From 6bf56f4658b8a6532fc98f328349e28bc8dd15e4 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Sun, 26 Feb 2017 16:44:05 +0800 Subject: [PATCH 001/177] Amend local --- .../src/TestCollection/StackTest.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/group12/382266293/src/TestCollection/StackTest.java b/group12/382266293/src/TestCollection/StackTest.java index 3784a9b972..8d2f85e1bf 100644 --- a/group12/382266293/src/TestCollection/StackTest.java +++ b/group12/382266293/src/TestCollection/StackTest.java @@ -104,13 +104,22 @@ public void testSize() { @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)); + + int size = getRandomNumber(); + int[] expected = new int[size]; + int actual; + for (int i = 0; i < size; i++) { + actual = getRandomNumber(); + expected[i] = actual; + myStack.add(actual); + } + int expectedInt; + for (int i = 0; i < size; i++) { + expectedInt = expected[size - i - 1]; + actual = myStack.pop(); + assertEquals(expectedInt, actual); + } } @Test From 5f23dd85c1bc6049c99ff076ce2cc03ab1bb0411 Mon Sep 17 00:00:00 2001 From: bate999999999 <282742732@qq.com> Date: Sun, 26 Feb 2017 22:48:52 +0800 Subject: [PATCH 002/177] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 124 +++++++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 +++ .../src/com/coding/basic/Iterator.java | 7 + .../com/coding/basic/IteratorArrayList.java | 40 +++ .../com/coding/basic/IteratorLinkedList.java | 30 +++ .../src/com/coding/basic/LinkedList.java | 239 ++++++++++++++++++ .../learning_1/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 22 ++ .../src/com/coding/basic/Stack.java | 42 +++ 10 files changed, 556 insertions(+) create mode 100644 group12/282742732/learning_1/.settings/org.eclipse.jdt.core.prefs create mode 100644 group12/282742732/learning_1/src/com/coding/basic/ArrayList.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/Iterator.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/IteratorArrayList.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/IteratorLinkedList.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/LinkedList.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/List.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/Queue.java create mode 100644 group12/282742732/learning_1/src/com/coding/basic/Stack.java diff --git a/group12/282742732/learning_1/.settings/org.eclipse.jdt.core.prefs b/group12/282742732/learning_1/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group12/282742732/learning_1/.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/group12/282742732/learning_1/src/com/coding/basic/ArrayList.java b/group12/282742732/learning_1/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..ec3f7399e7 --- /dev/null +++ b/group12/282742732/learning_1/src/com/coding/basic/ArrayList.java @@ -0,0 +1,124 @@ +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.groupLength(); + }else if (size==0){ + elementData[0]=o; + }else{ + elementData[size] = o; + } + size = size + 1; + } + public void add(int index, Object o){ + if (size+1>=elementData.length) { + this.groupLength(); + }else if (index == size ) { + elementData[size] = o; + }else if(index>=0 && index<=size ){ + Object[] elementDataNew = new Object[this.elementData.length]; + + System.arraycopy(elementData, 0, elementDataNew, 0, index); + elementDataNew[index]=o; + System.arraycopy(elementData, index, elementDataNew, index+1, size-index); + + this.elementData = elementDataNew; + }else{ + System.out.println("指针越界"); + return; + } + + size = size + 1; + } + + public Object get(int index){ + + if (index>=0||index<=size) { + return elementData[index]; + }else{ + System.out.println("指针越界"); + return null; + } + + } + + public Object remove(int index){ + + Object obj =this.elementData[index]; + Object[] elementDataNew = new Object[this.elementData.length]; + if (index<0 || index > size-1) { + System.out.println("指针越界"); + return null; + }else if(index==0){ + System.arraycopy(elementData, 1, elementDataNew, 0, size-1); + }else if(index==size){ + System.arraycopy(elementData, 0, elementDataNew, 0, size-1); + }else if(index>0 && index <=size){ + System.arraycopy(elementData, 0, elementDataNew, 0, index); + System.arraycopy(elementData, index+1, elementDataNew, index, size-index-1); + } + + this.elementData = elementDataNew; + size=size-1; + return obj; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + + return new IteratorArrayList(elementData,size); + } + + private void groupLength(){ + this.elementData = new Object[this.elementData.length + 10]; + size=size+10; + } + + public static void main(String[] args) { + + + + ArrayList list = new ArrayList(); + System.out.println(list.size()); + + list.add("aaa"); +// System.out.println(list.remove(1)); + + list.add("bbb"); + + + list.add(1, "ccc"); + list.add(2, "ddd"); + +// System.out.println(list.size()); +// +// System.out.println( list.remove(0) ); +// +// list.add(0,"111"); +// list.add("xxxx"); + + System.out.println(list.size()); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)+","); + } + Iterator it = list.iterator(); + + int idex=0; + while (it.hasNext()) { + String str = (String) it.next(); + idex++; + System.out.println("str"+idex+"=="+str+";"); + + } + } +} diff --git a/group12/282742732/learning_1/src/com/coding/basic/BinaryTreeNode.java b/group12/282742732/learning_1/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group12/282742732/learning_1/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/282742732/learning_1/src/com/coding/basic/Iterator.java b/group12/282742732/learning_1/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group12/282742732/learning_1/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/282742732/learning_1/src/com/coding/basic/IteratorArrayList.java b/group12/282742732/learning_1/src/com/coding/basic/IteratorArrayList.java new file mode 100644 index 0000000000..faefc0de06 --- /dev/null +++ b/group12/282742732/learning_1/src/com/coding/basic/IteratorArrayList.java @@ -0,0 +1,40 @@ +package com.coding.basic; + +public class IteratorArrayList implements Iterator { + + + private Object[] elementData; + private int length; + + private int index = 0; + + public IteratorArrayList(Object[] elementData,int length){ + this.elementData = elementData; + this.length = length; + } + + @Override + public boolean hasNext() { + + if ((index+1)<=length) { + return true; + } + + return false; + } + + @Override + public Object next() { + if ((index+1)<=length) { + index = index + 1; + return elementData[index-1]; + }else{ + System.out.println("指针超过范围"); + return null; + } + + } + + + +} diff --git a/group12/282742732/learning_1/src/com/coding/basic/IteratorLinkedList.java b/group12/282742732/learning_1/src/com/coding/basic/IteratorLinkedList.java new file mode 100644 index 0000000000..558b90f05a --- /dev/null +++ b/group12/282742732/learning_1/src/com/coding/basic/IteratorLinkedList.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +import com.coding.basic.LinkedList.Node; + +public class IteratorLinkedList implements Iterator{ + + Node node ; + public IteratorLinkedList(Node node){ + this.node = node; + } + + @Override + public boolean hasNext() { + + if (node == null) { + return false; + } + return true; + + } + + @Override + public Object next() { + Object obj = this.node.data; + node = node.next; + return obj; + } + + +} diff --git a/group12/282742732/learning_1/src/com/coding/basic/LinkedList.java b/group12/282742732/learning_1/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..c5a28a35f8 --- /dev/null +++ b/group12/282742732/learning_1/src/com/coding/basic/LinkedList.java @@ -0,0 +1,239 @@ +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); + last=head; + }else{ + Node node = new Node(o); + last.setNext(node); + last = node; + } + size = size + 1; + } + public void add(int index , Object o){ + + if (index >=0 && index<=this.size && size>0) { + + if (index == 0) { + this.addFirst(o); + }else if(index == size){ + this.addLast(o); + }else{ + int num = 0; + Node node = head; + Node node1 = null; + Node nodenew = new Node(o); + Node node3 = null; + while (num <= index){ + + if(index - 1 == num){ + node1 = node; + }else if(index == num){ + node3 = node; + } + node = node.next; + num = num +1; + }; + nodenew.setNext(node3); + node1.setNext(nodenew); + + + size = size + 1; + } + + }else{ + System.out.println("指针越界"); + } + + } + public Object get(int index){ + + + if (index >=0 && index<=this.size && size>0) { + int num = 0; + Node node = head; + while (num < size){ + if(index == num){ + return node.getData(); + }else{ + node = node.next; + num = num +1; + } + }; + }else{ + System.out.println("指针越界"); + return null; + } + return null; + } + public Object remove(int index){ + + if (index >=0 && index<=this.size && size>0) { + + if (index == 0) { + return this.removeFirst(); + }else if(index+1==size){ + return this.removeLast(); + }else{ + int num = 0; + Node node = head; + Node node1 = null; + Node node2 = null; + Node node3 = null; + while (num <= index+1){ + if(index - 1 == num){ + node1 = node; + }else if(index+1 == num){ + node3 = node; + }else if(index == num){ + node2 = node; + } + node = node.next; + num = num +1; + }; + node1.setNext(node3); + size = size - 1; + return node2.data; + } + + }else{ + System.out.println("指针越界"); + return null; + } + + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(o); + node.setNext(head); + head = node; + size = size + 1; + } + public void addLast(Object o){ + Node node = new Node(o); + last.setNext(node); + last = node; + size = size + 1; + } + public Object removeFirst(){ + Object obj = null; + if(size > 0){ + obj = head.data; + head = head.next; + }else{ + System.out.println("指针越界"); + return null; + } + + size = size - 1; + return obj; + } + public Object removeLast(){ + Object obj = null; + if(this.size() > 0){ + if(this.size()==1){ + obj = head.data; + this.head = null; + }else if (this.size()==2) { + obj = head.next.data; + this.head.setNext(null); + }else{ + int num = 0; + Node node = head; + Node node1 = null; + Node node2 = null; + Node node3 = null; + while (num <= size-2){ + if(size - 2 == num){ + obj = node.next.data; + node.setNext(null); + last = node; + }else{ + node = node.next; + } + + num = num +1; + }; + } + }else{ + System.out.println("指针越界"); + return null; + } + + + + size = size - 1; + return obj; + } + public Iterator iterator(){ + return new IteratorLinkedList(this.head); + } + + + static class Node{ + Object data; + Node next; + + public Node(Object object) { + data = object; + } + + 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; + } + + } + + + public static void main(String[] args) { + LinkedList list = new LinkedList(); + list.add("aaa"); + list.add("bbb"); + list.add("ccc"); +// System.out.println(list.removeLast()); +// System.out.println(list.removeFirst()); +// list.add(3,"xxxxxx"); +// System.out.println("======="+list.removeFirst()); +// System.out.println(list.size()); +// +// System.out.println("list.get0========"+list.get(0)); +// System.out.println("list.get1========"+list.get(1)); +// System.out.println("============="); + System.out.println(list.size()); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + + Iterator it = list.iterator(); + + while(it.hasNext()){ + String str = (String) it.next(); + System.out.println("str====="+str); + } + + } +} diff --git a/group12/282742732/learning_1/src/com/coding/basic/List.java b/group12/282742732/learning_1/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group12/282742732/learning_1/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/282742732/learning_1/src/com/coding/basic/Queue.java b/group12/282742732/learning_1/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..d16a441644 --- /dev/null +++ b/group12/282742732/learning_1/src/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + LinkedList elementData = new LinkedList(); + 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/group12/282742732/learning_1/src/com/coding/basic/Stack.java b/group12/282742732/learning_1/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..31b24fd136 --- /dev/null +++ b/group12/282742732/learning_1/src/com/coding/basic/Stack.java @@ -0,0 +1,42 @@ +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(){ + if (elementData.size()>0) { + return false; + } + return true; + } + public int size(){ + return elementData.size(); + } + + public static void main(String[] args) { + + Stack st = new Stack(); + st.push("aaa"); + st.push("bbb"); + st.push("ccc"); + System.out.println(st.isEmpty()); + int length = st.size(); + + for (int i = 0; i < length; i++) { + System.out.println(st.peek()); + } + + System.out.println(st.isEmpty()); + } +} From 9c41d7429b2984fb25efd950c1eabd01811bdf01 Mon Sep 17 00:00:00 2001 From: ls00002 <2686360536@qq.com> Date: Sun, 26 Feb 2017 22:57:11 +0800 Subject: [PATCH 003/177] homework --- group12/2686360536/ArrayList.java | 34 +++++++++++++ group12/2686360536/LinkedList.java | 80 ++++++++++++++++++++++++++++++ group12/2686360536/List.java | 9 ++++ group12/2686360536/Node.java | 43 ++++++++++++++++ group12/2686360536/Queue.java | 28 +++++++++++ group12/2686360536/Stack.java | 38 ++++++++++++++ 6 files changed, 232 insertions(+) create mode 100644 group12/2686360536/ArrayList.java create mode 100644 group12/2686360536/LinkedList.java create mode 100644 group12/2686360536/List.java create mode 100644 group12/2686360536/Node.java create mode 100644 group12/2686360536/Queue.java create mode 100644 group12/2686360536/Stack.java diff --git a/group12/2686360536/ArrayList.java b/group12/2686360536/ArrayList.java new file mode 100644 index 0000000000..cf7eb423b0 --- /dev/null +++ b/group12/2686360536/ArrayList.java @@ -0,0 +1,34 @@ +package org.dul.CodingTask.homework_2017_2_25; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] data = new Object[100]; + + public void add(Object object) { + data[size] = object; + size++; + } + + public void add(int index, Object object) { + + } + + public Object get(int index) { + return data[index]; + } + + public Object remove(int index) { + return null; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + +} diff --git a/group12/2686360536/LinkedList.java b/group12/2686360536/LinkedList.java new file mode 100644 index 0000000000..6a8d0b237f --- /dev/null +++ b/group12/2686360536/LinkedList.java @@ -0,0 +1,80 @@ +package org.dul.CodingTask.homework_2017_2_25; + +public class LinkedList implements List { + + private Node start; + private Node end; + private int size; + + public void add(Object object) { + if (start == null) { + start = new Node(object); + end = start; + } else { + Node node = new Node(object); + start.setNext(node); + end = node; + } + size++; + } + + public void add(int index, Object object) { + } + + + public Object get(int index) { + if(index > size -1) + return null; + + Node current = start; + for (int i = 0; i < index; i++) { + current = current.getNext(); + } + return current.getData(); + } + + public Object remove(int index) { + return null; + } + + public int size() { + return size; + } + + public void addFirst(Object object) { + Node node = new Node(object, start); + start = node; + } + + public void addEnd(Object object) { + Node node = new Node(object); + end.setNext(node); + end = node; + } + + public Object removeFirst() { + Object data = start.getData(); + start = start.getNext(); + return data; + + } + + public Object removeEnd() { + Object data = end.getData(); + Node current = start; + while(true){ + if (current.getNext() == end){ + end = current; + current.setNext(null); + break; + }else { + current = current.getNext(); + } + } + return data; + } + + public Iterator iterator() { + return null; + } +} diff --git a/group12/2686360536/List.java b/group12/2686360536/List.java new file mode 100644 index 0000000000..7822b0e26c --- /dev/null +++ b/group12/2686360536/List.java @@ -0,0 +1,9 @@ +package org.dul.CodingTask.homework_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/group12/2686360536/Node.java b/group12/2686360536/Node.java new file mode 100644 index 0000000000..999e3ee828 --- /dev/null +++ b/group12/2686360536/Node.java @@ -0,0 +1,43 @@ +package org.dul.CodingTask.homework_2017_2_25; + +public class Node { + private Object data; + private Node next; + private Node previous; + + public Node() { + } + + public Node(Object data){ + this.data = data; + } + + 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; + } + + public Node getPrevious() { + return previous; + } + + public void setPrevious(Node previous) { + this.previous = previous; + } +} \ No newline at end of file diff --git a/group12/2686360536/Queue.java b/group12/2686360536/Queue.java new file mode 100644 index 0000000000..10adea7fc4 --- /dev/null +++ b/group12/2686360536/Queue.java @@ -0,0 +1,28 @@ +package org.dul.CodingTask.homework_2017_2_25; + +public class Queue { + private ArrayList elements = new ArrayList(); + + public void enQueue(Object object) { + elements.add(object); + } + + public Object deQueue() { + if (isEmpty()) + return null; + else { + return elements.remove(elements.size() - 1); + } + } + + public boolean isEmpty() { + if (elements.size() == 0) + return true; + else + return false; + } + + public int size() { + return elements.size(); + } +} diff --git a/group12/2686360536/Stack.java b/group12/2686360536/Stack.java new file mode 100644 index 0000000000..e2908b0fa5 --- /dev/null +++ b/group12/2686360536/Stack.java @@ -0,0 +1,38 @@ +package org.dul.CodingTask.homework_2017_2_25; + +public class Stack { + private ArrayList elements = new ArrayList(); + + public void push(Object object) { + elements.add(object); + } + + public Object pop() { + if (isEmpty()) + return null; + else { + return elements.remove(elements.size() - 1); + } + + } + + public Object peek() { + if (isEmpty()) + return null; + else { + return elements.get(elements.size() - 1); + } + } + + public boolean isEmpty() { + if (elements.size() == 0) + return true; + else + return false; + } + + public int size() { + return elements.size(); + } + +} From 2ef160ab17cb1d8d787417c77b1f90b77f10444a Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 27 Feb 2017 17:29:39 +0800 Subject: [PATCH 004/177] =?UTF-8?q?2-26=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/array/ArrayUtil.java | 219 ++++++++++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++++ .../src/com/coderising/litestruts/Struts.java | 32 +++ .../src/com/coderising/litestruts/View.java | 23 ++ .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 6 +- .../src/test/com/coderising/StrutsTest.java | 46 ++++ 7 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/litestruts/LoginAction.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml create mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java diff --git a/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java b/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..fe8f130afb --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,219 @@ +package com.coderising.array; + +import com.coding.basic.ArrayList; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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-1-i]; + } + 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 length = oldArray.length; + int[] tempArr = new int[length]; + int j = 0; + int zeroNum = 0;//鍌ㄥ瓨0鐨勪釜鏁 + for (int i = 0; i < length; i++) { + if(oldArray[i]!=0){ + tempArr[j] = oldArray[i]; + j ++; + }else{ + zeroNum ++; + } + } + //鍒犻櫎鏁扮粍灏剧鐨0 + int[] newArray = new int[length-zeroNum]; + System.arraycopy(tempArr, 0, newArray, 0, length-zeroNum); + return newArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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[] array3 = new int[length1 + length2]; + //灏哸rray1銆乤rray2鐨勫煎姞鍏rray3涓 + System.arraycopy(array1, 0, array3, 0, length1); + System.arraycopy(array2, 0, array3, length1, length2); + int length = array3.length; + int temp; + //灏哸rray3鍐掓场鎺掑簭 + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + if(array3[i]>array3[j+i]){ + temp = array3[i]; + array3[i] = array3[j+i]; + array3[j+i] = temp; + } + } + } + return duplicate(array3); + } + + /** + *鍘婚噸 + */ + private int[] duplicate(int[] array){ + + for (int i = 1; i < array.length; i++) { + if(array[i-1]==array[i]){ + array[i] = 0; + } + } + return removeZero(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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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 = {}; + if(max <= 1)return array; + //鐢熸垚 鏂愭尝閭e鏁板垪鐨凙rrayList闆嗗悎 + ArrayList ls = new ArrayList(); + ls.add(1);ls.add(1); + int next;int i = 1; + while(true){ + next = (int)ls.get(i) +(int)ls.get(i-1); + if(next >= max){ + break; + } + ls.add(next); + i ++; + } + return objList2int(ls); + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + + ArrayList primesList = new ArrayList(); + boolean flag; + for (int i = 2; i < max; i++) { + flag = false; + for (int j = 2; j <= Math.sqrt(i); j++) { + if (i % j == 0) { + flag =true; + break; + } + } + if(!flag){ + primesList.add(i); + } + } + return objList2int(primesList); + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + int temp; + ArrayList perfectList = new ArrayList(); + for (int i = 6; i <= max; i++) { + temp = 0; + for (int j = 1; j <= (i/2); j++) { + if(i%j == 0){ + temp += j; + } + } + if(temp == i){ + perfectList.add(i); + } + } + return objList2int(perfectList); + } + + /** + * 鐢╯eperator 鎶婃暟缁 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]+seperator); + } + return str.substring(0, str.lastIndexOf(seperator)); + } + + /** + * 灏嗗瓨鍌╥nt鏁版嵁鐨凙rrayList杞崲涓篿nt鏁扮粍 + * @param ls + * @return + */ + public int[] objList2int(ArrayList ls){ + + Object[] objArr = ls.toArray(); + int[] array = new int[ls.size()]; + for (int i = 0; i < ls.size(); i++) { + array[i] = (int) objArr[i]; + } + return array; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/LoginAction.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..a3ce652047 --- /dev/null +++ b/group12/2258659044/zj-2017/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/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..2d52453f26 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,32 @@ +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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + 鎹畃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; + } + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..9024d72158 --- /dev/null +++ b/group12/2258659044/zj-2017/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/group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml b/group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..99063bcb0c --- /dev/null +++ b/group12/2258659044/zj-2017/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/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java index 5de89da950..c15e99848b 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java @@ -52,7 +52,11 @@ public Object remove(int index){ public int size(){ return size; } - + + public Object[] toArray(){ + return elementData.clone(); + } + /** * 鎵╁锛屾墿瀹瑰洜瀛愪负10 */ diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java new file mode 100644 index 0000000000..2cb51e3967 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java @@ -0,0 +1,46 @@ +package test.com.coderising; + +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; + + + + + +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 From 7e60614cb4bba9183a4014530db517460638832a Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 27 Feb 2017 18:00:03 +0800 Subject: [PATCH 005/177] =?UTF-8?q?=E8=AF=BB=E5=8F=96xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/litestruts/Struts.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index 2d52453f26..baa67f6aae 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -1,7 +1,18 @@ package com.coderising.litestruts; +import java.io.File; +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.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + public class Struts { public static View runAction(String actionName, Map parameters) { @@ -29,4 +40,27 @@ public static View runAction(String actionName, Map parameters) { return null; } + private void readStrutsXml(String filePath){ + + File xmlFile = new File("struts.xml"); + try { + DocumentBuilder documentBuilder = DocumentBuilderFactory + .newInstance().newDocumentBuilder(); + Document document = documentBuilder.parse(xmlFile); + //鑾峰彇鏍硅妭鐐 + Element element = document.getDocumentElement(); + //http://www.jb51.net/article/44338.htm + NodeList childNodes = element.getChildNodes(); + + } 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(); + } + } } \ No newline at end of file From 0a2e978d7547d6c207ded2044fe4deda2617b204 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Mon, 27 Feb 2017 20:18:28 +0800 Subject: [PATCH 006/177] new Exs --- group12/382266293/.classpath | 16 +-- .../basic}/Collection/AbstractList.java | 0 .../basic}/Collection/Concrete/ArrayList.java | 0 .../Collection/Concrete/BinaryTreeNode.java | 0 .../Collection/Concrete/LinkedList.java | 0 .../basic}/Collection/Concrete/Queue.java | 0 .../basic}/Collection/Concrete/Stack.java | 0 .../basic}/Collection/Iterator.java | 0 .../basic}/Collection/List.java | 0 .../basic}/TestCollection/AllTests.java | 0 .../basic}/TestCollection/ArrayListTest.java | 0 .../TestCollection/BinaryTreeNodeTest.java | 0 .../basic}/TestCollection/LinkedListTest.java | 0 .../basic}/TestCollection/QueueTest.java | 0 .../basic}/TestCollection/StackTest.java | 0 .../{src => coding/basic}/util/Print.java | 0 .../{src => coding/basic}/util/TestUtil.java | 8 ++ group12/382266293/lib/.gitignore | 1 + group12/382266293/src/TestDom4J.java | 59 +++++++++ group12/382266293/src/array/ArrayUtil.java | 115 ++++++++++++++++++ .../382266293/src/array/ArrayUtilTest.java | 83 +++++++++++++ .../382266293/src/litestruts/LoginAction.java | 39 ++++++ group12/382266293/src/litestruts/Struts.java | 34 ++++++ .../382266293/src/litestruts/StrutsTest.java | 43 +++++++ group12/382266293/src/litestruts/View.java | 23 ++++ group12/382266293/src/litestruts/struts.xml | 11 ++ 26 files changed, 425 insertions(+), 7 deletions(-) rename group12/382266293/{src => coding/basic}/Collection/AbstractList.java (100%) rename group12/382266293/{src => coding/basic}/Collection/Concrete/ArrayList.java (100%) rename group12/382266293/{src => coding/basic}/Collection/Concrete/BinaryTreeNode.java (100%) rename group12/382266293/{src => coding/basic}/Collection/Concrete/LinkedList.java (100%) rename group12/382266293/{src => coding/basic}/Collection/Concrete/Queue.java (100%) rename group12/382266293/{src => coding/basic}/Collection/Concrete/Stack.java (100%) rename group12/382266293/{src => coding/basic}/Collection/Iterator.java (100%) rename group12/382266293/{src => coding/basic}/Collection/List.java (100%) rename group12/382266293/{src => coding/basic}/TestCollection/AllTests.java (100%) rename group12/382266293/{src => coding/basic}/TestCollection/ArrayListTest.java (100%) rename group12/382266293/{src => coding/basic}/TestCollection/BinaryTreeNodeTest.java (100%) rename group12/382266293/{src => coding/basic}/TestCollection/LinkedListTest.java (100%) rename group12/382266293/{src => coding/basic}/TestCollection/QueueTest.java (100%) rename group12/382266293/{src => coding/basic}/TestCollection/StackTest.java (100%) rename group12/382266293/{src => coding/basic}/util/Print.java (100%) rename group12/382266293/{src => coding/basic}/util/TestUtil.java (90%) create mode 100644 group12/382266293/lib/.gitignore create mode 100644 group12/382266293/src/TestDom4J.java create mode 100644 group12/382266293/src/array/ArrayUtil.java create mode 100644 group12/382266293/src/array/ArrayUtilTest.java create mode 100644 group12/382266293/src/litestruts/LoginAction.java create mode 100644 group12/382266293/src/litestruts/Struts.java create mode 100644 group12/382266293/src/litestruts/StrutsTest.java create mode 100644 group12/382266293/src/litestruts/View.java create mode 100644 group12/382266293/src/litestruts/struts.xml diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath index 3e0fb272a8..97b7b051d0 100644 --- a/group12/382266293/.classpath +++ b/group12/382266293/.classpath @@ -1,7 +1,9 @@ - - - - - - - + + + + + + + + + diff --git a/group12/382266293/src/Collection/AbstractList.java b/group12/382266293/coding/basic/Collection/AbstractList.java similarity index 100% rename from group12/382266293/src/Collection/AbstractList.java rename to group12/382266293/coding/basic/Collection/AbstractList.java diff --git a/group12/382266293/src/Collection/Concrete/ArrayList.java b/group12/382266293/coding/basic/Collection/Concrete/ArrayList.java similarity index 100% rename from group12/382266293/src/Collection/Concrete/ArrayList.java rename to group12/382266293/coding/basic/Collection/Concrete/ArrayList.java diff --git a/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java b/group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java similarity index 100% rename from group12/382266293/src/Collection/Concrete/BinaryTreeNode.java rename to group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java diff --git a/group12/382266293/src/Collection/Concrete/LinkedList.java b/group12/382266293/coding/basic/Collection/Concrete/LinkedList.java similarity index 100% rename from group12/382266293/src/Collection/Concrete/LinkedList.java rename to group12/382266293/coding/basic/Collection/Concrete/LinkedList.java diff --git a/group12/382266293/src/Collection/Concrete/Queue.java b/group12/382266293/coding/basic/Collection/Concrete/Queue.java similarity index 100% rename from group12/382266293/src/Collection/Concrete/Queue.java rename to group12/382266293/coding/basic/Collection/Concrete/Queue.java diff --git a/group12/382266293/src/Collection/Concrete/Stack.java b/group12/382266293/coding/basic/Collection/Concrete/Stack.java similarity index 100% rename from group12/382266293/src/Collection/Concrete/Stack.java rename to group12/382266293/coding/basic/Collection/Concrete/Stack.java diff --git a/group12/382266293/src/Collection/Iterator.java b/group12/382266293/coding/basic/Collection/Iterator.java similarity index 100% rename from group12/382266293/src/Collection/Iterator.java rename to group12/382266293/coding/basic/Collection/Iterator.java diff --git a/group12/382266293/src/Collection/List.java b/group12/382266293/coding/basic/Collection/List.java similarity index 100% rename from group12/382266293/src/Collection/List.java rename to group12/382266293/coding/basic/Collection/List.java diff --git a/group12/382266293/src/TestCollection/AllTests.java b/group12/382266293/coding/basic/TestCollection/AllTests.java similarity index 100% rename from group12/382266293/src/TestCollection/AllTests.java rename to group12/382266293/coding/basic/TestCollection/AllTests.java diff --git a/group12/382266293/src/TestCollection/ArrayListTest.java b/group12/382266293/coding/basic/TestCollection/ArrayListTest.java similarity index 100% rename from group12/382266293/src/TestCollection/ArrayListTest.java rename to group12/382266293/coding/basic/TestCollection/ArrayListTest.java diff --git a/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java b/group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java similarity index 100% rename from group12/382266293/src/TestCollection/BinaryTreeNodeTest.java rename to group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java diff --git a/group12/382266293/src/TestCollection/LinkedListTest.java b/group12/382266293/coding/basic/TestCollection/LinkedListTest.java similarity index 100% rename from group12/382266293/src/TestCollection/LinkedListTest.java rename to group12/382266293/coding/basic/TestCollection/LinkedListTest.java diff --git a/group12/382266293/src/TestCollection/QueueTest.java b/group12/382266293/coding/basic/TestCollection/QueueTest.java similarity index 100% rename from group12/382266293/src/TestCollection/QueueTest.java rename to group12/382266293/coding/basic/TestCollection/QueueTest.java diff --git a/group12/382266293/src/TestCollection/StackTest.java b/group12/382266293/coding/basic/TestCollection/StackTest.java similarity index 100% rename from group12/382266293/src/TestCollection/StackTest.java rename to group12/382266293/coding/basic/TestCollection/StackTest.java diff --git a/group12/382266293/src/util/Print.java b/group12/382266293/coding/basic/util/Print.java similarity index 100% rename from group12/382266293/src/util/Print.java rename to group12/382266293/coding/basic/util/Print.java diff --git a/group12/382266293/src/util/TestUtil.java b/group12/382266293/coding/basic/util/TestUtil.java similarity index 90% rename from group12/382266293/src/util/TestUtil.java rename to group12/382266293/coding/basic/util/TestUtil.java index 2dfeeade7f..b9f996bc56 100644 --- a/group12/382266293/src/util/TestUtil.java +++ b/group12/382266293/coding/basic/util/TestUtil.java @@ -16,6 +16,14 @@ public class TestUtil extends TestCase { private static final int RANDOM_SIZE = 500; + public static int[] getRandomIntArray(int number) { + int[] arr = new int[number]; + for (int i = 0; i < arr.length; i++) { + arr[i] = getRandomNumber(); + } + return arr; + } + public static int getRandomNumber() { return random.nextInt(RANDOM_SIZE); } diff --git a/group12/382266293/lib/.gitignore b/group12/382266293/lib/.gitignore new file mode 100644 index 0000000000..3d08860a86 --- /dev/null +++ b/group12/382266293/lib/.gitignore @@ -0,0 +1 @@ +/dom4j-1.6.1.zip diff --git a/group12/382266293/src/TestDom4J.java b/group12/382266293/src/TestDom4J.java new file mode 100644 index 0000000000..b5dabfcc0c --- /dev/null +++ b/group12/382266293/src/TestDom4J.java @@ -0,0 +1,59 @@ +import java.net.URL; +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.Node; +import org.dom4j.io.SAXReader; + +import static util.Print.*; + +public class TestDom4J { + + public Document parse(String add) throws DocumentException { + SAXReader reader = new SAXReader(); + Document document = reader.read(add); + return document; + } + + + + public void bar(Document document) { + List list = document.selectNodes( "/struts-config/action-mappings/action" ); + Node node = document.selectSingleNode( "/struts-config/action-mappings/action/forward" ); + + String name = node.valueOf( "@name" ); + println(name); + } + + 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); + } + } + + public static void main(String args[]) throws DocumentException { + + + + } + +} diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java new file mode 100644 index 0000000000..a9a4a66491 --- /dev/null +++ b/group12/382266293/src/array/ArrayUtil.java @@ -0,0 +1,115 @@ +package array; + +import static util.Print.*; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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; + for (int i = 0; i < len/2; i++) { + temp = origin[i]; + origin[i] = origin[len-1-i]; + origin[len-1-i] = temp; + } + + } + + public static void main(String args[]) { + + ArrayUtil arrayUtil = new ArrayUtil(); + int[] my = new int[] {1,2,3,4,5}; + arrayUtil.reverseArray(my); + println(my); + } + + + /** + * 鐜板湪鏈夊涓嬬殑涓涓暟缁勶細 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鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 + * 渚嬪array= [3,8,9], seperator = "-" + * 鍒欒繑鍥炲间负"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} \ No newline at end of file diff --git a/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java new file mode 100644 index 0000000000..4e8df6912c --- /dev/null +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -0,0 +1,83 @@ +package array; + +import static org.junit.Assert.*; +import static util.TestUtil.*; + +import java.util.Arrays; + +import static util.Print.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +public class ArrayUtilTest { + + private int[] myArr; + ArrayUtil au = new ArrayUtil(); + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + myArr = null; + } + + + @Test + public void testReverseArray() { + + int size = getRandomNumber(); + int[] expected = getRandomIntArray(size); + int[] myArr = Arrays.copyOf(expected, size); + + au.reverseArray(myArr); + + for (int i = 0; i < size; i++) { + assertEquals(expected[i], myArr[size-1-i]); + } + + } + + + + + @Test + public void testRemoveZero() { + + } + + @Test + public void testMerge() { + + } + + @Test + public void testGrow() { + + } + + @Test + public void testFibonacci() { + + } + + @Test + public void testGetPrimes() { + + } + + @Test + public void testGetPerfectNumbers() { + + } + + @Test + public void testJoin() { + + } + +} diff --git a/group12/382266293/src/litestruts/LoginAction.java b/group12/382266293/src/litestruts/LoginAction.java new file mode 100644 index 0000000000..c37c250014 --- /dev/null +++ b/group12/382266293/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; + } +} \ No newline at end of file diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java new file mode 100644 index 0000000000..f26fa8d8b7 --- /dev/null +++ b/group12/382266293/src/litestruts/Struts.java @@ -0,0 +1,34 @@ +package litestruts; + +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; + } + +} \ No newline at end of file diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java new file mode 100644 index 0000000000..e08fab55c9 --- /dev/null +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +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")); + } +} \ No newline at end of file diff --git a/group12/382266293/src/litestruts/View.java b/group12/382266293/src/litestruts/View.java new file mode 100644 index 0000000000..5a7d948765 --- /dev/null +++ b/group12/382266293/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; + } +} \ No newline at end of file diff --git a/group12/382266293/src/litestruts/struts.xml b/group12/382266293/src/litestruts/struts.xml new file mode 100644 index 0000000000..99063bcb0c --- /dev/null +++ b/group12/382266293/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 From 73ca23170c4a738564b912091553a1d0d3549bda Mon Sep 17 00:00:00 2001 From: 2319021847 <2319021847@2319021847> Date: Mon, 27 Feb 2017 21:19:38 +0800 Subject: [PATCH 007/177] homework1 --- .../homework1/com/code/basic/ArrayList.java | 106 ++++++++++++++++++ .../com/code/basic/BinaryTreeNode.java | 53 +++++++++ .../homework1/com/code/basic/Iterator.java | 6 + .../homework1/com/code/basic/LinkList.java | 86 ++++++++++++++ .../homework1/com/code/basic/LinkNode.java | 46 ++++++++ .../homework1/com/code/basic/List.java | 14 +++ .../homework1/com/code/basic/Queue.java | 70 ++++++++++++ .../homework1/com/code/basic/Stack.java | 45 ++++++++ 8 files changed, 426 insertions(+) create mode 100644 group12/2319021847/homework1/com/code/basic/ArrayList.java create mode 100644 group12/2319021847/homework1/com/code/basic/BinaryTreeNode.java create mode 100644 group12/2319021847/homework1/com/code/basic/Iterator.java create mode 100644 group12/2319021847/homework1/com/code/basic/LinkList.java create mode 100644 group12/2319021847/homework1/com/code/basic/LinkNode.java create mode 100644 group12/2319021847/homework1/com/code/basic/List.java create mode 100644 group12/2319021847/homework1/com/code/basic/Queue.java create mode 100644 group12/2319021847/homework1/com/code/basic/Stack.java diff --git a/group12/2319021847/homework1/com/code/basic/ArrayList.java b/group12/2319021847/homework1/com/code/basic/ArrayList.java new file mode 100644 index 0000000000..942bce6c2a --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/ArrayList.java @@ -0,0 +1,106 @@ +package com.coding.basic; + +public class ArrayList implements List{ + + private int size = 0; + private Object[] elements; + + public ArrayList() { + this.elements = new Object[5]; + } + + public ArrayList(int size) { + this.elements = new Object[size]; + } + public void add(Object o) { + // TODO Auto-generated method stub + if(isFull()) + { + resize(); + } + this.elements[this.size] = o; + this.size++; + } + public boolean isFull () + { + if(this.size == this.elements.length) + { + return true; + } + + return false; + } + + public void resize() + { + Object[] newElements = new Object[this.elements.length*2]; + System.arraycopy(elements, 0, newElements, 0, elements.length); + this.elements = newElements; + newElements = null; + } + public void add(int index, Object o) { + // TODO Auto-generated method stub + rangeCheck(index); + if(isFull()) + { + resize(); + } + System.arraycopy(elements, index, elements, index+1,size-index); + this.elements[index] = o; + size++; + } + void rangeCheck(int index) + { + if(index > size || index < 0) + { + throw new IndexOutOfBoundsException("下标越界"); + } + } + public Object get(int index) { + // TODO Auto-generated method stub + rangeCheck(index); + return elements[index]; + } + + public Object remove(int index) { + // TODO Auto-generated method stub + rangeCheck(index); + Object elem = elements[index]; + System.arraycopy(elements, index+1, elements, index, size-index-1); + size--; + elements[size] = null; + return elem; + } + + public int size() { + // TODO Auto-generated method stub + return this.size; + } + public com.coding.basic.Iterator Iterator () + { + return new Itr(); + } + public class Itr implements com.coding.basic.Iterator{ + int cur = 0; + public boolean hasNext() { + // TODO Auto-generated method stub + if(size==cur) + { + return false; + } + return true; + } + + public Object next() { + // TODO Auto-generated method stub + int i = cur; + if(i < elements.length) + { + cur = i+1; + return elements[i]; + } + return null; + } + + } +} diff --git a/group12/2319021847/homework1/com/code/basic/BinaryTreeNode.java b/group12/2319021847/homework1/com/code/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..2e026b47b6 --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/BinaryTreeNode.java @@ -0,0 +1,53 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode(Object o){ + this.data = o; + this.left = null; + this.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(BinaryTreeNode root, Object o){ + BinaryTreeNode current = root; + BinaryTreeNode node = new BinaryTreeNode(o); + if(current == null) + { + current = node; + } + else if(((Integer)current.getData()).intValue() < ((Integer)o).intValue()) + { + insert(current.getLeft(),o); + } + else if(((Integer)current.getData()).intValue() >= ((Integer)o).intValue()) + { + insert(current.getRight(),o); + } + + return node; + } + +} diff --git a/group12/2319021847/homework1/com/code/basic/Iterator.java b/group12/2319021847/homework1/com/code/basic/Iterator.java new file mode 100644 index 0000000000..f6ecde73bf --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + boolean hasNext(); + Object next(); +} diff --git a/group12/2319021847/homework1/com/code/basic/LinkList.java b/group12/2319021847/homework1/com/code/basic/LinkList.java new file mode 100644 index 0000000000..9f759f9088 --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/LinkList.java @@ -0,0 +1,86 @@ +package com.coding.basic; + +public class LinkList implements List{ + + private LinkNode head; + // TODO Auto-generated method stub + private int size; + + public LinkList() + { + this.head = null; + this.size = 0; + } + public void add(Object o) { + // TODO Auto-generated method stub + LinkNode currPtr = this.head; + if(this.head == null) + { + this.head = new LinkNode(o, this.head ,null); + } + while(currPtr != null) + { + currPtr = currPtr.getNext(); + } + currPtr.setNext(new LinkNode(o, currPtr, null)); + size++; + } + + public void add(int index, Object o) { + // TODO Auto-generated method stub + LinkNode currPtr = this.head; + if(index < 0 || index > size) + throw new IndexOutOfBoundsException("下标越界"); + int i = 0; + if(index == 0) + { + LinkNode node = new LinkNode(o,currPtr,currPtr.getPrv()); + currPtr.getNext().setPrv(node); + currPtr = node; + } + while(i < index) + { + currPtr = currPtr.getNext(); + i++; + } + LinkNode node = new LinkNode(o,currPtr.getPrv(),currPtr); + currPtr.getPrv().setNext(node); + currPtr.setPrv(node); + size++; + } + + public Object get(int index) { + if(index < 0 || index > size) + throw new IndexOutOfBoundsException("下标越界"); + int i = 0; + LinkNode currPtr = this.head; + while(i < index) + { + currPtr = currPtr.getNext(); + i++; + } + + return currPtr.getData(); + } + + public Object remove(int index) { + // TODO Auto-generated method stub + int i = 0; + LinkNode currPtr = this.head; + while(i < index) + { + currPtr = currPtr.getNext(); + i++; + } + currPtr.getNext().setPrv(currPtr.getPrv()); + currPtr.getPrv().setNext( currPtr.getNext()); + size--; + return currPtr.getData(); + } + + public int size() { + // TODO Auto-generated method stub + return size; + } + +} diff --git a/group12/2319021847/homework1/com/code/basic/LinkNode.java b/group12/2319021847/homework1/com/code/basic/LinkNode.java new file mode 100644 index 0000000000..1452dcc42b --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/LinkNode.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class LinkNode { + private LinkNode pNextPtr; + private LinkNode pPrvPtr; + private Object ndata; + + public LinkNode () + { + this.pNextPtr=null; + this.pPrvPtr=null; + this.ndata=null; + } + + public LinkNode (Object o, LinkNode pPrvPtr, LinkNode pNextPtr) + { + this.pNextPtr=null; + this.pPrvPtr=null; + this.ndata=null; + } + + public void setNext(LinkNode node) + { + this.pNextPtr = node; + } + + public void setPrv(LinkNode node) + { + this.pPrvPtr = node; + } + + public LinkNode getNext() + { + return this.pNextPtr; + } + + public LinkNode getPrv() + { + return this.pPrvPtr; + } + public Object getData() + { + return this.ndata; + } + +} diff --git a/group12/2319021847/homework1/com/code/basic/List.java b/group12/2319021847/homework1/com/code/basic/List.java new file mode 100644 index 0000000000..8360496919 --- /dev/null +++ b/group12/2319021847/homework1/com/code/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(); + +} diff --git a/group12/2319021847/homework1/com/code/basic/Queue.java b/group12/2319021847/homework1/com/code/basic/Queue.java new file mode 100644 index 0000000000..4dac2bfc22 --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/Queue.java @@ -0,0 +1,70 @@ +package com.coding.basic; + +public class Queue { + private int size; + + private int head; + + private int tail; + + private Object[] queue; + + public Queue() + { + this.size = 0; + this.head = 0; + this.tail = 0; + } + + public void enQueue(Object o) { + if(isFull()) + { + resize(); + } + int newtail = (head+size)%queue.length; + queue[newtail] = o; + size++; + } + + public Object deQueue() { + if(isEmpty()) + { + return null; + } + Object oldHead = queue[head]; + head = (head-1)%queue.length; + size--; + return oldHead; + } + + public int getHead(){ + return head; + } + + public int 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[2*(queue.length)]; + System.arraycopy(queue, 0, newQueue, 0, size); + this.queue = newQueue; + newQueue = null; + } +} diff --git a/group12/2319021847/homework1/com/code/basic/Stack.java b/group12/2319021847/homework1/com/code/basic/Stack.java new file mode 100644 index 0000000000..370197cb32 --- /dev/null +++ b/group12/2319021847/homework1/com/code/basic/Stack.java @@ -0,0 +1,45 @@ +package com.coding.basic; + + + +public class Stack { + private Object[] elements; + private int size; + + + public Stack() + { + this.size = 0; + this.elements = new Object[10]; + } + public void push(Object o){ + if(o == null) + return; + size++; + elements[size-1] = o; + } + + public Object pop(){ + if(isEmpty()) + { + return null; + } + Object pop = elements[size-1]; + size--; + return pop; + } + + public Object peek(){ + if(isEmpty()) + { + return null; + } + return elements[size-1]; + } + public boolean isEmpty(){ + return size < 1; + } + public int size(){ + return size; + } +} \ No newline at end of file From 84e382274ea9cce7771a00abd36a8dd566274d92 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 27 Feb 2017 22:53:58 +0800 Subject: [PATCH 008/177] struts --- .../src/com/coderising/litestruts/Struts.java | 150 +++++++++++++----- .../src/com/coderising/litestruts/struts.xml | 8 +- 2 files changed, 115 insertions(+), 43 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index baa67f6aae..e75250f7a8 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -2,6 +2,9 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; import java.util.Map; import javax.xml.parsers.DocumentBuilder; @@ -10,57 +13,126 @@ 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) { + private final static String ACTION = "action"; + private final static String RESULT = "result"; + private final static String NAME = "name"; + private final static String CLASS = "class"; + private final static String EXECUTE = "execute"; - /* - - 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 + public static View runAction(String actionName, + Map parameters) { + + + View view = new View(); + Map viewMap = new HashMap(); - 4. 鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲硷紝 纭畾鍝竴涓猨sp锛 - 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 - - */ - - return null; - } - - private void readStrutsXml(String filePath){ - - File xmlFile = new File("struts.xml"); - try { - DocumentBuilder documentBuilder = DocumentBuilderFactory - .newInstance().newDocumentBuilder(); - Document document = documentBuilder.parse(xmlFile); - //鑾峰彇鏍硅妭鐐 - Element element = document.getDocumentElement(); - //http://www.jb51.net/article/44338.htm - NodeList childNodes = element.getChildNodes(); - + String path = "src/com/coderising/litestruts/struts.xml"; + Map xmlMap = readStrutsXml(path, actionName); + + try { + String calssPath = xmlMap.get(CLASS); + Class clazz = Class.forName(calssPath); + Object action = clazz.newInstance(); + Field[] fields = clazz.getDeclaredFields(); + String fieldName; + String methodName; + for (int i = 0; i < fields.length; i++) { + fieldName = fields[i].getName(); + if(parameters.containsKey(fieldName)){ + methodName = "set" + fieldName.substring(0, 1).toUpperCase() + + fieldName.substring(1); + Method method = clazz.getMethod(methodName, fields[i].getType()); + method.invoke(action, parameters.get(fieldName)); + } + } + + Method successMethos = clazz.getMethod(EXECUTE); + Object result = successMethos.invoke(action); + + for (int i = 0; i < fields.length; i++) { + fieldName = fields[i].getName(); + methodName = "get" + fieldName.substring(0, 1).toUpperCase() + + fieldName.substring(1); + Method method = clazz.getMethod(methodName); + Object value = method.invoke(action); + viewMap.put(fieldName, value); + + } + view.setParameters(viewMap); + + String jsp = xmlMap.get(result.toString()); + view.setJsp(jsp); + + } catch (Exception e) { + e.printStackTrace(); + } + + return view; + } + + /** + * 璇诲彇struts.xml鏂囦欢 + * + * @param filePath + * 锛歴truts.xml璺姴 + * @param actionName + * @return + */ + private static Map readStrutsXml(String filePath, + String actionName) { + + File xmlFile = new File(filePath); + Map xmlMap = new HashMap(); + try { + DocumentBuilder documentBuilder = DocumentBuilderFactory + .newInstance().newDocumentBuilder(); + Document document = documentBuilder.parse(xmlFile); + // 鑾峰彇鏍硅妭鐐 + Element element = document.getDocumentElement(); + // http://www.jb51.net/article/44338.htm + NodeList actionNodes = element.getChildNodes(); + for (int i = 0; i < actionNodes.getLength(); i++) { + Node actionNode = actionNodes.item(i); + if (ACTION.equals(actionNode.getNodeName())) { + NamedNodeMap actionNodeMap = actionNode.getAttributes(); + String atName = actionNodeMap.getNamedItem(NAME) + .getNodeValue(); + if (atName.equals(actionName)) { + String classPath = actionNodeMap.getNamedItem(CLASS) + .getNodeValue(); + xmlMap.put(CLASS, classPath); + NodeList resultNodes = actionNode.getChildNodes(); + for (int j = 0; j < resultNodes.getLength(); j++) { + Node resultNode = resultNodes.item(j); + if (RESULT.equals(resultNode.getNodeName())) { + NamedNodeMap resultNodeMap = resultNode + .getAttributes(); + String jspName = resultNodeMap.getNamedItem( + NAME).getNodeValue(); + String jspPath = resultNode.getTextContent(); + xmlMap.put(jspName, jspPath); + } + } + + } + } + + } + } 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 xmlMap; + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml b/group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml index 99063bcb0c..4c6eeabbd4 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/struts.xml @@ -1,11 +1,11 @@ - + /jsp/homepage.jsp /jsp/showLogin.jsp - - /jsp/welcome.jsp - /jsp/error.jsp + + /jsp/welcome.jsp + /jsp/error.jsp \ No newline at end of file From 8eaa97a2f43fecb04b33462cbb09bc2f42199b43 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 27 Feb 2017 22:55:21 +0800 Subject: [PATCH 009/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9View=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zj-2017/src/com/coderising/litestruts/View.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java index 9024d72158..0c0b9d3b26 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/View.java @@ -4,7 +4,7 @@ public class View { private String jsp; - private Map parameters; + private Map parameters; public String getJsp() { return jsp; @@ -13,10 +13,10 @@ public View setJsp(String jsp) { this.jsp = jsp; return this; } - public Map getParameters() { + public Map getParameters() { return parameters; } - public View setParameters(Map parameters) { + public View setParameters(Map parameters) { this.parameters = parameters; return this; } From cbf8ec80b4be4a2874627c503b94534c471c782b Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Tue, 28 Feb 2017 07:21:02 +0800 Subject: [PATCH 010/177] Array Ex & Test --- .../382266293/coding/basic/util/Print.java | 6 ++ .../382266293/coding/basic/util/TestUtil.java | 9 +- group12/382266293/src/array/ArrayUtil.java | 101 +++++++++++++++--- .../382266293/src/array/ArrayUtilTest.java | 82 ++++++++++++-- 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/group12/382266293/coding/basic/util/Print.java b/group12/382266293/coding/basic/util/Print.java index b2ae48552b..81b5cf539e 100644 --- a/group12/382266293/coding/basic/util/Print.java +++ b/group12/382266293/coding/basic/util/Print.java @@ -1,5 +1,6 @@ package util; +import java.util.Arrays; public class Print { @@ -10,5 +11,10 @@ public static void print(Object o){ public static void println(Object o){ System.out.println(o); } + + public static void printArr(int[] arr) { + println(Arrays.toString(arr)); + } + } diff --git a/group12/382266293/coding/basic/util/TestUtil.java b/group12/382266293/coding/basic/util/TestUtil.java index b9f996bc56..0820e0e684 100644 --- a/group12/382266293/coding/basic/util/TestUtil.java +++ b/group12/382266293/coding/basic/util/TestUtil.java @@ -1,5 +1,6 @@ package util; +import java.util.Arrays; import java.util.Random; import Collection.List; @@ -16,10 +17,12 @@ public class TestUtil extends TestCase { private static final int RANDOM_SIZE = 500; + + public static int[] getRandomIntArray(int number) { int[] arr = new int[number]; for (int i = 0; i < arr.length; i++) { - arr[i] = getRandomNumber(); + arr[i] = getRandomNumber() + 1; } return arr; } @@ -28,6 +31,10 @@ public static int getRandomNumber() { return random.nextInt(RANDOM_SIZE); } + public static int getRandomNumber(int bound) { + return random.nextInt(bound); + } + public static void addIntWithNatureOrder(List myList, int numbers) { for (int acutal = 0; acutal < numbers ; acutal++) { diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index a9a4a66491..aafa3c410c 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -2,6 +2,10 @@ import static util.Print.*; +import java.util.Arrays; +import java.util.BitSet; + + public class ArrayUtil { /** @@ -13,25 +17,18 @@ public class ArrayUtil { */ public void reverseArray(int[] origin){ - int len = origin.length; int temp; - for (int i = 0; i < len/2; i++) { + int index = origin.length - 1; + int numbersToReverse = origin.length/2; + for (int i = 0; i < numbersToReverse ; i++) { temp = origin[i]; - origin[i] = origin[len-1-i]; - origin[len-1-i] = temp; + origin[i] = origin[index - i]; + origin[index - i] = temp; } } - public static void main(String args[]) { - - ArrayUtil arrayUtil = new ArrayUtil(); - int[] my = new int[] {1,2,3,4,5}; - arrayUtil.reverseArray(my); - println(my); - } - /** * 鐜板湪鏈夊涓嬬殑涓涓暟缁勶細 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} * 瑕佹眰灏嗕互涓婃暟缁勪腑鍊间负0鐨勯」鍘绘帀锛屽皢涓嶄负0鐨勫煎瓨鍏ヤ竴涓柊鐨勬暟缁勶紝鐢熸垚鐨勬柊鏁扮粍涓猴細 @@ -39,10 +36,29 @@ public static void main(String args[]) { * @param oldArray * @return */ - + public int[] removeZero(int[] oldArray){ - return null; + + BitSet check = new BitSet(oldArray.length); + boolean isZero; + for (int i = 0; i < oldArray.length; i++) { + isZero = (oldArray[i] == 0) ? true : false; + check.set(i, isZero); + } + + int newSize = oldArray.length-check.cardinality(); + int[] newArr = new int[newSize]; + + int nextIndex = check.nextClearBit(0); + for(int i = 0 ; i < newSize ; i++) { + newArr[i] = oldArray[nextIndex]; + nextIndex = check.nextClearBit(nextIndex+1); + } + + return newArr; } + + /** * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 @@ -53,8 +69,34 @@ public int[] removeZero(int[] oldArray){ */ public int[] merge(int[] array1, int[] array2){ - return null; + + int len1 = array1.length; + int len2 = array2.length; + int len3 = array1[len1-1] < array2[len2-1] ? array2[len2-1] + 1: array1[len1-1] + 1; + int[] newArr = new int[len3]; + initialArray(newArr, -1); + for (int i = 0; i < len1; i++) { + newArr[array1[i]] = 0; + } + for (int i = 0; i < len2; i++) { + newArr[array2[i]] = 0; + } + int mergedLength = 0; + for (int i = 0; i < len3; i++) { + if (newArr[i] != -1) + newArr[mergedLength++] = i; + } + return Arrays.copyOf(newArr, mergedLength); } + + public static void initialArray(int[] arr, int j) { + for (int i = 0; i < arr.length; i++) { + arr[i] = j; + } + } + + + /** * 鎶婁竴涓凡缁忓瓨婊℃暟鎹殑鏁扮粍 oldArray鐨勫閲忚繘琛屾墿灞曪紝 鎵╁睍鍚庣殑鏂版暟鎹ぇ灏忎负oldArray.length + size * 娉ㄦ剰锛岃佹暟缁勭殑鍏冪礌鍦ㄦ柊鏁扮粍涓渶瑕佷繚鎸 @@ -65,9 +107,19 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ - return null; + + int[] newArr = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; + } + + return newArr; } + + + + /** * 鏂愭尝閭e鏁板垪涓猴細1锛1锛2锛3锛5锛8锛13锛21...... 锛岀粰瀹氫竴涓渶澶у硷紝 杩斿洖灏忎簬璇ュ肩殑鏁板垪 * 渚嬪锛 max = 15 , 鍒欒繑鍥炵殑鏁扮粍搴旇涓 [1锛1锛2锛3锛5锛8锛13] @@ -79,6 +131,15 @@ public int[] fibonacci(int max){ return null; } + + public static void main(String args[]) { + + ArrayUtil aUtil = new ArrayUtil(); + + + + } + /** * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] @@ -108,7 +169,13 @@ public int[] getPerfectNumbers(int max){ * @return */ public String join(int[] array, String seperator){ - return null; + 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/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java index 4e8df6912c..b242e4b73b 100644 --- a/group12/382266293/src/array/ArrayUtilTest.java +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -2,18 +2,20 @@ import static org.junit.Assert.*; import static util.TestUtil.*; - import java.util.Arrays; - +import java.util.Iterator; +import java.util.TreeSet; import static util.Print.*; import org.junit.After; import org.junit.Before; import org.junit.Test; + + public class ArrayUtilTest { - private int[] myArr; + private int[] actual; ArrayUtil au = new ArrayUtil(); @Before @@ -23,7 +25,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - myArr = null; + actual = null; } @@ -32,12 +34,12 @@ public void testReverseArray() { int size = getRandomNumber(); int[] expected = getRandomIntArray(size); - int[] myArr = Arrays.copyOf(expected, size); + actual = Arrays.copyOf(expected, size); - au.reverseArray(myArr); + au.reverseArray(actual); for (int i = 0; i < size; i++) { - assertEquals(expected[i], myArr[size-1-i]); + assertEquals(expected[i], actual[size-1-i]); } } @@ -47,16 +49,71 @@ public void testReverseArray() { @Test public void testRemoveZero() { + + int size = getRandomNumber(10000); + int[] expected = getRandomIntArray(size); + int zeros = getRandomNumber(size-1); + TreeSet t = new TreeSet(); + while (t.size() != zeros) { + t.add(getRandomNumber(size)); + } + + for (Integer i : t) { + expected[i] = 0; + } + + int expectedSize = size - zeros; + actual = au.removeZero(expected); + assertEquals(expectedSize, actual.length); + + for (int i = 0, j = 0; i < size; i++) { + if (expected[i] != 0) + assertEquals(expected[i], actual[j++]); + } + } @Test public void testMerge() { + int[] arr1 = getRandomIntArray(getRandomNumber()); + int[] arr2 = getRandomIntArray(getRandomNumber()); + Arrays.sort(arr1); + Arrays.sort(arr2); + TreeSet t = new TreeSet(); + for (int i = 0; i < arr1.length; i++) { + t.add(arr1[i]); + } + for (int i = 0; i < arr2.length; i++) { + t.add(arr2[i]); + } + int[] actual = new int[arr1.length + arr2.length]; + actual = au.merge(arr1, arr2); + + assertEquals(t.size(), actual.length); + + Iterator it = t.iterator(); + for(int i = 0; it.hasNext(); i++) { + assertEquals((int)it.next(), actual[i]); + } } @Test public void testGrow() { + int[] expected = getRandomIntArray(getRandomNumber()); + int growSize = getRandomNumber(); + int[] actual = au.grow(expected, growSize); + + assertEquals(expected.length + growSize, actual.length); + + for (int i = 0; i < actual.length; i++) { + if (i < expected.length) { + assertEquals(expected[i], actual[i]); + } else { + assertEquals(0, actual[i]); + } + } } @@ -78,6 +135,17 @@ public void testGetPerfectNumbers() { @Test public void testJoin() { + int[] expected = getRandomIntArray(getRandomNumber()); + String seperator = "-"; + String joinedString = au.join(expected, seperator); + + String[] actual = joinedString.split(seperator); + + assertEquals(expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertEquals(expected[i], Integer.parseInt(actual[i])); + } + } } From e043badb8ae24a1ffa664433fadc3f71eb850b56 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 28 Feb 2017 10:05:02 +0800 Subject: [PATCH 011/177] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E5=8C=85=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zj-2017/src/test/com/coderising/StrutsTest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java index 2cb51e3967..e11d532f7f 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java @@ -8,11 +8,6 @@ import com.coderising.litestruts.Struts; import com.coderising.litestruts.View; - - - - - public class StrutsTest { @Test From 04142847ca20fe8c23397888abfb670cbb44abd9 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 28 Feb 2017 11:20:01 +0800 Subject: [PATCH 012/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8D=95=E5=85=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/array/ArrayUtilTest.java | 119 ++++++++++++++++++ .../{ => litestruts}/StrutsTest.java | 2 +- 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java rename group12/2258659044/zj-2017/src/test/com/coderising/{ => litestruts}/StrutsTest.java (93%) diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..7eae6540bf --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,119 @@ +package test.com.coderising.array; + +import org.junit.Assert; +import org.junit.Test; + +import com.coderising.array.ArrayUtil; +import com.coding.basic.ArrayList; + +public class ArrayUtilTest { + + ArrayUtil au = new ArrayUtil(); + + @Test + public void testReverseArray() { + + int[] a = {7, 9, 30, 3, 4}; + int[] assertArray = {4,3,30,9,7}; + au.reverseArray(a); + assertResult(assertArray,a); + } + + @Test + public void testRemoveZero() { + + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] assertArray = {1,3,4,5,6,6,5,4,7,6,7,5}; + int[] newArr = au.removeZero(oldArr); + assertResult(assertArray,newArr); + + } + + @Test + public void testMerge() { + + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + int[] assertArray = {3,4,5,6,7,8}; + int[] a3 = au.merge(a1, a2); + assertResult(assertArray,a3); + } + + @Test + public void testGrow() { + + int[] oldArray = {2,3,6}; + int size = 3; + int[] assertArray = {2,3,6,0,0,0}; + int[] resultArr = au.grow(oldArray, size); + assertResult(assertArray,resultArr); + } + + @Test + public void testFibonacci() { + + int[] assertArray = {1,1,2,3,5,8,13}; + int max = 15; + int[] resultArr = au.fibonacci(max); + assertResult(assertArray,resultArr); + max = 0; + int[] assertArray1 ={}; + int[] resultArr1 = au.fibonacci(max); + assertResult(assertArray1,resultArr1); + } + + @Test + public void testGetPrimes() { + + int[] assertArray = {2,3,5,7,11,13,17,19}; + int max = 23; + int[] resultArr = au.getPrimes(max); + assertResult(assertArray,resultArr); + } + + @Test + public void testGetPerfectNumbers() { + + int[] assertArray = {6,28,496}; + int max = 496; + int[] resultArr = au.getPerfectNumbers(max); + assertResult(assertArray,resultArr); + } + + @Test + public void testJoin() { + + int[] array = {6,5,8,9}; + String seperator = "*"; + String resulStr = au.join(array, seperator); + String assertStr = "6*5*8*9"; + Assert.assertEquals(assertStr, resulStr); + } + + @Test + public void testObjList2int() { + + ArrayList ls = new ArrayList(); + for (int i = 0; i < 10; i++) { + ls.add(i); + } + int[] resulArr = au.objList2int(ls); + Assert.assertEquals(ls.size(), resulArr.length); + for (int i = 0; i < resulArr.length; i++) { + Assert.assertEquals(i, resulArr[i]); + } + } + + /** + * 鏂█鏂规硶 + * @param assertArr 鏂█闆嗗悎 + * @param resultArr 瀹為檯闆嗗悎 + */ + private void assertResult(int[] assertArr,int[] resultArr){ + + Assert.assertEquals(assertArr.length,resultArr.length); + for (int i = 0; i < resultArr.length; i++) { + Assert.assertEquals(assertArr[i],resultArr[i]); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/litestruts/StrutsTest.java similarity index 93% rename from group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java rename to group12/2258659044/zj-2017/src/test/com/coderising/litestruts/StrutsTest.java index e11d532f7f..74d04878cc 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/StrutsTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/litestruts/StrutsTest.java @@ -1,4 +1,4 @@ -package test.com.coderising; +package test.com.coderising.litestruts; import java.util.HashMap; import java.util.Map; From 653558d4986731ea50f2f4c83436c8d2ff5801ba Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 28 Feb 2017 11:21:41 +0800 Subject: [PATCH 013/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2258659044/zj-2017/src/com/coderising/litestruts/Struts.java | 1 - 1 file changed, 1 deletion(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index e75250f7a8..82e61dbcf2 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -96,7 +96,6 @@ private static Map readStrutsXml(String filePath, Document document = documentBuilder.parse(xmlFile); // 鑾峰彇鏍硅妭鐐 Element element = document.getDocumentElement(); - // http://www.jb51.net/article/44338.htm NodeList actionNodes = element.getChildNodes(); for (int i = 0; i < actionNodes.getLength(); i++) { Node actionNode = actionNodes.item(i); From 8598b0e64d177bb178413b766a7dfe9fd0b1dd39 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 28 Feb 2017 17:39:24 +0800 Subject: [PATCH 014/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9ArrayList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2258659044/zj-2017/src/com/coding/basic/ArrayList.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java index c15e99848b..017763d17e 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java @@ -54,7 +54,9 @@ public int size(){ } public Object[] toArray(){ - return elementData.clone(); + Object[] objArr = new Object[size]; + System.arraycopy(elementData, 0, objArr, 0, size); + return objArr; } /** From 1e25f0a3ccfc798b5e2825a74948143d9c654332 Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Tue, 28 Feb 2017 17:44:40 +0800 Subject: [PATCH 015/177] ArrayUtil answer and it's Junit Test example --- group12/247565311/week1/ArrayList.java | 10 +- group12/247565311/week2/ArrayUtil.java | 219 +++++++++++++++++++++ group12/247565311/week2/ArrayUtilTest.java | 141 +++++++++++++ 3 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 group12/247565311/week2/ArrayUtil.java create mode 100644 group12/247565311/week2/ArrayUtilTest.java diff --git a/group12/247565311/week1/ArrayList.java b/group12/247565311/week1/ArrayList.java index c2643af683..f15c04e289 100644 --- a/group12/247565311/week1/ArrayList.java +++ b/group12/247565311/week1/ArrayList.java @@ -30,7 +30,7 @@ public boolean add(E arg0) { } data = newdata; } - data[leng] = arg0; + data[size-1] = arg0; return true; } @@ -233,17 +233,17 @@ public Object[] toArray() { if(this.size == 0) return null; Object[] res = new Object[this.size]; for(int i=0;i T[] toArray(T[] arg0) { T[] res = (T[])(new Object[this.size]); for(int i=0;i data = new ArrayList(); + int leno = oldArray.length; + for(int i=0;i data = new ArrayList(); + int p1=0,p2=0,len1=array1.length,len2=array2.length; + int val1=0,val2=0; + if(len1 == 0) return array2; + if(len2 == 0) return array1; + while(p1=len1){ + data.add(array2[p2]); + p2 += 1; + continue; + } + if(p2>=len2){ + data.add(array1[p1]); + p1 += 1; + continue; + } + if(p1val2){ + data.add(val2); + p2 += 1; + }else if(val1 data = new ArrayList(); + data.add(llast); + data.add(last); + while(last+llast li = new ArrayList(); + int cur = 2; + while(cur li = null,resli = new ArrayList(); + for(int i=6;i getAllElem(int arg0){ + ArrayList res = new ArrayList(); + for(int i=1;i Date: Tue, 28 Feb 2017 19:56:50 +0800 Subject: [PATCH 016/177] copyFromliuxin --- .../495473393/coderising/array/ArrayUtil.java | 96 +++++++++++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++++++++ .../coderising/litestruts/Struts.java | 34 +++++++ .../coderising/litestruts/StrutsTest.java | 43 +++++++++ .../495473393/coderising/litestruts/View.java | 23 +++++ .../coderising/litestruts/struts.xml | 11 +++ 6 files changed, 246 insertions(+) create mode 100644 group12/495473393/coderising/array/ArrayUtil.java create mode 100644 group12/495473393/coderising/litestruts/LoginAction.java create mode 100644 group12/495473393/coderising/litestruts/Struts.java create mode 100644 group12/495473393/coderising/litestruts/StrutsTest.java create mode 100644 group12/495473393/coderising/litestruts/View.java create mode 100644 group12/495473393/coderising/litestruts/struts.xml diff --git a/group12/495473393/coderising/array/ArrayUtil.java b/group12/495473393/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..e5ddb476a6 --- /dev/null +++ b/group12/495473393/coderising/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/group12/495473393/coderising/litestruts/LoginAction.java b/group12/495473393/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group12/495473393/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/group12/495473393/coderising/litestruts/Struts.java b/group12/495473393/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group12/495473393/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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + 鎹畃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/group12/495473393/coderising/litestruts/StrutsTest.java b/group12/495473393/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group12/495473393/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/group12/495473393/coderising/litestruts/View.java b/group12/495473393/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group12/495473393/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/group12/495473393/coderising/litestruts/struts.xml b/group12/495473393/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group12/495473393/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 From eb8351a74c2c2a2a4316b64f549ca1e94f6d7038 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Tue, 28 Feb 2017 20:15:18 +0800 Subject: [PATCH 017/177] Array Exs --- group12/382266293/src/array/ArrayUtil.java | 97 ++++++++++++++----- .../382266293/src/array/ArrayUtilTest.java | 20 ++-- 2 files changed, 89 insertions(+), 28 deletions(-) diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index aafa3c410c..f33f64150b 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -1,9 +1,11 @@ package array; import static util.Print.*; - import java.util.Arrays; import java.util.BitSet; +import Collection.Iterator; +import Collection.Concrete.ArrayList; + public class ArrayUtil { @@ -25,7 +27,6 @@ public void reverseArray(int[] origin){ origin[i] = origin[index - i]; origin[index - i] = temp; } - } @@ -59,7 +60,6 @@ public int[] removeZero(int[] oldArray){ } - /** * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 * 渚嬪 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 鍒 a3 涓篬3,4,5,6,7,8] , 娉ㄦ剰锛 宸茬粡娑堥櫎浜嗛噸澶 @@ -95,8 +95,6 @@ public static void initialArray(int[] arr, int j) { } } - - /** * 鎶婁竴涓凡缁忓瓨婊℃暟鎹殑鏁扮粍 oldArray鐨勫閲忚繘琛屾墿灞曪紝 鎵╁睍鍚庣殑鏂版暟鎹ぇ灏忎负oldArray.length + size * 娉ㄦ剰锛岃佹暟缁勭殑鍏冪礌鍦ㄦ柊鏁扮粍涓渶瑕佷繚鎸 @@ -112,13 +110,9 @@ public int[] grow(int [] oldArray, int size){ for (int i = 0; i < oldArray.length; i++) { newArr[i] = oldArray[i]; } - return newArr; } - - - - + /** * 鏂愭尝閭e鏁板垪涓猴細1锛1锛2锛3锛5锛8锛13锛21...... 锛岀粰瀹氫竴涓渶澶у硷紝 杩斿洖灏忎簬璇ュ肩殑鏁板垪 @@ -128,16 +122,17 @@ public int[] grow(int [] oldArray, int size){ * @return */ public int[] fibonacci(int max){ - return null; - } - - - public static void main(String args[]) { - - ArrayUtil aUtil = new ArrayUtil(); - - - + if (max == 1) + return new int[0]; + int[] result = new int[max]; + result[0] = result[1] = 1; + int count = 0; + for (int i = 2, j = 0; j < max ; i++) { + result[i] = result[i-1] + result[i-2]; + j = result[i]; + count++; + } + return Arrays.copyOf(result, ++count); } /** @@ -147,9 +142,39 @@ public static void main(String args[]) { * @return */ public int[] getPrimes(int max){ - return null; + + String temp = ""; + for(int i = 0; i < max; i++) { + if(isPrime(i)) { + temp += i + " "; + } + } + String[] tempArr = temp.split(" "); + int[] result = new int[tempArr.length]; + for (int i = 0; i < result.length; i++) { + result[i] = Integer.parseInt(tempArr[i]); + } + + return result; } + public static boolean isPrime(int num) { + + if (num <= 1) + return false; + + if (num == 2) + return true; + + for(int i = 2; i <= Math.sqrt(num) + 1; i++) { + if (num % i == 0) + return false; + } + + return true; + } + + /** * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 @@ -157,8 +182,36 @@ public int[] getPrimes(int max){ * @return */ public int[] getPerfectNumbers(int max){ - return null; + + int count = 0; + ArrayList myList = new ArrayList(); + for(int i = 1; i < max; i++) { + if(isPerfectNum(i)) { + count++; + myList.add(i); + } + } + int[] result = new int[count]; + Iterator iterator = myList.iterator(); + for (int i = 0; i < count; i++) { + result[i] = iterator.next(); + } + return result; + } + + + public static boolean isPerfectNum(int num) { + + int sum = 0; + for (int i = 1; i <= num/2; i++) { + if (num % i == 0) + sum += i; + } + + return (num == sum) ? true : false; + } + /** * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 diff --git a/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java index b242e4b73b..22a3250613 100644 --- a/group12/382266293/src/array/ArrayUtilTest.java +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -43,9 +43,6 @@ public void testReverseArray() { } } - - - @Test public void testRemoveZero() { @@ -119,17 +116,28 @@ public void testGrow() { @Test public void testFibonacci() { - + int[] expected = new int[] {1, 1, 2, 3, 5, 8, 13}; + int[] acutal = new int[expected.length]; + actual = au.fibonacci(15); + assertArrayEquals(expected,actual); } @Test public void testGetPrimes() { - + + int[] expected = new int[] {2,3,5,7,11,13,17,19}; + int[] acutal = new int[expected.length]; + actual = au.getPrimes(23); + assertArrayEquals(expected,actual); } @Test public void testGetPerfectNumbers() { - + + int[] expected = new int[] {6, 28, 496, 8128}; + int[] acutal = new int[expected.length]; + actual = au.getPerfectNumbers(10000); + assertArrayEquals(expected,actual); } @Test From 518245aada91188166d2257dd0172fa476fae8d2 Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Tue, 28 Feb 2017 22:01:22 +0800 Subject: [PATCH 018/177] Only commit Only commit --- .../src/com/coderising/array/ArrayUtil.java | 135 ++++++++++++++++++ .../com/coderising/array/ArrayUtilTest.java | 73 ++++++++++ 2 files changed, 208 insertions(+) create mode 100644 group12/446031103/src/com/coderising/array/ArrayUtil.java create mode 100644 group12/446031103/src/com/coderising/array/ArrayUtilTest.java diff --git a/group12/446031103/src/com/coderising/array/ArrayUtil.java b/group12/446031103/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..fbbe3c1c89 --- /dev/null +++ b/group12/446031103/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,135 @@ +package com.coderising.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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; + int temp ; + for (int i = 0; i < end; i++,end--) { + temp=origin[i]; + origin[i]=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){ + int zeroCnt = 0; + for (int i : oldArray) { + if(0==i){ + zeroCnt++; + } + + } + int size = 0; + int [] result = new int[oldArray.length-zeroCnt]; + for (int i : oldArray) { + if(0!=i){ + result[size]=i; + size++; + } + + } + return result; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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 repetition = 0; + for (int i : array2) { + if(Arrays.asList(array1).contains(i)) + repetition++; + } + int [] result =Arrays.copyOf(array1, array1.length+array2.length-repetition); + int size = 0; + for (int i = 0; i < array2.length; i++) { + int temp=array2[i]; + if(!Arrays.asList(array1).contains(temp)){ + result[array1.length+size]=temp; + 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 int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/group12/446031103/src/com/coderising/array/ArrayUtilTest.java b/group12/446031103/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..7cfdce4313 --- /dev/null +++ b/group12/446031103/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,73 @@ +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; + +import junit.framework.Assert; + +public class ArrayUtilTest { + ArrayUtil au = new ArrayUtil(); + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @SuppressWarnings("deprecation") + @Test + public void testReverseArray() { + int [] origin = {4,7, 9 , 30, 3}; + au.reverseArray(origin); + Assert.assertEquals(3, origin[0]); + Assert.assertEquals(30, origin[1]); + Assert.assertEquals(9, origin[2]); + Assert.assertEquals(7, origin[3]); + Assert.assertEquals(4, origin[4]); + } + + @SuppressWarnings("deprecation") + @Test + public void testRemoveZero() { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int [] result=au.removeZero(oldArr); + Assert.assertEquals(false, Arrays.asList(result).contains(0)); + } + + @Test + public void testMerge() { + fail("Not yet implemented"); + } + + @Test + public void testGrow() { + fail("Not yet implemented"); + } + + @Test + public void testFibonacci() { + fail("Not yet implemented"); + } + + @Test + public void testGetPrimes() { + fail("Not yet implemented"); + } + + @Test + public void testGetPerfectNumbers() { + fail("Not yet implemented"); + } + + @Test + public void testJoin() { + fail("Not yet implemented"); + } + +} From 64cc020cc19d695e309b38d8958a3f8ba9223572 Mon Sep 17 00:00:00 2001 From: tanghaojie Date: Tue, 28 Feb 2017 23:15:00 +0800 Subject: [PATCH 019/177] SomeChange --- group12/{495473393/Coding => }/.gitignore | 0 group12/495473393/Code/.gitignore | 4 + .../org.eclipse.core.resources.prefs | 3 + .../495473393/Code/src/Week1/ArrayList.java | 34 ++++ .../src/Week1}/BinaryTreeNode.java | 17 +- .../src/Base => Code/src/Week1}/Iterator.java | 4 +- .../495473393/Code/src/Week1/LinkedList.java | 37 +++++ .../src/Base => Code/src/Week1}/List.java | 6 +- group12/495473393/Code/src/Week1/Queue.java | 19 +++ .../src/Base => Code/src/Week1}/Stack.java | 20 +-- .../Code/src/Week2/array/ArrayUtil.java | 145 ++++++++++++++++++ .../495473393/Code/src/Week2/array/Main.java | 15 ++ .../src/Week2}/litestruts/LoginAction.java | 2 +- .../src/Week2}/litestruts/Struts.java | 2 +- .../src/Week2}/litestruts/StrutsTest.java | 2 +- .../src/Week2}/litestruts/View.java | 2 +- .../src/Week2}/litestruts/struts.xml | 0 .../495473393/Coding/src/Base/ArrayList.java | 32 ---- .../495473393/Coding/src/Base/LinkedList.java | 46 ------ group12/495473393/Coding/src/Base/Queue.java | 19 --- .../495473393/coderising/array/ArrayUtil.java | 96 ------------ 21 files changed, 289 insertions(+), 216 deletions(-) rename group12/{495473393/Coding => }/.gitignore (100%) create mode 100644 group12/495473393/Code/.gitignore create mode 100644 group12/495473393/Code/.settings/org.eclipse.core.resources.prefs create mode 100644 group12/495473393/Code/src/Week1/ArrayList.java rename group12/495473393/{Coding/src/Base => Code/src/Week1}/BinaryTreeNode.java (85%) rename group12/495473393/{Coding/src/Base => Code/src/Week1}/Iterator.java (84%) create mode 100644 group12/495473393/Code/src/Week1/LinkedList.java rename group12/495473393/{Coding/src/Base => Code/src/Week1}/List.java (90%) create mode 100644 group12/495473393/Code/src/Week1/Queue.java rename group12/495473393/{Coding/src/Base => Code/src/Week1}/Stack.java (50%) create mode 100644 group12/495473393/Code/src/Week2/array/ArrayUtil.java create mode 100644 group12/495473393/Code/src/Week2/array/Main.java rename group12/495473393/{coderising => Code/src/Week2}/litestruts/LoginAction.java (96%) rename group12/495473393/{coderising => Code/src/Week2}/litestruts/Struts.java (96%) rename group12/495473393/{coderising => Code/src/Week2}/litestruts/StrutsTest.java (96%) rename group12/495473393/{coderising => Code/src/Week2}/litestruts/View.java (91%) rename group12/495473393/{coderising => Code/src/Week2}/litestruts/struts.xml (100%) delete mode 100644 group12/495473393/Coding/src/Base/ArrayList.java delete mode 100644 group12/495473393/Coding/src/Base/LinkedList.java delete mode 100644 group12/495473393/Coding/src/Base/Queue.java delete mode 100644 group12/495473393/coderising/array/ArrayUtil.java diff --git a/group12/495473393/Coding/.gitignore b/group12/.gitignore similarity index 100% rename from group12/495473393/Coding/.gitignore rename to group12/.gitignore diff --git a/group12/495473393/Code/.gitignore b/group12/495473393/Code/.gitignore new file mode 100644 index 0000000000..ff3a56dc08 --- /dev/null +++ b/group12/495473393/Code/.gitignore @@ -0,0 +1,4 @@ +/bin/ + +*.classpath +*.project \ No newline at end of file diff --git a/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs b/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..3a0682eb48 --- /dev/null +++ b/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/Week2/array/ArrayUtil.java=UTF-8 +encoding/src=UTF-8 diff --git a/group12/495473393/Code/src/Week1/ArrayList.java b/group12/495473393/Code/src/Week1/ArrayList.java new file mode 100644 index 0000000000..3614ed930a --- /dev/null +++ b/group12/495473393/Code/src/Week1/ArrayList.java @@ -0,0 +1,34 @@ +package Week1; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + @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 int size() { + return 0; + } + +} diff --git a/group12/495473393/Coding/src/Base/BinaryTreeNode.java b/group12/495473393/Code/src/Week1/BinaryTreeNode.java similarity index 85% rename from group12/495473393/Coding/src/Base/BinaryTreeNode.java rename to group12/495473393/Code/src/Week1/BinaryTreeNode.java index 875abe8c80..d5518b7b96 100644 --- a/group12/495473393/Coding/src/Base/BinaryTreeNode.java +++ b/group12/495473393/Code/src/Week1/BinaryTreeNode.java @@ -1,32 +1,35 @@ -package Base; +package Week1; 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 insert(Object o) { + return null; } - } diff --git a/group12/495473393/Coding/src/Base/Iterator.java b/group12/495473393/Code/src/Week1/Iterator.java similarity index 84% rename from group12/495473393/Coding/src/Base/Iterator.java rename to group12/495473393/Code/src/Week1/Iterator.java index 19b65c3637..b6075594ac 100644 --- a/group12/495473393/Coding/src/Base/Iterator.java +++ b/group12/495473393/Code/src/Week1/Iterator.java @@ -1,7 +1,7 @@ -package Base; +package Week1; public interface Iterator { public boolean hasNext(); - public Object next(); + public Object next(); } diff --git a/group12/495473393/Code/src/Week1/LinkedList.java b/group12/495473393/Code/src/Week1/LinkedList.java new file mode 100644 index 0000000000..9a77242c40 --- /dev/null +++ b/group12/495473393/Code/src/Week1/LinkedList.java @@ -0,0 +1,37 @@ +package Week1; + +public class LinkedList implements List { + + 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 int size() { + return 0; + } + + private static class Node { + Object data; + Node next; + } + +} diff --git a/group12/495473393/Coding/src/Base/List.java b/group12/495473393/Code/src/Week1/List.java similarity index 90% rename from group12/495473393/Coding/src/Base/List.java rename to group12/495473393/Code/src/Week1/List.java index 6c910af600..6785ebabbf 100644 --- a/group12/495473393/Coding/src/Base/List.java +++ b/group12/495473393/Code/src/Week1/List.java @@ -1,9 +1,13 @@ -package Base; +package 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/group12/495473393/Code/src/Week1/Queue.java b/group12/495473393/Code/src/Week1/Queue.java new file mode 100644 index 0000000000..a03fd44b6b --- /dev/null +++ b/group12/495473393/Code/src/Week1/Queue.java @@ -0,0 +1,19 @@ +package Week1; + +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/Code/src/Week1/Stack.java similarity index 50% rename from group12/495473393/Coding/src/Base/Stack.java rename to group12/495473393/Code/src/Week1/Stack.java index 8f59343d4b..074f310add 100644 --- a/group12/495473393/Coding/src/Base/Stack.java +++ b/group12/495473393/Code/src/Week1/Stack.java @@ -1,22 +1,24 @@ -package Base; +package Week1; public class Stack { private ArrayList elementData = new ArrayList(); - - public void push(Object o){ + + public void push(Object o) { } - - public Object pop(){ + + public Object pop() { return null; } - - public Object peek(){ + + public Object peek() { return null; } - public boolean isEmpty(){ + + public boolean isEmpty() { return false; } - public int size(){ + + public int size() { return -1; } } diff --git a/group12/495473393/Code/src/Week2/array/ArrayUtil.java b/group12/495473393/Code/src/Week2/array/ArrayUtil.java new file mode 100644 index 0000000000..a280dd49c9 --- /dev/null +++ b/group12/495473393/Code/src/Week2/array/ArrayUtil.java @@ -0,0 +1,145 @@ +package Week2.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 渚嬪锛 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 forLen = len / 2; + int temp; + for (int i = 0; i < forLen; 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[] newArray = new int[oldArray.length]; + int index = 0; + for (int x : oldArray) { + if (x != 0) { + newArray[index] = x; + index++; + } + } + return Arrays.copyOf(newArray, index); + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 渚嬪 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 newIndex = 0; + int index1 = 0; + int index2 = 0; + int len1 = array1.length; + int len2 = array2.length; + int x; + int y; + while (index1 < len1 && index2 < len2) { + x = array1[index1]; + y = array2[index2]; + if (x < y) { + newArray[newIndex] = x; + index1++; + } else if (x == y) { + newArray[newIndex] = x; + index1++; + index2++; + } else { + newArray[newIndex] = y; + index2++; + } + newIndex++; + } + for (int i = index1; i < len1; i++) { + newArray[newIndex] = array1[i]; + newIndex++; + } + for (int i = index2; i < len2; i++) { + newArray[newIndex] = array2[i]; + newIndex++; + } + return Arrays.copyOf(newArray, newIndex); + } + + /** + * 鎶婁竴涓凡缁忓瓨婊℃暟鎹殑鏁扮粍 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/group12/495473393/Code/src/Week2/array/Main.java b/group12/495473393/Code/src/Week2/array/Main.java new file mode 100644 index 0000000000..ad4388fe87 --- /dev/null +++ b/group12/495473393/Code/src/Week2/array/Main.java @@ -0,0 +1,15 @@ +package Week2.array; + +public class Main { + + public static void main(String[] args) { + ArrayUtil arrayUtil = new ArrayUtil(); + int[] a = { 1,3,5,7}; + int[] b={ 2,4,6,8,}; + int[] x = arrayUtil.merge(a,b); + for (int i : x) { + System.out.println(i); + } + } + +} diff --git a/group12/495473393/coderising/litestruts/LoginAction.java b/group12/495473393/Code/src/Week2/litestruts/LoginAction.java similarity index 96% rename from group12/495473393/coderising/litestruts/LoginAction.java rename to group12/495473393/Code/src/Week2/litestruts/LoginAction.java index dcdbe226ed..de7a05b462 100644 --- a/group12/495473393/coderising/litestruts/LoginAction.java +++ b/group12/495473393/Code/src/Week2/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts; +package Week2.litestruts; /** * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 diff --git a/group12/495473393/coderising/litestruts/Struts.java b/group12/495473393/Code/src/Week2/litestruts/Struts.java similarity index 96% rename from group12/495473393/coderising/litestruts/Struts.java rename to group12/495473393/Code/src/Week2/litestruts/Struts.java index 85e2e22de3..db818b0924 100644 --- a/group12/495473393/coderising/litestruts/Struts.java +++ b/group12/495473393/Code/src/Week2/litestruts/Struts.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts; +package Week2.litestruts; import java.util.Map; diff --git a/group12/495473393/coderising/litestruts/StrutsTest.java b/group12/495473393/Code/src/Week2/litestruts/StrutsTest.java similarity index 96% rename from group12/495473393/coderising/litestruts/StrutsTest.java rename to group12/495473393/Code/src/Week2/litestruts/StrutsTest.java index b8c81faf3c..326e33daee 100644 --- a/group12/495473393/coderising/litestruts/StrutsTest.java +++ b/group12/495473393/Code/src/Week2/litestruts/StrutsTest.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts; +package Week2.litestruts; import java.util.HashMap; import java.util.Map; diff --git a/group12/495473393/coderising/litestruts/View.java b/group12/495473393/Code/src/Week2/litestruts/View.java similarity index 91% rename from group12/495473393/coderising/litestruts/View.java rename to group12/495473393/Code/src/Week2/litestruts/View.java index 07df2a5dab..5abed5f20d 100644 --- a/group12/495473393/coderising/litestruts/View.java +++ b/group12/495473393/Code/src/Week2/litestruts/View.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts; +package Week2.litestruts; import java.util.Map; diff --git a/group12/495473393/coderising/litestruts/struts.xml b/group12/495473393/Code/src/Week2/litestruts/struts.xml similarity index 100% rename from group12/495473393/coderising/litestruts/struts.xml rename to group12/495473393/Code/src/Week2/litestruts/struts.xml 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/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/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/coderising/array/ArrayUtil.java b/group12/495473393/coderising/array/ArrayUtil.java deleted file mode 100644 index e5ddb476a6..0000000000 --- a/group12/495473393/coderising/array/ArrayUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coderising.array; - -public class ArrayUtil { - - /** - * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 - 渚嬪锛 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鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 - * 渚嬪 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; - } - - /** - * 鏂愭尝閭e鏁板垪涓猴細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; - } - - /** - * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 - * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - return null; - } - - /** - * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 - * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - return null; - } - - /** - * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 - * 渚嬪array= [3,8,9], seperator = "-" - * 鍒欒繑鍥炲间负"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator){ - return null; - } - - -} From 2bbaec8cc749ad8233df36ebfaa4c93b3791d09f Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Wed, 1 Mar 2017 07:38:03 +0800 Subject: [PATCH 020/177] Structs half done --- group12/382266293/.classpath | 1 + .../382266293/coding/basic/util/Print.java | 2 +- .../coding/basic/util/XMLreader.java | 51 +++++++ group12/382266293/src/TestDom4J.java | 59 -------- .../coderising/action}/LoginAction.java | 2 +- group12/382266293/src/litestruts/Struts.java | 139 +++++++++++++++++- .../382266293/src/litestruts/StrutsTest.java | 6 +- group12/382266293/src/litestruts/struts.xml | 4 +- 8 files changed, 196 insertions(+), 68 deletions(-) create mode 100644 group12/382266293/coding/basic/util/XMLreader.java delete mode 100644 group12/382266293/src/TestDom4J.java rename group12/382266293/src/{litestruts => com/coderising/action}/LoginAction.java (92%) diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath index 97b7b051d0..300ed0c62f 100644 --- a/group12/382266293/.classpath +++ b/group12/382266293/.classpath @@ -5,5 +5,6 @@ + diff --git a/group12/382266293/coding/basic/util/Print.java b/group12/382266293/coding/basic/util/Print.java index 81b5cf539e..403339f9aa 100644 --- a/group12/382266293/coding/basic/util/Print.java +++ b/group12/382266293/coding/basic/util/Print.java @@ -12,7 +12,7 @@ public static void println(Object o){ System.out.println(o); } - public static void printArr(int[] arr) { + public static void printArr(Object[] arr) { println(Arrays.toString(arr)); } diff --git a/group12/382266293/coding/basic/util/XMLreader.java b/group12/382266293/coding/basic/util/XMLreader.java new file mode 100644 index 0000000000..b7a345f7e6 --- /dev/null +++ b/group12/382266293/coding/basic/util/XMLreader.java @@ -0,0 +1,51 @@ +package util; +import java.net.URL; +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.Node; +import org.dom4j.io.SAXReader; + +import static util.Print.*; + +public class XMLreader { + + private static String address = "src/litestruts/struts.xml"; + + public Document parse(String add) throws DocumentException { + SAXReader reader = new SAXReader(); + Document document = reader.read(add); + return document; + } + + public String parseClass(String attr) { + + Document doc = null; + try { + doc = parse(address); + } catch (DocumentException e1) { + e1.printStackTrace(); + } + + Node root = doc.getRootElement(); + List list = root.selectNodes("action[@name='" + attr + "']"); + String clazz = null; + for(Object o:list){ + Element e = (Element) o; + clazz=e.attributeValue("class"); + System.out.println("class = " + clazz); + } + return clazz; + } + + public static void main(String args[]) throws DocumentException { + XMLreader reader = new XMLreader(); + reader.parseClass("login"); + + } + +} diff --git a/group12/382266293/src/TestDom4J.java b/group12/382266293/src/TestDom4J.java deleted file mode 100644 index b5dabfcc0c..0000000000 --- a/group12/382266293/src/TestDom4J.java +++ /dev/null @@ -1,59 +0,0 @@ -import java.net.URL; -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.Node; -import org.dom4j.io.SAXReader; - -import static util.Print.*; - -public class TestDom4J { - - public Document parse(String add) throws DocumentException { - SAXReader reader = new SAXReader(); - Document document = reader.read(add); - return document; - } - - - - public void bar(Document document) { - List list = document.selectNodes( "/struts-config/action-mappings/action" ); - Node node = document.selectSingleNode( "/struts-config/action-mappings/action/forward" ); - - String name = node.valueOf( "@name" ); - println(name); - } - - 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); - } - } - - public static void main(String args[]) throws DocumentException { - - - - } - -} diff --git a/group12/382266293/src/litestruts/LoginAction.java b/group12/382266293/src/com/coderising/action/LoginAction.java similarity index 92% rename from group12/382266293/src/litestruts/LoginAction.java rename to group12/382266293/src/com/coderising/action/LoginAction.java index c37c250014..b1224eb80d 100644 --- a/group12/382266293/src/litestruts/LoginAction.java +++ b/group12/382266293/src/com/coderising/action/LoginAction.java @@ -1,4 +1,4 @@ -package litestruts; +package com.coderising.action; /** * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index f26fa8d8b7..088e88fdec 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -1,12 +1,26 @@ package litestruts; +import static util.Print.println; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.MethodDescriptor; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; import java.util.Map; +import util.XMLreader; + public class Struts { - public static View runAction(String actionName, Map parameters) { + static Object actionObj; + static Object viewObj; + + public static View runAction(String actionName, Map parameters) throws IntrospectionException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { /* @@ -25,10 +39,129 @@ public static View runAction(String actionName, Map parameters) { 4. 鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲硷紝 纭畾鍝竴涓猨sp锛 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + */ - return null; - } + XMLreader reader = new XMLreader(); + String clazz = reader.parseClass(actionName); + + actionObj = getObj(clazz); + + setParams(actionObj,parameters); + invoke(actionObj,"execute"); + + Map viewParams = getViewParams(actionObj); + println(viewParams); + viewObj = getObj("litestruts.View"); + + setParams(viewObj,viewParams); + + return (View) viewObj; + } + + + private static Object getObj(String clazz) { + Class cls = null; + try { + cls = Class.forName(clazz); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + try { + return cls.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + return cls; + } + + + public static Map getViewParams (Object obj) { + + PropertyDescriptor[] pd0 = getPropertyDescriptor(obj); + Map viewParams = new HashMap(); + + for (int i = 0; i < pd0.length; i++) { + String readMethod = pd0[i].getReadMethod().getName().substring(3); + String value = null; + try { + value = (String) pd0[i].getReadMethod().invoke(obj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + viewParams.put(readMethod.toLowerCase(), value); + } + return viewParams; + } + + + private static PropertyDescriptor[] getPropertyDescriptor(Object obj) { + + BeanInfo bi0 = getBeanInfo(obj); + PropertyDescriptor[] pd0 = bi0.getPropertyDescriptors(); + return pd0; + } + + private static BeanInfo getBeanInfo(Object obj) { + + BeanInfo bi0 = null; + try { + bi0 = Introspector.getBeanInfo(obj.getClass(), Object.class); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + return bi0; + } + + private static void setParams(Object pb0, Map parameters) { + + PropertyDescriptor[] pd0 = getPropertyDescriptor(pb0); + + for (int i = 0; i < pd0.length; i++) { + String name = pd0[i].getName(); + if(parameters.containsKey(name)) + try { + pd0[i].getWriteMethod().invoke(pb0,parameters.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + private static void invoke(Object obj, String execute) { + BeanInfo bi0 = getBeanInfo(obj); + MethodDescriptor[] methods = bi0.getMethodDescriptors(); + for (int i = 0; i < methods.length; i++) { + String methodName = methods[i].getName(); + if(methodName.equals(execute)) + try { + println(methods[i].getMethod().invoke(actionObj)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + + } + + + public static void main(String args[]) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = runAction("login",params); + println(view.getParameters()); + + } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java index e08fab55c9..67893b9f3b 100644 --- a/group12/382266293/src/litestruts/StrutsTest.java +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -1,5 +1,7 @@ package litestruts; +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; @@ -13,7 +15,7 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() { + public void testLoginActionSuccess() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "login"; @@ -29,7 +31,7 @@ public void testLoginActionSuccess() { } @Test - public void testLoginActionFailed() { + public void testLoginActionFailed() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "login"; Map params = new HashMap(); params.put("name","test"); diff --git a/group12/382266293/src/litestruts/struts.xml b/group12/382266293/src/litestruts/struts.xml index 99063bcb0c..fb0c2be3de 100644 --- a/group12/382266293/src/litestruts/struts.xml +++ b/group12/382266293/src/litestruts/struts.xml @@ -5,7 +5,7 @@ /jsp/showLogin.jsp - /jsp/welcome.jsp - /jsp/error.jsp + /jsp/welcome.jsp + /jsp/error.jsp \ No newline at end of file From 47f11b37b9da1dfe0ac02c7d45bb9b7ba8b7e9d4 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Wed, 1 Mar 2017 07:40:23 +0800 Subject: [PATCH 021/177] ignore file updaet --- group12/382266293/lib/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/group12/382266293/lib/.gitignore b/group12/382266293/lib/.gitignore index 3d08860a86..edf7850106 100644 --- a/group12/382266293/lib/.gitignore +++ b/group12/382266293/lib/.gitignore @@ -1 +1,3 @@ /dom4j-1.6.1.zip +/jaxen-1.1-beta-6.jar +/dom4j-1.6.1.jar From b0bfb33cd3b56bc8efe0b271a406b3ed850e82b3 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Wed, 1 Mar 2017 12:57:51 +0800 Subject: [PATCH 022/177] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BD=8D=E5=9B=BE?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/array/ArrayUtil.java | 29 +++++++++++++++++++ .../com/coderising/array/ArrayUtilTest.java | 5 ++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java b/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java index fe8f130afb..3f41a350e8 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java +++ b/group12/2258659044/zj-2017/src/com/coderising/array/ArrayUtil.java @@ -93,6 +93,35 @@ private int[] duplicate(int[] array){ return removeZero(array); } + /** + * 浣嶅浘娉曞悎骞 + * @param array1 + * @param array2 + * @return + */ + public int[] merge2(int[] array1, int[] array2){ + + int bitSize = 0; + int a = array1[array1.length-1] ; + int b = array2[array2.length-1]; + bitSize =(a>b)?a:b; + boolean[] bitmap = new boolean[bitSize+1]; + for (int i = 0; i < array1.length; i++) { + bitmap[array1[i]]=true; + } + for (int i = 0; i < array2.length; i++) { + bitmap[array2[i]]=true; + } + + ArrayList ls = new ArrayList(); + for (int i = 0; i < bitmap.length; i++) { + if(bitmap[i]==true){ + ls.add(i); + } + } + return objList2int(ls); + } + /** * 鎶婁竴涓凡缁忓瓨婊℃暟鎹殑鏁扮粍 oldArray鐨勫閲忚繘琛屾墿灞曪紝 鎵╁睍鍚庣殑鏂版暟鎹ぇ灏忎负oldArray.length + size * 娉ㄦ剰锛岃佹暟缁勭殑鍏冪礌鍦ㄦ柊鏁扮粍涓渶瑕佷繚鎸 diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java index 7eae6540bf..ea04dbbf3b 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/array/ArrayUtilTest.java @@ -34,8 +34,9 @@ public void testMerge() { int[] a1 = {3, 5, 7,8}; int[] a2 = {4, 5, 6,7}; - int[] assertArray = {3,4,5,6,7,8}; - int[] a3 = au.merge(a1, a2); + int[] assertArray = {3,4,5,6,7,8}; + //int[] a3 = au.merge(a1, a2); + int[] a3 = au.merge2(a1, a2); assertResult(assertArray,a3); } From dd2085c6b2faee4ba3b457347b5a21d2e1e1b23f Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Wed, 1 Mar 2017 15:22:16 +0800 Subject: [PATCH 023/177] ArrayUtil complete ArrayUtil complete --- .../src/com/coderising/array/ArrayUtil.java | 113 ++++++++++++++---- .../com/coderising/array/ArrayUtilTest.java | 53 +++++++- 2 files changed, 138 insertions(+), 28 deletions(-) diff --git a/group12/446031103/src/com/coderising/array/ArrayUtil.java b/group12/446031103/src/com/coderising/array/ArrayUtil.java index fbbe3c1c89..751de62bcf 100644 --- a/group12/446031103/src/com/coderising/array/ArrayUtil.java +++ b/group12/446031103/src/com/coderising/array/ArrayUtil.java @@ -1,6 +1,8 @@ package com.coderising.array; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class ArrayUtil { @@ -12,6 +14,7 @@ public class ArrayUtil { * @return */ public void reverseArray(int[] origin){ + //寰幆缁撴潫浣嶇疆 int end = origin.length-1; int temp ; for (int i = 0; i < end; i++,end--) { @@ -29,14 +32,16 @@ public void reverseArray(int[] origin){ * @return */ - public int[] removeZero(int[] oldArray){ + public int[] removeZero(int[] oldArray){ + //0鐨勪釜鏁 int zeroCnt = 0; for (int i : oldArray) { if(0==i){ zeroCnt++; } - } + } + //瀛樻斁浣嶇疆璁板綍 int size = 0; int [] result = new int[oldArray.length-zeroCnt]; for (int i : oldArray) { @@ -57,22 +62,31 @@ public int[] removeZero(int[] oldArray){ * @return */ - public int[] merge(int[] array1, int[] array2){ - int repetition = 0; - for (int i : array2) { - if(Arrays.asList(array1).contains(i)) - repetition++; + public 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); + List resultList= new ArrayList(); + for (int i : temp) { + if(!resultList.contains(i)) + resultList.add(i); } - int [] result =Arrays.copyOf(array1, array1.length+array2.length-repetition); - int size = 0; - for (int i = 0; i < array2.length; i++) { - int temp=array2[i]; - if(!Arrays.asList(array1).contains(temp)){ - result[array1.length+size]=temp; - size++; + //宸插幓閲嶆暟缁勶紝缂烘帓搴 + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(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 tempInt = result[j]; + result[j] =result[j+1]; + result[j+1] = tempInt; + } } - - } + } return result; } /** @@ -85,7 +99,7 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ - return null; + return Arrays.copyOf(oldArray, oldArray.length+size); } /** @@ -96,7 +110,16 @@ public int[] grow(int [] oldArray, int size){ * @return */ public int[] fibonacci(int max){ - return null; + int first =0; + int second = 1; + List resultList= new ArrayList(); + if(max!=second) + add(first,second,max,resultList); + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** @@ -106,7 +129,23 @@ public int[] fibonacci(int max){ * @return */ public int[] getPrimes(int max){ - return null; + List resultList= new ArrayList(); + for (int i = 2; i < max; i++) { + boolean isAdd = true; + for (int j = 2; j < i; j++) { + if(0==i%j){ + isAdd = false; + break; + } + } + if(isAdd) + resultList.add(i); + } + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** @@ -116,7 +155,22 @@ public int[] getPrimes(int max){ * @return */ public int[] getPerfectNumbers(int max){ - return null; + List resultList= new ArrayList(); + for (int i = 1; i < max; i++) { + int temp = 0; + for (int j = 1; j < i; j++) { + if(0==i%j){ + temp+=j; + } + } + if(i==temp) + resultList.add(i); + } + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** @@ -128,8 +182,23 @@ public int[] getPerfectNumbers(int max){ * @return */ public String join(int[] array, String seperator){ - return null; + return Arrays.toString(array).replace("[", "").replace("]", "").replace(", ", seperator); } - + /** + * + * @param number1 + * @param number2 + * @param max + * @param resultList + * @return + */ + public List add(int number1,int number2,int max,List resultList){ + if(number2 Date: Wed, 1 Mar 2017 15:31:29 +0800 Subject: [PATCH 024/177] Revert "ArrayUtil complete" This reverts commit dd2085c6b2faee4ba3b457347b5a21d2e1e1b23f. --- .../src/com/coderising/array/ArrayUtil.java | 113 ++++-------------- .../com/coderising/array/ArrayUtilTest.java | 53 +------- 2 files changed, 28 insertions(+), 138 deletions(-) diff --git a/group12/446031103/src/com/coderising/array/ArrayUtil.java b/group12/446031103/src/com/coderising/array/ArrayUtil.java index 751de62bcf..fbbe3c1c89 100644 --- a/group12/446031103/src/com/coderising/array/ArrayUtil.java +++ b/group12/446031103/src/com/coderising/array/ArrayUtil.java @@ -1,8 +1,6 @@ package com.coderising.array; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; public class ArrayUtil { @@ -14,7 +12,6 @@ public class ArrayUtil { * @return */ public void reverseArray(int[] origin){ - //寰幆缁撴潫浣嶇疆 int end = origin.length-1; int temp ; for (int i = 0; i < end; i++,end--) { @@ -32,16 +29,14 @@ public void reverseArray(int[] origin){ * @return */ - public int[] removeZero(int[] oldArray){ - //0鐨勪釜鏁 + public int[] removeZero(int[] oldArray){ int zeroCnt = 0; for (int i : oldArray) { if(0==i){ zeroCnt++; } - } - //瀛樻斁浣嶇疆璁板綍 + } int size = 0; int [] result = new int[oldArray.length-zeroCnt]; for (int i : oldArray) { @@ -62,31 +57,22 @@ public int[] removeZero(int[] oldArray){ * @return */ - public 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); - List resultList= new ArrayList(); - for (int i : temp) { - if(!resultList.contains(i)) - resultList.add(i); - } - //宸插幓閲嶆暟缁勶紝缂烘帓搴 - int [] result = new int[resultList.size()]; - for (int i = 0; i < resultList.size(); i++) { - result[i] = resultList.get(i); + public int[] merge(int[] array1, int[] array2){ + int repetition = 0; + for (int i : array2) { + if(Arrays.asList(array1).contains(i)) + repetition++; } - //鍐掓场鎺掑簭 - 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 tempInt = result[j]; - result[j] =result[j+1]; - result[j+1] = tempInt; - } + int [] result =Arrays.copyOf(array1, array1.length+array2.length-repetition); + int size = 0; + for (int i = 0; i < array2.length; i++) { + int temp=array2[i]; + if(!Arrays.asList(array1).contains(temp)){ + result[array1.length+size]=temp; + size++; } - } + + } return result; } /** @@ -99,7 +85,7 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ - return Arrays.copyOf(oldArray, oldArray.length+size); + return null; } /** @@ -110,16 +96,7 @@ public int[] grow(int [] oldArray, int size){ * @return */ public int[] fibonacci(int max){ - int first =0; - int second = 1; - List resultList= new ArrayList(); - if(max!=second) - add(first,second,max,resultList); - int [] result = new int[resultList.size()]; - for (int i = 0; i < resultList.size(); i++) { - result[i] = resultList.get(i); - } - return result; + return null; } /** @@ -129,23 +106,7 @@ public int[] fibonacci(int max){ * @return */ public int[] getPrimes(int max){ - List resultList= new ArrayList(); - for (int i = 2; i < max; i++) { - boolean isAdd = true; - for (int j = 2; j < i; j++) { - if(0==i%j){ - isAdd = false; - break; - } - } - if(isAdd) - resultList.add(i); - } - int [] result = new int[resultList.size()]; - for (int i = 0; i < resultList.size(); i++) { - result[i] = resultList.get(i); - } - return result; + return null; } /** @@ -155,22 +116,7 @@ public int[] getPrimes(int max){ * @return */ public int[] getPerfectNumbers(int max){ - List resultList= new ArrayList(); - for (int i = 1; i < max; i++) { - int temp = 0; - for (int j = 1; j < i; j++) { - if(0==i%j){ - temp+=j; - } - } - if(i==temp) - resultList.add(i); - } - int [] result = new int[resultList.size()]; - for (int i = 0; i < resultList.size(); i++) { - result[i] = resultList.get(i); - } - return result; + return null; } /** @@ -182,23 +128,8 @@ public int[] getPerfectNumbers(int max){ * @return */ public String join(int[] array, String seperator){ - return Arrays.toString(array).replace("[", "").replace("]", "").replace(", ", seperator); + return null; } - /** - * - * @param number1 - * @param number2 - * @param max - * @param resultList - * @return - */ - public List add(int number1,int number2,int max,List resultList){ - if(number2 Date: Wed, 1 Mar 2017 15:42:50 +0800 Subject: [PATCH 025/177] ArrayUtil complete ArrayUtil complete --- .../src/com/coderising/array/ArrayUtil.java | 101 +++++++++++++++--- .../com/coderising/array/ArrayUtilTest.java | 50 +++++++-- 2 files changed, 126 insertions(+), 25 deletions(-) diff --git a/group12/446031103/src/com/coderising/array/ArrayUtil.java b/group12/446031103/src/com/coderising/array/ArrayUtil.java index fbbe3c1c89..a771999a22 100644 --- a/group12/446031103/src/com/coderising/array/ArrayUtil.java +++ b/group12/446031103/src/com/coderising/array/ArrayUtil.java @@ -1,6 +1,8 @@ package com.coderising.array; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class ArrayUtil { @@ -58,21 +60,30 @@ public int[] removeZero(int[] oldArray){ */ public int[] merge(int[] array1, int[] array2){ - int repetition = 0; - for (int i : array2) { - if(Arrays.asList(array1).contains(i)) - repetition++; + //鍚堟嫾鏁扮粍锛岀己鎺掑簭锛岀己鍘婚噸 + 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); + List resultList= new ArrayList(); + for (int i : temp) { + if(!resultList.contains(i)) + resultList.add(i); + }//宸插幓閲嶆暟缁勶紝缂烘帓搴 + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); } - int [] result =Arrays.copyOf(array1, array1.length+array2.length-repetition); - int size = 0; - for (int i = 0; i < array2.length; i++) { - int temp=array2[i]; - if(!Arrays.asList(array1).contains(temp)){ - result[array1.length+size]=temp; - size++; + //鍐掓场鎺掑簭 + 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 tempInt = result[j]; + result[j] =result[j+1]; + result[j+1] = tempInt; + } } - } + } return result; } /** @@ -85,7 +96,7 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ - return null; + return Arrays.copyOf(oldArray, oldArray.length+size); } /** @@ -96,7 +107,16 @@ public int[] grow(int [] oldArray, int size){ * @return */ public int[] fibonacci(int max){ - return null; + int first =0; + int second = 1; + List resultList= new ArrayList(); + if(max!=second) + add(first,second,max,resultList); + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** @@ -106,7 +126,23 @@ public int[] fibonacci(int max){ * @return */ public int[] getPrimes(int max){ - return null; + List resultList= new ArrayList(); + for (int i = 2; i < max; i++) { + boolean isAdd = true; + for (int j = 2; j < i; j++) { + if(0==i%j){ + isAdd = false; + break; + } + } + if(isAdd) + resultList.add(i); + } + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** @@ -116,7 +152,22 @@ public int[] getPrimes(int max){ * @return */ public int[] getPerfectNumbers(int max){ - return null; + List resultList= new ArrayList(); + for (int i = 1; i < max; i++) { + int temp = 0; + for (int j = 1; j < i; j++) { + if(0==i%j){ + temp+=j; + } + } + if(i==temp) + resultList.add(i); + } + int [] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** @@ -128,8 +179,24 @@ public int[] getPerfectNumbers(int max){ * @return */ public String join(int[] array, String seperator){ - return null; + return Arrays.toString(array).replace("[", "").replace("]", "").replace(", ", seperator); } + /** + * + * @param number1 + * @param number2 + * @param max + * @param resultList + * @return + */ + public List add(int number1,int number2,int max,List resultList){ + if(number2 Date: Wed, 1 Mar 2017 21:42:37 +0800 Subject: [PATCH 026/177] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/ArrayList.java | 196 +++++++++--------- 1 file changed, 99 insertions(+), 97 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java index 220e00459c..4c803377db 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java @@ -1,98 +1,100 @@ -锘縤mport java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - /*鎵╁鍥犲瓙*/ - private static final int GENE = 10; - - private Object[] elementData = new Object[10]; - /*鎵╁寮曠敤*/ - private Object[] newElementData; - - public void add(Object o){ - grow(); - elementData[size] = o; - size ++; - } - public void add(int index, Object o){ - - if(index>size){ - 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; - } - - public Object[] toArray(){ - Object[] objArr = new Object[size]; - System.arraycopy(elementData, 0, objArr, 0, size); - return objArr; - } - - /** - * 鎵╁锛屾墿瀹瑰洜瀛愪负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]; - } - - } +锘縫ackage com.coding.basic; + +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + /*鎵╁鍥犲瓙*/ + private static final int GENE = 10; + + private Object[] elementData = new Object[10]; + /*鎵╁寮曠敤*/ + private Object[] newElementData; + + public void add(Object o){ + grow(); + elementData[size] = o; + size ++; + } + public void add(int index, Object o){ + + if(index>size){ + 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; + } + + public Object[] toArray(){ + Object[] objArr = new Object[size]; + System.arraycopy(elementData, 0, objArr, 0, size); + return objArr; + } + + /** + * 鎵╁锛屾墿瀹瑰洜瀛愪负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]; + } + + } } \ No newline at end of file From e746e1b588a9aed822919698d1afb91fce273d37 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Wed, 1 Mar 2017 21:46:11 +0800 Subject: [PATCH 027/177] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2258659044/zj-2017/src/com/coding/basic/ArrayList.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java index 4c803377db..f1fbf7e8b1 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java @@ -19,7 +19,7 @@ public void add(Object o){ } public void add(int index, Object o){ - if(index>size){ + if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); } grow(); @@ -35,7 +35,7 @@ public void add(int index, Object o){ public Object get(int index){ - if(index>size){ + if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); } return elementData[index]; From d1910a6a176548c38c7913a9a50a83d960e287bc Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Wed, 1 Mar 2017 22:23:57 +0800 Subject: [PATCH 028/177] package name changed with linkedList remove fix --- .../AbstractList.java | 2 +- .../{Collection => collection}/Iterator.java | 2 +- .../{Collection => collection}/List.java | 2 +- .../concrete}/ArrayList.java | 6 +-- .../concrete}/BinaryTreeNode.java | 2 +- .../concrete}/LinkedList.java | 15 +++++-- .../concrete}/Queue.java | 6 +-- .../concrete}/Stack.java | 6 +-- .../collection}/AllTests.java | 2 +- .../collection}/ArrayListTest.java | 9 ++-- .../collection}/BinaryTreeNodeTest.java | 4 +- .../collection}/LinkedListTest.java | 10 +++-- .../collection}/QueueTest.java | 7 ++- .../collection}/StackTest.java | 4 +- .../382266293/coding/basic/util/TestUtil.java | 8 ++-- .../coding/basic/util/XMLreader.java | 25 ++++++++++- .../382266293/eollection/AbstractList.java | 43 +++++++++++++++++++ group12/382266293/eollection/Iterator.java | 7 +++ group12/382266293/eollection/List.java | 16 +++++++ group12/382266293/src/array/ArrayUtil.java | 5 ++- group12/382266293/src/litestruts/Struts.java | 18 ++++---- 21 files changed, 151 insertions(+), 48 deletions(-) rename group12/382266293/coding/basic/{Collection => collection}/AbstractList.java (97%) rename group12/382266293/coding/basic/{Collection => collection}/Iterator.java (80%) rename group12/382266293/coding/basic/{Collection => collection}/List.java (89%) rename group12/382266293/coding/basic/{Collection/Concrete => collection/concrete}/ArrayList.java (96%) rename group12/382266293/coding/basic/{Collection/Concrete => collection/concrete}/BinaryTreeNode.java (98%) rename group12/382266293/coding/basic/{Collection/Concrete => collection/concrete}/LinkedList.java (92%) rename group12/382266293/coding/basic/{Collection/Concrete => collection/concrete}/Queue.java (93%) rename group12/382266293/coding/basic/{Collection/Concrete => collection/concrete}/Stack.java (95%) rename group12/382266293/coding/basic/{TestCollection => test/collection}/AllTests.java (91%) rename group12/382266293/coding/basic/{TestCollection => test/collection}/ArrayListTest.java (96%) rename group12/382266293/coding/basic/{TestCollection => test/collection}/BinaryTreeNodeTest.java (93%) rename group12/382266293/coding/basic/{TestCollection => test/collection}/LinkedListTest.java (96%) rename group12/382266293/coding/basic/{TestCollection => test/collection}/QueueTest.java (96%) rename group12/382266293/coding/basic/{TestCollection => test/collection}/StackTest.java (97%) create mode 100644 group12/382266293/eollection/AbstractList.java create mode 100644 group12/382266293/eollection/Iterator.java create mode 100644 group12/382266293/eollection/List.java diff --git a/group12/382266293/coding/basic/Collection/AbstractList.java b/group12/382266293/coding/basic/collection/AbstractList.java similarity index 97% rename from group12/382266293/coding/basic/Collection/AbstractList.java rename to group12/382266293/coding/basic/collection/AbstractList.java index a81e76b587..93da57e1bd 100644 --- a/group12/382266293/coding/basic/Collection/AbstractList.java +++ b/group12/382266293/coding/basic/collection/AbstractList.java @@ -1,4 +1,4 @@ -package Collection; +package collection; public abstract class AbstractList implements List { diff --git a/group12/382266293/coding/basic/Collection/Iterator.java b/group12/382266293/coding/basic/collection/Iterator.java similarity index 80% rename from group12/382266293/coding/basic/Collection/Iterator.java rename to group12/382266293/coding/basic/collection/Iterator.java index d51656a3a8..79955745cd 100644 --- a/group12/382266293/coding/basic/Collection/Iterator.java +++ b/group12/382266293/coding/basic/collection/Iterator.java @@ -1,4 +1,4 @@ -package Collection; +package collection; public interface Iterator { diff --git a/group12/382266293/coding/basic/Collection/List.java b/group12/382266293/coding/basic/collection/List.java similarity index 89% rename from group12/382266293/coding/basic/Collection/List.java rename to group12/382266293/coding/basic/collection/List.java index 7ddb685cac..5fdc0de9ab 100644 --- a/group12/382266293/coding/basic/Collection/List.java +++ b/group12/382266293/coding/basic/collection/List.java @@ -1,4 +1,4 @@ -package Collection; +package collection; public interface List { diff --git a/group12/382266293/coding/basic/Collection/Concrete/ArrayList.java b/group12/382266293/coding/basic/collection/concrete/ArrayList.java similarity index 96% rename from group12/382266293/coding/basic/Collection/Concrete/ArrayList.java rename to group12/382266293/coding/basic/collection/concrete/ArrayList.java index 3db5ab47e6..449cdf4e1a 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/ArrayList.java +++ b/group12/382266293/coding/basic/collection/concrete/ArrayList.java @@ -1,10 +1,10 @@ -package Collection.Concrete; +package collection.concrete; import java.util.Arrays; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; +import collection.AbstractList; +import collection.Iterator; public class ArrayList extends AbstractList { diff --git a/group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java b/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java similarity index 98% rename from group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java rename to group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java index 34a9d4253e..442b06b1c9 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java +++ b/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package Collection.Concrete; +package collection.concrete; public class BinaryTreeNode> { diff --git a/group12/382266293/coding/basic/Collection/Concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java similarity index 92% rename from group12/382266293/coding/basic/Collection/Concrete/LinkedList.java rename to group12/382266293/coding/basic/collection/concrete/LinkedList.java index 66dbd9d8d0..c1e572d33c 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -1,8 +1,9 @@ -package Collection.Concrete; +package collection.concrete; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; + +import collection.AbstractList; +import collection.Iterator; public class LinkedList extends AbstractList { @@ -87,15 +88,21 @@ public E removeLast(){ return remove(size-1); } + @SuppressWarnings("unchecked") 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); + Node node = head; + for ( int i = 0; i < index - 1 ; i++) { + node = node.next; + } + node.next = node.next.next; } size--; return pNode.data; diff --git a/group12/382266293/coding/basic/Collection/Concrete/Queue.java b/group12/382266293/coding/basic/collection/concrete/Queue.java similarity index 93% rename from group12/382266293/coding/basic/Collection/Concrete/Queue.java rename to group12/382266293/coding/basic/collection/concrete/Queue.java index 300fb633af..0875d8286a 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/Queue.java +++ b/group12/382266293/coding/basic/collection/concrete/Queue.java @@ -1,8 +1,8 @@ -package Collection.Concrete; +package collection.concrete; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; +import collection.AbstractList; +import collection.Iterator; public class Queue extends AbstractList { diff --git a/group12/382266293/coding/basic/Collection/Concrete/Stack.java b/group12/382266293/coding/basic/collection/concrete/Stack.java similarity index 95% rename from group12/382266293/coding/basic/Collection/Concrete/Stack.java rename to group12/382266293/coding/basic/collection/concrete/Stack.java index 17ec4364fa..ecc0994273 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/Stack.java +++ b/group12/382266293/coding/basic/collection/concrete/Stack.java @@ -1,10 +1,10 @@ -package Collection.Concrete; +package collection.concrete; import java.util.EmptyStackException; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; +import collection.AbstractList; +import collection.Iterator; public class Stack extends AbstractList { diff --git a/group12/382266293/coding/basic/TestCollection/AllTests.java b/group12/382266293/coding/basic/test/collection/AllTests.java similarity index 91% rename from group12/382266293/coding/basic/TestCollection/AllTests.java rename to group12/382266293/coding/basic/test/collection/AllTests.java index cd4eeadb58..661d6c3722 100644 --- a/group12/382266293/coding/basic/TestCollection/AllTests.java +++ b/group12/382266293/coding/basic/test/collection/AllTests.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/group12/382266293/coding/basic/TestCollection/ArrayListTest.java b/group12/382266293/coding/basic/test/collection/ArrayListTest.java similarity index 96% rename from group12/382266293/coding/basic/TestCollection/ArrayListTest.java rename to group12/382266293/coding/basic/test/collection/ArrayListTest.java index f29580616f..74a3a14212 100644 --- a/group12/382266293/coding/basic/TestCollection/ArrayListTest.java +++ b/group12/382266293/coding/basic/test/collection/ArrayListTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; import static util.TestUtil.*; @@ -10,10 +10,9 @@ import org.junit.Before; import org.junit.Test; - -import Collection.Iterator; -import Collection.List; -import Collection.Concrete.ArrayList; +import collection.Iterator; +import collection.List; +import collection.concrete.ArrayList; import junit.framework.TestCase; public class ArrayListTest extends TestCase { diff --git a/group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java b/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java similarity index 93% rename from group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java rename to group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java index 275ef59484..161d29298a 100644 --- a/group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java +++ b/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; import java.util.Random; @@ -9,7 +9,7 @@ import org.junit.Before; import org.junit.Test; -import Collection.Concrete.BinaryTreeNode; +import collection.concrete.BinaryTreeNode; import junit.framework.TestCase; public class BinaryTreeNodeTest extends TestCase { diff --git a/group12/382266293/coding/basic/TestCollection/LinkedListTest.java b/group12/382266293/coding/basic/test/collection/LinkedListTest.java similarity index 96% rename from group12/382266293/coding/basic/TestCollection/LinkedListTest.java rename to group12/382266293/coding/basic/test/collection/LinkedListTest.java index 8b9fad15eb..5a2d7213af 100644 --- a/group12/382266293/coding/basic/TestCollection/LinkedListTest.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; import static util.TestUtil.*; @@ -8,9 +8,9 @@ import org.junit.Before; import org.junit.Test; -import Collection.Iterator; -import Collection.List; -import Collection.Concrete.LinkedList; +import collection.Iterator; +import collection.List; +import collection.concrete.LinkedList; import junit.framework.TestCase; @@ -182,7 +182,9 @@ public void testRemove() { assertEquals(i, myLL.size()); assertEquals(a,res); } + } + @Test public void testSize() { diff --git a/group12/382266293/coding/basic/TestCollection/QueueTest.java b/group12/382266293/coding/basic/test/collection/QueueTest.java similarity index 96% rename from group12/382266293/coding/basic/TestCollection/QueueTest.java rename to group12/382266293/coding/basic/test/collection/QueueTest.java index 01a9aa31f2..bbbd076f7d 100644 --- a/group12/382266293/coding/basic/TestCollection/QueueTest.java +++ b/group12/382266293/coding/basic/test/collection/QueueTest.java @@ -1,11 +1,14 @@ -package TestCollection; +package test.collection; import static util.Print.*; import org.junit.After; import org.junit.Before; import org.junit.Test; + +import collection.concrete.Queue; + import static util.TestUtil.*; -import Collection.Concrete.Queue; + import junit.framework.TestCase; public class QueueTest extends TestCase { diff --git a/group12/382266293/coding/basic/TestCollection/StackTest.java b/group12/382266293/coding/basic/test/collection/StackTest.java similarity index 97% rename from group12/382266293/coding/basic/TestCollection/StackTest.java rename to group12/382266293/coding/basic/test/collection/StackTest.java index 8d2f85e1bf..d64b3e60f3 100644 --- a/group12/382266293/coding/basic/TestCollection/StackTest.java +++ b/group12/382266293/coding/basic/test/collection/StackTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; @@ -8,7 +8,7 @@ import org.junit.Before; import org.junit.Test; -import Collection.Concrete.Stack; +import collection.concrete.Stack; import junit.framework.TestCase; public class StackTest extends TestCase { diff --git a/group12/382266293/coding/basic/util/TestUtil.java b/group12/382266293/coding/basic/util/TestUtil.java index 0820e0e684..009e67ca26 100644 --- a/group12/382266293/coding/basic/util/TestUtil.java +++ b/group12/382266293/coding/basic/util/TestUtil.java @@ -3,10 +3,10 @@ import java.util.Arrays; import java.util.Random; -import Collection.List; -import Collection.Concrete.ArrayList; -import Collection.Concrete.LinkedList; -import Collection.Concrete.Queue; +import collection.List; +import collection.concrete.ArrayList; +import collection.concrete.LinkedList; +import collection.concrete.Queue; import junit.framework.TestCase; diff --git a/group12/382266293/coding/basic/util/XMLreader.java b/group12/382266293/coding/basic/util/XMLreader.java index b7a345f7e6..1cdee9dc1c 100644 --- a/group12/382266293/coding/basic/util/XMLreader.java +++ b/group12/382266293/coding/basic/util/XMLreader.java @@ -1,5 +1,4 @@ package util; -import java.net.URL; import java.util.Iterator; import java.util.List; @@ -41,6 +40,30 @@ public String parseClass(String attr) { } return clazz; } + + + + public String parseResult(String attr, String result) { + + Document doc = null; + try { + doc = parse(address); + } catch (DocumentException e1) { + e1.printStackTrace(); + } + + Node root = doc.getRootElement(); + List list = root.selectNodes("action[@name='" + attr + "']/result[@name='" + result + "']"); + + String jsp = null; + for(Object o:list){ + Element e = (Element) o; + jsp = e.getTextTrim(); + } + return jsp; + } + + public static void main(String args[]) throws DocumentException { XMLreader reader = new XMLreader(); diff --git a/group12/382266293/eollection/AbstractList.java b/group12/382266293/eollection/AbstractList.java new file mode 100644 index 0000000000..7add091ad4 --- /dev/null +++ b/group12/382266293/eollection/AbstractList.java @@ -0,0 +1,43 @@ + + +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/eollection/Iterator.java b/group12/382266293/eollection/Iterator.java new file mode 100644 index 0000000000..05ab137bf6 --- /dev/null +++ b/group12/382266293/eollection/Iterator.java @@ -0,0 +1,7 @@ + + +public interface Iterator { + + public boolean hasNext(); + public E next(); +} diff --git a/group12/382266293/eollection/List.java b/group12/382266293/eollection/List.java new file mode 100644 index 0000000000..f4730b943e --- /dev/null +++ b/group12/382266293/eollection/List.java @@ -0,0 +1,16 @@ + + +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/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index f33f64150b..85df44e987 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -3,8 +3,9 @@ import static util.Print.*; import java.util.Arrays; import java.util.BitSet; -import Collection.Iterator; -import Collection.Concrete.ArrayList; + +import collection.Iterator; +import collection.concrete.ArrayList; diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index 088e88fdec..b520ee7e89 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -58,14 +58,14 @@ public static View runAction(String actionName, Map parameters) t actionObj = getObj(clazz); setParams(actionObj,parameters); - invoke(actionObj,"execute"); - + String result = (String) invoke(actionObj,"execute"); + String viewPage = reader.parseResult(actionName,result); Map viewParams = getViewParams(actionObj); + viewParams.put("jsp", viewPage); println(viewParams); viewObj = getObj("litestruts.View"); - - setParams(viewObj,viewParams); - + setParams(viewObj,viewParams); + return (View) viewObj; } @@ -138,18 +138,19 @@ private static void setParams(Object pb0, Map parameters) { } } - private static void invoke(Object obj, String execute) { + private static String invoke(Object obj, String execute) { BeanInfo bi0 = getBeanInfo(obj); MethodDescriptor[] methods = bi0.getMethodDescriptors(); for (int i = 0; i < methods.length; i++) { String methodName = methods[i].getName(); if(methodName.equals(execute)) try { - println(methods[i].getMethod().invoke(actionObj)); + return (String) methods[i].getMethod().invoke(actionObj); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } + return null; } @@ -160,7 +161,8 @@ public static void main(String args[]) throws InstantiationException, IllegalAcc params.put("password","1234"); View view = runAction("login",params); - println(view.getParameters()); + println(view.getJsp()); + } From 2804027660154b6900cf73f141b55611451ff27a Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Wed, 1 Mar 2017 22:44:39 +0800 Subject: [PATCH 029/177] fix remove method --- .../basic/collection/concrete/LinkedList.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/group12/382266293/coding/basic/collection/concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java index c1e572d33c..cb3d87684d 100644 --- a/group12/382266293/coding/basic/collection/concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -91,21 +91,25 @@ public E removeLast(){ @SuppressWarnings("unchecked") public E remove(int index) { checkIndex(index); - Node pNode = getNode(index); - + Node pNode = null; + E data = null; if (index == 0) { + data = (E) head.data; head = head.next; - } else if (index == size-1 ) { - getNode(index-1).next = null; + } else if (index == size-1) { + pNode = getNode(index - 1); + data = (E) pNode.next.data; + pNode.next = null; } else { - Node node = head; + pNode = head; for ( int i = 0; i < index - 1 ; i++) { - node = node.next; + pNode = pNode.next; } - node.next = node.next.next; + data = (E) pNode.next.data; + pNode.next =pNode.next.next; } size--; - return pNode.data; + return data; } @Override From 46e983244e08729345884b661e7d4cdb0b83c979 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Thu, 2 Mar 2017 06:34:00 +0800 Subject: [PATCH 030/177] Struts Done --- .../coding/basic/util/ActionXMLreader.java | 53 ++++++ .../coding/basic/util/XMLreader.java | 74 -------- group12/382266293/src/litestruts/Struts.java | 174 +++++++----------- 3 files changed, 115 insertions(+), 186 deletions(-) create mode 100644 group12/382266293/coding/basic/util/ActionXMLreader.java delete mode 100644 group12/382266293/coding/basic/util/XMLreader.java diff --git a/group12/382266293/coding/basic/util/ActionXMLreader.java b/group12/382266293/coding/basic/util/ActionXMLreader.java new file mode 100644 index 0000000000..8f6e0eb497 --- /dev/null +++ b/group12/382266293/coding/basic/util/ActionXMLreader.java @@ -0,0 +1,53 @@ +package util; + +import java.util.List; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; + +import static util.Print.*; + +public class ActionXMLreader { + + public Node getRootNode(String add) { + SAXReader reader = new SAXReader(); + Document document = null; + Node root = null; + try { + document = reader.read(add); + root = document.getRootElement(); + } catch (DocumentException e) { + e.printStackTrace(); + } + return root; + } + + public String parseClass(Node root, String attr) { + + @SuppressWarnings("rawtypes") + List list = root.selectNodes("action[@name='" + attr + "']"); + String clazz = null; + for(Object o:list){ + Element e = (Element) o; + clazz = e.attributeValue("class"); + } + return clazz; + } + + public String parseResult(Node root, String attr, String result) { + + @SuppressWarnings("rawtypes") + List list = root.selectNodes("action[@name='" + attr + "']/result[@name='" + result + "']"); + + String jsp = null; + for(Object o:list){ + Element e = (Element) o; + jsp = e.getTextTrim(); + } + return jsp; + } + + +} diff --git a/group12/382266293/coding/basic/util/XMLreader.java b/group12/382266293/coding/basic/util/XMLreader.java deleted file mode 100644 index 1cdee9dc1c..0000000000 --- a/group12/382266293/coding/basic/util/XMLreader.java +++ /dev/null @@ -1,74 +0,0 @@ -package util; -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.Node; -import org.dom4j.io.SAXReader; - -import static util.Print.*; - -public class XMLreader { - - private static String address = "src/litestruts/struts.xml"; - - public Document parse(String add) throws DocumentException { - SAXReader reader = new SAXReader(); - Document document = reader.read(add); - return document; - } - - public String parseClass(String attr) { - - Document doc = null; - try { - doc = parse(address); - } catch (DocumentException e1) { - e1.printStackTrace(); - } - - Node root = doc.getRootElement(); - List list = root.selectNodes("action[@name='" + attr + "']"); - String clazz = null; - for(Object o:list){ - Element e = (Element) o; - clazz=e.attributeValue("class"); - System.out.println("class = " + clazz); - } - return clazz; - } - - - - public String parseResult(String attr, String result) { - - Document doc = null; - try { - doc = parse(address); - } catch (DocumentException e1) { - e1.printStackTrace(); - } - - Node root = doc.getRootElement(); - List list = root.selectNodes("action[@name='" + attr + "']/result[@name='" + result + "']"); - - String jsp = null; - for(Object o:list){ - Element e = (Element) o; - jsp = e.getTextTrim(); - } - return jsp; - } - - - - public static void main(String args[]) throws DocumentException { - XMLreader reader = new XMLreader(); - reader.parseClass("login"); - - } - -} diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index b520ee7e89..2eb4a01848 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -1,7 +1,6 @@ package litestruts; -import static util.Print.println; - +import util.ActionXMLreader; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -10,137 +9,82 @@ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; - -import util.XMLreader; - - +import org.dom4j.Node; +import static util.Print.*; public class Struts { - static Object actionObj; - static Object viewObj; + private static Object actionObj = null; + private static String address = "src/litestruts/struts.xml"; - public static View runAction(String actionName, Map parameters) throws IntrospectionException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - - /* - - 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瀛楁涓 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - */ + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters){ + + ActionXMLreader reader = new ActionXMLreader(); + Node root = reader.getRootNode(address); - XMLreader reader = new XMLreader(); - String clazz = reader.parseClass(actionName); - + String clazz = reader.parseClass(root, actionName); actionObj = getObj(clazz); - - setParams(actionObj,parameters); - String result = (String) invoke(actionObj,"execute"); - String viewPage = reader.parseResult(actionName,result); - Map viewParams = getViewParams(actionObj); - viewParams.put("jsp", viewPage); - println(viewParams); - viewObj = getObj("litestruts.View"); - setParams(viewObj,viewParams); - - return (View) viewObj; + BeanInfo bi = getBeanInfo(actionObj); + PropertyDescriptor[] pd = bi.getPropertyDescriptors(); + + setParameters(actionObj, pd, parameters); + String executeResult = (String) getResult(actionObj, bi, "execute"); + String jsp = reader.parseResult(root, actionName, executeResult); + + Map readParamters = new HashMap(); + readParamters = getReadParameters(actionObj, pd); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(readParamters); + + return view; } - - private static Object getObj(String clazz) { - Class cls = null; - try { - cls = Class.forName(clazz); + + private static Object getObj(String clazz) { + @SuppressWarnings("rawtypes") + Class cls = null; + + try { + cls = Class.forName(clazz); + return cls.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); - } - try { - return cls.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { + }catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); - } - return cls; + } + return null; } - public static Map getViewParams (Object obj) { - - PropertyDescriptor[] pd0 = getPropertyDescriptor(obj); - Map viewParams = new HashMap(); - - for (int i = 0; i < pd0.length; i++) { - String readMethod = pd0[i].getReadMethod().getName().substring(3); - String value = null; - try { - value = (String) pd0[i].getReadMethod().invoke(obj); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } - viewParams.put(readMethod.toLowerCase(), value); - } - return viewParams; - } - - - private static PropertyDescriptor[] getPropertyDescriptor(Object obj) { - - BeanInfo bi0 = getBeanInfo(obj); - PropertyDescriptor[] pd0 = bi0.getPropertyDescriptors(); - return pd0; - } - private static BeanInfo getBeanInfo(Object obj) { - BeanInfo bi0 = null; + BeanInfo bi = null; try { - bi0 = Introspector.getBeanInfo(obj.getClass(), Object.class); + bi = Introspector.getBeanInfo(obj.getClass(), Object.class); } catch (IntrospectionException e) { e.printStackTrace(); } - return bi0; + return bi; } - private static void setParams(Object pb0, Map parameters) { + private static void setParameters(Object obj, PropertyDescriptor[] pd ,Map parameters) { - PropertyDescriptor[] pd0 = getPropertyDescriptor(pb0); - - for (int i = 0; i < pd0.length; i++) { - String name = pd0[i].getName(); + for (int i = 0; i < pd.length; i++) { + String name = pd[i].getName(); if(parameters.containsKey(name)) try { - pd0[i].getWriteMethod().invoke(pb0,parameters.get(name)); + pd[i].getWriteMethod().invoke(obj,parameters.get(name)); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } } - private static String invoke(Object obj, String execute) { - BeanInfo bi0 = getBeanInfo(obj); - MethodDescriptor[] methods = bi0.getMethodDescriptors(); + private static String getResult(Object obj, BeanInfo bi,String execute) { + MethodDescriptor[] methods = bi.getMethodDescriptors(); for (int i = 0; i < methods.length; i++) { String methodName = methods[i].getName(); if(methodName.equals(execute)) @@ -151,19 +95,25 @@ private static String invoke(Object obj, String execute) { } } return null; - } + + @SuppressWarnings("rawtypes") + public static Map getReadParameters (Object obj, PropertyDescriptor[] pd) { + Map viewParams = new HashMap(); - public static void main(String args[]) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - View view = runAction("login",params); - println(view.getJsp()); - - + for (int i = 0; i < pd.length; i++) { + String readMethod = pd[i].getReadMethod().getName().substring(3); + String value = null; + try { + value = (String) pd[i].getReadMethod().invoke(obj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + viewParams.put(readMethod.toLowerCase(), value); + } + return viewParams; } + } \ No newline at end of file From 5655fd9cedfd34cc5ed90d29786a5b48e0471b67 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Thu, 2 Mar 2017 07:05:37 +0800 Subject: [PATCH 031/177] pack packages --- .../382266293/eollection/AbstractList.java | 43 ------------------- group12/382266293/eollection/Iterator.java | 7 --- group12/382266293/eollection/List.java | 16 ------- 3 files changed, 66 deletions(-) delete mode 100644 group12/382266293/eollection/AbstractList.java delete mode 100644 group12/382266293/eollection/Iterator.java delete mode 100644 group12/382266293/eollection/List.java diff --git a/group12/382266293/eollection/AbstractList.java b/group12/382266293/eollection/AbstractList.java deleted file mode 100644 index 7add091ad4..0000000000 --- a/group12/382266293/eollection/AbstractList.java +++ /dev/null @@ -1,43 +0,0 @@ - - -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/eollection/Iterator.java b/group12/382266293/eollection/Iterator.java deleted file mode 100644 index 05ab137bf6..0000000000 --- a/group12/382266293/eollection/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ - - -public interface Iterator { - - public boolean hasNext(); - public E next(); -} diff --git a/group12/382266293/eollection/List.java b/group12/382266293/eollection/List.java deleted file mode 100644 index f4730b943e..0000000000 --- a/group12/382266293/eollection/List.java +++ /dev/null @@ -1,16 +0,0 @@ - - -public interface List { - - public void add(E e); - - public int size(); - - public E get(int index); - - public boolean isEmpty(); - - public int indexOf(E e); - - -} From e29c4bb9a90ae677dd86eccfb003b82b3f9689e1 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 2 Mar 2017 18:03:45 +0800 Subject: [PATCH 032/177] cafa --- .../src/com/coderising/litestruts/Struts.java | 104 ++++++++++++------ 1 file changed, 72 insertions(+), 32 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index 82e61dbcf2..699c2e3a31 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -4,7 +4,9 @@ import java.io.IOException; import java.lang.reflect.Field; 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; @@ -18,28 +20,36 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import com.coderising.litestruts.bean.Action; +import com.coderising.litestruts.bean.Result; + public class Struts { private final static String ACTION = "action"; private final static String RESULT = "result"; private final static String NAME = "name"; private final static String CLASS = "class"; + private final static String TYPE = "type"; private final static String EXECUTE = "execute"; + private final static List actions; + static{ + String path = "src/com/coderising/litestruts/struts.xml"; + actions = readStrutsXml(path); + } + public static View runAction(String actionName, Map parameters) { - View view = new View(); Map viewMap = new HashMap(); - - String path = "src/com/coderising/litestruts/struts.xml"; - Map xmlMap = readStrutsXml(path, actionName); + + Action actionBean= getCurrentAction(actionName); try { - String calssPath = xmlMap.get(CLASS); + String calssPath = actionBean.getClaz(); Class clazz = Class.forName(calssPath); - Object action = clazz.newInstance(); + Object instance = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); String fieldName; String methodName; @@ -49,25 +59,31 @@ public static View runAction(String actionName, methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method method = clazz.getMethod(methodName, fields[i].getType()); - method.invoke(action, parameters.get(fieldName)); + method.invoke(instance, parameters.get(fieldName)); } } Method successMethos = clazz.getMethod(EXECUTE); - Object result = successMethos.invoke(action); + Object result = successMethos.invoke(instance); for (int i = 0; i < fields.length; i++) { fieldName = fields[i].getName(); methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method method = clazz.getMethod(methodName); - Object value = method.invoke(action); + Object value = method.invoke(instance); viewMap.put(fieldName, value); } view.setParameters(viewMap); - String jsp = xmlMap.get(result.toString()); + List results = actionBean.getResults(); + for (int i = 0; i < results.size(); i++) { + if(results.get(i).getName()){ + + } + } + String jsp = actionBean.get(result.toString()); view.setJsp(jsp); } catch (Exception e) { @@ -85,11 +101,15 @@ public static View runAction(String actionName, * @param actionName * @return */ - private static Map readStrutsXml(String filePath, - String actionName) { + + private static List readStrutsXml(String filePath) { File xmlFile = new File(filePath); - Map xmlMap = new HashMap(); + Action action = null; + Result result = null; + List results = null; + List actions = new ArrayList(); + try { DocumentBuilder documentBuilder = DocumentBuilderFactory .newInstance().newDocumentBuilder(); @@ -100,31 +120,41 @@ private static Map readStrutsXml(String filePath, for (int i = 0; i < actionNodes.getLength(); i++) { Node actionNode = actionNodes.item(i); if (ACTION.equals(actionNode.getNodeName())) { + action = new Action(); + // 瑙f瀽action鏍囩 NamedNodeMap actionNodeMap = actionNode.getAttributes(); - String atName = actionNodeMap.getNamedItem(NAME) + String actionName = actionNodeMap.getNamedItem(NAME) .getNodeValue(); - if (atName.equals(actionName)) { - String classPath = actionNodeMap.getNamedItem(CLASS) - .getNodeValue(); - xmlMap.put(CLASS, classPath); - NodeList resultNodes = actionNode.getChildNodes(); - for (int j = 0; j < resultNodes.getLength(); j++) { - Node resultNode = resultNodes.item(j); - if (RESULT.equals(resultNode.getNodeName())) { - NamedNodeMap resultNodeMap = resultNode - .getAttributes(); - String jspName = resultNodeMap.getNamedItem( - NAME).getNodeValue(); - String jspPath = resultNode.getTextContent(); - xmlMap.put(jspName, jspPath); - } + String claz = actionNodeMap.getNamedItem(CLASS) + .getNodeValue(); + action.setName(actionName); + action.setClaz(claz); + // 瑙f瀽result鏍囩 + NodeList resultNodes = actionNode.getChildNodes(); + for (int j = 0; j < resultNodes.getLength(); j++) { + results = new ArrayList(); + Node resultNode = resultNodes.item(j); + if (RESULT.equals(resultNode.getNodeName())) { + result = new Result(); + NamedNodeMap resultNodeMap = resultNode + .getAttributes(); + String resultName = resultNodeMap + .getNamedItem(NAME).getNodeValue(); + String resultType = resultNodeMap + .getNamedItem(TYPE).getNodeValue(); + String jspPath = resultNode.getTextContent(); + result.setName(resultName); + result.setType(resultType); + result.setJspPath(jspPath); + results.add(result); } - } + action.setResults(results); } - } + actions.add(action); + } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { @@ -132,6 +162,16 @@ private static Map readStrutsXml(String filePath, } catch (IOException e) { e.printStackTrace(); } - return xmlMap; + return actions; } + + private static Action getCurrentAction(String actionName){ + + for (int i = 0; i < actions.size(); i++) { + if(actions.get(i).getName().equals(actionName)){ + return actions.get(i); + } + } + return null; + } } \ No newline at end of file From a5722d9fa6bb9b2d7528b339f794b1119410f629 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 2 Mar 2017 20:52:14 +0800 Subject: [PATCH 033/177] =?UTF-8?q?=E4=BC=98=E5=8C=96struts=E8=AF=BB?= =?UTF-8?q?=E5=8F=96xml=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/litestruts/Struts.java | 72 ++++++++++++------- .../coderising/litestruts/bean/Action.java | 45 ++++++++++++ .../coderising/litestruts/bean/Result.java | 43 +++++++++++ 3 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Action.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Result.java diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index 699c2e3a31..325bb2b1c5 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -32,7 +32,9 @@ public class Struts { private final static String TYPE = "type"; private final static String EXECUTE = "execute"; + //Struts.xml鎻忚堪鐨勬墍鏈塧ction淇℃伅 private final static List actions; + //璇诲彇Struts.xml鑾峰彇鎵鏈塧ction鐩稿叧淇℃伅 static{ String path = "src/com/coderising/litestruts/struts.xml"; actions = readStrutsXml(path); @@ -43,16 +45,21 @@ public static View runAction(String actionName, View view = new View(); Map viewMap = new HashMap(); - + + //鑾峰彇褰撳墠璇锋眰鐨刟ction淇℃伅 Action actionBean= getCurrentAction(actionName); - + if(actionBean == null){ + return view; + } try { - String calssPath = actionBean.getClaz(); + //鍒涘缓瀹炰緥鑾峰彇灞炴 + String calssPath = actionBean.getClazz(); Class clazz = Class.forName(calssPath); Object instance = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); String fieldName; String methodName; + //璋冪敤set鏂规硶涓哄睘鎬ц祴鍊 for (int i = 0; i < fields.length; i++) { fieldName = fields[i].getName(); if(parameters.containsKey(fieldName)){ @@ -63,9 +70,10 @@ public static View runAction(String actionName, } } + //璋冪敤榛樿execute鏂规硶 Method successMethos = clazz.getMethod(EXECUTE); Object result = successMethos.invoke(instance); - + // 璋冪敤get鏂规硶鑾峰彇灞炴у for (int i = 0; i < fields.length; i++) { fieldName = fields[i].getName(); methodName = "get" + fieldName.substring(0, 1).toUpperCase() @@ -75,16 +83,14 @@ public static View runAction(String actionName, viewMap.put(fieldName, value); } + //灏佽view瀵硅薄鎵闇鏁版嵁 view.setParameters(viewMap); - List results = actionBean.getResults(); for (int i = 0; i < results.size(); i++) { - if(results.get(i).getName()){ - + if(results.get(i).getName().equals(result)){ + view.setJsp(results.get(i).getRedirectUrl()); } } - String jsp = actionBean.get(result.toString()); - view.setJsp(jsp); } catch (Exception e) { e.printStackTrace(); @@ -123,38 +129,33 @@ private static List readStrutsXml(String filePath) { action = new Action(); // 瑙f瀽action鏍囩 NamedNodeMap actionNodeMap = actionNode.getAttributes(); - String actionName = actionNodeMap.getNamedItem(NAME) - .getNodeValue(); - String claz = actionNodeMap.getNamedItem(CLASS) - .getNodeValue(); + String actionName = getNodePropertyValue(actionNodeMap.getNamedItem(NAME)); + String claz = getNodePropertyValue(actionNodeMap.getNamedItem(CLASS)); action.setName(actionName); - action.setClaz(claz); + action.setClazz(claz); // 瑙f瀽result鏍囩 NodeList resultNodes = actionNode.getChildNodes(); - for (int j = 0; j < resultNodes.getLength(); j++) { - results = new ArrayList(); + results = new ArrayList(); + for (int j = 0; j < resultNodes.getLength(); j++) { Node resultNode = resultNodes.item(j); if (RESULT.equals(resultNode.getNodeName())) { result = new Result(); - NamedNodeMap resultNodeMap = resultNode - .getAttributes(); - String resultName = resultNodeMap - .getNamedItem(NAME).getNodeValue(); - String resultType = resultNodeMap - .getNamedItem(TYPE).getNodeValue(); + NamedNodeMap resultNodeMap = resultNode.getAttributes(); + String resultName = getNodePropertyValue(resultNodeMap.getNamedItem(NAME)); + String resultType = getNodePropertyValue(resultNodeMap.getNamedItem(TYPE)); String jspPath = resultNode.getTextContent(); result.setName(resultName); result.setType(resultType); - result.setJspPath(jspPath); + result.setRedirectUrl(jspPath); results.add(result); } + } action.setResults(results); + actions.add(action); } } - - actions.add(action); - + } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { @@ -165,6 +166,11 @@ private static List readStrutsXml(String filePath) { return actions; } + /** + * 鑾峰彇褰撳墠action淇℃伅 + * @param actionName + * @return + */ private static Action getCurrentAction(String actionName){ for (int i = 0; i < actions.size(); i++) { @@ -174,4 +180,18 @@ private static Action getCurrentAction(String actionName){ } return null; } + + /** + * 鑾峰彇鑺傜偣灞炴у + * @param node + * @return + */ + private static String getNodePropertyValue(Node node){ + + if(node!=null){ + return node.getNodeValue(); + } + return null; + } + } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Action.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Action.java new file mode 100644 index 0000000000..1c8c26f6d0 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Action.java @@ -0,0 +1,45 @@ +package com.coderising.litestruts.bean; + +import java.util.List; + +/** + * struts.xml 瀵瑰簲action鏍囩 + * @author zj + */ +public class Action { + + /*鍚嶇О*/ + private String name; + + /*绫诲叏鍚嶅悕绉*/ + private String clazz; + + /*result*/ + private List 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 List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Result.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Result.java new file mode 100644 index 0000000000..a595176c19 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/bean/Result.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts.bean; + +/** + * struts.xml 瀵瑰簲result鏍囩 + * @author zj + */ +public class Result { + + /*鍚嶇О*/ + private String name; + + /*璺宠浆绫诲瀷*/ + private String type; + + /*璺宠浆璺緞*/ + private String redirectUrl; + + 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 getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + +} From 1a328aa2e97fea2367e6c89e7315ffd144b65f6b Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Thu, 2 Mar 2017 21:53:19 +0800 Subject: [PATCH 034/177] 5commit 5 data struct homework --- group12/247565311/week1/LinkedList.java | 9 ++- group12/247565311/week2/ArrayUtil.java | 80 +++++++++------------- group12/247565311/week2/ArrayUtilTest.java | 7 +- 3 files changed, 44 insertions(+), 52 deletions(-) diff --git a/group12/247565311/week1/LinkedList.java b/group12/247565311/week1/LinkedList.java index c3f0ca2eb8..3acf90ac47 100644 --- a/group12/247565311/week1/LinkedList.java +++ b/group12/247565311/week1/LinkedList.java @@ -255,8 +255,13 @@ public Object[] toArray() { @Override public T[] toArray(T[] arg0) { - - return null; + T[]res = (T[]) new Object[size]; + Node n = head; + for(int i=0;i data = new ArrayList(); - int leno = oldArray.length; - for(int i=0;i data = new ArrayList(); - int p1=0,p2=0,len1=array1.length,len2=array2.length; - int val1=0,val2=0; - if(len1 == 0) return array2; - if(len2 == 0) return array1; - while(p1=len1){ - data.add(array2[p2]); + temparray[temp] = array2[p2]; p2 += 1; continue; } if(p2>=len2){ - data.add(array1[p1]); + temparray[temp] = array1[p1]; p1 += 1; continue; } - if(p1val2){ - data.add(val2); + if(array1[p1] > array2[p2]){ + temparray[temp] = array2[p2]; p2 += 1; - }else if(val1 li = null,resli = new ArrayList(); for(int i=6;i Date: Fri, 3 Mar 2017 00:12:03 +0800 Subject: [PATCH 035/177] week1 rebuild week2 work1 finished --- group12/495473393/Code/src/Week2/array/Main.java | 15 --------------- .../Code/src/{Week1 => week1}/ArrayList.java | 0 .../Code/src/{Week1 => week1}/BinaryTreeNode.java | 0 .../Code/src/{Week1 => week1}/Iterator.java | 0 .../Code/src/{Week1 => week1}/LinkedList.java | 0 .../495473393/Code/src/{Week1 => week1}/List.java | 0 .../Code/src/{Week1 => week1}/Queue.java | 0 .../Code/src/{Week1 => week1}/Stack.java | 0 .../src/{Week2 => week2}/array/ArrayUtil.java | 0 .../{Week2 => week2}/litestruts/LoginAction.java | 0 .../src/{Week2 => week2}/litestruts/Struts.java | 0 .../{Week2 => week2}/litestruts/StrutsTest.java | 0 .../src/{Week2 => week2}/litestruts/View.java | 0 .../src/{Week2 => week2}/litestruts/struts.xml | 0 14 files changed, 15 deletions(-) delete mode 100644 group12/495473393/Code/src/Week2/array/Main.java rename group12/495473393/Code/src/{Week1 => week1}/ArrayList.java (100%) rename group12/495473393/Code/src/{Week1 => week1}/BinaryTreeNode.java (100%) rename group12/495473393/Code/src/{Week1 => week1}/Iterator.java (100%) rename group12/495473393/Code/src/{Week1 => week1}/LinkedList.java (100%) rename group12/495473393/Code/src/{Week1 => week1}/List.java (100%) rename group12/495473393/Code/src/{Week1 => week1}/Queue.java (100%) rename group12/495473393/Code/src/{Week1 => week1}/Stack.java (100%) rename group12/495473393/Code/src/{Week2 => week2}/array/ArrayUtil.java (100%) rename group12/495473393/Code/src/{Week2 => week2}/litestruts/LoginAction.java (100%) rename group12/495473393/Code/src/{Week2 => week2}/litestruts/Struts.java (100%) rename group12/495473393/Code/src/{Week2 => week2}/litestruts/StrutsTest.java (100%) rename group12/495473393/Code/src/{Week2 => week2}/litestruts/View.java (100%) rename group12/495473393/Code/src/{Week2 => week2}/litestruts/struts.xml (100%) diff --git a/group12/495473393/Code/src/Week2/array/Main.java b/group12/495473393/Code/src/Week2/array/Main.java deleted file mode 100644 index ad4388fe87..0000000000 --- a/group12/495473393/Code/src/Week2/array/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -package Week2.array; - -public class Main { - - public static void main(String[] args) { - ArrayUtil arrayUtil = new ArrayUtil(); - int[] a = { 1,3,5,7}; - int[] b={ 2,4,6,8,}; - int[] x = arrayUtil.merge(a,b); - for (int i : x) { - System.out.println(i); - } - } - -} diff --git a/group12/495473393/Code/src/Week1/ArrayList.java b/group12/495473393/Code/src/week1/ArrayList.java similarity index 100% rename from group12/495473393/Code/src/Week1/ArrayList.java rename to group12/495473393/Code/src/week1/ArrayList.java diff --git a/group12/495473393/Code/src/Week1/BinaryTreeNode.java b/group12/495473393/Code/src/week1/BinaryTreeNode.java similarity index 100% rename from group12/495473393/Code/src/Week1/BinaryTreeNode.java rename to group12/495473393/Code/src/week1/BinaryTreeNode.java diff --git a/group12/495473393/Code/src/Week1/Iterator.java b/group12/495473393/Code/src/week1/Iterator.java similarity index 100% rename from group12/495473393/Code/src/Week1/Iterator.java rename to group12/495473393/Code/src/week1/Iterator.java diff --git a/group12/495473393/Code/src/Week1/LinkedList.java b/group12/495473393/Code/src/week1/LinkedList.java similarity index 100% rename from group12/495473393/Code/src/Week1/LinkedList.java rename to group12/495473393/Code/src/week1/LinkedList.java diff --git a/group12/495473393/Code/src/Week1/List.java b/group12/495473393/Code/src/week1/List.java similarity index 100% rename from group12/495473393/Code/src/Week1/List.java rename to group12/495473393/Code/src/week1/List.java diff --git a/group12/495473393/Code/src/Week1/Queue.java b/group12/495473393/Code/src/week1/Queue.java similarity index 100% rename from group12/495473393/Code/src/Week1/Queue.java rename to group12/495473393/Code/src/week1/Queue.java diff --git a/group12/495473393/Code/src/Week1/Stack.java b/group12/495473393/Code/src/week1/Stack.java similarity index 100% rename from group12/495473393/Code/src/Week1/Stack.java rename to group12/495473393/Code/src/week1/Stack.java diff --git a/group12/495473393/Code/src/Week2/array/ArrayUtil.java b/group12/495473393/Code/src/week2/array/ArrayUtil.java similarity index 100% rename from group12/495473393/Code/src/Week2/array/ArrayUtil.java rename to group12/495473393/Code/src/week2/array/ArrayUtil.java diff --git a/group12/495473393/Code/src/Week2/litestruts/LoginAction.java b/group12/495473393/Code/src/week2/litestruts/LoginAction.java similarity index 100% rename from group12/495473393/Code/src/Week2/litestruts/LoginAction.java rename to group12/495473393/Code/src/week2/litestruts/LoginAction.java diff --git a/group12/495473393/Code/src/Week2/litestruts/Struts.java b/group12/495473393/Code/src/week2/litestruts/Struts.java similarity index 100% rename from group12/495473393/Code/src/Week2/litestruts/Struts.java rename to group12/495473393/Code/src/week2/litestruts/Struts.java diff --git a/group12/495473393/Code/src/Week2/litestruts/StrutsTest.java b/group12/495473393/Code/src/week2/litestruts/StrutsTest.java similarity index 100% rename from group12/495473393/Code/src/Week2/litestruts/StrutsTest.java rename to group12/495473393/Code/src/week2/litestruts/StrutsTest.java diff --git a/group12/495473393/Code/src/Week2/litestruts/View.java b/group12/495473393/Code/src/week2/litestruts/View.java similarity index 100% rename from group12/495473393/Code/src/Week2/litestruts/View.java rename to group12/495473393/Code/src/week2/litestruts/View.java diff --git a/group12/495473393/Code/src/Week2/litestruts/struts.xml b/group12/495473393/Code/src/week2/litestruts/struts.xml similarity index 100% rename from group12/495473393/Code/src/Week2/litestruts/struts.xml rename to group12/495473393/Code/src/week2/litestruts/struts.xml From f3673733c2597f6a8d2648b0e7949f9b68c132f9 Mon Sep 17 00:00:00 2001 From: tanghaojie Date: Fri, 3 Mar 2017 00:13:18 +0800 Subject: [PATCH 036/177] week1 rebuild and week2 first work finished --- .../org.eclipse.core.resources.prefs | 2 +- .../495473393/Code/src/week1/ArrayList.java | 2 +- .../Code/src/week1/BinaryTreeNode.java | 2 +- .../495473393/Code/src/week1/Iterator.java | 2 +- .../495473393/Code/src/week1/LinkedList.java | 2 +- group12/495473393/Code/src/week1/List.java | 2 +- group12/495473393/Code/src/week1/Queue.java | 2 +- group12/495473393/Code/src/week1/Stack.java | 2 +- .../Code/src/week2/array/ArrayUtil.java | 102 +++++++++++- .../Code/src/week2/array/ArrayUtilTest.java | 150 ++++++++++++++++++ .../src/week2/litestruts/LoginAction.java | 2 +- .../Code/src/week2/litestruts/Struts.java | 2 +- .../Code/src/week2/litestruts/StrutsTest.java | 2 +- .../Code/src/week2/litestruts/View.java | 2 +- 14 files changed, 257 insertions(+), 19 deletions(-) create mode 100644 group12/495473393/Code/src/week2/array/ArrayUtilTest.java diff --git a/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs b/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs index 3a0682eb48..7bc4554011 100644 --- a/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs +++ b/group12/495473393/Code/.settings/org.eclipse.core.resources.prefs @@ -1,3 +1,3 @@ eclipse.preferences.version=1 -encoding//src/Week2/array/ArrayUtil.java=UTF-8 +encoding//src/week2/array/ArrayUtil.java=UTF-8 encoding/src=UTF-8 diff --git a/group12/495473393/Code/src/week1/ArrayList.java b/group12/495473393/Code/src/week1/ArrayList.java index 3614ed930a..daec2f718b 100644 --- a/group12/495473393/Code/src/week1/ArrayList.java +++ b/group12/495473393/Code/src/week1/ArrayList.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public class ArrayList implements List { diff --git a/group12/495473393/Code/src/week1/BinaryTreeNode.java b/group12/495473393/Code/src/week1/BinaryTreeNode.java index d5518b7b96..2e4d695983 100644 --- a/group12/495473393/Code/src/week1/BinaryTreeNode.java +++ b/group12/495473393/Code/src/week1/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public class BinaryTreeNode { private Object data; diff --git a/group12/495473393/Code/src/week1/Iterator.java b/group12/495473393/Code/src/week1/Iterator.java index b6075594ac..dbf72bf1f7 100644 --- a/group12/495473393/Code/src/week1/Iterator.java +++ b/group12/495473393/Code/src/week1/Iterator.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public interface Iterator { public boolean hasNext(); diff --git a/group12/495473393/Code/src/week1/LinkedList.java b/group12/495473393/Code/src/week1/LinkedList.java index 9a77242c40..b6c3b9af89 100644 --- a/group12/495473393/Code/src/week1/LinkedList.java +++ b/group12/495473393/Code/src/week1/LinkedList.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public class LinkedList implements List { diff --git a/group12/495473393/Code/src/week1/List.java b/group12/495473393/Code/src/week1/List.java index 6785ebabbf..00d6eda9f6 100644 --- a/group12/495473393/Code/src/week1/List.java +++ b/group12/495473393/Code/src/week1/List.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public interface List { public void add(Object o); diff --git a/group12/495473393/Code/src/week1/Queue.java b/group12/495473393/Code/src/week1/Queue.java index a03fd44b6b..c503ef3853 100644 --- a/group12/495473393/Code/src/week1/Queue.java +++ b/group12/495473393/Code/src/week1/Queue.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public class Queue { diff --git a/group12/495473393/Code/src/week1/Stack.java b/group12/495473393/Code/src/week1/Stack.java index 074f310add..9c731b59f0 100644 --- a/group12/495473393/Code/src/week1/Stack.java +++ b/group12/495473393/Code/src/week1/Stack.java @@ -1,4 +1,4 @@ -package Week1; +package week1; public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group12/495473393/Code/src/week2/array/ArrayUtil.java b/group12/495473393/Code/src/week2/array/ArrayUtil.java index a280dd49c9..6fa6830304 100644 --- a/group12/495473393/Code/src/week2/array/ArrayUtil.java +++ b/group12/495473393/Code/src/week2/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package Week2.array; +package week2.array; import java.util.Arrays; @@ -12,6 +12,9 @@ public class ArrayUtil { * @return */ public void reverseArray(int[] origin) { + if (origin == null) { + return; + } int len = origin.length; int forLen = len / 2; int temp; @@ -31,6 +34,9 @@ public void reverseArray(int[] origin) { */ public int[] removeZero(int[] oldArray) { + if (oldArray == null) { + return null; + } int[] newArray = new int[oldArray.length]; int index = 0; for (int x : oldArray) { @@ -52,6 +58,13 @@ public int[] removeZero(int[] oldArray) { */ public int[] merge(int[] array1, int[] array2) { + if (array1 == null && array2 == null) { + return null; + } else if (array1 == null) { + return array2; + } else if (array2 == null) { + return array1; + } int[] newArray = new int[array1.length + array2.length]; int newIndex = 0; int index1 = 0; @@ -97,7 +110,13 @@ public int[] merge(int[] array1, int[] array2) { * @return */ public int[] grow(int[] oldArray, int size) { - return null; + if (oldArray == null) { + return null; + } + if (size < 0) { + size = 0; + } + return Arrays.copyOf(oldArray, oldArray.length + size); } /** @@ -108,7 +127,20 @@ public int[] grow(int[] oldArray, int size) { * @return */ public int[] fibonacci(int max) { - return null; + if (max <= 1) { + return null; + } + int now = 2; + int index = 1; + int[] fiboArray = new int[] { 1, 1 }; + while (now < max) { + now = fiboArray[index] + fiboArray[index - 1]; + if (index + 2 > fiboArray.length) { + fiboArray = Arrays.copyOf(fiboArray, fiboArray.length * 2); + } + fiboArray[++index] = now; + } + return Arrays.copyOf(fiboArray, index); } /** @@ -116,9 +148,36 @@ public int[] fibonacci(int max) { * * @param max * @return + * @throws Exception */ - public int[] getPrimes(int max) { - return null; + public int[] getPrimes(int max) throws Exception { + if (max < 2) { + return null; + } + int[] primes = new int[] { 2 }; + int index = 0; + int newPrimes = 3; + while (newPrimes < max) { + if (index + 2 > primes.length) { + primes = Arrays.copyOf(primes, primes.length * 2); + } + primes[++index] = newPrimes; + + boolean foundPrime = false; + while (!foundPrime) { + newPrimes += 2; + foundPrime = true; + int mid = newPrimes / 2 + 1; + for (int i = 3; i <= mid; i++) { + if (newPrimes % i == 0) { + foundPrime = false; + break; + } + } + } + } + + return Arrays.copyOf(primes, ++index); } /** @@ -128,7 +187,28 @@ public int[] getPrimes(int max) { * @return */ public int[] getPerfectNumbers(int max) { - return null; + int perfectNumber = 6; + if (max < perfectNumber) { + return null; + } + int[] perfectNumbers = new int[] { perfectNumber }; + + while (perfectNumber < max) { + perfectNumber++; + int sum = 0; + for (int i = 1; i < perfectNumber; i++) { + if (perfectNumber % i == 0) { + sum += i; + } + } + if (sum == perfectNumber) { + int[] newArr = new int[perfectNumbers.length + 1]; + System.arraycopy(perfectNumbers, 0, newArr, 0, perfectNumbers.length); + perfectNumbers = newArr; + perfectNumbers[perfectNumbers.length - 1] = perfectNumber; + } + } + return perfectNumbers; } /** @@ -139,7 +219,15 @@ public int[] getPerfectNumbers(int max) { * @return */ public String join(int[] array, String seperator) { - return null; + if (array == null || array.length == 0) { + return null; + } + StringBuilder sb = new StringBuilder(); + sb.append(array[0]); + for (int i = 1; i < array.length; i++) { + sb.append(seperator + array[i]); + } + return sb.toString(); } } diff --git a/group12/495473393/Code/src/week2/array/ArrayUtilTest.java b/group12/495473393/Code/src/week2/array/ArrayUtilTest.java new file mode 100644 index 0000000000..7f5cf05025 --- /dev/null +++ b/group12/495473393/Code/src/week2/array/ArrayUtilTest.java @@ -0,0 +1,150 @@ +/** + * + */ +package week2.array; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author TangHaoJie + * + */ +public class ArrayUtilTest { + + private ArrayUtil au; + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + au = new ArrayUtil(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + /** + * {@link week2.array.ArrayUtil#reverseArray(int[])} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testReverseArray() { + int[] a1 = null; + au.reverseArray(a1); + assertArrayEquals(null, a1); + + int[] a2 = new int[0]; + au.reverseArray(a2); + assertArrayEquals(new int[0], a2); + + int[] a3 = new int[] { 1, 2, 3, 4, 5, 6 }; + au.reverseArray(a3); + assertArrayEquals(new int[] { 6, 5, 4, 3, 2, 1 }, a3); + } + + /** + * {@link week2.array.ArrayUtil#removeZero(int[])} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testRemoveZero() { + int[] a1 = null; + int[] b1 = au.removeZero(a1); + assertArrayEquals(b1, a1); + + int[] a2 = new int[0]; + int[] b2 = au.removeZero(a2); + assertArrayEquals(b2, a2); + + int[] a3 = new int[] { 1, 2, 3, 4, 5, 6 }; + int[] b3 = au.removeZero(a3); + assertArrayEquals(b3, a3); + + int[] a4 = new int[] { 0, 0, 1, 2, 0, 3, 4, 0, 5, 6 }; + int[] b4 = au.removeZero(a4); + assertArrayEquals(b4, new int[] { 1, 2, 3, 4, 5, 6 }); + + int[] a5 = new int[] { 1, 2, 0, 3, 4, 0, 5, 6, 0, 0, 0 }; + int[] b5 = au.removeZero(a5); + assertArrayEquals(b5, new int[] { 1, 2, 3, 4, 5, 6 }); + } + + /** + * {@link week2.array.ArrayUtil#merge(int[], int[])} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testMerge() { + int[] a1 = null; + int[] b1 = null; + int[] c1 = au.merge(a1, b1); + assertArrayEquals(c1, null); + + int[] a2 = new int[0]; + int[] b2 = new int[0]; + int[] c2 = au.merge(a2, b2); + assertArrayEquals(c2, new int[0]); + + int[] a3 = new int[] { 1, 3, 5, 7, 9 }; + int[] b3 = new int[] { 2, 4, 6, 8, 10 }; + int[] c3 = au.merge(a3, b3); + assertArrayEquals(c3, new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); + } + + /** + * {@link week2.array.ArrayUtil#grow(int[], int)} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testGrow() { + int[] a1 = null; + int[] b1 = au.grow(a1, 0); + assertArrayEquals(b1, a1); + + int[] a2 = new int[0]; + int[] b2 = au.grow(a2, 0); + assertArrayEquals(b2, a2); + + int[] a3 = new int[] { 1, 2 }; + int[] b3 = au.grow(a3, -10); + assertArrayEquals(b3, a3); + + int[] a4 = new int[] { 1, 2 }; + int[] b4 = au.grow(a4, 5); + assertArrayEquals(b4, new int[] { 1, 2, 0, 0, 0, 0, 0 }); + } + + /** + * {@link week2.array.ArrayUtil#fibonacci(int)} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testFibonacci() { + } + + /** + * {@link week2.array.ArrayUtil#getPrimes(int)} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testGetPrimes() { + } + + /** + * {@link week2.array.ArrayUtil#getPerfectNumbers(int)} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testGetPerfectNumbers() { + } + + /** + * {@link week2.array.ArrayUtil#join(int[], java.lang.String)} 鐨勬祴璇曟柟娉曘 + */ + @Test + public void testJoin() { + } + +} diff --git a/group12/495473393/Code/src/week2/litestruts/LoginAction.java b/group12/495473393/Code/src/week2/litestruts/LoginAction.java index de7a05b462..d8daf1c835 100644 --- a/group12/495473393/Code/src/week2/litestruts/LoginAction.java +++ b/group12/495473393/Code/src/week2/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package Week2.litestruts; +package week2.litestruts; /** * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 diff --git a/group12/495473393/Code/src/week2/litestruts/Struts.java b/group12/495473393/Code/src/week2/litestruts/Struts.java index db818b0924..bafaaafd8c 100644 --- a/group12/495473393/Code/src/week2/litestruts/Struts.java +++ b/group12/495473393/Code/src/week2/litestruts/Struts.java @@ -1,4 +1,4 @@ -package Week2.litestruts; +package week2.litestruts; import java.util.Map; diff --git a/group12/495473393/Code/src/week2/litestruts/StrutsTest.java b/group12/495473393/Code/src/week2/litestruts/StrutsTest.java index 326e33daee..9187ef02f2 100644 --- a/group12/495473393/Code/src/week2/litestruts/StrutsTest.java +++ b/group12/495473393/Code/src/week2/litestruts/StrutsTest.java @@ -1,4 +1,4 @@ -package Week2.litestruts; +package week2.litestruts; import java.util.HashMap; import java.util.Map; diff --git a/group12/495473393/Code/src/week2/litestruts/View.java b/group12/495473393/Code/src/week2/litestruts/View.java index 5abed5f20d..01a422a808 100644 --- a/group12/495473393/Code/src/week2/litestruts/View.java +++ b/group12/495473393/Code/src/week2/litestruts/View.java @@ -1,4 +1,4 @@ -package Week2.litestruts; +package week2.litestruts; import java.util.Map; From dc83eec51c3186a7e6a31178c083933b24109805 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Fri, 3 Mar 2017 09:33:23 +0800 Subject: [PATCH 037/177] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2258659044/zj-2017/src/com/coderising/litestruts/Struts.java | 1 + 1 file changed, 1 insertion(+) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index 325bb2b1c5..d7196e4ce5 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -89,6 +89,7 @@ public static View runAction(String actionName, for (int i = 0; i < results.size(); i++) { if(results.get(i).getName().equals(result)){ view.setJsp(results.get(i).getRedirectUrl()); + break; } } From 00d48e6bf328abd2388ebe70dded3f0abfa5adaa Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Fri, 3 Mar 2017 09:37:52 +0800 Subject: [PATCH 038/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../production/week2/litestruts/struts.xml | 11 + .../563253496/week2/src/array/ArrayUtil.java | 329 ++++++++++++++++++ .../week2/src/litestruts/LoginAction.java | 39 +++ .../week2/src/litestruts/Struts.java | 128 +++++++ .../week2/src/litestruts/StrutsTest.java | 43 +++ .../563253496/week2/src/litestruts/View.java | 23 ++ .../563253496/week2/src/litestruts/struts.xml | 11 + .../563253496/week2/src/litestruts/test.java | 44 +++ .../week2/src/test/array/ArrayUtilTest.java | 166 +++++++++ 9 files changed, 794 insertions(+) create mode 100644 group12/563253496/week2/out/production/week2/litestruts/struts.xml create mode 100644 group12/563253496/week2/src/array/ArrayUtil.java create mode 100644 group12/563253496/week2/src/litestruts/LoginAction.java create mode 100644 group12/563253496/week2/src/litestruts/Struts.java create mode 100644 group12/563253496/week2/src/litestruts/StrutsTest.java create mode 100644 group12/563253496/week2/src/litestruts/View.java create mode 100644 group12/563253496/week2/src/litestruts/struts.xml create mode 100644 group12/563253496/week2/src/litestruts/test.java create mode 100644 group12/563253496/week2/src/test/array/ArrayUtilTest.java diff --git a/group12/563253496/week2/out/production/week2/litestruts/struts.xml b/group12/563253496/week2/out/production/week2/litestruts/struts.xml new file mode 100644 index 0000000000..bfc639857c --- /dev/null +++ b/group12/563253496/week2/out/production/week2/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/group12/563253496/week2/src/array/ArrayUtil.java b/group12/563253496/week2/src/array/ArrayUtil.java new file mode 100644 index 0000000000..d9236e72d4 --- /dev/null +++ b/group12/563253496/week2/src/array/ArrayUtil.java @@ -0,0 +1,329 @@ +package array; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + * 渚嬪锛 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 < 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 int[] removeZero(int[] oldArray) { + int count = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + count++; + } + } + int[] newArray = new int[oldArray.length - count]; + int flag = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[flag] = oldArray[i]; + flag++; + } else { + continue; + } + } + return newArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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[] temp = new int[array1.length + array2.length]; + int count = array1.length; + int point = array1.length; + for (int i = 0; i < array1.length; i++) { + temp[i] = array1[i]; + } + boolean flag = true; + for (int i = 0; i < array2.length; i++) { + for (int j = 0; j < array1.length; j++) { + if (array1[j] == array2[i]) { + flag = false; + } + } + if (flag) { + temp[count]=array2[i]; + count++; + } + flag = true; + } + */ + if (array1.length == 0) { + return array2; + } + if (array2.length == 0) { + return array1; + } + + int[] temp = new int[array1.length + array2.length]; + int ap = 0; + int bp = 0; + int count = 0; + while (ap < array1.length && bp < array2.length) { + if (array1[ap] == array2[bp]) { + temp[count] = array1[ap]; + ap++; + bp++; + count++; + } else if (array1[ap] > array2[bp]) { + temp[count] = array2[bp]; + bp++; + count++; + } else { + temp[count] = array1[ap]; + ap++; + count++; + } + } + if (ap == array1.length) { + for (int i = bp; i < array2.length; i++) { + temp[count] = array2[i]; + count++; + } + } else if (bp == array2.length) { + for (int i = ap; i < array1.length; i++) { + temp[count] = array1[i]; + count++; + } + + + } + int array3[] = new int[count]; + System.arraycopy(temp, 0, array3, 0, count); + + return array3; + /*int[] temp = new int[array2.length]; + boolean flag = true; + int count = 0; + for (int i = 0; i < array2.length; i++) { + for (int j = 0; j < array1.length; j++) { + if (array2[j] == array1[i]) { + flag = false; + } + } + if (flag) { + temp[count] = array2[i]; + count++; + } + } + if (count == 0) { + return array1; + } + + int ap = 0; //鏁扮粍1鐨勬寚閽 + int bp = 0; //鏁扮粍2鐨勬寚閽 + int[] array3 = new int[count + array1.length]; + for (int i = 0; i < array3.length; i++) { + if (array1[ap] > array2[bp]) { + array3[i] = array2[bp]; + bp++; + }else { + array3[i] = array1[ap]; + ap++; + } + + } +*/ + + } + + /** + * 鎶婁竴涓凡缁忓瓨婊℃暟鎹殑鏁扮粍 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + int a = 1; + int b = 1; + int[] result = {1, 1}; + int[] temp; + while (b < max) { + + b = a + b; + a = b - a; + temp = result; + result = new int[result.length + 1]; + + for (int i = 0; i < temp.length; i++) { + result[i] = temp[i]; + } + result[result.length - 1] = b; + } + temp = result; + result = new int[result.length - 1]; + for (int i = 0; i < result.length; i++) { + result[i] = temp[i]; + } + return result; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + /* int[] result = null; + int[] temp = null; + if (max < 2) { + return null; + } + boolean flag = true; + for (int i = 2; i < max; i++) { + for (int j = 2; j * j < i; j++) { + if (i % j == 0) { + flag = false; + } + } + if (flag) { + if (result == null) { + result = new int[1]; + result[0] = i; + } else { + temp = result; + result = new int[result.length + 1]; + for (int j = 0; j < temp.length; j++) { + result[j] = temp[j]; + } + result[result.length - 1] = i; + } + } + flag = true; + } + + return result;*/ + if (max < 2) { + return null; + } + int[] result = {2}; + int[] temp ; + boolean flag = true; + for (int i = 3; i < max; i++) { + for (int j = 2; j * j <= i; j++) { + if (i % j == 0){ + flag = false; + } + } + if (flag) { + temp=result; + result=new int[temp.length+1]; + System.arraycopy(temp,0,result,0,temp.length); + result[result.length-1]=i; + } + flag=true; + + } + return result; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] result = {}; + int[] temp = null; + int count = 0; + for (int i = 1; i < max; i++) { + for (int j = 1; j < i; j++) { + if (i % j == 0) { + count += j; + } + } + if (count == i) { + temp = result; + result = new int[temp.length + 1]; + for (int j = 0; j < temp.length; j++) { + result[j] = temp[j]; + } + result[result.length - 1] = i; + } + + } + return result; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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]); + sb.append(seperator); + } + sb.append(array[array.length - 1]); + return sb.toString(); + + } + + +} diff --git a/group12/563253496/week2/src/litestruts/LoginAction.java b/group12/563253496/week2/src/litestruts/LoginAction.java new file mode 100644 index 0000000000..bba4c11c9f --- /dev/null +++ b/group12/563253496/week2/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/group12/563253496/week2/src/litestruts/Struts.java b/group12/563253496/week2/src/litestruts/Struts.java new file mode 100644 index 0000000000..4c478cae5e --- /dev/null +++ b/group12/563253496/week2/src/litestruts/Struts.java @@ -0,0 +1,128 @@ +package litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +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 + + 1. 鏍规嵁actionName鎵惧埌鐩稿搴旂殑class 锛 渚嬪LoginAction, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + 鎹畃arameters涓殑鏁版嵁锛岃皟鐢ㄥ璞$殑setter鏂规硶锛屼緥濡俻arameters涓殑鏁版嵁鏄 + ("name"="test" , "password"="1234") , + 閭e氨搴旇璋冪敤 setName鍜宻etPassword鏂规硶 + + 2. 閫氳繃鍙嶅皠璋冪敤瀵硅薄鐨別xectue 鏂规硶锛 骞惰幏寰楄繑鍥炲硷紝渚嬪"success" + + 3. 閫氳繃鍙嶅皠鎵惧埌瀵硅薄鐨勬墍鏈塯etter鏂规硶锛堜緥濡 getMessage锛, + 閫氳繃鍙嶅皠鏉ヨ皟鐢紝 鎶婂煎拰灞炴у舰鎴愪竴涓狧ashMap , 渚嬪 {"message": "鐧诲綍鎴愬姛"} , + 鏀惧埌View瀵硅薄鐨刾arameters + + 4. 鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲硷紝 纭畾鍝竴涓猨sp锛 + 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 + + */ + + //璇诲彇閰嶇疆鏂囦欢 + + SAXReader reader = new SAXReader(); + try { + Document document = reader.read("src/litestruts/struts.xml"); + Element root = document.getRootElement(); + Element temp = null; + + /* + *淇濆瓨root鐨勫瓙鑺傜偣 + Map lables = new HashMap(); + + for (int i = 0; i < root.elements().size(); i++) { + temp = (Element) root.elements().get(i); + lables.put(temp.attribute(0).getText(), i); + } + */ + + Map viewResult = new HashMap<>(); + Map resultLable = new HashMap<>(); + Map firstLayorNode = new HashMap<>(); + + //淇濆瓨鏍硅妭鐐圭殑瀛愯妭鐐 + for (int i = 0; i < root.elements().size(); i++) { + temp = (Element)root.elements().get(i); + firstLayorNode.put(temp.attribute("name").getText(),i); + } + + View view = new View(); + + Element actionLable = (Element)root.elements().get(firstLayorNode.get(actionName)); + + if (actionName.equals("login")) { + + + for (int i = 0; i < actionLable.elements().size(); i++) { + temp = (Element) actionLable.elements().get(i); + resultLable.put(temp.attribute("name").getText(), temp.getText()); + } + + + Class clazz = Class.forName(actionLable.attribute("class").getText()); + + LoginAction la = (LoginAction) clazz.newInstance(); + la.setName(parameters.get("name")); + la.setPassword(parameters.get("password")); + + Method m = clazz.getMethod("execute"); + String result = (String) m.invoke(la); + + + view.setJsp(resultLable.get(result)); + + + m = clazz.getMethod("getMessage"); + result = (String) m.invoke(la); + viewResult.put("message", result); + + m = clazz.getMethod("getName"); + result = (String) m.invoke(la); + viewResult.put("name", result); + + m = clazz.getMethod("getPassword"); + result = (String)m.invoke(la); + viewResult.put("password", result); + + view.setParameters(viewResult); + return view; + } + + + } 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 null; + } + +} diff --git a/group12/563253496/week2/src/litestruts/StrutsTest.java b/group12/563253496/week2/src/litestruts/StrutsTest.java new file mode 100644 index 0000000000..d6be3a2d14 --- /dev/null +++ b/group12/563253496/week2/src/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +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/group12/563253496/week2/src/litestruts/View.java b/group12/563253496/week2/src/litestruts/View.java new file mode 100644 index 0000000000..1eed614744 --- /dev/null +++ b/group12/563253496/week2/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/group12/563253496/week2/src/litestruts/struts.xml b/group12/563253496/week2/src/litestruts/struts.xml new file mode 100644 index 0000000000..bfc639857c --- /dev/null +++ b/group12/563253496/week2/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/group12/563253496/week2/src/litestruts/test.java b/group12/563253496/week2/src/litestruts/test.java new file mode 100644 index 0000000000..f29f7ee366 --- /dev/null +++ b/group12/563253496/week2/src/litestruts/test.java @@ -0,0 +1,44 @@ +package litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +/** + * Created by bdl19 on 2017/3/2. + */ +public class test { + public static void main(String[] args) { + SAXReader reader = new SAXReader(); + try { + Document document = reader.read("src/litestruts/struts.xml"); + Element root = document.getRootElement(); + System.out.println(root.elements().size()); + + +/* + + String s = "login"; + String string = "login"; + System.out.println(root.getName()); + Element action = root.element("action"); + System.out.print(action.getName()); + System.out.print(action.attribute("name").getText()); + System.out.print(action.attribute("name").getText()); + String str = action.attribute("name").getText(); + if (str.equals(s)) { + System.out.println(123123); + System.out.println("123"); + // Class clazz = Class.forName(action.attribute("class")); + } + System.out.println(s); + System.out.println(str); + +*/ + + } catch (DocumentException e) { + e.printStackTrace(); + } + } +} diff --git a/group12/563253496/week2/src/test/array/ArrayUtilTest.java b/group12/563253496/week2/src/test/array/ArrayUtilTest.java new file mode 100644 index 0000000000..57a0c6d648 --- /dev/null +++ b/group12/563253496/week2/src/test/array/ArrayUtilTest.java @@ -0,0 +1,166 @@ +package test.array; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import array.ArrayUtil; + +import java.lang.reflect.Array; + +/** + * ArrayUtil Tester. + * + * @author + * @version 1.0 + * @since
三月 2, 2017
+ */ +public class ArrayUtilTest { + + @Before + public void before() throws Exception { + + } + + @After + public void after() throws Exception { + + } + + /** + * Method: reverseArray(int[] origin) + */ + @Test + public void testReverseArray() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + int[] a = {7, 9, 30, 3}; + int[] b = {3, 30, 9, 7}; + au.reverseArray(a); + for (int i = 0; i < a.length; i++) { + Assert.assertEquals(b[i], a[i]); + } + + a = new int[]{7, 9, 30, 3, 4}; + b = new int[]{4, 3, 30, 9, 7}; + au.reverseArray(a); + for (int i = 0; i < a.length; i++) { + Assert.assertEquals(b[i], a[i]); + } + + } + + /** + * Method: removeZero(int[] oldArray) + */ + @Test + public void testRemoveZero() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + + int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int result[] = au.removeZero(oldArr); + int exResult[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + Assert.assertEquals(result.length,exResult.length); + for (int i = 0; i < result.length; i++) { + Assert.assertEquals(result[i], exResult[i]); + + } + } + + /** + * Method: merge(int[] array1, int[] array2) + */ + @Test + public void testMerge() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] a3 = {3, 4, 5, 6, 7, 8}; + int[] result = au.merge(a1,a2); + Assert.assertEquals(a3.length, result.length); + for (int i = 0; i < result.length; i++) { + Assert.assertEquals(a3[i],result[i]); + } + } + + /** + * Method: grow(int[] oldArray, int size) + */ + @Test + public void testGrow() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + + int[] oldArray = {2,3,6}; + int size = 3; + + int[] newArray = au.grow(oldArray,size); + int[] exArray = {2,3,6,0,0,0}; + for (int i = 0; i < newArray.length; i++) { + Assert.assertEquals(exArray[i],newArray[i]); + } + + } + + /** + * Method: fibonacci(int max) + */ + @Test + public void testFibonacci() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + int[] exArray = {1,1,2,3,5,8,13}; + int[] newArray = au.fibonacci(14); + for (int i = 0; i < newArray.length; i++) { + Assert.assertEquals(exArray[i],newArray[i]); + } + } + + /** + * Method: getPrimes(int max) + */ + @Test + public void testGetPrimes() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + int[] exArray = {2,3,5,7,11,13,17,19}; + int[] newArray = au.getPrimes(23); + for (int i = 0; i < newArray.length; i++) { + Assert.assertEquals(exArray[i],newArray[i]); + } + } + + /** + * Method: getPerfectNumbers(int max) + */ + @Test + public void testGetPerfectNumbers() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + int exArray[] = {6,28,496}; + int[] newArray = au.getPerfectNumbers(1000); + for (int i = 0; i < newArray.length; i++) { + Assert.assertEquals(exArray[i],newArray[i]); + } + + + } + + /** + * Method: join(int[] array, String seperator) + */ + @Test + public void testJoin() throws Exception { +//TODO: Test goes here... + ArrayUtil au = new ArrayUtil(); + String exS = "3-8-9"; + int[] array= {3,8,9}; + String result = au.join(array,"-"); + Assert.assertEquals(exS,result); + } + + +} From 30451976494cc5513a923ddacda73f34e1f0820c Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Fri, 3 Mar 2017 11:57:30 +0800 Subject: [PATCH 039/177] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zj-2017/src/com/coderising/litestruts/Struts.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java index d7196e4ce5..57f4f6d55e 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java +++ b/group12/2258659044/zj-2017/src/com/coderising/litestruts/Struts.java @@ -66,7 +66,9 @@ public static View runAction(String actionName, methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method method = clazz.getMethod(methodName, fields[i].getType()); - method.invoke(instance, parameters.get(fieldName)); + if(method != null){ + method.invoke(instance, parameters.get(fieldName)); + } } } @@ -79,9 +81,10 @@ public static View runAction(String actionName, methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method method = clazz.getMethod(methodName); - Object value = method.invoke(instance); - viewMap.put(fieldName, value); - + if(method != null){ + Object value = method.invoke(instance); + viewMap.put(fieldName, value); + } } //灏佽view瀵硅薄鎵闇鏁版嵁 view.setParameters(viewMap); From 23e6c4261e1aafcb614dcd52c203f8383b8c4b2e Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Fri, 3 Mar 2017 12:55:44 +0800 Subject: [PATCH 040/177] =?UTF-8?q?=E4=BA=A4=E7=AC=AC=E4=BA=8C=E5=91=A8?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E4=B8=9A=EF=BC=9A=E6=A8=A1=E6=8B=9Fstrut?= =?UTF-8?q?=E8=AF=BB=E5=8F=96xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group12/247565311/week2/LoginAction.java | 30 +++++++ group12/247565311/week2/Struts.java | 105 +++++++++++++++++++++++ group12/247565311/week2/StrutsTest.java | 50 +++++++++++ group12/247565311/week2/View.java | 21 +++++ group12/247565311/week2/struts.xml | 11 +++ 5 files changed, 217 insertions(+) create mode 100644 group12/247565311/week2/LoginAction.java create mode 100644 group12/247565311/week2/Struts.java create mode 100644 group12/247565311/week2/StrutsTest.java create mode 100644 group12/247565311/week2/View.java create mode 100644 group12/247565311/week2/struts.xml diff --git a/group12/247565311/week2/LoginAction.java b/group12/247565311/week2/LoginAction.java new file mode 100644 index 0000000000..b0ae6ebf5b --- /dev/null +++ b/group12/247565311/week2/LoginAction.java @@ -0,0 +1,30 @@ +package week2; + +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/group12/247565311/week2/Struts.java b/group12/247565311/week2/Struts.java new file mode 100644 index 0000000000..b8a9f8a721 --- /dev/null +++ b/group12/247565311/week2/Struts.java @@ -0,0 +1,105 @@ +package week2; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + + + + + + + +import org.dom4j.*; +import org.dom4j.io.SAXReader; + +public class Struts { + @SuppressWarnings("unchecked") + public static View runAction(String actionName,Mapparameters){ + if(actionName == null || parameters == null) return null; + List actions = null; + try { + File xmlfile = new File("D:\\5Java\\coding2017\\group12\\247565311\\week2\\struts.xml"); + Document doc = new SAXReader().read(xmlfile); + Element root = doc.getRootElement(); + actions = root.elements(); + } catch (DocumentException e) { + e.printStackTrace(); + } + + String className=""; + Element curActNode = null; + for(int i=0;i attrs = actions.get(i).attributes(); + for(int j=0;j class1 = null; + try { + class1 = Class.forName(className); + class1Instance = class1.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + for(String key : parameters.keySet()){ + String methodName = "set"+(new StringBuilder()).append(Character.toUpperCase(key.charAt(0))).append(key.substring(1)).toString(); + Object methodPara=parameters.get(key); + try { + Method method =class1.getMethod(methodName, String.class); + method.invoke(class1Instance, methodPara); + } catch (Exception e) { + e.printStackTrace(); + } + } + Object exeResult = null; + try { + Method method =class1.getMethod("execute"); + exeResult = method.invoke(class1Instance); + } catch (Exception e) { + e.printStackTrace(); + } + + String jsp = null; + List results = curActNode.elements(); + for(int i=0;i attrs = results.get(i).attributes(); + for(int j=0;j para = new HashMap(); + view.setParameters(para); + + Field [] fields = class1.getDeclaredFields(); + 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"); //密码和预设的不一致 + + 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/group12/247565311/week2/View.java b/group12/247565311/week2/View.java new file mode 100644 index 0000000000..ccf254d458 --- /dev/null +++ b/group12/247565311/week2/View.java @@ -0,0 +1,21 @@ +package week2; +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/group12/247565311/week2/struts.xml b/group12/247565311/week2/struts.xml new file mode 100644 index 0000000000..234232d0b6 --- /dev/null +++ b/group12/247565311/week2/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + From 29954837d7626621b786df0c1c8d63b39e417e12 Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Fri, 3 Mar 2017 12:57:17 +0800 Subject: [PATCH 041/177] some changes to homework1 not important --- group12/247565311/week1/ArrayListTest.java | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 group12/247565311/week1/ArrayListTest.java diff --git a/group12/247565311/week1/ArrayListTest.java b/group12/247565311/week1/ArrayListTest.java new file mode 100644 index 0000000000..846dd152f5 --- /dev/null +++ b/group12/247565311/week1/ArrayListTest.java @@ -0,0 +1,113 @@ +package week1; + +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; + +public class ArrayListTest { + + @Before + public void setUp() throws Exception { + // 执行测试方法钱执行此方法 + } + + @After + public void tearDown() throws Exception { + // 测试用例执行完了执行此方法 + } + + @Test + public void testArrayList() { + fail("尚未实现"); + } + + @Test + public void testAddE() { + fail("尚未实现"); + } + + @Test + public void testAddIntE() { + fail("尚未实现"); + } + + @Test + public void testAddAllCollectionOfQextendsE() { + fail("尚未实现"); + } + + @Test + public void testAddAllIntCollectionOfQextendsE() { + fail("尚未实现"); + } + + @Test + public void testClear() { + fail("尚未实现"); + } + + @Test + public void testContains() { + fail("尚未实现"); + } + + @Test + public void testContainsAll() { + fail("尚未实现"); + } + + @Test + public void testGet() { + fail("尚未实现"); + } + + @Test + public void testIndexOf() { + fail("尚未实现"); + } + + @Test + public void testIsEmpty() { + fail("尚未实现"); + } + + @Test + public void testRemoveObject() { + fail("尚未实现"); + } + + @Test + public void testRemoveInt() { + fail("尚未实现"); + } + + @Test + public void testRemoveAll() { + fail("尚未实现"); + } + + @Test + public void testRetainAll() { + fail("尚未实现"); + } + + @Test + public void testSet() { + fail("尚未实现"); + } + + @Test + public void testSize() { + fail("尚未实现"); + } + + @Test + public void testToArray() { + fail("尚未实现"); + } + +} From 66c131f662cf93b807793a30d8360b19d65684d6 Mon Sep 17 00:00:00 2001 From: guodongym Date: Fri, 3 Mar 2017 21:58:14 +0800 Subject: [PATCH 042/177] del --- 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 --- 13 files changed, 1007 deletions(-) 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 diff --git a/group12/377401843/learning_1/.gitignore b/group12/377401843/learning_1/.gitignore deleted file mode 100644 index b12088665a..0000000000 --- a/group12/377401843/learning_1/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -/.project -/.classpath diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/ArrayList.java b/group12/377401843/learning_1/src/com/guodong/datastructure/ArrayList.java deleted file mode 100644 index 880af45da8..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/ArrayList.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.guodong.datastructure; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - /** - * 鎸変笅鏍囬『搴忔柊澧炲厓绱 - * - * @Method add - * @param o - * @see com.guodong.datastructure.List#add(java.lang.Object) - */ - public void add(Object o) { - ensureCapacityInternal(size + 1); - elementData[size] = o; - size++; - } - - /** - * 鍦ㄦ寚瀹氫笅鏍囦綅缃彃鍏ュ厓绱 - * - * @Method add - * @param index - * @param o - * @see com.guodong.datastructure.List#add(int, java.lang.Object) - */ - public void add(int index, Object o) { - checkRangeForAdd(index); - - ensureCapacityInternal(size + 1); - - System.arraycopy(elementData, index, elementData, index + 1, size - index); - - elementData[index] = o; - size++; - } - - /** - * 鏍规嵁涓嬫爣鑾峰彇鍒楄〃鏁版嵁 - * - * @Method get - * @param index - * @return - * @see com.guodong.datastructure.List#get(int) - */ - public Object get(int index) { - checkRangeForGetOrRemove(index); - - return elementData[index]; - } - - /** - * 鏍规嵁涓嬫爣绉婚櫎鍏冪礌锛屽苟杩斿洖绉婚櫎鐨勫厓绱犲 - * - * @Method remove - * @param index - * @return - * @see com.guodong.datastructure.List#remove(int) - */ - public Object remove(int index) { - checkRangeForGetOrRemove(index); - - Object oldValue = elementData[index]; - - System.arraycopy(elementData, index + 1, elementData, index, size - index -1); - - size--; - elementData[size] = null; - - return oldValue; - } - - /** - * 鑾峰緱鍒楄〃闀垮害 - * - * @Method size - * @return - * @see com.guodong.datastructure.List#size() - */ - public int size() { - return size; - } - - /** - * 鑾峰彇ArrayList鐨勮凯浠e櫒 - * - * @MethodName iterator - * @author zhaogd - * @date 2017骞2鏈21鏃 涓嬪崍8:19:28 - * @return - */ - public Iterator iterator() { - return new ArrayListIterator(); - } - - /** - * 纭繚鏁扮粍瀹归噺瓒冲锛屽鏋滀笉澶熷垯鎵╁厖鏁扮粍 - * - * @MethodName ensureCapacityInternal - * @author zhaogd - * @date 2017骞2鏈21鏃 涓嬪崍5:06:46 - * @param minCapacity - */ - private void ensureCapacityInternal(int minCapacity) { - if(minCapacity > elementData.length){ - grow(minCapacity); - } - } - - /** - * 鏁扮粍鎵╁厖锛屾瘡娆℃墿鍏呭師鏁扮粍涓鍗婄殑闀垮害锛岀劧鍚庢妸鍘熸暟缁勬嫹璐濆埌鏂版暟缁 - * - * @MethodName grow - * @author zhaogd - * @date 2017骞2鏈21鏃 涓嬪崍5:20:55 - * @param minCapacity - */ - private void grow(int minCapacity) { - minCapacity = elementData.length + elementData.length / 2; - elementData = Arrays.copyOf(elementData, minCapacity); - } - - /** - * 妫鏌dd鏂规硶鐨勪笅鏍囪寖鍥存槸鍚﹀悎娉 - * - * @MethodName checkRangeForAdd - * @author zhaogd - * @date 2017骞2鏈21鏃 涓嬪崍7:32:55 - * @param index - */ - private void checkRangeForAdd(int index) { - if(index > size || index < 0){ - throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); - } - } - - /** - * 妫鏌et鎴栬匯emove鏂规硶鐨勪笅鏍囪寖鍥存槸鍚﹀悎娉 - * - * @MethodName checkRangeForGetOrRemove - * @author zhaogd - * @date 2017骞2鏈21鏃 涓嬪崍7:33:21 - * @param index - */ - private void checkRangeForGetOrRemove(int index) { - if(index >= 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 2ced039d20..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 8d486220b0..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 976129cc84..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 1a6f12da52..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 6dc85d8ec0..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 c2b5049e73..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 f38f58614d..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() { - // 娴嬭瘯鏂板涓嬫爣寮傚父鏃讹紝鏄惁鍙互姝g‘鎶涘嚭寮傚父 - arrayList.add(-1, 2); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForAdd2() { - // 娴嬭瘯鏂板涓嬫爣寮傚父鏃讹紝鏄惁鍙互姝g‘鎶涘嚭寮傚父 - 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 537cd5961f..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 52d42b5aa7..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 1773b5027c..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 74ac8e7cc7..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()); - } - -} From 9e6f0cb292b6e9d9622df42a1bc74d906a0b362e Mon Sep 17 00:00:00 2001 From: guodongym Date: Fri, 3 Mar 2017 22:07:02 +0800 Subject: [PATCH 043/177] maven --- group12/377401843/learning/.gitignore | 4 + group12/377401843/learning/pom.xml | 71 +++++ .../main/java/com/zhaogd/array/ArrayUtil.java | 114 +++++++ .../java/com/zhaogd/collection/ArrayList.java | 170 +++++++++++ .../com/zhaogd/collection/BinaryTreeNode.java | 58 ++++ .../java/com/zhaogd/collection/Iterator.java | 9 + .../com/zhaogd/collection/LinkedList.java | 285 ++++++++++++++++++ .../main/java/com/zhaogd/collection/List.java | 14 + .../java/com/zhaogd/collection/Queue.java | 21 ++ .../java/com/zhaogd/collection/Stack.java | 25 ++ .../com/zhaogd/litestruts/LoginAction.java | 39 +++ .../java/com/zhaogd/litestruts/Struts.java | 34 +++ .../com/zhaogd/litestruts/StrutsTest.java | 43 +++ .../main/java/com/zhaogd/litestruts/View.java | 23 ++ .../java/com/zhaogd/litestruts/struts.xml | 11 + .../com/zhaogd/collection/ArrayListTest.java | 134 ++++++++ .../zhaogd/collection/BinaryTreeNodeTest.java | 35 +++ .../com/zhaogd/collection/LinkedListTest.java | 142 +++++++++ .../java/com/zhaogd/collection/QueueTest.java | 62 ++++ .../java/com/zhaogd/collection/StackTest.java | 46 +++ 20 files changed, 1340 insertions(+) create mode 100644 group12/377401843/learning/.gitignore create mode 100644 group12/377401843/learning/pom.xml create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/BinaryTreeNode.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/Iterator.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/List.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/collection/Stack.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/litestruts/struts.xml create mode 100644 group12/377401843/learning/src/test/java/com/zhaogd/collection/ArrayListTest.java create mode 100644 group12/377401843/learning/src/test/java/com/zhaogd/collection/BinaryTreeNodeTest.java create mode 100644 group12/377401843/learning/src/test/java/com/zhaogd/collection/LinkedListTest.java create mode 100644 group12/377401843/learning/src/test/java/com/zhaogd/collection/QueueTest.java create mode 100644 group12/377401843/learning/src/test/java/com/zhaogd/collection/StackTest.java diff --git a/group12/377401843/learning/.gitignore b/group12/377401843/learning/.gitignore new file mode 100644 index 0000000000..8bd3a05882 --- /dev/null +++ b/group12/377401843/learning/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.settings/ +/.classpath +/.project diff --git a/group12/377401843/learning/pom.xml b/group12/377401843/learning/pom.xml new file mode 100644 index 0000000000..1d11205656 --- /dev/null +++ b/group12/377401843/learning/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + com.zhaogd.projects + learning + 1.0.0 + jar + + + + junit + junit + 4.12 + + + + + + + ${project.basedir}/src/main/resources + true + + + ${project.basedir}/src/main/java + + **/*.java + + + + + + + ${project.basedir}/src/test/java + + **/*.java + + + + ${project.basedir}/src/test/resources + + + ${project.basedir}/src/main/java + + **/*.java + + + + ${project.basedir}/src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + 1.8 + UTF-8 + true + 128m + 512m + + + + + diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java new file mode 100644 index 0000000000..f62f0eceef --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java @@ -0,0 +1,114 @@ +package com.zhaogd.array; + +import java.util.ArrayList; +import java.util.Arrays; + + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 渚嬪锛 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 tmp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = tmp; + } + 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 Integer[] removeZero(int[] oldArray) { + ArrayList arrayList = new ArrayList(); + for (int i : oldArray) { + if (i != 0) { + arrayList.add(i); + } + } + return arrayList.toArray(new Integer[arrayList.size()]); + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 渚嬪 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); + + 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 null; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java new file mode 100644 index 0000000000..d3afc5e01a --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java @@ -0,0 +1,170 @@ +package com.zhaogd.collection; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + /** + * 鎸変笅鏍囬『搴忔柊澧炲厓绱 + * + * @Method add + * @param o + * @see com.guodong.datastructure.List#add(java.lang.Object) + */ + public void add(Object o) { + ensureCapacityInternal(size + 1); + elementData[size] = o; + size++; + } + + /** + * 鍦ㄦ寚瀹氫笅鏍囦綅缃彃鍏ュ厓绱 + * + * @Method add + * @param index + * @param o + * @see com.guodong.datastructure.List#add(int, java.lang.Object) + */ + public void add(int index, Object o) { + checkRangeForAdd(index); + + ensureCapacityInternal(size + 1); + + System.arraycopy(elementData, index, elementData, index + 1, size - index); + + elementData[index] = o; + size++; + } + + /** + * 鏍规嵁涓嬫爣鑾峰彇鍒楄〃鏁版嵁 + * + * @Method get + * @param index + * @return + * @see com.guodong.datastructure.List#get(int) + */ + public Object get(int index) { + checkRangeForGetOrRemove(index); + + return elementData[index]; + } + + /** + * 鏍规嵁涓嬫爣绉婚櫎鍏冪礌锛屽苟杩斿洖绉婚櫎鐨勫厓绱犲 + * + * @Method remove + * @param index + * @return + * @see com.guodong.datastructure.List#remove(int) + */ + public Object remove(int index) { + checkRangeForGetOrRemove(index); + + Object oldValue = elementData[index]; + + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + + size--; + elementData[size] = null; + + return oldValue; + } + + /** + * 鑾峰緱鍒楄〃闀垮害 + * + * @Method size + * @return + * @see com.guodong.datastructure.List#size() + */ + public int size() { + return size; + } + + /** + * 鑾峰彇ArrayList鐨勮凯浠e櫒 + * + * @MethodName iterator + * @author zhaogd + * @date 2017骞2鏈21鏃 涓嬪崍8:19:28 + * @return + */ + public Iterator iterator() { + return new ArrayListIterator(); + } + + /** + * 纭繚鏁扮粍瀹归噺瓒冲锛屽鏋滀笉澶熷垯鎵╁厖鏁扮粍 + * + * @MethodName ensureCapacityInternal + * @author zhaogd + * @date 2017骞2鏈21鏃 涓嬪崍5:06:46 + * @param minCapacity + */ + private void ensureCapacityInternal(int minCapacity) { + if (minCapacity > elementData.length) { + grow(minCapacity); + } + } + + /** + * 鏁扮粍鎵╁厖锛屾瘡娆℃墿鍏呭師鏁扮粍涓鍗婄殑闀垮害锛岀劧鍚庢妸鍘熸暟缁勬嫹璐濆埌鏂版暟缁 + * + * @MethodName grow + * @author zhaogd + * @date 2017骞2鏈21鏃 涓嬪崍5:20:55 + * @param minCapacity + */ + private void grow(int minCapacity) { + minCapacity = elementData.length + elementData.length / 2; + elementData = Arrays.copyOf(elementData, minCapacity); + } + + /** + * 妫鏌dd鏂规硶鐨勪笅鏍囪寖鍥存槸鍚﹀悎娉 + * + * @MethodName checkRangeForAdd + * @author zhaogd + * @date 2017骞2鏈21鏃 涓嬪崍7:32:55 + * @param index + */ + private void checkRangeForAdd(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); + } + } + + /** + * 妫鏌et鎴栬匯emove鏂规硶鐨勪笅鏍囪寖鍥存槸鍚﹀悎娉 + * + * @MethodName checkRangeForGetOrRemove + * @author zhaogd + * @date 2017骞2鏈21鏃 涓嬪崍7:33:21 + * @param index + */ + private void checkRangeForGetOrRemove(int index) { + if (index >= 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/src/main/java/com/zhaogd/collection/BinaryTreeNode.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/BinaryTreeNode.java new file mode 100644 index 0000000000..ee256391e7 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/BinaryTreeNode.java @@ -0,0 +1,58 @@ +package com.zhaogd.collection; + +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/src/main/java/com/zhaogd/collection/Iterator.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Iterator.java new file mode 100644 index 0000000000..0d9e6013d6 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Iterator.java @@ -0,0 +1,9 @@ +package com.zhaogd.collection; + +public interface Iterator { + + public boolean hasNext(); + + public Object next(); + +} diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java new file mode 100644 index 0000000000..1cd0c2e2b3 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java @@ -0,0 +1,285 @@ +package com.zhaogd.collection; + +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/src/main/java/com/zhaogd/collection/List.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/List.java new file mode 100644 index 0000000000..fb2f1bb78e --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/List.java @@ -0,0 +1,14 @@ +package com.zhaogd.collection; + +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/src/main/java/com/zhaogd/collection/Queue.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java new file mode 100644 index 0000000000..d4a0647ab6 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java @@ -0,0 +1,21 @@ +package com.zhaogd.collection; + +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/src/main/java/com/zhaogd/collection/Stack.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Stack.java new file mode 100644 index 0000000000..afb01f5f92 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Stack.java @@ -0,0 +1,25 @@ +package com.zhaogd.collection; + +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/src/main/java/com/zhaogd/litestruts/LoginAction.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java new file mode 100644 index 0000000000..17edaa63b1 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java new file mode 100644 index 0000000000..fa2f5eea7c --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.zhaogd.litestruts; + +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/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java new file mode 100644 index 0000000000..41e8313502 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java new file mode 100644 index 0000000000..a790924f7d --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java @@ -0,0 +1,23 @@ +package com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/struts.xml b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/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/group12/377401843/learning/src/test/java/com/zhaogd/collection/ArrayListTest.java b/group12/377401843/learning/src/test/java/com/zhaogd/collection/ArrayListTest.java new file mode 100644 index 0000000000..c54e99b4db --- /dev/null +++ b/group12/377401843/learning/src/test/java/com/zhaogd/collection/ArrayListTest.java @@ -0,0 +1,134 @@ +package com.zhaogd.collection; + +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; + +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() { + // 娴嬭瘯鏂板涓嬫爣寮傚父鏃讹紝鏄惁鍙互姝g‘鎶涘嚭寮傚父 + arrayList.add(-1, 2); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForAdd2() { + // 娴嬭瘯鏂板涓嬫爣寮傚父鏃讹紝鏄惁鍙互姝g‘鎶涘嚭寮傚父 + 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/src/test/java/com/zhaogd/collection/BinaryTreeNodeTest.java b/group12/377401843/learning/src/test/java/com/zhaogd/collection/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..797d457c21 --- /dev/null +++ b/group12/377401843/learning/src/test/java/com/zhaogd/collection/BinaryTreeNodeTest.java @@ -0,0 +1,35 @@ +package com.zhaogd.collection; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +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/src/test/java/com/zhaogd/collection/LinkedListTest.java b/group12/377401843/learning/src/test/java/com/zhaogd/collection/LinkedListTest.java new file mode 100644 index 0000000000..32cac4bc6d --- /dev/null +++ b/group12/377401843/learning/src/test/java/com/zhaogd/collection/LinkedListTest.java @@ -0,0 +1,142 @@ +package com.zhaogd.collection; + +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; + +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/src/test/java/com/zhaogd/collection/QueueTest.java b/group12/377401843/learning/src/test/java/com/zhaogd/collection/QueueTest.java new file mode 100644 index 0000000000..29c5e15752 --- /dev/null +++ b/group12/377401843/learning/src/test/java/com/zhaogd/collection/QueueTest.java @@ -0,0 +1,62 @@ +package com.zhaogd.collection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.NoSuchElementException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +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/src/test/java/com/zhaogd/collection/StackTest.java b/group12/377401843/learning/src/test/java/com/zhaogd/collection/StackTest.java new file mode 100644 index 0000000000..510e4c45f6 --- /dev/null +++ b/group12/377401843/learning/src/test/java/com/zhaogd/collection/StackTest.java @@ -0,0 +1,46 @@ +package com.zhaogd.collection; + +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; + +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()); + } + +} From 6304409d52ed8a1cc103e0e6dc977df9141b3b0a Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Sat, 4 Mar 2017 22:37:44 +0800 Subject: [PATCH 044/177] comlete comlete --- .../com/coderising/action/LoginAction.java | 42 +++++++ .../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 | 11 ++ 5 files changed, 236 insertions(+) create mode 100644 group12/446031103/src/com/coderising/action/LoginAction.java create mode 100644 group12/446031103/src/com/coderising/litestruts/Struts.java create mode 100644 group12/446031103/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group12/446031103/src/com/coderising/litestruts/View.java create mode 100644 group12/446031103/src/com/coderising/litestruts/struts.xml diff --git a/group12/446031103/src/com/coderising/action/LoginAction.java b/group12/446031103/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..2a0b6d477b --- /dev/null +++ b/group12/446031103/src/com/coderising/action/LoginAction.java @@ -0,0 +1,42 @@ +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; + } + public void setMessage(String message){ + this.message = message; + } +} diff --git a/group12/446031103/src/com/coderising/litestruts/Struts.java b/group12/446031103/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..b0e784d9fa --- /dev/null +++ b/group12/446031103/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,117 @@ +package com.coderising.litestruts; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +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.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.action.LoginAction; + +/** + * @ClassName: Struts + * @Description: TODO + * @author: msh + * @date: 2017-3-2 涓婂崍9:37:55 + * @version: V1.0 + */ +public class Struts { + public static View runAction(String actionName, Map parameters) { + Map xmlDoc = getXMLDOC(actionName); + Map viewMap = new HashMap(); + View view = new View(); + view.setParameters(viewMap); + try { + Class classz = Class.forName(xmlDoc.get(actionName)); + LoginAction la = (LoginAction) classz.newInstance(); + la.setName(parameters.get("name")); + la.setPassword(parameters.get("password")); + Method exectue = classz.getMethod("execute", null); + Object result = exectue.invoke(la, null); + Field[] fields = classz.getDeclaredFields(); + for (Field field : fields) { + PropertyDescriptor pd = new PropertyDescriptor(field.getName(), classz); + Method readMethod = pd.getReadMethod(); + viewMap.put(field.getName(), (String) readMethod.invoke(la, null)); + } + view.setJsp(xmlDoc.get(result)); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (SecurityException 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(); + } catch (IntrospectionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + /* + * 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 view; + } + /** + * @MethodName: getXMLDOC + * @Description: 瑙f瀽xml鏂囦欢 + * @param actionName + * @return + * @return: Map + */ + private static Map getXMLDOC(String actionName) { + Map xmldoc = new HashMap(); + // 瑙f瀽struts.xml鏂囦欢 + // 鍒涘缓SAXReader鐨勫璞eader + SAXReader reader = new SAXReader(); + try { + // 閫氳繃reader瀵硅薄鐨剅ead鏂规硶璇诲彇struts.xml锛屽緱鍒癲ocument瀵硅薄 + Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml")); + // 鑾峰彇鏍硅妭鐐 + Element struts = document.getRootElement(); + // 杩唬鑺傜偣 + Iterator actions = struts.elementIterator(); + while (actions.hasNext()) { + Element action = (Element) actions.next(); + if (actionName.equals(action.attributeValue("name"))) { + xmldoc.put(action.attributeValue("name"), action.attributeValue("class")); + Iterator results = action.elementIterator(); + while (results.hasNext()) { + Element result = (Element) results.next(); + xmldoc.put(result.attributeValue("name"), result.getStringValue()); + } + break; + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } + return xmldoc; + } + +} diff --git a/group12/446031103/src/com/coderising/litestruts/StrutsTest.java b/group12/446031103/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/litestruts/View.java b/group12/446031103/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/litestruts/struts.xml b/group12/446031103/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..90cf18b7da --- /dev/null +++ b/group12/446031103/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 From f86730b9bbe5dd3206739ee30badce14bf19b91b Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Sun, 5 Mar 2017 10:44:57 +0800 Subject: [PATCH 045/177] minor refactor --- group12/382266293/src/litestruts/Struts.java | 11 ++++------- group12/382266293/src/litestruts/StrutsTest.java | 4 ---- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index 2eb4a01848..cb7593c657 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -16,13 +16,12 @@ public class Struts { private static Object actionObj = null; private static String address = "src/litestruts/struts.xml"; + private static ActionXMLreader reader = new ActionXMLreader(); @SuppressWarnings("unchecked") public static View runAction(String actionName, Map parameters){ - - ActionXMLreader reader = new ActionXMLreader(); + Node root = reader.getRootNode(address); - String clazz = reader.parseClass(root, actionName); actionObj = getObj(clazz); BeanInfo bi = getBeanInfo(actionObj); @@ -30,10 +29,8 @@ public static View runAction(String actionName, Map parameters){ setParameters(actionObj, pd, parameters); String executeResult = (String) getResult(actionObj, bi, "execute"); - String jsp = reader.parseResult(root, actionName, executeResult); - - Map readParamters = new HashMap(); - readParamters = getReadParameters(actionObj, pd); + String jsp = reader.parseResult(root, actionName, executeResult); + Map readParamters = getReadParameters(actionObj, pd); View view = new View(); view.setJsp(jsp); diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java index 67893b9f3b..35686c8e30 100644 --- a/group12/382266293/src/litestruts/StrutsTest.java +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -8,10 +8,6 @@ import org.junit.Assert; import org.junit.Test; - - - - public class StrutsTest { @Test From 51b29654aabc083bdc554f5f2e75acd164bca257 Mon Sep 17 00:00:00 2001 From: guodongym Date: Sun, 5 Mar 2017 12:45:43 +0800 Subject: [PATCH 046/177] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/zhaogd/litestruts/struts.xml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/litestruts/struts.xml diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/struts.xml b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/struts.xml deleted file mode 100644 index a6cfe43e6c..0000000000 --- a/group12/377401843/learning/src/main/java/com/zhaogd/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 From 75d687506ce3c332473aeab42ce6c8f740ac7dd8 Mon Sep 17 00:00:00 2001 From: guodongym Date: Sun, 5 Mar 2017 12:46:16 +0800 Subject: [PATCH 047/177] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group12/377401843/learning/pom.xml | 7 ++ .../main/java/com/zhaogd/array/ArrayUtil.java | 95 +++++++++++++++---- .../com/zhaogd/litestruts/LoginAction.java | 57 +++++------ .../java/com/zhaogd/litestruts/Struts.java | 93 +++++++++++++----- .../com/zhaogd/litestruts/StrutsTest.java | 4 +- .../main/java/com/zhaogd/litestruts/View.java | 11 ++- .../learning/src/main/resources/struts.xml | 11 +++ .../java/com/zhaogd/array/ArrayUtilTest.java | 62 ++++++++++++ 8 files changed, 264 insertions(+), 76 deletions(-) create mode 100644 group12/377401843/learning/src/main/resources/struts.xml create mode 100644 group12/377401843/learning/src/test/java/com/zhaogd/array/ArrayUtilTest.java diff --git a/group12/377401843/learning/pom.xml b/group12/377401843/learning/pom.xml index 1d11205656..f252611284 100644 --- a/group12/377401843/learning/pom.xml +++ b/group12/377401843/learning/pom.xml @@ -13,6 +13,13 @@ junit 4.12 + + + dom4j + dom4j + 1.6.1 + + diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java index f62f0eceef..64596aa807 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayUtil.java @@ -1,8 +1,7 @@ package com.zhaogd.array; -import java.util.ArrayList; import java.util.Arrays; - +import java.util.HashSet; public class ArrayUtil { @@ -13,13 +12,12 @@ public class ArrayUtil { * @param origin * @return */ - public static void reverseArray(int[] origin) { + public void reverseArray(int[] origin) { 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; } - System.out.println(Arrays.toString(origin)); } /** @@ -29,14 +27,16 @@ public static void reverseArray(int[] origin) { * @param oldArray * @return */ - public Integer[] removeZero(int[] oldArray) { - ArrayList arrayList = new ArrayList(); + public int[] removeZero(int[] oldArray) { + int[] newArr = new int[oldArray.length]; + int z = 0; for (int i : oldArray) { if (i != 0) { - arrayList.add(i); + newArr[z] = i; + z++; } } - return arrayList.toArray(new Integer[arrayList.size()]); + return Arrays.copyOf(newArr, z); } /** @@ -48,12 +48,21 @@ public Integer[] removeZero(int[] oldArray) { * @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); - + HashSet set = new HashSet<>(); + for (Integer i : array1) { + set.add(i); + } + for (Integer i : array2) { + set.add(i); + } + int[] array3 = new int[set.size()]; + int i = 0; + for (int s : set) { + array3[i] = s; + i++; + } Arrays.sort(array3); + return array3; } @@ -67,7 +76,7 @@ public int[] merge(int[] array1, int[] array2) { * @return */ public int[] grow(int[] oldArray, int size) { - return null; + return Arrays.copyOf(oldArray, oldArray.length + size); } /** @@ -78,7 +87,23 @@ public int[] grow(int[] oldArray, int size) { * @return */ public int[] fibonacci(int max) { - return null; + if (max == 1) { + return new int[] {}; + } + int a = 1; + int b = 1; + int count = 2; + for (int i = 1; i < max; i = a + b) { + a = b; + b = i; + count++; + } + int[] array = new int[count-1]; + array[0] = array[1] = 1; + for (int i = 2; i < array.length; i++) { + array[i] = array[i - 2] + array[i - 1]; + } + return array; } /** @@ -88,7 +113,22 @@ public int[] fibonacci(int max) { * @return */ public int[] getPrimes(int max) { - return null; + int[] array = new int[max]; + int z = 0; + for (int i = 2; i < max; i++) { + boolean flag = true; + for (int j = 2; j <= Math.sqrt(i); j++) { + if (i % j == 0) { //濡傛灉鍙栨ā涓0锛屽垯涓哄悎鏁 + flag = false; + break; + } + } + if (flag) { + array[z] = i; + z++; + } + } + return Arrays.copyOf(array, z); } /** @@ -98,7 +138,22 @@ public int[] getPrimes(int max) { * @return */ public int[] getPerfectNumbers(int max) { - return null; + int[] array = new int[max]; + int z = 0; + for (int i = 0; i < max; i++) { + int tmp = 0; + for (int j = 1; j < i / 2 + 1; j++) { + if (i % j == 0) { + tmp += j; + } + } + if (tmp == i) { + array[z] = tmp; + z++; + } + } + + return Arrays.copyOf(array, z); } /** @@ -109,6 +164,10 @@ public int[] getPerfectNumbers(int max) { * @return */ public String join(int[] array, String seperator) { - return null; + String s = ""; + for (int i = 0; i < array.length; i++) { + s += array[i] + seperator; + } + return s.substring(0, s.length() - 1); } } diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java index 17edaa63b1..9011030c54 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/LoginAction.java @@ -2,38 +2,41 @@ /** * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 + * * @author liuxin * */ -public class LoginAction{ - private String name ; - private String password; - private String message; +public class LoginAction { + private String name; + private String password; + private String message; - public String getName() { - return name; - } + public String getName() { + return name; + } - public String getPassword() { - return password; - } + 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 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 setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } } diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java index fa2f5eea7c..f9c8afc214 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/Struts.java @@ -1,34 +1,77 @@ package com.zhaogd.litestruts; +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.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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 - 鎹畃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; - } + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) throws Exception { + + SAXReader reader = new SAXReader(); + Document document = reader.read(Struts.class.getResourceAsStream("/struts.xml")); + Element rootElement = document.getRootElement(); + List elements = rootElement.elements("action"); + + HashMap hashMap = new HashMap(); + for (Element element : elements) { + String name = element.attributeValue("name"); + if (name != null && !"".equals(name) && actionName.equals(name)) { + hashMap.put("actionName", name); + hashMap.put("class", element.attributeValue("class")); + List resultElements = element.elements("result"); + for (Element resultElement : resultElements) { + hashMap.put(resultElement.attributeValue("name"), (String) resultElement.getData()); + } + break; + } + } + + Class c = Class.forName(hashMap.get("class")); + Object o = c.newInstance(); + Set> entrySet = parameters.entrySet(); + for (Entry parameter : entrySet) { + Method method = o.getClass().getMethod("set" + parameter.getKey().substring(0, 1).toUpperCase() + + parameter.getKey().substring(1).toLowerCase(), String.class); + method.invoke(o, parameter.getValue()); + } + + Method exectue = o.getClass().getMethod("execute"); + String invoke = (String) exectue.invoke(o); + + View view = new View(); + view.setJsp(hashMap.get(invoke)); + HashMap p = new HashMap(); + p.put("message", (String) o.getClass().getMethod("getMessage").invoke(o)); + view.setParameters(p); + + /* + * + * 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 view; + } } diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java index 41e8313502..1a213157f3 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/StrutsTest.java @@ -13,7 +13,7 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() { + public void testLoginActionSuccess() throws Exception { String actionName = "login"; @@ -29,7 +29,7 @@ public void testLoginActionSuccess() { } @Test - public void testLoginActionFailed() { + public void testLoginActionFailed() throws Exception { String actionName = "login"; Map params = new HashMap(); params.put("name","test"); diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java index a790924f7d..f5a451e7fc 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/litestruts/View.java @@ -4,19 +4,22 @@ public class View { private String jsp; - private Map parameters; - + private Map parameters; + public String getJsp() { return jsp; } + public View setJsp(String jsp) { this.jsp = jsp; return this; } - public Map getParameters() { + + public Map getParameters() { return parameters; } - public View setParameters(Map parameters) { + + public View setParameters(Map parameters) { this.parameters = parameters; return this; } diff --git a/group12/377401843/learning/src/main/resources/struts.xml b/group12/377401843/learning/src/main/resources/struts.xml new file mode 100644 index 0000000000..8e318d5de1 --- /dev/null +++ b/group12/377401843/learning/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/group12/377401843/learning/src/test/java/com/zhaogd/array/ArrayUtilTest.java b/group12/377401843/learning/src/test/java/com/zhaogd/array/ArrayUtilTest.java new file mode 100644 index 0000000000..f08eab4b3e --- /dev/null +++ b/group12/377401843/learning/src/test/java/com/zhaogd/array/ArrayUtilTest.java @@ -0,0 +1,62 @@ +package com.zhaogd.array; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +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 testReverseArray() { + int[] origin = new int[] { 7, 9, 30, 3 }; + arrayUtil.reverseArray(origin); + assertArrayEquals(origin, new int[] { 3, 30, 9, 7 }); + } + + @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); + assertArrayEquals(newArr, new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }); + } + + @Test + public void testMerge() { + int arr1[] = { 3, 5, 7, 8 }; + int arr2[] = { 4, 5, 6, 7 }; + int[] arr3 = arrayUtil.merge(arr1, arr2); + + assertArrayEquals(arr3, new int[] { 3, 4, 5, 6, 7, 8 }); + } + + @Test + public void testGrow() { + int[] arr = { 2, 3, 6 }; + int[] newArr = arrayUtil.grow(arr, 3); + assertArrayEquals(newArr, new int[] { 2, 3, 6, 0, 0, 0 }); + } + + @Test + public void testFibonacci() { + assertArrayEquals(new int[] {}, arrayUtil.fibonacci(1)); + assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, arrayUtil.fibonacci(15)); + } + + @Test + public void testGetPrimes() { + assertArrayEquals(new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }, arrayUtil.getPrimes(23)); + } + +} From eac15330f716857372e7e0760a872330f39f6063 Mon Sep 17 00:00:00 2001 From: bate999999999 <282742732@qq.com> Date: Sun, 5 Mar 2017 13:00:55 +0800 Subject: [PATCH 048/177] commit --- .gitignore | 25 +++++++++++++++++++++++++ .gitignore.bak | 16 ++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 .gitignore.bak diff --git a/.gitignore b/.gitignore index ec55baf87d..ccd4cbfe60 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,28 @@ hs_err_pid* #ide config .metadata .recommenders + + +*.xml +*.iml +.idea +*.iml +rebel.xml +rebel-remote.xml + +.classpath +.project +.setting +.metadata + +target +*.class + +log +*.log +tmp +*.tmp + +.metadata +RemoteSystemsTempFiles +.gitignore \ No newline at end of file diff --git a/.gitignore.bak b/.gitignore.bak new file mode 100644 index 0000000000..ec55baf87d --- /dev/null +++ b/.gitignore.bak @@ -0,0 +1,16 @@ +*.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 From ce8b11925b80d902ab78d78de14bc23d8c41a16e Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Sun, 5 Mar 2017 21:27:44 +0800 Subject: [PATCH 049/177] change some bugs --- group12/247565311/week2/ArrayUtil.java | 6 +++--- group12/247565311/week2/Struts.java | 7 ------- group12/247565311/week2/StrutsTest.java | 2 -- group12/247565311/week2/View.java | 3 +++ liuxin/src/com/coderising/litestruts/Struts.java | 1 + 5 files changed, 7 insertions(+), 12 deletions(-) diff --git a/group12/247565311/week2/ArrayUtil.java b/group12/247565311/week2/ArrayUtil.java index ba88dd147c..b76726b7b5 100644 --- a/group12/247565311/week2/ArrayUtil.java +++ b/group12/247565311/week2/ArrayUtil.java @@ -11,9 +11,9 @@ public class ArrayUtil { * @return */ public void reverseArray(int[] origin){ // time :O(n) - int leno = origin.length,temp=0; + int leno = origin.length; for(int i=0;i parameters) { + /* 0. 璇诲彇閰嶇疆鏂囦欢struts.xml From 98f0c0cafde61ca1a8d482b2283341d2f790fd14 Mon Sep 17 00:00:00 2001 From: Hipple <1159828430@qq.com> Date: Sun, 5 Mar 2017 21:51:35 +0800 Subject: [PATCH 050/177] liteStruts --- group18/1159828430/20170226/.classpath | 9 + group18/1159828430/20170226/.gitignore | 1 + group18/1159828430/20170226/.project | 17 ++ .../src/com/coding/array/ArrayUtil.java | 232 ++++++++++++++++++ .../src/com/coding/array/ArrayUtilTest.java | 80 ++++++ .../com/coding/litestruts/LoginAction.java | 38 +++ .../src/com/coding/litestruts/Struts.java | 84 +++++++ .../src/com/coding/litestruts/StrutsTest.java | 43 ++++ .../src/com/coding/litestruts/View.java | 27 ++ .../src/com/coding/litestruts/struts.xml | 11 + 10 files changed, 542 insertions(+) create mode 100644 group18/1159828430/20170226/.classpath create mode 100644 group18/1159828430/20170226/.gitignore create mode 100644 group18/1159828430/20170226/.project create mode 100644 group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java create mode 100644 group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java create mode 100644 group18/1159828430/20170226/src/com/coding/litestruts/LoginAction.java create mode 100644 group18/1159828430/20170226/src/com/coding/litestruts/Struts.java create mode 100644 group18/1159828430/20170226/src/com/coding/litestruts/StrutsTest.java create mode 100644 group18/1159828430/20170226/src/com/coding/litestruts/View.java create mode 100644 group18/1159828430/20170226/src/com/coding/litestruts/struts.xml diff --git a/group18/1159828430/20170226/.classpath b/group18/1159828430/20170226/.classpath new file mode 100644 index 0000000000..2dcf9f7eab --- /dev/null +++ b/group18/1159828430/20170226/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group18/1159828430/20170226/.gitignore b/group18/1159828430/20170226/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group18/1159828430/20170226/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group18/1159828430/20170226/.project b/group18/1159828430/20170226/.project new file mode 100644 index 0000000000..30be1e8fb2 --- /dev/null +++ b/group18/1159828430/20170226/.project @@ -0,0 +1,17 @@ + + + 20170226 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java b/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java new file mode 100644 index 0000000000..3440cbbb71 --- /dev/null +++ b/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java @@ -0,0 +1,232 @@ +package com.coding.array; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * @author Scholar + * @Time锛2017骞2鏈27鏃 涓嬪崍8:46:07 + * @version 1.0 + */ +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 a = [7, 9 , 30, 3] , 缃崲鍚庝负 [3, 30, 9,7] + 濡傛灉 a = [7, 9, 30, 3, 4] , 缃崲鍚庝负 [4,3, 30 , 9,7] + * @param origin + * @return + * @return + */ + public static 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} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + //姝e父鏂瑰紡 + /*List list = new ArrayList(); + for (int i : oldArray) + if (i != 0) + list.add(i); + + int[] newArray = new int[list.size()]; + for (int i = 0; i < newArray.length; i++) { + newArray[i] = list.get(i); + }*/ + //jdk1.8 + IntStream intStream = Arrays.stream(oldArray); + int[] newArray = intStream.filter(i -> i != 0).toArray(); + return newArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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]; + System.arraycopy(array1, 0, newArray, 0, array1.length); + System.arraycopy(array2, 0, newArray, array1.length, array2.length); + + //Arrays.sort(newArray);//蹇熸帓搴 + + //鍐掓场鎺掑簭 + /*for(int i=0;i newArray[j]){ + int temp = newArray[i]; + newArray[i] = newArray[j]; + newArray[j] = temp; + } + } + }*/ + + //閫夋嫨鎺掑簭 + /*for (int i = 0; i < newArray.length - 1; i++) { + int min = i; + for (int j = i + 1; j < newArray.length; j++) { + if (newArray[min] > newArray[j]) { + min = j; + } + } + if (min != i) { + int temp = newArray[i]; + newArray[i] = newArray[min]; + newArray[min] = temp; + } + }*/ + + //鎻掑叆鎺掑簭 + for (int i = 1; i < newArray.length; i++) { + for (int j = i; j > 0; j--) { + if (newArray[j] < newArray[j - 1]) { + int temp = newArray[j - 1]; + newArray[j - 1] = newArray[j]; + newArray[j] = temp; + } else + break; + } + } + 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){ + oldArray = Arrays.copyOf(oldArray, oldArray.length + size); + return oldArray; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細1锛1锛2锛3锛5锛8锛13锛21...... 锛岀粰瀹氫竴涓渶澶у硷紝 杩斿洖灏忎簬璇ュ肩殑鏁板垪 + * 渚嬪锛 max = 15 , 鍒欒繑鍥炵殑鏁扮粍搴旇涓 [1锛1锛2锛3锛5锛8锛13] + * max = 1, 鍒欒繑鍥炵┖鏁扮粍 [] + * @param max + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static int[] fibonacci(int max){ + List list = new ArrayList(); + if (max == 1) { + int[] newArr = null; + return newArr; + } else { + for (int i = 0; i <= max; i++) { + int value = fibonacciSequence(i); + if (value < max) { + list.add(value); + } else { + break; + } + } + } + int[] newArray = list.stream().mapToInt(i -> i).toArray(); + return newArray; + } + + private static int fibonacciSequence(int n){ + if(n < 2){ + return 1; + }else{ + return fibonacciSequence(n-1) + fibonacciSequence(n-2); + } + } + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + @SuppressWarnings("unused") + public static int[] getPrimes(int max){ + List list = new ArrayList(); + for (int i = 2; i < max; i++) { + list.add(i); + for (int j = 2; j <= Math.sqrt(i); j++) { + if (i % j == 0){ + Integer temp = i; + list.remove(temp); + break; + } + } + } + + int[] newArray = list.stream().mapToInt(i -> i).toArray(); + return newArray; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + List list = new ArrayList(); + int[] newArray = null; + if (!(max < 6)) {//绗竴涓畬鏁颁负6 + for (int i = 6; i < max; i++) { + int sum = 0; + for (int j = 1; j <= i/2; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) { + list.add(i); + } + System.out.println(i); + } + newArray = list.stream().mapToInt(i -> i).toArray(); + } + return newArray; + } + + /** + * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 + * 渚嬪array= [3,8,9], seperator = "-" + * 鍒欒繑鍥炲间负"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + StringBuilder str = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + str.append(array[i]); + if(i != array.length - 1){ + str.append(seperator); + } + } + return str.toString(); + } + +} + diff --git a/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java b/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java new file mode 100644 index 0000000000..a07658d0ca --- /dev/null +++ b/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java @@ -0,0 +1,80 @@ +package com.coding.array; + +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.Test; + +/** + * @author Scholar + * @Time锛2017骞3鏈4鏃 涓婂崍9:12:27 + * @version 1.0 + */ +public class ArrayUtilTest { + + @Test + public void testReverseArray(){ + int[] oldArr = {7, 9 , 30, 3}; + int[] newArr = ArrayUtil.reverseArray(oldArr); + int[] resultArr = {3, 30 , 9, 7}; + assertArrayEquals(resultArr, newArr); + + } + + @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); + int[] resultArr = {1,3,4,5,6,6,5,4,7,6,7,5}; + assertArrayEquals(resultArr, newArr); + } + + @Test + public void testMerge() { + int[] a1 = {3,5,7,8}; + int[] a2 = {4, 5, 6,7}; + int[] newArr = ArrayUtil.merge(a1, a2); + Arrays.stream(newArr).forEach(i -> System.out.println(i)); + } + + @Test + public void testGrow() { + int[] oldArr = {2,3,6}; + int[] newArr = ArrayUtil.grow(oldArr, 3); + int[] resultArr = {2,3,6,0,0,0}; + assertArrayEquals(resultArr, newArr); + } + + @Test + public void testFibonacci() { + int[] newArr = ArrayUtil.fibonacci(15); + int[] resultArr = {1, 1, 2, 3, 5, 8, 13}; + assertArrayEquals(resultArr, newArr); + } + + @Test + public void testGetPrimes() { + int[] newArr = ArrayUtil.getPrimes(23); + int[] resultArr = {2,3,5,7,11,13,17,19}; + assertArrayEquals(resultArr, newArr); + } + + @Test + public void testGetPerfectNumbers() { + int[] newArr = ArrayUtil.getPerfectNumbers(500); + int[] resultArr = {6, 28, 496}; + assertArrayEquals(resultArr, newArr); + } + + @Test + public void testJoin() { + int[] oldArr = {3,8,9}; + String resultStr = ArrayUtil.join(oldArr, "-"); + String str = "3-8-9"; + assertEquals(str, resultStr); + } + +} diff --git a/group18/1159828430/20170226/src/com/coding/litestruts/LoginAction.java b/group18/1159828430/20170226/src/com/coding/litestruts/LoginAction.java new file mode 100644 index 0000000000..308a0c17fd --- /dev/null +++ b/group18/1159828430/20170226/src/com/coding/litestruts/LoginAction.java @@ -0,0 +1,38 @@ +package com.coding.litestruts; +/** + * @author Scholar + * @Time锛2017骞2鏈27鏃 涓嬪崍8:50:23 + * @version 1.0 + */ +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/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java b/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java new file mode 100644 index 0000000000..92a485db1b --- /dev/null +++ b/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java @@ -0,0 +1,84 @@ +package com.coding.litestruts; + +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.Map.Entry; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +/** + * @author Scholar + * @Time锛2017骞2鏈27鏃 涓嬪崍8:49:47 + * @version 1.0 + */ +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + try {//澶氳浠g爜闇瑕乼ry catch鏃讹紝濡備綍鍚堢悊浣跨敤try cath鍜宼hrow Exception锛 + Element actionElement = getElement("action", actionName); + //瀹炰緥鍖朼ction骞惰缃弬鏁 + String actionAdress = actionElement.attribute("class").getText(); + Class actionClass = Class.forName(actionAdress); + Object actionObj = actionClass.newInstance(); + for (Entry entry : parameters.entrySet()) { + Method setMethod = actionClass.getMethod("set"+initStr(entry.getKey()), String.class); + setMethod.invoke(actionObj, entry.getValue()); + } + + //鎵цexecute + Method executeMethod = actionClass.getMethod("execute"); + //Type returnType = m.getGenericReturnType();//鑾峰彇杩斿洖鍊肩被鍨 + String returnValue = (String)executeMethod.invoke(actionObj);//杩欓噷濡備綍鏍规嵁杩斿洖绫诲瀷鏉ュ姩鎬佹帴鏀舵柟娉曠殑杩斿洖鍊硷紵 + + //鑾峰彇杩斿洖鍊兼斁鍒皏iew + Map params = new HashMap(); + Field[] fields = actionClass.getDeclaredFields(); + for (Field field : fields) { + Method m = actionClass.getMethod("get"+initStr(field.getName())); + params.put(field.getName(), (String) m.invoke(actionObj)); + } + Class viewClass = View.class; + Object viewObj = viewClass.newInstance(); + Field paramField = viewClass.getDeclaredField("parameters"); + paramField.setAccessible(true); + paramField.set(viewObj, params); + + //灏嗗搴攔esult鐨勫艰祴鍊肩粰view骞惰繑鍥瀡iew瀵硅薄 + Element resultElement = getElement("result", returnValue); + String jsp = resultElement.getStringValue(); + Method setJsp = viewClass.getMethod("setJsp", String.class); + return (View)setJsp.invoke(viewObj, jsp); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + //DOM4J缁撳悎XPATH瑙f瀽XML,鍙栧緱鐩稿簲鐨勮妭鐐 + private static Element getElement(String node, String name){ + Document document; + Element element = null; + try { + File file = new File("src/com/coding/litestruts/struts.xml"); + SAXReader reader = new SAXReader(); + document = reader.read(file); + element = (Element) document.selectSingleNode("//"+ node + "[@name='" + name + "']"); + } catch (Exception e) { + System.out.println("璇诲彇XML澶辫触"); + } + return element; + } + + // 灏嗗崟璇嶇殑棣栧瓧姣嶅ぇ鍐 + public static String initStr(String old){ + String str = old.substring(0,1).toUpperCase() + old.substring(1) ; + return str ; + } +} \ No newline at end of file diff --git a/group18/1159828430/20170226/src/com/coding/litestruts/StrutsTest.java b/group18/1159828430/20170226/src/com/coding/litestruts/StrutsTest.java new file mode 100644 index 0000000000..4bf614bbbc --- /dev/null +++ b/group18/1159828430/20170226/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; + +/** + * @author Scholar + * @Time锛2017骞2鏈27鏃 涓嬪崍8:51:23 + * @version 1.0 + */ +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/group18/1159828430/20170226/src/com/coding/litestruts/View.java b/group18/1159828430/20170226/src/com/coding/litestruts/View.java new file mode 100644 index 0000000000..3c7175350a --- /dev/null +++ b/group18/1159828430/20170226/src/com/coding/litestruts/View.java @@ -0,0 +1,27 @@ +package com.coding.litestruts; + +import java.util.Map; +/** + * @author Scholar + * @Time锛2017骞2鏈27鏃 涓嬪崍8:49:10 + * @version 1.0 + */ +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/group18/1159828430/20170226/src/com/coding/litestruts/struts.xml b/group18/1159828430/20170226/src/com/coding/litestruts/struts.xml new file mode 100644 index 0000000000..60f2bc6c41 --- /dev/null +++ b/group18/1159828430/20170226/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 From 211f2809ab913e1fc636db3bc1ca8936263b8c20 Mon Sep 17 00:00:00 2001 From: Hipple <1159828430@qq.com> Date: Sun, 5 Mar 2017 22:14:34 +0800 Subject: [PATCH 051/177] update Merge --- .../src/com/coding/array/ArrayUtil.java | 66 +++++++------------ .../src/com/coding/array/ArrayUtilTest.java | 3 +- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java b/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java index 3440cbbb71..c634a3a0b6 100644 --- a/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java +++ b/group18/1159828430/20170226/src/com/coding/array/ArrayUtil.java @@ -65,49 +65,33 @@ public static int[] removeZero(int[] oldArray){ */ public static int[] merge(int[] array1, int[] array2){ - int[] newArray= new int[array1.length + array2.length]; - System.arraycopy(array1, 0, newArray, 0, array1.length); - System.arraycopy(array2, 0, newArray, array1.length, array2.length); - - //Arrays.sort(newArray);//蹇熸帓搴 - - //鍐掓场鎺掑簭 - /*for(int i=0;i newArray[j]){ - int temp = newArray[i]; - newArray[i] = newArray[j]; - newArray[j] = temp; - } - } - }*/ - - //閫夋嫨鎺掑簭 - /*for (int i = 0; i < newArray.length - 1; i++) { - int min = i; - for (int j = i + 1; j < newArray.length; j++) { - if (newArray[min] > newArray[j]) { - min = j; - } - } - if (min != i) { - int temp = newArray[i]; - newArray[i] = newArray[min]; - newArray[min] = temp; - } - }*/ - - //鎻掑叆鎺掑簭 - for (int i = 1; i < newArray.length; i++) { - for (int j = i; j > 0; j--) { - if (newArray[j] < newArray[j - 1]) { - int temp = newArray[j - 1]; - newArray[j - 1] = newArray[j]; - newArray[j] = temp; - } else - break; + int lena = array1.length; + int lenb = array2.length; + int[] newArray = new int[lena + lenb]; + int i = 0, j = 0, k = 0;// 鍒嗗埆浠h〃鏁扮粍a ,b , c 鐨勭储寮 + + while (i < array1.length && j < array2.length) + if (array1[i] <= array2[j]) { + if (k == 0 || newArray[k - 1] != array1[i]) // 鍘婚噸澶 + newArray[k++] = array1[i]; + i++; + } else { + if (k == 0 || newArray[k - 1] != array2[j]) // 鍘婚噸澶 + newArray[k++] = array2[j]; + j++; } + + while (i < array1.length) { + if (k == 0 || newArray[k - 1] != array1[i]) // 鍘婚噸澶 + newArray[k++] = array1[i]; + i++; + } + while (j < array2.length) { + if (k == 0 || newArray[k - 1] != array2[j]) // 鍘婚噸澶 + newArray[k++] = array2[j]; + j++; } + newArray = removeZero(newArray); return newArray; } /** diff --git a/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java b/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java index a07658d0ca..575c02540c 100644 --- a/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java +++ b/group18/1159828430/20170226/src/com/coding/array/ArrayUtilTest.java @@ -37,7 +37,8 @@ public void testMerge() { int[] a1 = {3,5,7,8}; int[] a2 = {4, 5, 6,7}; int[] newArr = ArrayUtil.merge(a1, a2); - Arrays.stream(newArr).forEach(i -> System.out.println(i)); + int[] resultArr = {3,4,5,6,7,8}; + assertArrayEquals(resultArr, newArr); } @Test From 0b4c649413805ea15ce7ae5f44d7cb9742089f0f Mon Sep 17 00:00:00 2001 From: Hipple <1159828430@qq.com> Date: Sun, 5 Mar 2017 22:52:28 +0800 Subject: [PATCH 052/177] add jar --- .../1159828430/20170226/lib/dom4j-1.6.1.jar | Bin 0 -> 313898 bytes .../20170226/lib/jaxen-1.1-beta-6.jar | Bin 0 -> 244330 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 group18/1159828430/20170226/lib/dom4j-1.6.1.jar create mode 100644 group18/1159828430/20170226/lib/jaxen-1.1-beta-6.jar diff --git a/group18/1159828430/20170226/lib/dom4j-1.6.1.jar b/group18/1159828430/20170226/lib/dom4j-1.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8c4dbb92d6c23a7fbb2813eb721eb4cce91750c GIT binary patch literal 313898 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

^<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/group18/1159828430/20170226/lib/jaxen-1.1-beta-6.jar b/group18/1159828430/20170226/lib/jaxen-1.1-beta-6.jar new file mode 100644 index 0000000000000000000000000000000000000000..6cef35dac44ca72c47fa43ae3603eabd8e8d366e GIT binary patch literal 244330 zcmbq*19WBEwrxcf+pgHQZQHhORcza~ZQD-8w(X>T&b{~jd(U~Vo&Q^VJG<@dw)YrW zV~*8VpQDdCS7arCfFZv9@c>Uwp#R64f4zWz{gx6^r+rHJjt@2x z7!Zur7h@CQcECE53N>8Xg(ZcuS239|GN%MH5H(+NbNHzE+&Fz4IJC&DjcivC=s2YM za;Nv=e2O2gWXv&IKZX@wVn}#w-(1i;8IzlA5}>*~49HMegv}`)FvgC3T$_=NA1xWS zQ7$OkM;;B+TVONP`GHPb0H_!I>?NMP?Re?A3(PN}QEV#yQ`!>p8%LY*%{hc{fF&ekBa!;Y)u`lEdRyub2R!pk3UCm>||}=XlC=Dsrl<6Q2%s@|Lb7n>i9Qtq5aQJ zt`3%e=k@2<%=Mi0^o{iXF1A1C%KY!o8^WJrvek3^O4Q%|@ju%;=(&EmnEuC@0W8D+ zgvLK7>c8yu^&E`;!|AWt#rRWD|K((AWNB+;@9;N%e;&D$quJj9@XzRW{TI6b$uWPu z643t?5dT;7srZ%wDb8skB_3*?}LjJrotgla%OcP0OFq?DK5Kp&ej+_ZzPC|LD z8)OW$)*#KH-H?om{Kq6kuM8}3K5D?#5?kptDNxU1|L z7+ifjU9F@`WF23tGxQ6Y^f@TPW{fo_2LjaXOalVC`R*Jh3%hIpAL@=4f3GG&4&CMU z6&|N+@@#8oMT-*)ddC_B(pIw9<%SDnYnTgycuyN-_y&l$MP}#&!gwbbkF)1z^WCmL zMA9}Mj`u)+Kj-=|X7u&>Fy|ZiwD(xO2*nK=jtORV%nieL5BZ_#mp4fCZbe%N@4+%2 zqP<^|-Vx|N`Pcwywflt|+EjSvY z3X)DQLeNtM%UnWvU$%c5--AnDNSe5FG+Fq&m-(x)PqD=>smw=&>|0vv{>Y>Y8&xh+ z_zoVW<{_vYJLgR3&P0$2U*ZDqe2^SU+`tupo=yLGd ze3B})+Eg%gTD+%jAD$$3ZR0_gGTUgKd0o_gU6*E-VALlZ|1AAGC zMx;;z1Hx$3lwgt=dA)mFNP9@kLM9V)MY>p&hA#naEn}K#_YeXGfknJ~a;bmDY<+71 z9~wPosm-yQ13@O7it-5%I+t|T2};RW+PKE8ykC-`FZkNrNkLU%My5N@%TZiF0(zpx zW*Lq$Ts%(M(#A&N!`TV|l{E9@4Tt6y1w7${2ZBGKQLCh1wVJchrvIeSj_x>hi@m-w zOUJmQiu&-L{y>@{xB_;ldc4FS8)N1mN;Bbf680$v&PZMn%Ut-b0rTukY?1A`A$3k}4Xc1tpr4|EG85>gMwc+D|vdthYJdE%6r z;{y*&;8n_q85KOyVoH`h*+%a|gE}`X^t0XMqtESOKHJ&kS%azMS^an9OFK~FoHmt` za=NHsA7HAHsKCZuZe;m$C$qJpBi)J}h!$?b?o}emVcPeluJFH=ZxB8O%my)Ygd~*n z3a-g1D{JiQ!en;l$*l*tk!kjjk%4j=r}u~fN|ycc(5uT@;C?6GVEE{$nC&5}fxY4p zBCBkR``Yq7sOI_nP(zR)ch)WLxrGLD7dA-mD{X);!uS7*%{ z$2j?{i6`xMR!T44t$)r4d)h%jPTmC~=MI1^Z^2P1dnT=tuT2h)-Z4jJ*)~^8D1Bz- z&fSe~36i7U0<*BTNEvp#Mn(x>VV7?8dmmXN+l%>hfpGI z2_yIaC6Z-P7$$z6|9&z*jD%f?{F#u#6)R#kMkrpuq0cTRP3)}UrKv`7bYp4;_IM)3 z?px8GtdT!RrgENFps)22=?ux5Pg?rS;yXV?^dqqJGX>J(ZgLmgpvnKGDwc@`cZObV zW6VMN=zKDa$jfO>!JY4Ii>T5UevV2QdOFN5Ce#QN*4@M(- zra?C9M#-+h!7jHm(SE;t3t7G&!k$6e@+lRU_HC)-}Q}$~y`0(RX>@92>-0+0L9TliBLx zVD}Y@+>J< z3^R^^Q-4DGpDQWh5O*BeW0s(c8 zo|@9I*A%woReca+%XGWyK|gL9bP<{38!#AkA*YB72?Fe4n&wsk9h|8rN1!r-?*JSg zt?m7LJWO$NY>+>!dO(_1OlF%Sx)NiX;1>k*f@M8s?%~Thde>L|?VZQXBvwXeg?)i=`B=7Z-$#XA|aCbt_P&f*2zi6%`AFDJ$T4TWCwN1 z9y7Rs9bACsfnp^V#i9PpXT<3zT=zG|8WwYn;e4zq)ehiI8!cXgV?owBCT)Y;Xb|r8 zgE>CFAr-&yt29l%fKNoutm8(&7B&FTq3e8O6muIofLY{|!%p~tuzbnaI$|fXE^OAY zK^Io)*P%%bv)o0>yOiqf5enQDVcrp@-f`(??U;j!eH<#9gti=wG|Oev68T%E5};r-*oOb(9lZVf?Fp=e~xHP&05u3{=w?!G!N4-ADz^nqRnfOQ{tBr zl#>FZG{GCm>YJz6(o39fAQYN&!)etW<_qv_N*T6aor zx^|xw&LsxNzXY{?_6N1y38M2oc)aJ?X>e`0F~SYA9?LqgHxWKr(>bOViUgBwD- zQBio8_MQVsBGBDbmw+0Yh~b#R4fPkSM$38)E{ByiciO=s;M;V!Z+j)kGC6XbCx8}p zz5I@yPHV^ui*Npul21oxHjJLyu{gxc%Yb(**nImi0m625KS_+ll;>or$TgC-RU)Z!`;%m) z5z0Czu&EF2gJ0BxUkuaP2Cn;4t`2n0cVSoF0lXPk-`~zDT3Rm9P@wP@oLNw?Sp7gW zR+I=-Te6l=q4oF^m{FkjE}HWm!K7Ej7oV{g+-LmCpC<`{MYUoI8AcQ7Bx9Kk+8mkj z=iE|gGNTm=ATz?*vnyJsCL}U$?(Eu@rSTL*mrN#*5Vl$JE6}Bp9ddV*13w!;W@ZCLph~)Ya-fFm0&dVX_F&WA@hP0FpcH_#uV6x<~T_w`FrGGP8wl>W1T{%b}5XBi-1W9|4Q zmHt&eD@r(E3c-B}CpFHQ8)$gP1mglg@xiV^9Aa~PH_*3@!6vE0#=_B~vKdI5tTJ!3 zXKS?!#MEp(>H{FPR1rlMfl<7H-5x=XS|@E2DNpQ(BZYwB;FzEPcwqT>n2_=D`VI6G zeO-<&;sBVjBeh3Eb!SB>F{oJysb;Jn1NN7z>e0p-=en${VKp=kGqNR-9pY8V@i6nW zb?u85$Q7BZPEPgya+cjTvPELpo;%0*ZsSO~JO>tJbG*2ywpt=l|vCy4Kjqs#sTN+1n<6R%HiLuBLX26q3( zj0)$EW2c4edz&8a<6022P+w%8U!+l zl67;W+%->v?a;O3$E*!X)SGEo0ODLySwNmJwkMzk9Zp?*gx?V=8BgbsW*x46GaS)VC zl8I+5X0Hmnn$XIq61t&2NH0+k*dt2fMaCEB8Icp1*MU#aY^19gE#8x#yx2jR@PPg|&m!GMu9SP_(bT^Hnlwn!T!ciPX)55=0h z1DKT?W%GEOcXs;Jl8c;xrknLaZMGbkyF!b&7-p?sZ#+MuXlsqP{WO}{=lxBug+=FIL z!yd$k&I$NA6>8}M-KnP#q+)y-m{3!TbeR;xIL=5V%Pu_O1j6Qs=4V;xzC+c_F zZfOSh)=`^KX97ka0ezhp%s)t}8f~Lp_Nx(g{nbPKcjxf0q=fS)RsSziQgE`hwXy#f zH)SeqDPSrgeOjy5;i=&T@DowNH7>;fFNrS#Hh%WxRr)Rg)>f*w2M|%#pBJS=8+y(} z$#ku)U@dQ81^IZU}&<8Z(3 zkbH|@4%ua;7N!eu>*^RxZuT&39Y`McbPJ|=0Yk}C9Y_SLvQKw0XbB?nR*%vH0fD~~ zvgHb6wZ0xtr|XD@#ebF^pn}H@ZJC^D)@BN8GRANy(ko|5-x1tw5Wg*wSAcfwdf1~B zSeI>D5LY8B%jzE`4i?%{xjkM}rj$}!T;vVlKNG3DqD!!?IcdWcAK0z zhlJ8PxdHU2HK{5MNcaWiRNK~ArasO|EP!u=g52r5qYd#Gq^u{(Jm@@|Ty{`rW`~e| zA}!`rA{)E_=&*ASN?vv`tc!Lg+IvF*@)B7z%)vs)XM6Wq6BLGB~aiZVmV1)(Q#0@b5*l(!Kt#zvPu=B|HRQ- zVMW$uOi}pj*2qNVqSbJ zOB}^7>e=^W%{xw(pyNSxIjXy?m~8_oY{L;A=D^1w#L(k7wZ^d1jv*4u9H%T|H#l&a z9W(H~5z&;Mf&d0rzCJX01nKR906jvY2;BtZwx+`HAHhmU=+aip&ThgurK}fZxMHtbF zV^$jC4CGB;goZ)VMa?&KhcAwxJ&frTJ=DK)*?YY&Cj(j9yTun|FqLRLCP5xM(-?hr zrMRx+5trd!Tz0%L-s{+oFk~~A?|i?{0ENrO)Ach_8CBiWb5F_$JujO~90ibj?<0S! z3eKjeUV$PrlU=f1(0Rc}Jv;Yzk*P_8i^-+G*HKDl9+NnSZFt|tP<<65`VM1OekQ1B zJHTa}5zB=b&X4#F5z_cI5fx*7Tz+HKWq~KX1;V}tYdJ+AF51~}`tQ2%J7NCzO*o@M zJ0w|v4$_>ZF%G*Yj%*}ZF}z!1qtxk;hW(X&spmL-pPt->&o0;nxowHTNY1fnD%F@0 zkK%V+eeK#MH4ZOsx@x9rejy>=_&PDuodhA*f^4*Quq!igjhgs$MI2hp zxsJqSIwZz%KnuoJta7p-)Frk{FCMF%uR(p!`Y~IM+GC!RxLEtWy!V^(Z`pmH&_x2M z+8Kj7@mJMJHZ+@0&_DQ$p;kFG;ET^#A^(oge*B5g1dWXKoGcxs^_8Lcj{j0>Fxb;obB>@`K?8!105HlECrvPq3X?VqMwkn>}URq_SlXI~WhO z>wG-j6n}%+rGkFDZV5~Mp0OCyhe)2aARFxf?J7PvkAYz;J;;E;$bE)k?@4WHx?i80 zo0>kw{IfJ=ekLd{%nce_)53f?%mL$3-xqfJws*H5AJ>wb)sxh!&%yR(yYyNqK`BEe zhRuAnh$knfs{JU!@4kj%9EmY9ojIM91|@}~5|vWj4BZ84gFU~UxEls#{=?^s zUEiBeN8i~yVDiLhJbPw3U1-B)-5bP8=n!@~ed&BV?j-VM;@}LTt$i5v{?2`K?n2+Y zuBHd7ySunf@llGRTVE_dD#+l?ax@!ms&U~`AtzInUUifOI~{9P*ab^3tM^=OJ6FW3te%=9$+VE86I)C3ELEw$;H{ciSbY_?(2pCDmPbeD z=PGNDq|5rU>H86f!?^~BRVHLCaQ~uX-wXZUug5(h2rY!X7V~*!N~wb_-4JbpDcJ6u z(TWC5N9{)bN8=5baprr$rSxYReSkz>ST=%BPU33b+(-o{;Y1LM?Gao;AcoVgw zL{(<-e$s)63edR@AuZU?q+I@Obrz*9IXSV9*(Cu+$Ggjxgs;9{U;00UX4q6gdWC7Z zWK=`IqX8akzujRuS_Ao9?E>hdDQOWKAM5t?a0t~+ zJVcdz8FPiG`l>5r@wE}BQM>!{X|VPeOZW+>npYuujAgYV!lJXGM}xDQCiP-lmp8|8 zD7bc|70mQrAeQ!izl5i2Ds1)jjuJOkA0KkEgDZ6P(e?LD#Tu^9z}y_RG?Rrn| zPRnW)mWz@$jcLs(Sq-JK9_1Gx3!8^dHvDiW4_--6h<39}RAfu{*01n2u!<7*@df_I z;2Y_Riwl%ad@%CemVn{rY5x+ z74U?^9fIWM>m$RpBn)2^bo=i!PLjQDqURNF2JH z@M^7p+DXSYgFot99$NY|D62uV@Pwf7R=!{Wz~ljB#o#q=8vT9SAC6HY(3of@zplnP zq{cc_J{hsyT~c_1yksqJK?Xqq)YfMv6($^cmsD=`2v5CCTmpmB1OF)@89@QIN{pE`oIWaQJ^%Ws(1W_eUSk<-aBb?4&B@lWizD?`J_yf@&m`__ zX!cBC_DSRor{FcwJQ6Qb1 zhaQpT%54Zngh$dAoG?+y1E6bEp+lR7U0loI?%cc6ip^36);p*dTLi=gjtq%-R^)Xq z=F|IFkq`J-P>KeT6OO=>$U1Seu+g%xWKDJ{&C4}(yNBi9e-QVlAj5$`6vJ#)4y9I;e{}Cdq zbV^*3t|+P)%fh!JlOabxf-W%yJa<)EX1yk))CkG_Gn#+hZcZFpjw|kJ{0JwT>#y&{+qojyV0_luwAwD;4uGU+icDw9)vJZZo_o7 zQS=#U6@#IAcETkj6_7b+y!h!8)D?MYCiwQDRZPcYepLx>6Z-jgA*gbx(f}R|M?ud~ z4m_pXNz!e-^x?Vv`8=xt`k%e+vf=}gF|fgY0vI4T%X|1iXQ-H90w>#qwE2IUAlpmc7FZjH+Z4M6~yjA zOs6$BSb=0VnH@r#m7jfp{mtlO)8IyWfG-j!yCCqh&Nuedu^%bNXFj2n6(r9puHxJ> zv-rfry)ciKoL?{i1w)Q(80-65#V-N+-@=0aU$BVVlECDH8}9aCyOOkLN?TGrvx!8A zM3cK7#1E;|1wZoNeRHR_BWm@Z6rTTG=0!S(e_HR8!0N%~SJX$femQYIVbbl;E;If6 z62MZI2ozL74N7lyP!b1yqAkUtwrBfTVujje{ z`>)tlqmit4sE5KC`kcOM`ULlAz2Z1^bdq&T(3>V)t&ojHhVO4bDTDa6g8Hr+rUKay zj-4spqG9-*DYJy(*@Pf@#Rvp|9!{lt@b{Ikbry zF{@5!0oJ)A%M#A4{SRD75cRh7f8iqXe~k-<|H6gN7cP(nrz_Gc#FQ=eelM9%&v(!BcicpTUX5X{AUqdY3=uB6(fQEx;{J^ozJT?QK6rTRx;)du?njHG<9r5SVjI)DD<-oYND7dZO9Zm7~SArwz&YZ;f-%q z@O|=hNvCG=6qmJIjN{sDN*?7p06b0NgHv)h|KJ&X@jNW02m+NMMXJR~9b3Kg6nhBG z8yXLn%DyU_p4S~Iwa5YW4roRj(0-YA?*+LZoi-z2N4K|3NOD%a;qjHgAGxCK8TJo` z5DVD42gyrcc|82I@Q4*VHj>6nsW&PHU*nlfaFv z{$24|ioCR&!LzhLdB`tZhVOj^Rz}d^E~R&~FhsA4Eb$t&vneFXwOxYb#Tf1Sk}kSn zG+tm0?GKvBNeFRn@7O|htjlutdSOs&4&tD5T?gA?=f4^+ss31=5;pQ%6LV?`dtf7f z8l)|qYU<-d3h^?dME$I<^BS6N4W_im(d@Xs{tkj_1dCh4M<8l7FenmK$(UMepCe?5 zaQZcQ9Jo?I)r&z=tz3#P>ZMdmp0}jf(}~}Eu+cJ%r9YZZ_i!rQ%TF6SBVo&1OLv%C zow2AkI)j|W*+VikuonR0&`MaC74&1>z=;r)g=!mQky}#c#MpMrTch(gK0+$+42L|? z)zZpyB4Se_1P7TB$J$~vU?ys`2Tjt#xW7a0bNjCY8}3+D==4#n-XTc=jVhI^Hs1jM zfer9$ruN}4Y$X4$vBC6T*w~UrFqb zb)X-gDq7q%LJC(2R|bvKfhc|zuV0yD>0^m08*H&HBDgZyju8XGh@U&j%UXZKnACBL z%z-E(qU5?&ajrv`we(22$gf#M?$rfNC+u+^^7~T)e$YXbB0d(h2Y>fYCqQNbhur`u zs-{G`NpKa@*teiPRv~Mq0Y6G? zIC#Re<*a4=gdKh}sOG=GPl1kMujefiAYUUkn^j6XsS@MNnTj{gVl0*R4PqHMH!HjAj>= ze5BulG#-UQKuqdHHO+x+C`t&O{uFr55yth@+Ql{EY<7&4j%zx(V0+r!8fJU?eErxX z`Ki!=L|B{c7h#V9%8Jw<+h-;uIBkeEUV?zIxtyk?9^fCf7nQ~`)Yp(MV6y6Y0d=S_ z|JXKE$wbdN%tcb*j%#IO>Av*SmxgNXRvUh*ELPN~KNuCrr}YeK@@|!h&)h+9#F=vK ze5%-MzLWkHF>BN%!PC9F7 zWO7DiGE(|ea*P=zPSk!FXC-ct%xK~|UUVrxoJJ|M_IpVcLd~b{lf!-l@YI}~O|RU* z(^YBHj;qWa2rAs-4VMP4CSrj;?*O`l7j#gq8hnBzQY-)WjO zdYw1e;5`Bj_#4I$@RZ`4N}k%JcDS3`KEL-JIcJvi}5qM`{tu$H|qYm8s zRG5hir!VQ<4Q0Urb-wS|TJ7M9{<=E@kf!Dda?a3MfH`N9Vdj{#Ml@!V)q?6{HAF;! zE~V zrunpW`hI}Ws--!@pmJY0e}~asra2aUAuPY5UNwgLTvoM2IbEGKHU+L{1&BH4$*?Co z++O0|dq=szFo??%^1zl9r3$MY7W4w3$he7joAdxC&pDKHIm|Utp8>;#T7xt&+g~Ey z7H0GqQU()jr&C{bE-}PbWM=xc6=0{-EvglNT&~YU5_XbCG?i(|pyTOqn8ko~EMxCD zqCe^TRhsA=3Q9?U5;=hsvf(i`?*1dLVIjO4_^;Gpj*;$z$e8oPkaHzbWwh8q>JfzB zzVFb9a?pj?n=3}eZ%_|Eb02H?-=H4h((he?69&k;$=QlAa*_EPz^p;!Z1y0g!zs;L zTz8iR@xrqIm_u=bmmFliFzWm#jQ&-av;2Pub3R8$doz6}Mh0hrkBf&rShoA`k)fK{3!F&x{wnA2XQr~Fkv zK&xTb>SoN-R_pol)wYb&rnz*8KOXRtX*gF{`fB89+K%mlyP$&avO|AQG6^ zC5-F-4(CkQIGR&66OqeevzoW9A+%$4t)Hp<{Z=~k7fY+j_urL5O3G6Dmp-J0CMaHH z_VTWp>^T0h^;SET3vT&%V0Ca~i_cXx0=**Aqs;+SkeWM56`pHd+hUV$(%RAGu^oi9s*jbeh?QvQZOM+qu>Ia0p30XB6*ziNLU9W9>9z-|G zP;=t+|`Cc>Z$YBpb7^j-dfq6@`|7a`>%98`L$`QEETjB)!dEK5AQpZ(7JFnbu-69Kgi1U9cUjO{JDd^PO`VxAnw3IzXJOYJ9SUKT4*o+TcH(sU|fWckEv z432?m@c;_$;iS!rNBa-oX2EV#Z9;JQ*H%TIH#7= zXppf~7&b`!!W*dmg!uh4bjP0&N?9 zzsNVBl#m>NR9dKe5mR(Hd1X<5{njD_Qb25U>|X?61c-ys>kD*wdr47i5RAiGhY;D?;TpFIEphwo#lt$T?&3zStR~y**ltW@)*3=iiQb3V!`H_ z_FBv9v0JPC00-$GRUn8)z0@F7RX|Xluei9@bh8TefIO7X1zezq3@C|?!@870o{$fXciCnn-DunyAT@7|nr3;=2*^8{l#gNrphZHEn)0zEKmwGE~Jy(({*7cmW*aMmOTl?wtPPIaXj zGQp+G@}L+}(=c_j#&xz?ON8$V?@2_uRFkqTYdZNTEHBhC$6bE7#FsAOtR?@)9gn~4 zjAui)BP2}hVg|=*NR9&`l_d&=LW;_ao46Ad-)|`(Bu4(iWOx4GYLbqjmL_;OnFXxs zrdC83Y-pXlKIW+6G?e_sS z0)z^1v!w_*lz3Kkibg;zyEf0{(4-tYkPU!5JTb(QErFCA!N+J?^J+asozVibUHI?t7Jo@X@ zL-hZ??*3UE6{>=}YJS~*aFw3gp{AYYC^|eSj^=8Jh}C$ z%VYXu+J3tAXx;muaGK|vZX@gVAYR7p_BWh_o0tfZ4%_VpSZPl3Jvti0jHDYQ8qRf| z%fRTjYFD|550y^RUNai2&$NhYkDXx_&S&B-qP;ckggvDGjGaSp+^hkY7Pl~-?z5qJ zZBN*(<2K7-lahlecOoc>#5 z&zY#@Hy$VlYMUQeEI!+ZZY-Z88lQxF)7lloWJNEK(Vt`a-E@;QFLzg*ufec1H90if zWZGV_=|1*%G>0FY(VrLnKGz5=G#(%U+rqm;JIK;IaYC__hRwDfvt*og*RL~Fp6jFy z8c5^%S+HDrf+&R%&f+L{Acr;*#CtoRvjt1B3%lm@D5$dRd2&>nC~}D4RCtg)lfVW* z%z!d7BDN|f9yTtrx^^a%+(<3**uV08eV1)@MJO5BD}>_t9zNl&0e8n=&ayHT!`-Ut}?t|9^#M);U;4s9IfQaQ1t!JdN}3`H1Y74z}Z zG-bDR_biT-gdMGd`(u5r_I3s;MjjqARmwybcm*S2K-%7_7x+h|pobPr>9N2INWpti z!-V2jUFl0CPNp|WWThn^OYP(tGQ%0nFZEW2)cMpWUl#9<~+CkCEB(U{NLQH3K_w`ockZpw!87XX|E=ZlrL;Js%n($&O ziV%$IM*nmXj3jB0cr5L3a`S4UbPk>w1?yqr&YSmG8x~jC!I2POo5WuHHU)9tQ^)CsvU+NHesu;!-+D7 z06v!l#LSJM-;c>>fREn9S|TjW)c?&4k>j*}k7PV%O#~FQ(G>c<}4(0Yh*X_Nkfxpx2yxJK{ZA(Q5Y|Tki0kH z#QHgPoC7Kzbq1teaGK)0zT4Yuly8Iry_7=E2j}4qZG^!Ol(GBW1hVCMmSBA2pohl+ z;XOPnlN1FLA!T~)$q1wlh-8WusOp0IOcDPW@JAP zI{;0mXnq=Z`aSJ#09xF^8zYNUJOZjIlIKCV%pj*HHX_MUnIqN8E{y5N;!hzvg{e{| zk?NPK4!xMN_K}&k;wy(F0y3G1bxf3L!$Z3^<6{WLkd&CrGrh16iF_n1g1aPIv@ub&K8AWTh2SzDxkC@)oM7B>PIh^he*#7h3DY64RVv? z*{=gADom0$J1~|7o2O%hE|VsmE0U>xKaHzp|41suq}|A|rbVgdsOipcjFPgeJy9{~ z#6zmhj$G&;>jbwcqF_=PAaBvRFA7bXe=CVfD_qu7=C2Q*e92(xG}fV)$dY}iBb}+2 z;xSF9TKaWVd04N&kbIv(@SOj298#40!sYH38{cG~G>Buprthvc9k|!=Smo8}mF#lg zbhWj#)~S>8T*IzmN9brsE*o}%o@$JmR_)71J~h_5bR0)iAYG3`WJ#^pFJ_ezcx5`G zG+2zpG*(*ongQO#=n!>jBu|$mi3Pz>e5=WpaIc*48BB1pEi+h zF{QkKqH%?uk3l`oSd#lb#1B!g`4UO!dKp(n;_4SwSGV~|Zjs*{ zl{D6A)Otwv5=ezxU6Q>gmOQ@=8d=ur5rNZQ{~%=)blSwIp-!KdGRWY6U@FO`7B9o_iT_ zs?`Rmfg`75Ix5_Swm4+0b2v$??R&8K9`IqsF3c?&x2Q7~yhpMg;q`t?@h!_1^@u3X zvZ7kni~Y!gJ{WNye@e}}4#Kmuz+5VI+_Y2Na%6nE0*^(H4rUv!1+e_kJyLkwO!5G; zQDsI2@qWWl`@bQ6rEN`xm8$sY_4yU!oMl(>iA3&eI4=%ipOQyVg+fl)>4-8|JY1k~aHk9j)DG9so^?B7bms;=;Ylht zFT534g)1z-yr`B}7to)v1j*D%nXOn(=pbmkwyUJ0WZen#QJHN#yhx5JSE(wlSWe)k z+ZLe_(KM|WUu&D(4dSS&t$aPc#NvTb#f`Z384U^JdLd5W7iuUX&6Wsd5(KbJ$9t3U z@45x$-}Jw4$trZqjDL@bEoArMCw*<+AjBY^b%oOQ>N=6VBOF03osn*yEHng{)jC7b zkRx}_(>%uqVXqN9=gVIXN0|+!%7bhdf(sU8`7Q(-Bt#Px0^~|n*(r8D#4%vhq6M{0 zox2mR4;LMR=P3~2#1Y*ilB*oZieMXG{u(<#3UX?#`IBJ3hkhv^(*Ujb&SrqZ7O5JK z#jMv`Q_6ulVg89p@Q9ZTr>C(cYQGEeXtyz7IM;57y_aDLybGq9g#0mK)(8a_Qkm8-kTR(2GN(Fv^^jHu0NjMh}GEnaag zUSTa8vB_&|Qr0ZLWt`uzc4Sa2n_b>EE*DW%09S()RDpa`Tx|11^@`jjk;A6nZ%FB&%1o2gcdQLMxXMMY&wB`^ zOoH@@@07rfbW1!rSJ|B?Nurvcw+&09#3ugL3BDQO&V9~Da@wm=)faYGfN;*9op&nO z)AAw-@WLIO^nNz@2A-=WS_4HwLIG8(fEr$Y$eQ%SK0*Ilg217mbV1FNk;VROCAJ!G z-{S7aRuZP$+Dfd=kA2L$A3hWOn+EuA=x%Soo&g;p<^`7PPx*>zH9N0Vn%#kKH=Zq4 zD=p24mn65_n^7_;EmwFL5F!;;1$|ba9-17%{qh*+NI!5Yr;5l)kRu#fqb2iLl?X z*b6(0au%`d=LBrUVfzWV{M_cu62zi&HQm<{mc+o%8J;OGQbZP9EnnV|Pq z>W#4$B}$9e69JCyVE92eKZAqY;Pykn2SB}uWEg5N2*$H{+JwJVi_5Y4@+u3b4vTjG7mLwI z6(Fi7C5owC;AW8hO7hMzZ2Tj!K(1uGOyP87(JW#YEsMEj%dKezf9d<#&^Tk8l+k2; zl@wL8T?F)Nnl0U`+yI=f)F#^w{M^mhD8(`){`9_Jjo4f&DC-LL!04C{2|`v1;$W;` z*htezlW6gY<#f4A*FWTbFCS}=*w<1V%2%uH-*SH-(DP5LA>{wFoWXZ*K)VE@$o zk&03d^U6qEbw(6%f#A|$jGhW{7#xx6{2F0EM8HS+q|zbrNXulxd!&s-(UrWbMr&5T zsI**yq)_n+#mtP^El2XwKl7!pyp%2BJiBz?M3*qw2Gds(kfGd9Vf`2<$JZj%h-M^dE43N zr6ki@x(;uiuDcDy=<0E*TVCzG!oaNRLB8f=YvLF?5nRd(D|I zBNPN9?CwRKJ+lxA&L^u7j>K;gxU-qFS7|MmRINS`Sv2yqkj+!5B_fw!UbD3%d@vRB zX}sdS;n-nF=(+0`d<(6+m~MmKvX^jliOb0y=yx+`D&MTRqEY=!3&?F~wdQJy2s=oM z%+qmMx2HZQ)!j#0s{r>bLzIqqnT*rA!=APxr7a~FH!?PxqLhsUDHlJ{lz^NfF(8^1 z@E&o3To2TA7Als{1b!!8jz^-=sZIC09<*&Kds%d9-*+L2_Sn6dYy%87#s;|RB(6PW zykt3xv+atfgtUY z%6VB17pQgU7_n34=NIKhN!l`u6wV%|nlR(R%8|*9Dllwh=%}e@0X~jE-8t?m!TLm8 z0r`I@d&lTXw54sdJGRrYZQHhO+h!-7bZpzUZQHi(q+{Ofz0Y^g>3-jHF~(ZI){ix7 zRL!dADa{>yjOnVrCe(iLXmblr!C7{r!sH9&MvM*xx;{|eH~AZXGlvG&Sp<^X6pkyf z>pCM?z}6Az%tQNf=c~7>F-n_U|slTWrel_(N9JRdSA#14IRZ10PhDtkB8_) zWz~UAyX!8LZNRg!B4}_bs>+=DnJK{OK7|Q>xr>08bO=H;sp&^S z)c4V|)gU)>Mzuffrs~}FN-rJiWUN-4R?b&7w!Oa#*F}ZQLpUrKR_aq}QztQ`pTet5 zbfY|P24pWFMhwX39gOxKUFCmbY1v+s%)P+TNe5m;S(|G>4Oo>Thglt8f_Sqt9zw-B z@_@hm+0w$yJ# z`ic^-ck=QJ+vqs!$>w&hV%-wTg6kH>amgIaXyPe7tZ91Ai5THPkSL%u%Kl)Hq94a* zVSid8&i!^dR-Muy{{8&R*%4sv`82m+;g>hYua$Lju3tTbHx)+E8c@%9C7t-0s&4uP zL6#MVd%=Xo#+40FN$!E>Ven#$2Neem5--$<8tb+>b3Yop0p)NMey*XETWmQ)d5uUH zHkxq%9hS9DDEcEmV?ft$G2qW7N1rkKk5Y@Yo|TbWN7tVk4 zv5~j{ZWUKm)#Mt=R~IofO?MrN4sSW$5~)4KAM{FgrzAey#+4SQ*E90)90r$<5EqD_ zKWSN^)J?xE3F1dEOE9LY#^gZ_G+#NL*`aXpQ;i(4ZOr2b@*- zwzC$+;Szj-O=MX-*`Bpd^##~94){0i>0XxaJXefeSG_(qN0)xln**P_c|gGiWmaj^ zK1G@O{Qf)O{h8mU`F{~s$ja8y?Juz<%^dzUjTas>YCX$~6!5XTWM?725|E$)-cB9k zYYvBiK(4RggETCTB4o50%pgu2G8oV0f19paM?v_F^9!s$tAPe`xU4S2;q#lr!4l8s zOz_vOFCJgbO@VEvZ>oHM?W(14|WnC{t0Q`e)3#%LQ>zh;H_ubptAhEC@AuzTXP`b~IuCROQA+v4BS za$ZCljTP4~num1tyS_3s*`5_)QrRNa?6-HXet;aNV1b5uE?CX5 z33qwrT6STr`LAEmE0aIE0dv$>GVB%dh#m%L3f1E4)H+#)R~Qe~`nKsPQ_Q$OR4EtD zU;iK|y)Kxk%AMU5p)qR1K!b(74mypbm=53Z^d)MLx;J+n5dc*+fuwu|`O6gS9%HjA zKJA|8)3yEE6#le(y#HrY_!s0+*0RK$M}9YUKCfS_t=?U-)+Z@9;8(p|v75~UXN>A& zmEP5_1jN8ZAT@M$v6N}ys2v-723-Nz$5H1meuh&r{|XKuPsod3&EJ>l7ZTUe1t`;Y zC7Jo6Za1-hI_$~`UOK#~yE z@~b5^gu1&4yGUw}jyJK`#4N7*wbwq!=*?3hs5O?LKo7q+kn*28FL{<;z$fyL6I?a0 z_3omuZM&jiRh`7DkI{Rv=ZW3~hl-$W+obXjCLAvw+fTJxd}Q>i+MQUoq%PUIL%DnTJUDfX?TLeUWcRs%f=mg1E6%yQIuhyFm93noXN%es3Y2 zg5X7+tYWYrIsGUVMkG7s-mh!JYuakwyM+@Mpddm&|tvt-dOhvt6qEH)xhZpECpfTn?9Zx%?e93yUb5XjT?`4 zkyWl-ph)5ZECy^b1fAtS;Ek}ViuH$@``b@il0*gF{Ug-=P<2! zYf0pPU4Sq)ikL@i4@H{82${=&#H9r08M6!?N)X0DDvB|-`$9wX=r)3OwS2GA*-et{ zFsR!Ju{zj;l!ad|3?rz(L-MEEZ$}Sp?k=JY z9<1O5L&Z+Ljy!{ll=~Y5_D$+xIK_7RkinA`UOqa{?cSuL2!8KbRSTXj~7@3-s%-JcQmbJ^zqNG%X5m|2@x8adin z{}XZJSQJHqgOIicd+MkxViBaA-Dino=Xln@YJKX8aP z!tirK&A&YmK5X=|u{_+J9|L!BD~}8rbPIe96{2(-V%Mb3>5-LZuhxVduF__)Lv?%# zpW|D-g=y&yhJVYLyHC?8jnY8Gp+_R(2#WX_xX#d0C2=kz<}OSe-6!8!sDs*DMz=AV2c!#6@U`oo=_Y0z8-`&6;F- z@t_|pTzPw07&%e-@vvhCd%t=rY()BH4Tl8;?q3H5hzO7lHu|!L5wK(THX1GN;sIS_ zVQuz5Fna2UP-RSA8G<>vievLcamkGC2BLfA<$jGt&zPzCT+brzLJB{qpgO`G55;fZoc#l`0 z%XcElFR^9sYJnZ$l_O0Y#wuBe==#?wA@tl;V;5NMoyOMOXu^bAs zWZBhwI+uKoY3-#nsrJQTdQg`W8G2rtdc>wkIb)y!yQGh$i$+>8BJ#)y&O^i6$(@%P z&rsO--fgQd&=)i7*DTeZdjNb;6NI*2Z#g<4XF=Lr@?@#Z+~A<-IHIOF*lOT$w)<|Y zKeaOYQRZ?Lt&yEl}RpsFd{4guv7Xp>DK zD+=7P-nF1y^6OY(asoWx5hT&z09oAcWqqi&Cw*_TpLL{odq-I}qIng30CC-s( z1d(e;xSq>G8Bm-dnF92u2|-I_tn^lh2M92KjJ%54OcF3IO4TMO3(t#3Mv$>zIr<>$ zxeF1(S{B9$D|oG0YRZ-J&#kO^UUFOlNH-U%+ZtK*(co&g*;c z2A+lF3|sa#G=DV)V4#*Uqh0o6Ng7HX`%=>C_)wFP$e37p*ps=9BE2$@a1;Y^BBPNA ztBq07JqROU7H*1dRxKGZIy*4+uHg1mhM{q^opW{Clh{O^VBf7_3p5L=0-CoxHqK;C zlRxG!P#W~wg5pKM`wB-rt1*ljPC?v&v`iATb+}&{?!h)4=G>+OZoyh?1K+4`v-Z}< zMF%AV>oz1)(pKBfHq!juCV&$jl$j9FJWf*zR>@r|xZyA&Vbw5t?emrQHPa>f=|Dhe zO}C`(!4LM<2+$lZ&Q)SEYHhmZCkyVheric3awY=mbwhRN8y^f10*>V;^9cfjAj^OK z3i7n4mGB)9RZ-9@obe|>lW1-hAG<#kebG`D0{MK=SQZ;=B1X95N~yU)BR8{_e0>y` z&_3D#Bo}l^mOP+Nf%wmZn9VHm665e$|56HU7MdD~)wDEwV_E2VbjHXNM)rZMC)UL* z_hdC(cNWyTsBdU>NeQTqlogCca+ciE&P;N(d{j*_Pcf?m*9uBBa?SHyh1Y05SN2R> zITJ<<(5P5!A+c<90bEe)e3j`_BVypBuPoUx26M@^*Nq8xmgVBpJx>Qjg#8LanN!BP zw*w5z_>{H+^guiG2*25EVU)*8oo6+oIs%*yh-aEkiP5tIzCopC?tr9Arl4^!>MNU z9|rZsWL`GY8qKIjmHjK7PCcD<^;0N3IEZdjJ~ ztzF_F>er6Y^cqVD-60AvGLYgG)}@GC&{L_fU7#atkmUxkItpr2 z8x8QJMQB{0QlBo{<@3KX-XwW|ds*-5P~c$!%g))uIfBAMRHbLKclxYf;RP_b87`&T zesjL!2&%ni2Hirf2Y9>?>IUi*OMfU`4t;WinQ(H>7_;G{GXIY1-`J9KR-Q;kr*sb@ z5*D@*@hdLiatLyFG{9{WinaiS=!ybll}j2j+goO_p*?Q9Sj@MB9kj zGVS7c)|#w#5-;=Epve!k2}s1TfMp)Quy_>V$$+ObC|ZK0{jS^VR@tVxXE+F!MkzeO zq#^ya#K%1ncNI;$4 zLo299r?_or#Vr`3s(uh#;0Y(-1U3L@;&%>sz5XCzX$xhs3boiU`^&QNkc0jOpjJkd zm#^F}TVYFdVPt2&ezi#IC1Uj(Mc(|P1;o}f;T)j$@Dxs5256@am9be!)2z+VjVm;^ zQU(wMeW4#L1FlOxR_}n#r_5`s{0@Pv3AzfCTV%B(tys`M&j57=_2Hfn|3)W%#ffpF zFt=k;)C*aWP1I(Ci9%}ht!ad^%U?VhU~EuZbC1-ax*Y1*Q+i4yfA3r%TsE(^sG+F5 zJ>hhJjZ6_)mp{e{-2RhpNM=VRnX=U{rXNw(9s{}D9hnp}A+Q#I6EkL&#>cH6*0+l2o!bQm0&#|!)x zL%yX=()wE1Jf}NKq;eKu;#HcCrTur>lSf|R%L84MqUn6{Gy0Y=5pM0yHRu_pHhezw zdMg#xJQ;f??avtr_vQf-Av zyEY<@+=W$n5q;IY^Yy*q27wrZFf0*R)|i`#_9$G#6zrAlapx5Rrb~8kkZkUukL^vf zi^RrQ16DnkM9iH=u9SKZ;lQj4UYI02DXwy*^956qOM(9M=6JU0M^IPMT}bK*A~0=F zh{OJ4fEMe3>^NX+!40X?nixrf9wt!^B&@;tFLDNv3F*t)7+XLZ89l8!b*vfJAuw%h zOI{?(c_^##S#^_*4&h(QjWaWQu5|{lFNLAY2l-dJLM;0r*pap7equSYQ=atu*8!`{ zqBTW7+aW^l7_S7ZnsLC)B(wIIWE41DL9(m#pXgKDeKW}vB>h2U+Vj#}W7?ElIu6PT z!nYQb|AsAG@*n$1&`t{OyUr`Izl>ZOn1 z5v)RKx*cYb;|$XwCVOLICP$e}$;nwrsd(gxjn6D|43T?U`hJ+!m$8R?IlLL^Ak3>U z6~jRZ`FrG!a(k&pdoIRy?jvet@a=q?hBGj%-hRZw&m&Pt`E*bs&UBF}e~29rXZUJ{ ztg+_k5AN+0N3P3+kts`!8rIUIF}o0Hk5ejA{0ui^6CwuV3bctq4 z&47MKHiah$#mfTgwu(gnPlE}7^&@6P^$TQaTjL}crkS9k4nCFxLDDSE?04*Ib81B2 z84izw)u4ga``};G3W-mtGcK6ngw{H=i_LEi3q-6Zg*%d?VaL#)ez~n;XI5S0r8NXv z8=X~7F5P>6)%l!K*-6ng;2G&8+FX>^No|qfx6%xJfypY6qWcc>QFeMe|BP9IBkaU6 zxMkR(<2j>hYlnp6{@8(pw{S>}G_{^K9=n#iK8k$7eeiSRDwUOVJR&}uUlz4jG8SWHE@dPAkx|Cs$yEnoOhMnsYMDmdNwDi?SE(=0f{HO3d zV4=kf`g>bgYZ>qJ-KzuMyaJ+&kP93B0&D!> z=FCWu+DAs#qU!Y`7v4i_$jkf(yC08BDZ_(qDSQ9e;PDvc+uy5e<_mq+**;rI5I@Iozvkur(bIHO_~t44lrI(!O?t@GKNdG<*>qI5o?k_>?sk4oF#0uu2U63H zBo{lGNrj+YEC}WGu*I}OTY zzt>d$eglQi(9q1$%-Klj^YxT}@&j5Cbf1+(B*DYMr1?C#DtMYKsrxU=5bEG$_P$I{ ze$aY|2~2&ZYOY^kiLA-{^#dla4j3vQcENFl@M#f~Ap89C^b?&d<1MK4>esc*=P8y+ z6^7T;tV+1>CRS6a9?LL@DPfI@(=VPF9htGrdJ5{}%jUa;Yh?Cm_*Ff1j2BZNMN~hK zBUVT~aIS-R!Ps$AjRJTY{)&xJA58K`Zodo)E3U?um2vh`&$5hGiyD2 zw}0#E-{;46{!0XEXAo;)kcQhi1e{1+VGuiLsmwpls)DNrEr$Rk--Dc{qaK%bl8_ub zGSqb$mz=1o2ri$S7_XWzG=v*mfR+6tn(s@VAP)&0jn*a)83j|bUo;*M{(iqMH8@o>3_b3INyXPffY={#Q*=7tSoWex5V=H%b2N)1v*KlKgAY zBA>p4jpgSUu%wNF-e0c={riEKaAggJRbf=F)6_6I(WYI$x;Vx@5CoQ6Yf|X#8Gfkj zdV$lmAWK66a>BtF)Rp&`_dxDEw=RL?V+)h#Ty`!CG=r+%I5dgYm-NfC<;$9#Oz)3Z z$Sy8dI?cg0-%0~8UG5Ojn|53j9N}tG5>J}pCwnNBDuiB^N9FF4w6fvBTx-Ls4S#6P zgxqm!&%jG$LjzP^X@CsT!*c7_A2`T+$ehSQV`vH66OcfN!&E*~IqkWSn&YSm9oy$9 zx8~9mNt&O%#X{q2GbI6OEZ+n!Dz?ESP0q~O>I<<>l*M_<6cr@g#ePY;WN$4M9G=X~ zGg(?FIJlSq=TxLSl?Et%Llq@t@L2Ilpl2#gyHN=aLYpYI(L!}1H(DP*4y0bc1026) zG;4`9U3Qyp&;&5nK*K?~zs->l&Og!se&%SJx^RsT(aL{wZ{<2&1%p&y@#)fqG!)>V z9Z9iJ$+s-uqRhC+Wp-ZENB7Soeufowsg{B$`MvusW~EADVK0dldOT5hWaYn=ie-@>v~IAC zU}od#I|n&*6i~#yeF2^%p~~&($3`eZL#yEcsfRRpTVopk_z12HqbT+7fXDKq9oy%Gb~D(2M!-J<25hh%KOd;KxwslTeCMBJ?H4>+2<6CXCSJuum_^1g5C~Lcr+~!81Mwi(~vjd7hEX z=HTpX{I+|zc=@GdX-1A$u3riZ?Q_8b(Ss3Iqn*g0mMXe9`wgkYLr6dfqcW3XzEx>c z;Z8>gD3tj4-MVS4-n_kUmBGVf@RgO_4D7i|ou#B>0t~ACDxU=H9@Zkt%g^2bu+3iq zBG|LwDQg^C*%as53@A?P1OfYY%~;b1fHdyY=FQO_ln71%Ws5{NV|}$`=p#knfbU2h z-(Y&{ley=HV2;CZ5jO9}O`p@S&8g=-H?;iF}NO(q)_c?hAF!$f;g9>>f_}{fD}C zahmUUF))U@5fa!l-fn7RaAXDa16o+ZBZ!KaAVEmKJW6P5(osYV)t7*=Kn25b%`k_3 zRB@>IsN(#CC)5@Isc&{{*Gum1S`^@=`5|AAuN4TNNYEO0DwPyutnJ}Qu8=aj^lQ>pqJJiI}A_h{xq9l zL2EuHy6IkmTmw;{sVC}q!MMJok%a&50S(x@W@mf(H7xjWD3w$<&BrPgRUsgHl7g+Q zEEqiORF(M}fHANZ1qRS;7Gw71FnNeu;y7lH54TM#K!{@F{P7E8C}A;(Db!q0{3D)O z{4o`ofHxsWuVWcoIzf85Zi4m^Zqd_i$cq_CxLLdS2FUXf;O$z^4%re5JyV{UQl#3O z^bXeNLrt@OdZ>#&LnFF=qH#Ld(>~gxJP+jZ>vU9T~paZ_;IDYfM_npE~rVn(eH#fmm-dSJSQq>z8%@ zMI>J6ZA_v+t=#Fiq5D5O(SGm1{LRX(4gZbB{S{A@5mk`hrL7rY4B~Nv8X@Y;t)sLp zt-cEJUd_N$`qc3kbBPh_nX)4WihY~h;b=;DCNOVR#>s-6pKmwOM~E@w;F(x9(dlTP z+}KR(e1CtF`QlJyiaIETtV8ywE`Zdi=-Ke*Dj1CyD^xYmCIrd(CB zjlIBFw);+|j(v4w3lw>k4j|BN;M135q_KhJvmCeGRR5aI$$Z}Cwr2awqK?v!d{)S3 zsYHPecmg%S%9_!eBKe|$a$YQ!F|DQyCEwz@IXBD=bRoKHp0CNnSc&;`qeko62RP>r z@CE}`Nb%L4nRB!{63KE()G&DxATdB#zAl1Nx(iTNy_-+>W^)a!b&GMmrrG)$Za~`E zBjR+1&gYjShM5WwG002POqsG&;&)~;PZ}o#TrQscUGR>@YJUKURe)&BW9QE@_6xf) zZFyGFF6e8~R&j*PRk5$u#sku8o&gTescS%3gie$k?|hu>x2Bs+O86w0Mhxk3{1agA zSguTwHs@5yL@B!ugqmsEr-kM@TJHcd*dyP=VApL%E}td6xer`xx}77q zX&^^>=VYd&x=ecmyn3*)+q(GztpgBG-EH?n$|_WO8`A_w(nOKKI7Mf&D0a-kgiDCN z#l-L)^mdR{4URe~zuAOWPxDy^x?8~8@FXt)$>~xSnD-sHF++8dy$n)>Zy`x821kZTHENn;x6b!+vPwxTVNbSFbNg0kSI?7W0*6_bIVX-g36XCaGkrp zz*#^CP-)r^j%*EXq^QqU{X!dfiGfv7!xh;T+1Nq=H3K)lJ?2}!*L3bzMU>2Uk{kWk z#JWK0nyj|&BMRx++Oa|EKKBL|(fgSR-h8J--iM;$ zm$(}=r#xTIk|uvZ$}N@7yi~pwYtTen=*8kX)&skr;^DH6-^>h)sNB+s*nXng@1YUU zTpVE@|0G@~vdM@{8E+d@1^Ve=F{POCqDBJHX|0T$x$WT1uJcHz^Zxh4LmU1VMn0c0 zi|4nNd5pZ@Qv<)R(fI8~+nYI>{>Pn`{|6PtexjnpnW?(9QvhHRDgBJEcyiW4_I&2D zM1HPId8vj31|p#f_1?fV#s4=b3TBkIGJE)(eR5#TeS7=tKlozBXA|BeojGqmg zzP4d1sdPm#o$}mJod~eUTsBg8N7S!c6htrDC}UNOq=iI>Vplu0(JU1PHnCb#HT7~M z`SwLV)jVB;2l&_c-C#!`NCOw+G<}g2DH9t?j!@PlcEvWk-fo&4_`Cir4 z*$TpLwImGq_|{pO$si5L7Lh7ovQR5l4?B(7HTQ>t=O)&$wsXeLyLI8tFAa6yCvn_b z5$;Oc+iyniUt6o!If1`Vf>U^=h=8{F^v97CbY^XnD?6ZJFqKsY@tuZ+QC8X!w`LCV zULod37Luw^C}^5W>PhLTqyy+ME*Ww5=i7XEmbcl^JlsNrCzEUoPqaLt{N>^iu-b7u zJ`-btzX6#)kuvdrMaq9>T>KRv6%gc*-l=h0cgO>5W(hsOC_;>kishb0K(m9@PZ;Y@ zd@aE0D8t`NQ^Zot3vi|)&DkF=0{l)HIUMdcF4KOcAHLnayvTgXT>{TS*$qGH=Ayok zaE1E;yGu{}_@VcsOGGNEFD}f?%WX`Ee*m$*1+136(t7j=50`zd0$?LJ$jZRO6W8)VoTLn(Ug5 zGTx}=Bn+7f@KmE3mg?p@Qlbs^r$w_Ff#pFOIq2xnx~iq4+~DlTL4Z^hWWl~cRAgtK zodAx<2N32Vuf)Og_d@8S%E5KRt>-}OVBVhz6Izlk^(FYJKxjKm zVWdMjL|DxX_87hiccTU%31*X{28_VH>&&9LuS;1P$)wjTOk==PErbYhd3V8uYMveU zGq27o)UIk84@|jRcec3XUH(#=QZ#l@4|Xm(&uj*dO7eAz;u?x`{-h8_4B8oSG?JA? zC{QZf*^$Pgmy5lFq94LNpm4-)>DH@$9>+L}oxa7rCRat(46ZzofqXG|?)hB^!$$U6 ze2_6se4BxLbX*XB$cuc3n>NJU`Z&+U_)Mf=}0pG}{Qq1|LJ= zo~9A)SYd?+nc|Ay)X$r6s*CY+)Zdh}Q&})>NH*$w)La%~ckLV=v{;#ryI# zxDGAhOO*r}xTn4)nm4_athxBzt@HeK#|k7RzQBFnuQZVVWTStQ1&aTA$Ntx>U%28w zgh4^Pv2L^%fa(T;FE5|>JI|N+MAQ6lb$Q@L!M*fxM2?MW4N~55IJXku|Kba+sRa$d zQnBeA42KyU4j0F-&u?!eKY-g{vtc12ik}oNjJtg zYaK+O&0W7Zt}ln`oIvW(KuRSCP&wi^?423MN5zC0p?5Y?%K&7>V4~3?r;8dyLQm4x zqfod;nzyFJPYSGe8A5JHCS+|f=qnu)!h+ifEA3~@5>jW4&TOq zlQKA!`{r+g+L0ET-MfVx&81qs5vVb%qpz@oU%CS2p$8iKz`w;cSMgW zKx&deC1rV1V@7b^T8n#`i|^|dU|Q>Lv7bwzH@wb-{|ILz6RnyiTO9%YncgDHRe?H- z4WSDwbq%)*xZ24%IOs!!m?7WLmEaTZ*Dyr3EM4m62sr+zK`dUyKD3Ttv1%}M>C5-} zs!a~Q8>L6RagwZz(ai5^tnM@>$!WHne~Wxn6*zH&@1%P~uMl+%uIlntAS`Wd1N+S? z0j=eh;WERpjCmmeB%+}aT%gc^D4_UTFVjafqT5kiBR~RIT8Z!FI@iUlVMLN$W1LpEB(OusLLFb`q%F+fm&abvO8OPNXs+hH~qB?(|f z&`w5PiI(i%I|Fw2G*y0NI37%gkV8?agv(12)5mM%VEg6$PcmIB-yQh#c18VmyZ*nE z6hSlRe*>EDimURUEBLeusieey@{Z<*fRXak#JP7%P?3xCb;)B+v$J!f@{@uAcx9U za?mkBrL+^EVd1$vUchjw6i!ebo|{t_s&8uY7>N2lgaM_1vK{j5vr@J!v|;}P&9`14 z1mliMLR-Q$S808t_%y*h^;@qfy%M{;hIvH+`utjjm0hlQHhg>jLQ08L|KVgqgE@M` zMgycttn+<@<9Gp~m_s|1T_zGh{-P4tf>~|qK-&OAaRJc44fv2*Py2xI2u}gF{TgP8}0PmL}zi^wCCIB;}l`omi(x^NmE){XF$^>?N>C=txca#jcfY+O0?!%PqwC zBNWOD-%GLZBne}&7(LruEU+*xHufFzufSv=Ucz+p$?vy+vx{2nl?&6Y!w#hV)@|XMZWL&Qx&1^6 zJLt+f(F=~fp*tTdSuDq>%Nc@6>^haig4T_6BYDgzDRM;&0iWiJ*BeJiuv^D#8fblV zPwk_~X`!xgZ04lRFthR+7C$jHbv}BAi5PXCgqYG*Qf6%`(66wY!c-E05;U8{iS7XadYk!?IW?RnqU9&ZeaZ+46m%np#$6DE3BOXOpmA6}@2`esw0C%%{NB z#92LEVHS8kNxW5a2GYX8JiBOR&r5=-iK{@*;+M0_UBTP#tolTOl>J0JMA`K+zwoiC zf#Jf}lUg22w;OhWbd3;w(e&9u#Z^P3=rK>})M}^Mqva&R1!P;XPUD}HkniY4v z^m&u>iC=3lf z$Gs|Qn62Ie*cOw1m4}^jZo-**yZVFIJyV3M3vpbUm+5GGNZhk*Cc@kt?b925Piqwr zO;4T<1NSj(Yhbh}oo@$|E+ZSCxWIx}6=6Epc^Avva}Da(YiJr6OzS#HF^31ce=ruI zU;FwhZssJV0Vg{YoY*r8tD|){Z8tmdpsu+WXD=t!_$!5JYe8Pt<*?rC3)!NItVPN! zrN`VJWsdRl7O&!B2_w5_P?w-FlZP&|gZTir#E`i=BnQ~3_VwUS`a4%nb%KNxL*)bv zn@`p%i9pOYWx~BtrBFpl);)lBd~K`{!C=7rz`svyY7$1@&0|G$?CpL5rQ>Gv6&tL6xDBM7IK=A>W z_zAp?zr2XOec2JLZ#F*?1h6flCL9J+Aj<&|R0yO<#d2QYeKi4s+2qs8Rph6Y<1Yeg zraPOtlN1S}#%noxf@XUW#>xz_$URfAJtU;6p#g}3BitZrSaw1Y|MIewCjmp`9r(G? z;Kr&<^^9C^-$1DGHX?E&w~?Fv5cC4bHS;G-9)0dT>2t zQD^uPmEY1&mwS_=zAimMJ0LpDUg5N?s!~5(5t79#`tK&tyn}qtUF_hoUJXATQbYSg z&xvYoDYwICcB`Q$qwi3mIAs*Ej&XV+U8Ao$1yc~rtVr0nkoJc@q}pi55y1gEE{JoW zEZ6zjzPU_GV&r{0rd9{~R`ofS9)v8}k|QfoL}_jmB4nRKw1i)XIcG@J;Ci~D(|GaL z0^|mIV#X=5nQ%BQNTUwQWoqVL=YBknp0{WYl?Z-~40=wRZWG0*;3q;%iM150<#=f} zl1aS-T>bU?5ne_gYg>_|?5lfvSW=gD4ggGlbrC^IM!!8!#Vq&6vH+P@k9)@~b;}gA z7`C|Ut4CmGb&rjaSLrB8NqC}F+ih2W+G(>mTxB*IOHqQgJh|8553#0-Hi3IqI6r~> zv{Hi+wmiaXi!(y|PJ@^DfA-oW-64Yqf4cUM-yT5x)4l(9ZvVG?clb9r^8W-!hYuN1B@T&EJZ@<(o#BWuo< zrTi6{&9RN8A8yk!xYw6;Iy>LK(E6j$Q{!U`^7G3Fpv3Y?26GV+_+bF7L+vEcT7%k& zEV=mG$@F|jgT0a+U^Hf@3uOcUg@8>5WPBH6J) zFutWhf6pc$BTRE`dAE+uqGRqMbmK=aEKOl;Q9ymxGHZf$gd9+<+`>3%F`rZa+EIc` z!OZfr(Umv*&5B{Rm`s`ja&3jwL7^5ZHd`j#2&SHZN@-5qe=fo3Bp<*ZgsQh2sXMYx zU#a$SU;}SbZDNErn|a+Kjlo*xtiEVupZK~?Ga@nAWQk~_L3{exszGrk+JF}7ohpoP zgTBN#qVkBpqDmr>ELxin=NWAYQ>bpCRdxKZnGFBik)w(eU0(qK1h#=(H^K}66@zQc zo(5kE>n3TCu3$G}7~O3~ZDBaMlWb3kFB50{l_Vd?DMAed^Hmz&O=pDs;s<<=22L7o zC3zl%={`NpIRl}Ri^#f^bI7;!EVrRDYdWYY(mI?p!&L2$KsyCmXNPt6tpoM`Wcz?= zhj-8VxLU{DIQt3Z6XKsbm4@|{Qg#mVBH|ut?i!i=;LTKOqv-|kP>q>b;>MFG^*wJW z)-g%K(d?KxutASc-F>vv=)@M`9Z1?M`L6hGAot0ib*8$JI>1se*&*EQAjAMX%^EX8 zs9pMKFh~EWz$>M&IWrP76qAjpLxrF8x~&UV?EP#NvvhPmccrP!$XQ;2E{9MZQJn$2 zZ6L(~x<$R+HC^d`7P9J3EUAz4?47W=sHML!?m}`E?Vzrsb^O|d{@txzF z@YR@v>cp@u`kYGF`T11N$1vpncJ%t8kn!5vtY{pyjXT&8QgCo_*kIV_8hylyIb`mA zmI%s!(im3aH(<&(&Fo*35r6|i>J9JSZ&P8M_@am>eSb)lLun3DId#fuTA*At)3{A+ zI=c^4M)lggGD3p}Ieqbs$3)WUblmAu>%Lhz zBzcF6X^!K3lF=xUytHSf6dW4`@@5(SMhB3ZP2~eUr}*+DYJTBf+F_efwfE{HSlH#{ z3wzz-(E)dmF}4zGcQv}@1pHg?WSS(qWp%d<2#6>u*y{qd3N2gfGt|A})hkUfo!Juy z+rKbI4^=|UFL4Q@p`#ZxYbWhY!E`_TEw8$Ene|+L$g3UyCa?bgZ^7ag)*k^0|64)H zYF19@s@T4A39j?bG8S+ly8fTwEauRJgltgFWfYm{QfD5xP14k3qV z!{AJYXC1N}vJCK@nX)7HjGOe zh1IChIu47p#Bgd8HCf6hse;rLIiSL@%1Cok!bcCrlMacY*F`GhMyuJVENRRVt|-BIDP$|$cwWYp z9I4Eg(3xqsV7q#?!L&=DB_&@w9L0I-ZIKh}CR2}b&@+xHu$CXjvR`n|P2}Z3+)W%aXM?-jUCpV2)}ZB{v(PPvC%aE6d2URDEx%q&*o8cCjo(sA%LS zbh?H~O@uRTK8dQ4&7vGhwr({zu1GL7w}&ntk#q{4T0#|;Rc;9(s_dSEa`wDIquX*$ zFLB)JF*QQCXFzLVpJF#j-+t8XbhfMbUJ-MyL>Ut!TTbmuaGEV!o}Oh|RBl(3pnMut za3luRn(9(SC#lJQlvb{ygdd;3s!T7UsWy&NQif?U>}jCUn}z)u8QX)kSjhrC7fL?= z*S5Ct;8jW#m8OX`$Q9OZ+#OAR)E##^PRU}o;}#vA=DQ6y=KXfFt0-4MOjwlL6@y-l zVzqe0#ZOd&D>1ooccg`#xT~C~w-w65Oy%QYU7TNg9Z_;UyfNr#0&&;GM~ZqBwOP*+ zECR!n2rfArV^0{I*lP6jm^jk~BEz!Y6nkF;Qm-LB@2Xry9ZXC1UH6-lOWP9cDhc%Gg#$AJ!*##(8C^La6ZhHF3MpUP%Q}3oy9OKNBhH~{G!agj^k8Xb+ql*=9 zMJE8c+LxN-Pm$E~nAXFvUZFKMwD@}hJCg>%mNsHBsoCOd`^0|RwF3@ZF(>aBF+l7r zUYiGRaw9K<_++xSuS6t6C$S9z<26h~dVQKizk5bZZ@TjT5HBIN!mr4%HP1q$H2Pz`KUB5%^)k9i8 zxEo#ivqYR?RMc{gUKSucT_uhhEafpGxKL&br#D9HA_|Ml{x__KR#9eHS z{&Lxh7+72X?>{A4{ly9IV@Xg=)7;n%4>IbygFV{(VSehKl6jsSQ!E(+*iezf?iCfe zm5GfVjZ8(8bXJlCb?qE0>R>L%5=be}vm|r7<((Ng#~u z;ipG}hNMn>Nr44X6C(-(7}j+862=nymj(V-t^_wL!pTCf&4jaP>T`gr z=NZ0~EH(Da80E2t%@#d3`u(#-spnu015aS7c3q^h>tb?`pt-vfL#y23_~L4O;zOV^ zuEQ6a#rU_WC>=)6J%KeJ*LrvVJ+uIy-NAec%aCXSnda=TClz#=_fVSDcN08Y`Iy|2 zWXjp!kI_g4EAcX*DsMYdDE2CqtQ_~l8n+$Vjj#^yDByNZej^CEwY60WuNWcmG4BF_UU75CkIf=2rzvy`2dnY=kd$3BLTf)43g|F3)+f(;IjFmE2h-^PFdbHXmF?*boL2H9_ z`pa|}Cv}K!V}>w($&G?kLiWBCzvR6&BOH#ZvvlKDmTMY%pel`AI77o{!?ki6da1DX z_f@k4_0f4aSxM)ZgbF8D8(|_Du&<(pMZA^dRYQJ-B`*Dvhh)E*4rBr+A=gZU6726` zmfW%wLMC+=85Se>M$u&*%+1f^Z)RzRtVY<$rS1$v?r8RFPed^Hc@(11vI_yIy+&do zT7gNWI__Ze%UE>yaH#YQaO*r|WqUGd83Tx2u;&oHIWVMTXal@5k}9IDNeC^QSwBNi z1$z6o@aaL;oW+bn#jIGU(q@b#Sv?4Q0Wx9QqIdk=58?tZC_A?TTarlm@OneI_`{zl zuEk=I*t@nVHV}?ES9MM}R|N+j84X%{&wL+5tgG){!c0^2f%euOxotVT;zf^EKYb9_ zQ|#bdx79qA3iNtLP&c7TcCY2>)fM@l>RgT35xhC2o0#<-%6zV!w|CdUutL|drlA-J ztr*mpHD#2DdZVy!H>d_*0o~6|38W_66 z!hS4XIUIL^Q?D~v_xzZNpiD31db%fa%OsGSUS7j)#(#K~G9g)n!irW8{D>~L!t z$!kwZ`fDeevslW3_s`{kK!U{RGD!YJ;#^`iM#kUc#>gKQOB_jepd|dtws0AnFV-eq z7s}m7QUVW$FpSPXAz!GZ6wzg;(XTXg^yi(UGq0r9Hsr2XJi7;MH`mCqE`^XDaq<-E zc%|rdMvP$;3`~+-3wJ7%ZCZAH*WE_xt3V3`iz5!wmKic{tw)Jpw zDd}>XE+2nAp1m@G_9V7Qp6riRPhOw=ODT<`vu)-6HJ82G9v%161I#Bfpcho{rk+Jv ziaG4?r;6tJ(oycK;CQp}gmFpz#Y{gyZ3`FgCsRCyodBmLf>nZ#K-7cIpC1H2MFh9Z z0wflkuy_{pRAsRwaQgm9#=Ics=>1$-tbKrSWf&3-PpIIjc)`g!j6 zW#sfKT8Jmqp)%5C22xYK0H$6A1vShB2@o*Z~JGiMZ(d<;N#+^Vs2pjw~F>Je_N$Z+mBerci?7& zvydigoo2H}rAdG*QQle_3~qv~tTZUZO&Q-H^MXOnP3q?m^wltY_v~>9^0o-h^aM${ z|8TbP;l%Uvlv__WkzlV6bX_bkn(lJnetDSR`alun1Hb--kja?nC7+0h<$SSQ5^0mw zms(g|JEnL&|3bff{)9Dcx?nlbVDeVPAt@^t&SO9x{3fZ(ye~)~wWmWq+m!Ey5nJ=t z-sT!eDfB7~M~FTU7Mk4(i|mXAMT)JcXhIDgA&ohSEcWV1M;1#us!+qbg_CQ~xxF)U zF*Ju9nxy#!osevyfPj3Eaudh(Og%yQsJ~#uqZp`ZpXln%gtC`r;3U-9kr^~~vu}iY zwGun<)8g!Qp0x_8;FdXcm#jdrNmQbATtP>G0ThuEY~Ur-CdixUd#9m(d|xpQq3kr@ zBi+h?py|J8-qPdmL&6H4>6$5*Co4vVM>8dfX`$-eC0Rt1 zp@PX-`a}Mt1~|r!r)OZwBzVpoJvZOB$Yux31VP!J#M_=_OzQph`qs6wK@9bwD`Eay zl-z&T*gxAs{VFgu!pySRy0Rn%sf_XMG;Te$n#kpAQ?3q*9KHR{gs# z6AO?@Eknat{$S;P5CZM~xgT86pD3iwwZgJVh$Q9w%quo_n*X}?r=Twwm-x8wXXHqC z;~nM}>6Kx0bY2Qq9JuM%nOJ$8n2c`8m<<_UQepKCK#`aDyp-u24huG8fm@(K^-<_9 zUwa3NV;>{fn2KloNDy&q&)Rf?INw7p4$_wso?U+Vz^7ykJ_;Z+@;xNNvp(QS^YC6J zxk3{+{OMj)l29Tcf6du5)q8ByKa{kUNJbDJwTY&LPcp0M*}Nzz{f`U?cKpjZ$ch%qhbbo8u3pQQdDv68`Hs^$y(C7<^hp4gdzuN_jXx z-iy2CZl5?h66oFUd8{rq+KUv7@I~=Q5JpSS3Ja(LOGma1BPh&Q2IwJ|nxC^t3W|6L zFfbdf?zN+sKX#~@u~NR&uI`w7lmwZ5YRSV(KYfg_A?D)RBw_BN+V1m&`HajI z9m{l+`$c2QE}UjsEZJhgxf@Vmsi{KnXgV=%QJX>2qV>~Yzi!1kR};s4%QGVL_Dg;E zOGh#EZ@}K)iY2=cO8@7N%7Xl_l|}!L_XL26lhgla>+1h&m26h@CYLNgQy2}dxG70^ zuc%ru50W_kt5`$Cf+)BBdIq_}!CHTP;X8sE1O7HxAoyPt%vOzv3Yz)=?M08zuZ!~u zcfYsyYxF+U46*&|JpXDELc`8r0zQ^Ht8HeH_d)osCvK1d2(~car@vNIKeE!n*v*`0 z3ZMxN^=9&<##F_v`>}m%+zIvmxm`Xz0=;8{=;}w}%Xg(%iLKy%&0woYH@<5l2>`_# zDl*S6^vgRy~iQ##RM!)1uebVZxRc3YN@q{y13V{N z7#0k3a7`x)(Bu)Wa~x@H#rgq48xGSo(WazqYQD=N1qn)rg| z9iSIi6+=4?R1cQ=)y;|YkBRcFa=$3Z)yC6IOMTRrN;ja$GD3yG&FlxGIinb+=H#y# zCk+fQaV1Z<)|`h)2l$mfe)5wZp2p|D@1c%gTL>XP>I>n&*4ID#2L4Zd{hziK^8d80 zh7v0g4rwj8JtOPC+Sa?jEKE33xe{AZ^C`HU?vgzsI4&w6xx-9q{T~vfEwNKG7>$|4-t@0Kh zwbcO*b?b7c%Vh1&f?+m)29NsqEcPwE0qdC$`%0tYjn9IDl-poMtK=+9MgS2_{_omi z=M6%Qg3+Gr%B-lbNCA>~@P1*IFG$Ouv+t%A*t_r#1-UYYn{bhti%qyQ9fTi?D$m7F zA-qIuZL@iFWjOpSH&vV4$9eQ&mcwpQ3cGX^~;_tm$kZ@3Y3_Qa@)MBgUaZQM)AV zOuk4dm10x&fc{=gN&U8dkfchJlw!$kt5y%zM^vQHmX_4;46@_%Nk02Y5`3IB_*5t8_Kp6bXS zH~9=AO{ zuKq{-;ABaji0KwK=%o09oZ!)3Z-kD4wXT)ta9}7R5SoY3Fw)?;m$Q#46+f}-S>ALl zPIKSAlyn0MBtEx?<0!@-&o^YegWZtdh7c*Dj^f8%jGJ=27#nC1)svJI=bMOMO{tLQ zkWj^cQ)<36cBFqWhE*gGpFDsOZFE=ri7~EUX8#&)-WapcJj2Z2p1k}cZl`U8O$6^p ziXiEIee8J1)Ei2n#Akkl#78t*$xC`~iQmWg>B0{P?Ke0W8E`a+W_`~A&P9LZ)&s(;if^uIZ${_{=nzjVO=7w;aTrsamN`hiDf z7!Nr6&&|!*Lsu4Y?m{YPiVAG0X-)hhk{QgJw|H^EHuf0Kf3wG8?b*YQ~nM^8bI z9IO(1RvRRmo)v^ID7cFfaqb!z@ukE4VuiW~OeD~xq=&hkEHUX&|L*(7833~YgkvY` zUWAHkA+L~ugMk1dRPy2hOv-w=vc9e1%MMTU!v?7CV_~mO4}B>JaUGY0t(ssartV0t zBS+}=fw>15T!swE6%!>Wj=+Vl1VshArx_UP)6OPHUMPi$qPC|o+*FgE7w@!X1{J8>^}&;us_{1oUa zm=kU&f?UF2x>dEpYKJ~J-TG=p(i^0aWUbVqSJrlVZpfZZXfSuX##rh`6Io8zY{0*1 zu^h{(Tadmn@NhO-gi0A$qTo=A*_yj2<*3YpcYALY4`^OI?+jSKmMLv&q9dqys zcg~ygD)69#X;QOKKNmhdW?^XKxvxdCT>3`RV$q38`n95cT%xUJ3Danu^!D2$S~eY)UC;&sO3)DX+-r zVYw^tBMn{^<$^=)Q~0WlL{0d|HGSy>*M|WlFkQu=wP;5y{@=dKVUlqWJ-@OGEa+OtYs(Ghpw2kDOGD*b559V;MRr~G4W00!K4sN15L8g7s&X#eY zE%PAnai5O!EtLGWGQuuv&qN~Nhx$HW-*Q@mvQyTM8&iIRIHt7CH@tO@ugbd|yBH6R zx=*cN^maXB5Rv(}hT%7oXOB#p_P)-q3|4x_I|}@kUrXJWNLtgibiG=(FcQ4``*zmr zAFX}(@!y#IuePlJGUwQtSs4A>oTDHs1Nw&IlQ~#3Y-!aDqg&;E-T3@D0;`t_f-z;Q z)y1Y|P;^Q3cPk$z-(Sr5uFR>B<+m@UTU{Qv!0hSTN90dBO+IZaapqFi($=sGQ?iB) z@B#BdOwD`x1tmPNcXz8$%Lr!4`#azIIsrsY-$>cQd&YBtYY&S|6!UQN@e$Bt83pge z-E=IBU@wub>c15a9KMtof%50H`=UuL*OMz(o5hxU<(+uvI7{q*zFW;_m#M3cpjm=> z{b9gdsb0FX$q{oJnhM-qZd(ojb>3w1HEi!`ijP)EY?-7;j8L+MaSB6^M+van%NQWj zie|S*z0xQY@GO}t<++fAwkgVS_WnIWuE_LeL4DXQrar#^mF@nMW+VT{i?6JOt;@d| z-mE@gHf&#{uaV;!5u9VvY%&ZaI_JU~76s+R9N*a%Q`NY3d794X;6Z{Xb_-aO87I(p zg&A9oo!~I*5TN$1)Fb|1w*sL5LGpzahf$P>>Bbb|kP^vB_c$(pv_*Oiw9xGd5K6jJ z8KJ}u{MfAz&I-l^Zby_@Ehz(?yY$l*C+gRBJ%O!q6BAJM-10^RgD4uDG+731c_&>f zPu_i#oToz3bn$_TYF6Zn3xk{NP*tSWQ%vjdsYjufg{Bvlo`tp|tWQ=F7~DJG)4EEo zfR!6-ygMb9I20gvK1D9IOv{pz)5VD%6HCuzVUe!#CEN;{|d?ms~e<9bZt_EX^&t4C`G-Fy+3=`0fjpwS|h`7+(tGdmlqsA;kmKmcKJh{`jR#S~?*0gPt~kOD(3 zrRI4)#vd}l;*jmUdM53uwfT`}<7on-j#&>e5>Cb-SL&UC4{9O+2Nzx-gVrFypW?wYEI z3cc-ZQk_%6|9C}r*&~LJJ_g#=e;a83^J$s%pHGh6zo7m;D*tkBK4>x4WxmHN%B_m#1x<4u0=H4-O6XM0@vN=f){#RnX7x9jY#@AnJ3Gutr?|R{{zd z@nLYjq-&Vi5F4ps^uIii;(|G$@k8*i+_2*a{U)0;7npyY8_mUuc+Y`o1i^Bxbe9ZA z{^)QP5&g+3dtiT{?UmuJd#)DI!W-^)5=dobE0e{!p;cC>bCK?TCKpVGY2*dd$t`AD zB&MKVS4oFL{_%umv@QGO^-dSt@)ir`s6q4)(&l1Q%L>KGBx@PY3Jly``sO7S8yW$> z`eyd|y65oh&a|dZzd`oQ1hUC{7E!Mv6spY{K%HD>ws))FPV3rx-Vojb4){3hk26Z# z+Vu_#HnJ|V(u#0akSNxfNq4@o9@2=?I6u>14Ls?2!fF#+PdKy@@V%#DHI;AOZieOY1MtYu7Vm?JI7%oRiI)4Np8%)1CMGpzw$NXT<0!22UL z&hGM)#qoVcO?k`KuB~|$dI$X>#|K2y?PAb4$Rsztp@lI^XbRk^c{EahsVZx^tEkKx zkF$XmnsT0imK8x)zb5nm@v`jiZo-|yx+z*PByzXbJ{HvGSF(`!sAo~hOTN1YVqkr7+7+s((~rV;Jq`wSnydwml#nf7zzdVq^8%f zIOp6$sWX&tO=RMnyqWhcu2@$diV-u9M;%6(5e7C^ZgI+LR9Vml_h)%uC! zlmi#yEIuOH7qD^-BD;VVaiH7#Mi@J{4JnWOKXm|vc$M@T6@yvAo>2aTxj!Ao+Jt zMks|VUr$nBUT3gUqSGS^%5h;RZJYGfpJm7aPv(26io367))Pz-Dq}tEEHY8zECOU~ zZ}W259E^XgT4qjV2wK*HRa@GgINp`K*Kx*b-cxsdD|O1RE3?3NNCfxLYOMvQ;qkkL z(*^r%tvTht>9GnYo89^ce4*2le`ks#{Q~ zT{C@K+X&1Gtn+mLsjHu150=6Ed4759;lhN!Tia+Y(VpH&=MUmvPd?D=HGwl9vq{{) zNnHOqpZv3IAp1YH@-M(uh|0-dz~Z|tUPb~`K!d8o=c<_yB`j@AR7E(j6c(fA!uMGe zVc4aj#FFgaWIe$5&$Bp0eW8wgoTE+O3J3NX%$`5eyWUEAef|Ex>VGDO1(ytEW)u>q z5KgHI&TJ#!;kdM4F9_~zqulKY_T>xv8X8J+Lz03mEYp#{K8}zsI@?sSDpFjH^SxT9 zwZW=s-zRz$E~w7((gGn!Y;#6>GPX10UTL*Do?MenwOCD&F8e2cp+3Hz0pV2jhoIZHM?Xd65JZN z1aQ*qfkBn0Cqrlk>re1 z8D<(B{*fPxdoqiwp=sHg+nCY#n51e6mcp1lZ+FGh4FYr4_3%jrK00lVn{ga$RZ-JN zr_F1OBY+l?bDMmT6*;JOkL|wH!MO?7C4U~sR?Ctx+sZzJ%(Xi1%91?tl1rj2(~Ek+ zz9w`7V*sznBin9(-CqVyYKX80F(8lb3^&6Kj3l%Mx?aMIgX{6c5s#=iZX5sAX&ICv zcFS|iK`0mP3#fr7=rEs)VrL!^^KBZ!%;<`rNrPGMe15mE(F#WRF8I|A=)I=aJBqkyhBu|rd%=$ciMS)d%}NCq$h#?^T351n)de7Bp!j5q{@ z%$K8!f^ki6^X?vXE4yq&pQ#`!HwS~1=SHReMe&5#ZSu13E(1s1|Bfw2KR2dY3#Ln-!ML+tetQNB2GR zZBe8+$L=TyIE@mKTep`;Hh}9U9p7VK#YYI*lsQ_C+u+?Q+a#v!7VBgsFg=aEI+1&a zkT4%lu>-1ER;dvlVgJ1G5cUN*o)WJ%&+=96q7t~Q(0~eAUgf6#=mK>d^;@;?p@|4V zdn~VtKuTkGC1C0Pk9lE!Qc$k3yBhGw*j*O{kE@%+$~bz}fLyyhjjOwOl>zJx8|Jil zs*LC@f9i}_hTWPFuD zo2_9p1iScbXqHhKIBGAPWGS1LUDd+7LQW}hsf8Fgn;sOwWL=xLs()chVpAu?-W(ET zdli3JwJB5m)WtX6X=%CoK$ELw?s{EZlRT;#JSH$;N~T`TVnnCJx(or5f)e8T`sk2R z5D)Q}l`0;fu`_H+%kWKSG;K&@5RKm2WHtl!D68=zE-b>G-!O+F)EYkNA=xCYf9CXr zTB=*e=6x)2GA`>n1fOmy{`0_WQm1ef@UU*F+$lH!62pLVGTvxU3f{I^&WzcTZ*>(X z`ucZV&w2G!&es-4-E5n|RURy!8M>jqv6vt+OvO(ccL; z5Pa0sf1Cp}W+kle2Wk+dPcZiCM9cDFe*mFI>7B{+XMnUyqLT zTa1~=#EDhzrEnsv+sNC`a5X^*sq8*paeiiP(6LAG(9X=>^;m^^zW6seozlg zH0QaCZi-~4!-YHSyD2zkh8UvfA~IMI=#`a2WakB4y4g{g*QdtDCTutsl`%!Rm1|Ou zivuOt`y{Q>gh5?g@q5&Gt@B3p+nTVtK`L_yG=`0FastT+K@sJHd7o7*w*gs04hwz= z*eVoJVk)*X-*Al;AmfFC(vu$wrITNw5aYpB*%tB)SP)WA-dR){-z2k=ZvA6=42oM_dHOu$5_zf zw(4*!VXus2M?UD#sh=zbvu#RIWrYD+-g}t{b*R>9E5?R}ENB z)-A-oh+p6`9rAWxs;sMic~mBK_tBTD2XMj$*ZfjF=u!4sAzFETDC+t}vy4IQ-ZI@z z`XK+ymd;3Cy{>xlIuNoOxBKnIQ%JW`y*bqeD%p0FW&HInbZMXWRaZOT&e~i}yc_3d zZ8?=Smn?2n9_9(74_(T_%n}DbKE;z$z8UGvgN8hnHIz}gEz1kU+_5Px##ClEUB-Gl z0$tribrWVT=ErumHG4IE#q#jPhGC2Wtskk-kB80~xZzN>m~I_bxtO^*+k3Q$bApxS z6F*kf%I<(pRwnOCYFV~JX5u1J&^6OzHZ5Z|ymt|j!>Vnw21aX>ar@QYf5yH07Z?s} zCrO`;Vws?AspgKZmK#Z`W8TIIV%~UvzTaQBLvjH}j67U1wXd#z4R(0;dhv3KBd+Hy zM6W}s>$H1mBlE3qS68mXnP83WmqMQ|Dr{zMyV?Y~rqZ`2j}TwoxWlP9_kDvf3A^ER zqNLbXq1(?E$r0n}zV)c~c{A4X zS}OKbzydj$?Dx;6>H@dzkm>S$;gD(FnYU?-G(WtR4i80c^nb$Sj zsFm;v6T{#OY)t_GTZ5Ze;RW{l*Ksu)q|~aHX2NqKsvE2e;rd>4=r%K%{$QVhW55 zK%E)xV@qL?V!lMW8MOCu6(_r)Ybqt$F2IskB-J6Vl;Uz2#)(AVTD>PU2~Yoyv`%Kz zDki|5t~3l5A9xm6YdVUO)i}y1Q$I$+-4xoZynPAY`8I5FK0wnOA5urheliS^41-Ij#2TebG6OnFFyn8tAHLmQ?8CzoSmDUvn{m_Rq%5GlDJ#_7wVd#o58~A9! zFHlr@jk*~ad*bUY{2{x0;_A)NJ|%4Rso#C>DUrX99;h!zAX5Tvi30Tl)r#r3^gOodrs&0&dztD+h&och?rM_E0MB|2=w5nk`ndu$d>`__2 z?hCDTjA2JYZ!1aGnNQWd$b(IXp<&ddVif@3@RVdhr_P070*DYv9Zal&2DmsDZ+n(n zn-WIqEi2dxXHB;=iLUxXBxoa7B#+kt&w$X0$<18R?00j3({ETE^KgSB{XAh2iadRpLJ3-{$FcCQ$DMho(JmN)~?e_t_vFBnH&U zON8WnT_;>N&8LLpkMMC(vY2H*85*^y`A8AQ$Oq@vRt_N~#%abQ=V;6^5Ku|u9Gw`& zM#r6l1zouP5;w9P;G)Z98bh8oMU28-heMWWhWsF@e5_Lo)+J5B19Gahe^=KD5lS zLhvz+^9-A4Ijj{o14GejTUg8hR7Rw2OuUtafNddUTVhOqV-rg43`v*th(i?J2sFkZ zp{5jWy6b1&F^~MFP^Np*2eO9p##KBF@#B8(sO2Fp%$WW5*9w92{%3%PLZF?)XXPz? zB87cDi1GnGnSp4(@l&__B7xG{(aI}~$?{T@bf}UESJ(HPI6tl;QQbbXA|Hz?ySDE+ zdA^(Z`KIKP6{$dtKTZJX<5GE zUbEtbDPXN;W9%4eCj_!ZAAxCC)~*Mfz%>wLGMqUx|8$ay3Dgv?8D8Bxas}C2l%#X_ zr%Y{Xufdvyq4QiwdnAg;G%5+qpJcA58M12L`bCt)~|9|89ysVJrWGRO`TU(bWm-E@r_b=!lssg{GM&+?;k}5}6^b?-T5~ytOm~0iqllYow8V25Ed%QV)D{3?aK?9esr{^c zAQX#pk0~0AHez8@*uCO8IC2i0Pf2aIsOS4sXD)fhqt&i+ZG2T7h$@rtqvatY~*#eGqr#njz0m86+$v>|Mr z??{8S5qGu7&W}wgxQ8Rx0=yB0S%K9jS{)*Brc_Riu_EN|VpTbAE!;V-UDJ2a1nE^C zF5q7{`6z|TdewK}$>axblvM4=ZnB7L+M$v+az+!cz53M@rllkR@k?sM|AO}AW^ssZ z(gpBzJN|<95gyV-k$)c}%p%eee*EH9$Fn6_v!2yovKh6=ATBu-&-@ z^5@EZ1#ht!0wxl)!jBB1b;vJUQ+<0z`W0#PH1LiKc8yzv8@R(Efdt#0y^p&u{@Tpr zJv8)afKAHq?$x@7;i4@v@)-(EaP}EeC-hj7XYTWB59!W@K=A$xOzz_`nN(Vz|B*R} z;{GjS%vX6t{xmojnW?#s%k^#G@z(PbLW|>HX=$Ty3P)?+C`X z!uq)7G&PaMd;7O8JLX=c|3wq`NFh!^1tpZCkZf2sB!P3NicSP;FC|cGC8M9iR;G<~ zrzY47f!gaTzyAdx-EssQ*K@gU{kIjPdj4sSiPj}4P|T)5yNs3WA)CUCORw4bveZhv za6BZ-2zRq%wpA3L4E@sUEZCs?^lsgAgzKPXO5V%o4aW{AsOAiwuM~kk+xGTre_bAC z$%UM2HfgKf>IK!nG@39;Jg%S%?0BfSn|@nUBqDv&dyi2kL|O1jXfzV1ju7V?4d@jE zZq+D_;+LX_Y9wK~ZMH_uUM3mho4>({9TU{S51cz$UwzoZ2K1Pup$8RXd%Yoi1{5;S zjnW`BnY3h|LfJa_P7h4vxo(h`AHiC&;w}AAwFpiHLxiN&xikBMk>!}`Netl zBr=?01|2ZV7v%AqQNj7!Gj_D}HA0of@4ywx2t$pcKXm*;+mLAP;cU9ZGKxzQdn75J z>?l;q*$ZR?N-l@KH9X{))jCA-pO!0Z){-ie)$NaZBX$5Bcgv1F;)=_qvt?ODG<{Z+yEuLzd5AF7x9e^tFm z{_)Qs|F6}na^|?Mg7O|?r-UhlS1P5fxkjdas%6L!B8-;7VIi!g0)4(voT?C$Z6txC zenZtjSvw%Yr2HFH%mf0zQb6cTs3*|!_s!aDOtn+*%)L9(>wWvI4+#xr>Yy`XhAY5{ zGJ;5;SNA&C=TX(rQeu?NsCUvf`iKbLYVQS?xx!)(y$Pf`lvB)Z>fYrbu!?ekX-Z`TRzQK*QX!} z(R46=bS@-cZO+_4S1(;IQ&Jo{5xJ9HwxK?;_veIRYLP#!xLB`os>&C|i+AaP*Ungx zToh<&|1_<42E+<@_WO9ji&(!twH!hE;$*o(yO9#kt&I}KJhAaX$MZ%5Z@7$86LL-E zip|uq0N# zIGyD1yW7bd1IkGOwI^KtbjcqfI@aAgh*1cDBa#NYu5*$tD{40k9b$EKjPlXvS5RN} zyN*78!OtHwtCEEB^4R4Unq~LTvZQ{(g8tn%Ae(^wDVs`RM}~|B43rto?Nf+n2{i!G zr!U8$obbL0C;%g#qZ8LyUw?-LO$I%8#B2C+X6>T+udo`D`N3|IS}-7c*i>+A#9zB` z9~(iFo3KydHO@f{iN<<-1YX?!0LT)@PiDYNfh_&skILhpG2)&Hu19L)B`Lim4?Jf) zXXed>H}!oY?g%FwUL{DM(mxCM$YBgU2_^y(Hhw%_ErCN#_4cnbWB3lO&N(6<`363~ z%`>)7%rs`SrD6ZpCFZB=gvg#UgXoYK@s%Sdmn{k)L2>|>&;Ui|6`vWb_Cs)9eHJKM zO3)Z$w`3Pz^)QYvtjBPOxx+`JQZNoIa4(=WMheY zm5OcKwr$(CZB$UPZ6_7mwr$(CjgvX|KL1{G{b%iqGoCT-$9K`b-rx2%L|jeeRbYWC zAN4l#D`VsC?CEi41F>g+{=NT6#~6+F{6391{t>_Z@2Am!X0ZRNNBSQtnU~6zBIdVb z)CP=*2r>b;0PMq8Z7l|%rlCQDVim9<39fh=&!9naxqCLI->7dIo%7T`^LzXA&d$M8 zOv|$uQD9)|X=VDJht*Zr766A5w6p0r#eKAX<@wYG`Stnq#0wB~Ee|$CzZilOF=ofz zzf%EV6Cf8|gSVOVQpiTyF9Af4E~GGCLRV-{8R2S_G8oZ6KI$Nn)bvvK^gcSfkQ8B2G8H9~7Whm_`0ADB8__ADuN zO8RUutT%MET4;f#53@3beGWsu8SRG3&Ft52i5}iGT?Ql#1d~azq$QNd-SWH-JLm>2U3G@I@a_f(CjU>SB4I0X2_Oomx_u?Wm7S@{S#X zfYO4vY#IIJ&>i1&JYEnIM@NZaWT2RI;^$Zg21@MWbab(rBt)mL4zRPRAQmmKo*5gd zqevexc&I*KpKyEbbZayh^q3mFRAG?v`drL_1^_#>I}(x%PNiy~%@u%Z8*_S_xpo^T zt8w`{SOXG#E#|#I&u~qh@38mDg{q;jnMd!&8!u7&#@>J&XmC4}gV;*j{zL*~pl9qT zd*>1R#l`_WDOW&e9pwg#{N|a+OxgtLIKo&aPjh&!vB@3+vB4fH-pJH+1U@XG0w!J} zXGdbGoNbwU%u-m(E&Zvid=B^fXWftIXTgcvXg^t_v6k3Rp7!n=Ce^$9C3~Ato}jQn zoE}tcw}4jO^8i%##-1sAKSRHgcry_M)8iB8SvwT??#6vIV@-#cXqLcB9K<6kkB1rF zowaf#+v?1wbH6miZ4{+kZ&vsIOTQVGPHi*%wRD5Y4DCO2p{0BlcKGD(WjK7N7QR$& zfIDkW@wm&{v606p@3Qb7ey=Y>W@eC9_+qMiC<4~{LyzGVGn)c)g{te5I=}*T(#P6B zId{Va6l93VWJeToJofA@`-?JS8%1W3BkhqUz>C?AcB?X9EE-s*R#P<_=h$@c{oI>c zNpT~0K7f;XO2Vhar~)z5lY7SL{g8=k9}@@0qd)A4PJP%2jv6@7(y+j+AplEn(3$MH z1Upuppwd&MO{Ylg7+WD7!1SXq_YZl#Hl9;Xz4^Y1fNs%wW3u-kaCRv=yP-YBL%o#; zHk1N6y~Wg}w?AbHh35$^6o|2hy%+`>XD<8p5uL{4^YWr+Qn9d}A%_~L513}C=C)a~ z?(`k?P&d$dptdb5JM}kgLmxP2AGvi`VDpbfH&` zxlxz2=G!+!3-P}Vy8p{7(CS|mdjC)weJk`B{#&7!VxCii&!Nu5>}95{q803tX{`TD z`Vsk>tIqiGoyRig;o=IQ4{0)$b*Gc{)IRmr{ofKj@&3OgdSNktOZ0YWE<>B6LDw6p zcJXn*-KY%UWWObPB|aHG|1Hs@5aiHd8n-wUvMKo`Vx5_m3a#OgH7JydAHzyP(Pt+= zx1g|h_s60$7S_@z6bV|mGSOIZ&vXf`I;w#~upG5A2WKQQtwGmv-r5M{_eBaIDc4!t z(*CBMa>JvHvSK4tygpYJS=O*LyJGx<#bGxCbBDwq{08zRj9TFZ)K-r%%+`X&za@G* zp`~gGL}XFP`s0Lwd?zl(ehqKu`t4Ve+3W3Wd z-F(}90C{c2miH%<5gMx}=w{8U^q9=Tu#82!DZz!$8OGm#CqOxF{y0kvGclK501tEV zb9r7p3}wqDM{R;ZD>UogbU?eKV~lu|j^Zb%j$5BEjWVGTY{Uj)U!%umb_&!Tz`iQ< zFd80sYuE!{s-O?<&zM`X+*}f?@)27><{V9o;myLk0NMqv3>3HhK?k)=@CR2lJE66N zgd1Pv3s`VF8vtzysDjXGH7L8&Cq{}o>pS7P0yeKc>>k7gE?qF*NmYB9siS2I_r}Xw5X5?}6PlFW1~tlFUI9t=Lx2@(mNT8ppV!&f2eyO} z%2U)XnW~pq()Zp%Qd3^Ri3Y7NTwgWAK>Qf8}{MN4|LD^a9TqjRI{hJ0q6A` zNug>V^!5C6_fr}XPTqr%lmRUK4Tq8Rq9c~e=FCcYCR2(82_3w1L0bRp5ZskYj+6d| zvY=v(^+R&~BcdN118J%D`rz8HMl4kZDAphfCZgAz1 zjbdPB<) zE!?>x#1!11EaM33C;G;A)fuU1`>!1AL^8zD1V;_>GG%9YP4Vm(@hWxiX7IUM6b%m0Uf%Ps*YS0kkWlNHz>fG!0_YbDZRyh z@B!!qHu5ZIfq+F`%YXcsvM5vfp}}d9qzENeU?EHb5P2e6SVL%K!-;8;$9IGLzU4Ri zqCGSWP>NqCRDC&`QXHk0v3aZX4TR+trE>KOJ0e;7_=_tylakXsv?Z+T2MjHIWFUPI!p-!vqhaka9X6if%1%o$Rrdu1r7PQe<~tMyLBq; z_b}IfT*qzvS?UPaF|y0d6>G!TO99Zx;wz8|8`MY{QGvQI-rD{!=zGx|=|G8?rK#3S zY35(tWe$(gmG%sNij&Go^pdo!g(2`x57{CSU>)mSEx@Rey(jg&nw&c39SW&80BDnYMKK-?GY*dFh~kKHSQ@xe)rkHG8HCdW z;C}DR8S`pQ^b1c3KW32{+#it4KI#YTx{*_G5Wi+0-XVP63)>41hVmH(e=)a+quqJ~j zj}-K!4WYOSU#+LiwcrRl43-59E6fF3+{4G!&sML9MrDm%2*Nyw<^{Tk=vEdgFx~HV zf$3HeYK#Br!66l%=*GzCanZ2!HSxMM-n5n732;2nK-Zc>&W0ueph3wogL+uN>nF%o zzAc6Z!PLTr(L;}woQwz|Ba&mlcL_Z@My|fE1Xg7H9N||7!2q~ZYkgQ=zLVkzi2WLI zGdxWZr9ACqIf)KuhF%|*?dRkB}kH%^x zS=pgCo!Y48lB`o(RF7`BNo8^9xw05E(JoKUwxpWxh@`=4ya>pJBu#{Au0)u87Z21( z{8@Q!3nR9==s?}%aiR1haF=z$T{Op1xKR(OsGfePF-%d)EUkPWn1$I2TKU#}&O|^= zLfb_uo%pobxZh5~CP=X~3x1i-bRr2-<verR(sHIpk+t)f1LlOP zIt#v23~cL&*&TC3n|bFH|8aqyUEcG@0JaB_7AusInRv5|pury{(mi1{A$M=*yF+6z z;*`(xemVEyu@hR*e?n#XL@nS69?*R?!_8hpwmk*`j}IFn(YuwiW@n<{t#%|TvU*gk z94+T`zuV*6)-7ec_^vZ`^9P_ei#gZNaia{2T-{Puex$}~@Hzehr~V-|&)0jo$wrW3 zch+CpqJ#ZX580;eJ{hEXgX~E3IWr~qY=WS#ky8^#;zrc%I+Ha~P2)|4^{- zqr`2rZCv)%t`$w(!>#6CqKn90Y5U@~Dot|Z9>YzbDQh;?6sz?JD+(3KT^%&;p09U3 z{`S4VVMFkXX!u8y#ue^gFdctBL09~qmfijV(|QxdIrf$>g9DN{i_+@fR*coHfVd z-I)OHH5ZJ7H>6n&BH3Uz8*W$nng^wfxdI8k-Lh;QsKmAbQ<8cOQBSLT4%%b0k5wmW zJihxiOi=bV2o>yWMj>@J2+?-xAi+|~&}qZkahWWjVn$6A41=?0P9i?FH}S7mj73q_ z9%MT2RFShKMw;FkWW7bzTBg&t8~{Nf4(X%zlhC3blwPe6fQ7h?Ka8Ui2ZYA1Q!I7e8u2|Z9j6WUDRE0M5&*lx1g`rk9^cf zEdjKoyL8=-$Tq6`FtJ>L0o6g;LQmwNv(hw>oA)dEGnpi^1VXyrV6Y#(9qvSR&TQ(5GPfw-w;uj&Qx!tUy;iY?JK$m?;tm?G?>sik{8+XQulIX%SQN0 zJTt!q3bbO8BM2w0@i@yx$SR)KnWGdSEi$A=sc*@}GsRpate1M2I;~XcSLhC40TOuY z;D=u;m!SM~>~GAQ#_@0`(bhcEFn-vhs2!2a@gm(%C!FLz-ZA-j+-Yevua<*m8(}QJ zvWd@-G0Z^e82j>cdl(3HbG!&N1vxu3kCD{)v8KR}fH{Uol|E)dY4Eh1^Ma@6CFsp| zN>Rnbj4j+OrBJ*Qle1o+F81(+xz@*nr%e|AfK1rI99j0@f>FtAmBe~68HonN!p+g4 zpM`bw>6zfZYIB!-@i{7NiN15+FY73%$^->@FGtg<1TUrLN=q3a0E)`SBo66fhFs0e|4^Xmwc=K#b5Ie-dr9p&g-V$ zU#?`k0G7kk@tyRgdfdRI-Izo2)uIEh(G&nVar!O&+_*#Pb4Ytr`a|Ig?G&nI$=RqE z838kpw=)2afZg)YZFl_u((sDWHRTS;I5b1P?MFHVSCbI8hA)~3wdDyEr( zwGJj!WXQ)&E81R$@Z=@lsc1}DCdpHoxvzBs>GFs^xX4~5qzPcuhao1JBbgA_3wy*n zY6wg2H}qQd?kLa}tJZs}*P(T1HJm`BLMG`nfGpW?@NgHIQrRdlL@D*6L{l@3P8XUj z$}AZEo_0Fu^ixsK7M3VOt4mWxQV$R*Mfc***H-whp0Ouh1>e|}?Nytv(QS)PpLsMDm2D_xx9)S;hRrU;kTly^KbM~w@K>DoIV@km@gi6ub zuL{wLLSs|>46;@Ft$GgF_&VZ|IKEX$XBtzPoLN>clDGZisLVr?v-Z|bEKe^BxZ3Nd zGb|Azidp5bci}=oo2IYQ6emhbWOV>_je}|*ZQ>a)P+#3V(3cUA6!Zs={{W@Q|4dNb z=n3B~fj8do6az1zyVWwDrquQaB{ZNaeYp47|Csf|!n^+cRtr*EQ!^pbrgRFj3 zXey_`ra`%D9qfxGog)?LC$oyN_y6rg#?EhEoUdtE5c>jrhM{*6dh7xO&Fz zt%2EsHN;+#P#ZqZ^9R305Alq&lk?D}BFU>zYd8c%lC5gaEHZ)aSouK|TEX?X`jMPk zS=GZee|W=Fw+-)4I;^)3#i&Qhgdy$8~A`CELPqx2w8+Pm-%Ub zZl6fu8A(FGaCl3C$xwO5^hR^MSH?7%t-vZ}ogm)Eh;D|2#T5y^qsZJEuRir z>o+BAOy=yk6rp*9$FCqL-lfv&6<1t}F0}x0Q0WJ1!#*FZ@F!ZsJpv8Go2}}S>@WBi z8kVib7wYii$bsaU)6pyav9OF|4rkwb>f9HY)nvG4|EL8w!*V1$1pN#FP#HteNruO} z*VLaQT`mNBl3PWUYu7UO5l%YAdAQjGLOI&(f>&(2*y732gi_!UC zSq?C38i`-{w8PAphP|4<`P7K&o#DemVhWBE=HdUcCg1Kn@#cqY8%KG!oQ@U9FOzzH9QZ(N_$v=NA=XS(KxxaEe} z0nvCya^5BR`5xu_+m_T}*nSVBc?w3iwkE~P3eXYIYUhF@Lcef6^g_xO&08IXHhrVN zYS}yb^KaLZr8Loi%Qunm`yVFcf4^J(=YYHadYii#OZ{I#7T*bEe>Yh-QMXB|14F9R z3sV%ItMu_)lMJFI@}!7_q>uzW(|Knh8{f5-UjW^M$DLH2t!>v|lH zcbHxd9K7HHlog}W2Zlvjz_Tl1QK5a!BcWo?OVzRknyS^-SnaX*{3;_T*n+>!+9E*W z8GMVQ+fa&qpXFVRA7QOQbtssRSR=3s6-xC~qdNZS{2d+}5pQEhCS!y&9Iu1m8HYUs z`=E*rQ2{cGwLlTo7{H@O%Eqy|7#h|Zz&>S*6Xpvh0PpNyJ_;sTzgAlWj%=IIS`d{O z74JM(&OMCK`)*AqV9$9;YP}*?xU-6#S&=59)!Zyf7R~bTXX`|)v$*kWgMX*1q{YoQ zndaM*nRCUWqUClC{_vF?Qtia}%rT76krnZ%?rp2pXRlrdt`>7Up#V>!!0tXsKU2k> zv$gv{4{6-VHB2`6$YW}G9{M5l0d*hmk5#ymR`HWXj_)TURtq{9tekgf9#>| z1FHk4>2NYc5qauBrBNMw;N4!>l0;4R*G{>PJ&%z4@JrUrq4$yU2P%mp+Jz+|OQS-R zLlCAz$}#-mTr5tJY1V%Y$UMuQ``zC@C6n*-{(pSb|L(NF`;TY+zql+^!T*jmDO4xP zYzKs{M_5$gZ{-JSkbpGPLyoc8T}*JGdVEC52j;8haLh25p)j&;6Y-pKla@ zpxGM|5naD|P((f;Fujb-&BiByl((!STKE;!WXeu2C=!;C%3!r0MZX_f4?g-8Maskh z>@K&AJ8wuITW>Nf+fp#rGhrv^=u6bio;{44A1?3V7%79yC>!x!Jy2EJ!W@D{Tb#*n zBe@9+5uvfd@emtxll*v;2G&0f@Umq<#Kso(+=Ut#;^VFoR@lFnE7beXbt^Di8&m{5 zHsWiF`b)3y89C$ZrF-vbHl}k^|L9DtPX-bPw8qgh&*Y_X@S=w3So&}>Pl30|oGCJb zm#xhz7~w1K-Q*HD6!%Z=3hE2ETll$7?x_pHrS5#>LJR|i-^Em+BwswW zVZa#6KOJ?fPFQ$Supq=pivyOP9T~>0bopT=C8_p4KQ`%xJhcj24iP=Jm)N<$uYxAj zAPoZ(u4hygkJn}S0ug>&^YVxA+y<$5QMdyMs%JdioN!lwIm?!?`ZyW$NH+cb2l_-o zH|JiO{>h?Ur_SKsaz!*;UG7}Zd@ztjB6Pz9)4~p5y@44hWT~;I$kC2>#K}j zUTGuMD71_jL#jw+7@aNM)4nW0&RP>o%VdTLI|M57tGHJ!5t2|_deDK(1L8qr&Ar#u zm7~v5I~bLWp3#_4ym}EkqU%P_;7!j0Ln!qO>w{BJUE8WboNBtID=0`1v2`jVV4%OV zYFzwU`^b>$P>!5csMNvhNK;sD79Pzmk@5rtCgOv9fN-yXBrG0)EHx$yl`Qe%Os`4f zM!e7&8cHkYocW#?lq48;5z@5MI+X~r_f$YVepo|1`sifPBobo_B1;&SE>q2sJVA7T z&*nZ-hMM2nC)$R?sPJ{A;QTd^htAiL*1ZAr>h?Ru#Ac6560dHyAk1N)ZIk%HoJerg8|2 z)c|}x_deTero-(_xttJCPWWz`A6l8FRDj8O=(GqC{X;rGYzo+Z{(wpLzmkEUpgr~g zMi{$8iXq~$fw+zJYmXk|3{+09t|F5%ToiU!hxuHCdErq#VDivTNM=vGa#a3=0G=-4 z0)24>%D5$0J-DE`C2%;9d5I|V6qWx}j#bm^5hQE7A`~;J#-b3IbI1)anWhewAUzF% zcIJmq)Zql4KO9jB%vi8TV~A?jX#9a0N@$xZnvmZsZDBR4UpN7jEmhN7~3v zU0cL1hg^KC<3FQ>?B>&AY_`KKhe888W@HeKpn{{96(C=}-S(nX&||!#2LnlCpd-jO z+=3F7t1xZR%j2zC?|445rO*4KE(v7d#t}Tg+1H7cgas{T7(E&EfmkU@AHNu{BvmBm zJ9j^H09CL}6&dWv1Tv{;shzVQg|J0z(LJX0p-LB0rUbTR2exF7W!P^YzxjL=>L3|l z7XbJtH>ps7)Q{)`WFkn$VxH`yamG_ltS^3-%To*!)xHe-=inxKN5NW z{lfB}t+PtTZchK?egc)uWxrWl?y9wU7YdC=3O_2E4ZU^LuwfEEmP9oL{~6fmTQb4X zaU%}v*Sz-}U5V*_-0f(FP1ZT40_r&N&0m`>M;neuA1`lrtUkb2qHuy7eo(dY4GHaK8Gf7)$A1U`&(m)maX1i5UJ+#C9> zwI|oYe;kQb(XXErY`_J#>o~gz&ymCF&cLfgO}CTJ)FqD@$yLx8L&bj~Pv&IU6?qbc zXiFYOyZc)z+bGq;z76G`J8gYSWw8{L%QchC=Ms72srot`+P|=F7P;{HCc?$h-a%~X zB3$?(+W)9F8?MIX6Ra!IMGz@!%ZEi(U?KwsxV2DGt!5wBRp&1`jSzImV{8WC+rvlT zD=?k8s9T-RX7>XSqT~Z03pN+x6&Zk6AyIv|;eJDXI7^a<)q-j{|kkC&(ofe5%!m$f|a0&AY85A}*lX@E2vmV~-63koFLI z;oIr%dQ~EYeh^ML8d~LSJVH*^dBG#cMB`2otlVtsIr%ay#w%PAivagE41W6%U1T9Q zng|_4a~^#JVkj1|o&U5ECdq2O2NSFu?pWhC<+$nO_S23g>-$<@S@QOnppkf!?GN&-zhCneeF-{?gR~Y4d1Ki7ID5k?q_IgUG zYb|zs7Wuk$T_v2xDWvJFX~^qzdIGJ}K^4tVO7Ph+%pT4qBBbCfcl_($7kPi&QHb8} zUB=Kqwu1jIDf-V_K_v(0f7KL4#!D)GZv}_G;;B~P76HTowt#erh~TzH`#^WlBNc$f z5;d?`=wb>4l2)yd+THGU2g*Eu(Bj+!7O1En41E8YT2oiV-CC}=($uW1tgZK=wx_AB zE8ZVa+u~sGTFLf=K)5y__LAdGf@VY5`Ww&&a#TTnXeej!=ua9s+no`h3^=1`iLr_F zgK%gw-@5VaKfJL^kqhH#ts`UToh|xCBxY!jP9&&k`Sf0?jP-{N48JwBY3&Sks1t?} zN6sWI%=wv_YFskn)aNOnxNX+ibmhy49XE^9gdr!kX_3im`|b=@nfq;~=Z~ZWDXSRz z5k}tAUL__H=5H+q9~HDD`B}sBK(hBp2A)VT3``&_Jx8!Muf#jyPM=!92bt@JBeep} zprq5dUETPAd#g|v(FBlf4k-}NFb`1#=fNw|G|1zZC}i}6^;Xw46XsXF)U|2t8^+;W zvg(eC1D9Kh63ik^s5vKAaR`};R3nLbN<#gdni+ZVl*mE|2B%MC%oCASaPf^Ztki0naf);-#xN2V2KpfqZ9Aqz=Rn}qp z#4~E?7-aUK_ye4isBl-52the5D}4K5pR=xdabsPk=bQYyVfMwQ8`A@^2|Pflbx)r_ z${iUOGs7nAE)%AuDJ(oqPC^U3`CmfpR@0155Q)A_QP0%Bh$Y4JfGKf`DMM$4 zo1pOza}>%zA1dK9tOLp3&8OKlfsMfkZjGv7vC!U$bf0JkbEh2sjcTQ%EgQFp*j;M z&EQjKzPvE9yKk%z=2B2Dq~f_vr#>IgS8Q2%y}dp_wyDApVD>aXLF~1=p~0=2NeCvk zScx5Et{3w|G~c<2cU?#?^)!Tnx=f!9ReH78vN;X1k!FCRpeEc^7m!K^j{M`H!&*PE z+LocBE$?W2D|9r`t}$7voVixXXw@;pif+KKB|=%+P}^Wpyzq3nFCboLa()j(e&dCJ zMD4gzdMXn7C)$r?o|;)%B~oGZrZoZCdM$TZ`a`>*9Cb@kaZO>2c_BAI=1rBw8UtmZ z@FPFC1)AE{USadZ_}H30Ak28V>(omenk<~d0>Ph+XNg(9++DEA3Og6<9>H3K=B__M&)}gKB(*7Bhzy!jE0M1 z5P&)(ZqS@H89wb1fMjp6U&nqsVrO7Qj&#!}m`7*7y0bUE>FUYb=iwU^W+DLlnrEr< zO|034B|&?&8{P@qn*!s|VOYq+_(@J^N;Q9pHvnHhkzaFwp<6bGGZRjs9zfVGGNaE@ z*II?%6zgAsnIw^0eS98`m#W1x6pmS_U1gSdYG$^32S~D|3v6^?4IQ%!EK`Lq-+=#t#i23aOty+R2Wmzel=Y>>-(;;1Zfw8~$h&YBLU0Ci z4w-?mSi%QRRmXK4Hl)CDoHQQ%q~p{+q%i`q5QVJ=se0?ChsAnQ;n?wOL-Z_ZJ2uFH zAi+Qzp;@xT;+qUUeUx+RC-=*PU?Qe{LYty&3BQDkbH4ZN=?UZ(S{gh%z7X76!-fJn zA%4ZNUcQ$P-nO1Z8?+BH3C#`W2_p~V5#6M7pPc&wq-h;XaS+BML2P3~>K*Ea0tp?w zx9&Qgz}rQjSzGfOz;S$F{cEGa7@Z#J{S9dUf2eV(O#&FciH-mB`QHHj-KF$Da@;_b zmEV6QxZ1>-2ypO$Gu78J74yv&_5(NhfdN$yz~%S~s0XYWrAc9%^p5A}3)ufu1#%Vk z+8I&xG_Uyhm^a0JkDqrWu}&+L$8or7Im&q3sFVGCe_PrDIPZ*clpu z3v!mK?TO(BVqGNYnKgH;jCTx}6CBRv6}m?p5ap0x;TgVn)kib-~yA&5NzIwfr+y!n}@ zjvmN*+$ETmWe{h6wj)rm%9caR$aBR;9| zXp9McqNDW&Rh-3eg9TIUYCaRiEU}~u%WG<*lxkV42gVgHZu;~s%?7L)gRa4Ejp1IS z{p!P*6C-I+>Ac-j5sEy{taY0hP|8B@hFxGwar&Z~EP-Ewm4h-&!zq20v3@z0nwV5# zn6vh?v-Ys6cN!}N)$|gbhr!*iD3dpo;e`QbOIX0l4AO@$RMqCfucA((rkHFiqed5a z(+|290hx6aE;^jKj=h}ejBVjwa)lL>tiYb)yB&e%e&34<_VYq8s=yl`>oIbf5Wgnn?@lqGMXITU?pET#94CncWaO)D zZQ!et=D;Y(|}o8!B^lEzebMpgWP5cLE1O#Wlm#3+a*LgY>oMAm}X> z>I_NH=dR2u`>uW$ZFh!U-T3oO5w^TuBJ$RVVkygiQbUf&(1vO6>Me|{q^gmEdw{Mc% z*e72ZH3z(oe^FYaH1YM3@HRcj*D3F4=gM;a(J_l`OTJCz(ijG&j%Y`fo+Z|weza2y zNAoCVT^++-#MS4PpIvR1M3poa!`CjH2-QG_1sK+dBME4|d7K-hO~0MQ!x0K^l}CFZ zGaY{qZkv~Rh*aU_gpmtdpY2l6M9U6&!x+m$WDY$ClOY7hevgP;Rx-ougS0I#yJHTh ze~O;#Da0GT0a^V~UpJ0>!(A>2!o7$ND^n4Qx(y`T6j;`Wg9Miy{M!k|S8NT+uY*y} z1TL(+bVk2$Ei}t_HRAW5AG|t4MK59+0kkyoKmz?9bkPd|U599fPZRnTu)lK%$BrN7 z`1Ekj#K;+@lg_jIe&J3!HNn^ThIV6d0E75#^soy7UmBt+VulttH91o{9^cOBg^{G5 zKiV)npvm)o+^IU?q>H?nRJ)^SdiN~u_nmVYG=BcryzAQd`x_YVk0Q`FcsQ?E`b}TnLJ9Q$E%e=tZD@_Zy98*3j7{{vBeGQV9nAF&tc(?mO^h9k zZ48b7=Ovw}`iTi2u?lsf#vg+gI?93G)Pc4cdiW1&wuM}=6m#9** z8D1Dn)o2~*jQUSI^^%3YFqq(-3+>tA)j>Nh)n=TSmr}d8-Mx9-2&pN0a3&aL{%_jc{yDd*R){>Lm%Q zsxXhQDbj*N&%_ml{~~3@s2#g)%32F{L(c=2t%WJi5VUpUG^ zQdm^tPJk?!v^;6Ig)sGPgXtaAOsYt%D%Hev8A73XsfBz7`l~{P7ixW}33?&7c*!Le z+ON+;krvg6H1++uw3Nebc|%O(NHQ@4ksk33g&4S9tXFh|io5jkM6x)9PBH9625y!d zJ(OrlLR`Vt%=}JW<5oVZo(AY(?n_%Y}&0a36ne6%BMenfXfsBrkZSVIV}VvO4X zJ5ZB=k22kK9;7~i^`tUwbnF^|)Cn&k-5#{=%PN)2;K)Ng(!)UUUVfY!{@HIJu)lh) z&fx(dQ@w!hR&bBMf~H?h1NLTlj1)x7LPf>T^X|ODsmZLuqIJjISioM1BSi;4aE3+!Z7Nz9ps<=I4|&eMe!DS%lL3PcyDviRYSgHm)aA+0 z4R0|Re4K!^klp@C?EKJ}YY-7!mY7OR%_t-_NS_*4RVv76lTLEw=R?Ywx=d0z-4R-@ zV_K#99hCM7B)s7o)Q+%WG$Ydyb7s{NjB86v!DZ6OY!WMkg}Wv*v%O2CzNKy%!}rBC z$xXf@u_AM+wBd>;i_G4#FMc@{r%lKx_jG80%5d&m-`_vYPXl@yn?_ysi~LLtoEH8H zg|`t*a{-3ZxZ*kV4?eX)Xz4<`N)k z24ei29B2wX*Qgc)1f={GSF_$nH7nl0V`}o#;b#U<5x!n>)4|^0Q^-(0m!Ja+(D_L1 z-K7D^5VvZE$8WO4vwF6S*Jb5s)K81@bqEm>jY@U- z3%wC3FuBf}2cF|=9E^jjnY?2P=pG{ppiW5NbNWD_4r1)8iLz!Yz+iAUgDi9QNMPf& z_8g3_n&QR1giV`9(^z1#T44*5aPy{mjz?arDeO3 zxsqjS=jLywRv_Kv$mcMywqISs2Yu*xIyrl|hjzl!iVuK7vKxp`VQ7#MAQveD?+xD$h-0-O;4pRh2H;^#vj z`doPOezd_iIYMB%;Cp2V##~>_p$<6F;$mD#gGCa#M$JCF`%tvIB1Fg(ww2OZv&*Pn(6Xro_torh1=S`pw-~B6I_8BtxOyWOkk2 zDI#miKgt zTW^}^K51&whklD?OzedtbZ~tt=0*?w7SHJ0>mttO`V`&e!qJUu_8CehrrE#gLV$?$ zQ^4Aj7c1sU5`$8_6*gB3=-mbKt(~|L;;IwQsW%ty;w$E6FNPSu3?rS-IzRSF+bn`I zV^Z8mj3C$Oii^5)wPZ*@4~+(=I*}+0)_kJev&dD(mMzfaoX00FGoIYYGZJZ}tdU~y zGK=pXSJO~tD5a;glZaolz~pABu$#g-9i;TVbz(@>SJ#WGVjgI-<|-^?xH0kznPA|S zAppDom0=TYiOy_|)~0LU57mFDqXVPiFbo1;OuNmGm&?uvjDm7cPPYZ6S5-Q5&fh>e z)%<5faCEEPT92y4n33i#OE_iQEM0`y$nHcgVI_s@T26njhcXEn_L{;`|~5mSynimvN^I&{$VGMtpFvo@;K>Av${jw#qP4z9#6 zpWlZv*0&}&F`Z+u9(7>p_}>vCB5e7^5Ixte_syPlrtdKFMq|aI7Pq$h2=~Z zEma-P3+3o1Y(r>4r|_19GOWseTF6khjx)VkzBCO17=M{Gck8ZLMV)tKq&Wj@8`)ak z|F*qvrB^hr>5`CTkS(Jraz^33poGTGy)0cz!^YT+oSRKXlSlAR<5*6qZxt})nmM*^ zlBQ%~5$T7*f1zh2AjtLGOBeQ-%GN@?@b?O^cF;Vns_(mwpFE+?28=*YP5W`SFEmbG zMT2DG?Qz8C4=FjOF#27;Vn$4nkSk3WvW6DVpZIp?SA<=W_A7gp1WEw@)(4?51zpCsliEKM9`+F2T!lMofk$Edf5GXNO#B^|gtKmO0#&*dv=qhcJrw5R zlI3DLZhk}t5lE4>q757|sLLlL6F6Bv6F99gIC;a$5mE>wTUt{U^iypR2ReBuTNj5& z?I#(za+ub(;u)@@8ahq0L8pb$(Tb{P zdgC5^!RPQ^gKFkvGY}`{3MpdVbiBMhIkp-v+!51UTf38(PfpvekyPR6{`y!)#&zAy zjJ`-heLC~|3KHsyeANaT7hHGa-pAkWNJrVTkQmeqw`W2g?mVf+(mY?1oK43Q78j?A8(3l_auAu_TX@$+sL?$>vAXH2q!I^opN|I19x(JB=h} z+l|>lFG+ZqYC}bhcUTr7RqMno{zBh10?TW#t=fDuROtIUnBl*DfLCrgjT&sPSjoPJtD z3`@HT{>Bw2^Y{(p?{BQ}i3V0-PDcHf!JKz@F1Dsyuy3_LPl1Sp56EkI-V{WoBlaD1 z?}Lz=FFrNV36Y=$Udc=h%0Zx`10UNR^s}p6<(4%5ddNdFx~3gv#mx5xZQ#7xz(tLo zvm9;n6#T4}T$RwOLZqbyBOH2GGUQ%CP$Nn7w|mb*bGXW$jYec%J;qa~--26u@Z*~G zs;heaTlvDW9u{)9RJco-c-shGo8K@C=Bz}V29&w74nWyYz!XVQ^lLm|y9hwH06;e+ z%$sJy5FXC|_p8C_3b(YEsRBpQv4dctrg!M=+W<*$UotZ@I<%igNa?s{oAl?C$l`_x zWfy&j#j4tzXykd2Th={76gSWnhKf<~>x0i_TJ~y6>vM_T z&VfKLN}kh;>hu<;Nju-LI3E~~^jK8VXL1JdsmsM6cy|mQV;A9IJWMB)%}LzKHT9hnxhJHQ@7VK%>RpE9&0;qJEjy z=}wIs7v;Vg%rbo|8$FXQQXFe1E{zEp)agNWQ@f5yb>U{>&r;>g84t(D5tX&=nFo)H z0-GxAlQSA?niU-}4bSa0F~&~UHCykF_mJ~)T!CHTkX>Wixo1Bie)l?$2Ruhp9vZ7+ zHNqV2<+f#cj4RT?9zk5MfH=*ON@NdpgR+AmJH-OYgJ#y`c#Ud91b|}A&0tq#^T|G4 zH0uo6Bt6A=Hbm8_Z%W=aN9iOz#g?BO8@6QchdX8T-L?>2&A}VLFcV$P+vAKK#kZ>u z0aJA)?K5-G7`+h0B_GSF;o!B%h(;Xn#}RTUB?Y%?I+RE_e!*kP5wPS6TJblrA$kaL z=H~u93eS`iCKVB4g$cni>etbt`DI_g1{yrj(kzn^joA;}EKk-f47JTdAJEoM7Znn2 zA3bfCEw+=w<`XQ85*_OACZH8oG=Lms!D&M~W^ef+Sv-=uK=NGWy6JIG*Ki5{q@c?@ z!2QZ2_$B%E_ZW-yJ2(dUTN{f`@UP3he|J0J|KAkU-zjY7PXDs#(~jbY=%qsvI$Bya zYm>Jl)Zt^D_^}S|Ozbp+*pDC}AZ{sEpfeE&dM#&gDq>IHXX=?Vkr~kpu?be@c97XoY!*w!;@@}8d5NZspF{eX}yYfi#J;rz$8UX>;EC`9i#i)m-pcYjm^fkZ8f%y z#!68%<+0#{Zk{bI#t~XP>>FXZ>E>Yh|sx`OfFQ?wM=mn$L_xByk0C z#alzOts1kuPDA$>rGw8ZDlH1T46#)Ez)!(z=8~1Cz-&inIZ8>^QHq7112k;KNNZ-D z^YRcI(@xxQTO(kyP7_oQhfw0uf+Onborq5{!x$1}0gm83qj63geV)8@2dZQBdECc@T%YI@R z#v#VI!x&fN?awQu%&J!5$AA;D1a!&%?=!>u?=urIvjnWE{JkJ)B`0a#!w=&nu_6`k z9Zxzj4jV7M_hzjiKSDt)yXAKmr3_m1ydL%tz>3cJ86f@{WyA)O{q zGNFj94O?(8vSK82#8BU3z2>Z;a#ISdUpZx)IzLV#iX@faLy8-EubvZbL&obiTEz9f zsJ3zdIp>4$jt&;$LBhW89P6-ldGb=#O;xytn1Mu=`XF*2JYvkd9GBDfX9?vaNIY40 z7KlL1acDjw2ne9>o(PyPm|H(&(@YrzT(`9aAAWYWU1%j^EdY*+@0X+cb5{Qst@z@G zM%Io1SEFd;Nc``=Rqgd`ZH?@I%kHD%#$Q|U`vLQPj+32oAZqndi#3qQ^V3|vx|&Tb zvTpZ&Fxb;xtOy%(GJXzcRs&5dzH zS237&SFBZI`vMN^65-0em8_W7#HLO}NCkIHg2;*kk-~gScg*VTBmPcL4g|(g^JzrY z_j7V2;stBa&A91(lWv#ZMS4eXRAynVPn5}kY2cwAlQ^_|j8(pK6oQ5Qc{*Ea>kH*f zYNNU+&O)O}Cwnj76ymV4Fi@=W^**`w$+dS-Adg$M@`q(l2P;`LH+8Spc9eeFm!}3x zwD0$4OTc*Mvc?g1-$CKw3?OY&%%2|84Q50WW*M@$svFAc8q#E&s5r>q1Uhz*cz^?2 zOK68olerU$QXc`Kj8|%w=kD!Jx$|TG!r1Wx=YIKu%yhYyRu}Ul{Z$#{x9gaD>w5={ zhF918yfeqs4!{K#pz8CxoB1;~@c-M*{2LDdZ2Sugia(d(dXK57s8B`9=m<@me@_X# z_tIBNWM}#T0?OFFYQ<*z(Y>WMW6S3vBCJ^m$;X#($n``8jnTha+-97EXMDJ+?dfTM zpY9FUg8fFep}|)HumbK2wYus(UEssQFM7$+SnyVfkkfVbGhq_Ec%r$>Nr+va&1mx4 z_Wq&8I4dd@#g zBu?g-f@z(9*OLSlB~&1ljZm>KOmQp06)Ex-O_w|#zO>%?(2OZzDBL2QLIeK;BuDn? zW;EK8L^&@78oXM*@j6r2ry1Mw0gv#|U|CKY99^QHjXVn>J)jD`Zl|3w52a$_IK>%# znjFEn!s=7Ratfi+^Llj7Cl`hgBXmhMQtGuxBeHGd^Avc$o{)gs=^9p1_4Y+vRbzJd zE{^jWxq|>o^a1Ak0q>9>NfsEctun9(-I+_HB_eKcd^hB^tEkr*udea@}T3_#i^L zR|~>o?CK!gg+<{?6y#YN+w}x=4+L*|*6SmK+pzK5U5)kD&z!RWi0JA>G z*LBHs;;%cC0aBR&KqYek)CC1x%^dy(n1AmdDs&DTEigMslGMnz(a`_cv&cWMN2UfDdAmWwdGBvo1;T);)UivMumaITRPV^GSXQ!$X zzLH4W3E8PQKD3}nFLfz}4`!+NKy<;**ddJ5;_h0-<)Uio;pF>TP!N*AcUGM)B@@GRf$_FS{Ie(0O#m|MSx?q~fjKh09L#wf1xE;{s^ zcT5^U%Wvz)BIr!HUxI_cD$E5UN;*Rn$`vQg8Ni24KQ;!SmfQDvt+8=@>3eZ6sXqV7 z>sV}U4PKpx#@`}?`M;gVUm`=+UeUxI1XYHD+$TE71NxX4UH4fV_ON5aFF)x;9)EhhWOo@0X zoi5$Ut3shW!aF^(Eo{JOXVCMLtHf~cr5nSS9`e|d=!9)U@}8KGCJB$g-BbuB(pXtF z2Kz3k?lNZ|LgQ{|Vdm>-QDls7Yb3Yw*k-ARdaN0JVJA)!c7@7n-ccAM&i)Fl^C@xO~hGxt`qgn>qe8pN{ISW9L4m=HbB{+r&pg@2Gi^O|M~&Q&;%%BuaK$ z=1a`T+tI^OWGV zmQ5k)dac%6t&=>~_NR4=mWsx?CmO~NomZB3xMZm3Yu6a1PV*KRqQ;##0pK{}Rc~)1 zF?onB6(Pp0o!_p*So%Z}EHf=@bB>t9aD*`j9Wrp!&Bu&nn$=1d86C04G?L6Iv}#rm zx#C|pXG9-{)k%P!K(*jNB7)l;s(@MqDoZ^M4`kmVzU{fPbq{`Y);*7|((a$H8lpc) z>3_7H{?d3lk2KxolPaTkQ%ojvsFg}k5M93;#5|zvlXFhdEO@YRnu6wYaPH#VDJRDG zP+5FO6b%@%D|=^^KDR*c;Y^kMDN=K<=o-U#*hFg_>-$FL@(=2EgJJPhTz1&9DQ6&# zNOM55dJH%wF4`GH494DAJ&C;RJIeh`?$RqMO9*xDpd&83Sz>9AL3Vm6SgJJ6l`X>R z0Xb^b`{p$B17Bu_>2u!cq68IOdNV=N?c?m6*2c*mV5NJ-IJ~z~I=DQSSM`1{UO-M} zdsGW1;fxapsqi(+1Nz`^!z)C|wYt>?a`mx4h6QXwk($cd&zj=oD1UhNm-+!pgyAUx zq3jRbLa^uwDmmaNwPoH|xvfF292q4uSs8eswgIvjCyY|i2~R#g6R)97K~Zo7`DHOt zZD%c)5?-(ieX?4pDg^?~KmcQOL&UT^R6RVA{!<>gB)37Mc>OG|0km3VOQTHL&VcgZ zf-E`S3+1x-5BiUd13^n)LK@yb9{*o>)wXZISx>5a~T@B2Y-8^R#pIIoq9nF2SVG`jdPg z*R*j%_U$=6-p%!OI@A7`=gavWm9O$jgWl#GxrAD^9G1YU2oNlE1I?nd#7edNFJ@>qEZ}FuO`ASgLQhfHQ#4|)SDU`8qBas0rP0y&< zynlS4cgkS$bYM zL*4W}JNL*=pG(#Scj^9U7%xC>p)u61QE zRvZ{C7Eg`Mw2&;J%2v~DyE~_VFL7>BrSl9frxWz~&Q53z`C@T4-yy%c>ov4IXbS** zk3s(~C7}8T_zIeuSsMN?SIytYk0NJi!2k4w9|#KBOEOGM$bGA;(0tgKUn{vxY2fHn zuoWlG_G}koga0hbe&Hc#EBcZ1lGQx43Ke1_G6WYA0o>NyXNWlns&^dYzxioHAAp}$ z8Q(hQZ;YtNQ_ddd!h!b_jY3#=w!A!IM*a7rL-)oVm5d6yasPQ4fvsDQqAHn3OJR zj+^H*k>Ce@?eu%7>(pErM~zE8XJ~cHJpM`7z-|_pAZp5ByA1Ys*1Caf;uV<3Ahm~* zA7V=~b@2maA#)_;bjgU*!gL{1qva!mPMua@3c{-=A@7suF`zy1xxR$vqTB-QHfbo7 z4U-fk@(8e|Aw{gPl}O-1wMRyi_kbVJZ1^hkv{j;O~ zi^9k+{8h-v!NADcP|w=&ceqFWk-G*bqqswb)CRFqC_lXsNXqs#3o#`O((O>QU%h1D(qi4EWS$;e4e7J!nlcYA|GELiG7(}3UDuJ?gp!9&g| zqEdKC6}vp1aHJ);5yalgF~BTNANBh|j0@+E+)t^`qf?S#UvC>8Nej^u z$?i?}Dr%5sjt9iG#hT&g#f4tgXch2uZ%GAWm?X%mF)HM22cES~XN9Joy+@2{Yv>7s zaXf{(C62Bg`C;}Oag}@}t|z@P##{mvSSUu!FQh+-YkfsOGA7+6zf4_t-i%1ve34x; z=tUA^P{SU&i($QkURQnfu|9YUD{hl(Bu{tO%T4IS^T)=-qsQdd7+T4ABIGhSnT5s* zet)iHcYI@WEoYy$={CSF&dw;cjBQd&`}?e->$0??k*2|>n;@&1JMB-EV2obdc44ah ztrgXEa2g-@v%+s-aj}AKSoT{tIjU4jH#%v^(X6-7m~P)11Q`VH)@bVo*eSds*6u_$ih^p2cVwkAu6n|DuR z>9VB8ns+F1Q=M-zL3hX@2RLrr5kG1|KrAAu4atmnCWXqOIE0YbEpE8BzlwX`P6P&x zv3vp48fox`ym(U=1A0w-B!ES>qvM0D-Yhy zx$ow|%XLJKle`4Q;vLmpw#+cH0ajVK?gD$I8ki5^i0}AretNHakw+nuvhSxa&7GrF z(gzXGJmtpA>h#M&$U<07&6U?Bev7zM&F_o6IOhjAW9r-eyePIlnp&Z(H6&g}Uw3Mh z_=9(3vo}Uk^=798Do}@yx`D$p{r5 z-H$9XpUy;9vCXJsO9>H7^P^2u%ZV5Z36Fn{+vtT+kg0?coDO31DY_XXO+G4q(<<54adEufu3J1M~_hcI==Vcv- z(D9|5)ZP^z9M0VQ zf~IX0G##|2=|x)Y2N1)SzHO*VIM-F(L++(V;CrP$y7L9fHahlwl5xK}iMR0H;&!$e zswrKS==1Ex>IBOq^=sSXrbk|16+rMTvU?OZoFETXzF_WcaxNLI^iW#c_DN^5E!F@^ zC4&pU$vKrHaC2P%bm;soI{wL({0AM1X8M-DfFvot>-S;_*b>Up6tJ|0M1sG0FU!AB zLNW2sr=1!V$!0&-74sGy0o(NrE)+vOm10;eQgUkz)8)9y_}KIP(>9r};1OF@C>N}y z{&1J}N{!umA8VI;p}tWx#E}FW+2sTq;IkLYRycz>_HEKMj2XluL9EvA#*hb@W-}g|=^fnr{W4lR(98eEYTA zX+;-o-ICe?u>0B)eStHkBlr3n7n=F477$G`unn|YS)wvMIF%`y8+cjcSJVc#5Bmd{ z9fxlXw&7nL2~_lod;kC0k-Y9AcCghm_(QoQD&EFsnjWDq>#*67*{>R|eiG>LSzvhL z0w|oc3sfPSQY@g&g{iD@D4yJ|)RWp3#2?-B4KK=8x>ODl4xxhQ^{NBk!`SoP;RF1e ze%F<5#uI=esSkK?)!ojC!twthB`lGJ@QJ6xXKatTJvMMQCwzyz1AF+Y?On)`8T>YX z;69U#cQVJH#(p_zNw#E6%U!UUcoU;PxkqBaMIuV5$b=SByxIyTPwfNRjXHI^uNqI4Vrc<_Rm$HPr$yT$le7( zk@kno=T|1RI%-Q(|EerTIbU*7y#WiMa|U!P7wW)hlrTp?_|;_n>C|L>5iqFx@vSbr ztfpGuDjI9`?k4U@i|fV~L6=*Jg3&ePDE{}1DvkjelFdE-0{avnTyZaI5lD}v0BW?s zu!*6H@pS1+@ll8_{ON65La5Z>FDc*UFiLtt!Kt`VGz#~WbBw*ZFSLj`OcaFFsu}ed zrCo7gNcCyEh4Q!0dQ1roraRv73@8vmJ0!{$rLsQhkc>r1lxhQTL04he^Cj@wh_DNQ zi|)Ny*Y}6gh{GlF>YNUfyFcWU57pY0>%Wcdc3&T<@M1U8)_Wao#6|S;X6k;ddhlr@ zaC{*tC+6CZk2z4MxR~kt4uZ^DK^eIL2r%JIn5x>Rpl#6F#ULxbvu~}tF^jUY*h_8b z)NDPVPa&2~FSuR<%)?hefVp;i4KU01aQ7O0m9GKjlzpFP-0#P~0t^mYN*5hk10cX4 zz6O{G8$d1IuK=ulhCigBQ}15^hV^HFIkD}-98Wt^-|tXlWPScQyuDT<^Q;2^428c9 zF#l9!1q_}x01R>e2l`>gL4q<1kDvre84Dv{JTvtWRRf?OTubFdd}u4a8~)%MIS4h* zM&V+JfWX3aIo`lk^RT_&aQf!@yfH|5#XKj#3ckUv|Eo6o4a68z5~Tyb>2>!rMOu#~ zA*5;uWm4W_kJ@)+2APFvTw?(J2vTwO+Ozz0V=l9RWy}dzm z5OK(xJ+{hS0_iys#HS}v5SObL(5I5NeuFL2C-4`_w>xv@PKv`w-^MjAi3{QwGpUhE z6X-zN7a^Gy0mKw^jc5%->>_q&5Les^>%<93J z4G&HWor~AmZv86=9{hRe#LFohV)M(CO8n}2yvu>QfW5xKk7`Iw^d!+U12Yl*oUPKE zw6^Caof#nOo_i#=1dgW|!H^#;*U4JjQ^VbGpB_n%=ie+=oHzEBf#|R;aLU$q`0^&5 zOLEssoLY>z^*HF}DRc#VP{7veLp44-{K^uot}@^p^!etB3De_4^;Bm+=C>*oc1pcf z36&mhEzy=p54C>SvBtqmQV-VKb!rUF4nSrL4$(_#%l?0-AOAteU(k=$SNah&o?oJ^ ze>we=en16*%0)H8mV%;+1(PdD96a@@1Ly~i)m$8aq!thT6l?mNjVR+(y5n7(jmJE% zkB%zW`MiM_`V+vC?Hc@OEV&v(9)1&RDwWDd0AkH~3z;QcLN)Qq5kSqGq9ZDa`AWVe zR+9xv$cd=2`|MU_&0B`CX~Z{~!-kj|$&)HwR}?vuIW9@dHN_ZffEpsm628znHUp6K zG9$>1!0rN*TKQ9ikk=gVkr~i+h_@yl*gp+)UeRvACoBw%z)T-7PZrM8d@YfezvD5c zUxt)e%r-5&ql?oWmjKl}wCBz_XNBIGDJITb1kevD1)KpFN}CQZ<%ownQEjy7OX{KTW@B+u~i<%Df+RThDT)^c@!ED0tA2h`+*g>Q~@=~77> zg6f(Gq(`=Qxjr{#i_T~x&YPffq5iW3clJ^-}_(QBLq z51`h3{DWGv*!Z<69gy?_BFszlQVkP8t*LuWdZVF!qaS6j^uwZY6xGEQKtDJ;u-+P6 z{-hs)69wG=Oh5i&4DT;Rkzb{}D1~L2Wqt%6WPjLd59s;#bbf%|qi(!ds1o7NJFF5^ z1-o7b^#>w-(dkY*HtzN(@&}Q2JfTlo9k-D9%|gVs$eJZ zn6rgGWGq?8IY~e@guj^eX$~>1=T;5r#7T*`T(9GSzBSFKTZl*+2u16b6SA)z$b=(3+12)l66kpkBZqYwyTRs%7eP#JE=;|WPiJrsBy{zG4hT0kOIs!bkK2f_|d^aCUtq{Ko>;W z+h?!LSE|xA!{F5S2};w#=@c)~3NWG%sj}w`>e%Q?Of`NhYfLS|(!8wD;ID^rOfK^=0AZ3lj z&*b)Ei+~}*N@tb#ei3>~?`?H_+KA5`X?3*7{v>-bdO8$QGRq?BFE8xNK39_aThu3j=o5((37`dt8O@g2rHj1=D#jBi3BXd+-} zU@8a^ez0PU3{@aMz2hx_gv0`VdmG^S-*rHOzp(DVhLdW`a#;iV$h<&;Nj!l;p@?a9 z+15bhM1#k`+OB_r+MI4k)p3er%?YSlnvah@zLMwTK8m+X0s^t&o@-Gh}2;TCRq;`QWq- zak%bWcoFzkB7scmU7ER1g{2CY^tXpDEf4RPIXpcu@_(=193I8_-?rULx9Kv353u^UB7L;LpDYzJn~3c{drI@8=GlM zfMcKrK;id;`u_q08xz20m_PK}X^$~L0nX{|1RsMjiy5`$73h*7ye^q3s#qLyxtml<+ zP@8gIgo{3HuVIsECOu^iD~;K#zOIkRq?Q@;UlfTn2hS;egs#@R@2BjrAkz4Jm{sl` zdYOO;!k8km6ePqLvXB6hQ0Px5h!N+NrULPoqk$m74R^+*CC1O&^HMJ@Sn5L{5lf0^-&g z^zK?bx!JVT-(Qn?049k5t0Lc+BOtw(0{R#y+aI)_;`I~A$T34gucnUvVybd^*e{b= zi2lM<8$%;O8!KBqdp$ri({GJTLCVsAA@lFNPYmM;^p*%e7=eN=YrIFoEU7a$mCqKg zGSk@2`;5y2rw0{4kU)z3X}iBLB*-ep`f8xdNmhNJ&wyqw$h~>OL96i^ywQGB79opE z+%!-L-Hq?W>-4hy#w)Ao?#Jn=&l_79)%T{|k^qrB%i`ji0s{z z!Wk&Wn763=3S50nQDyJlD&=OozRc{`DJ0#m4|k> zDf}ZjhB=r%h<`5Ni4nc;9wc%28fh|e^!~AXB|gbHC)0LL*rqcIJ^f=*_zpC-00{CxFy^8bG)Q-)jrs8xNBFL4C%I(Ng%%k#^-NKskiwS z${xr|O%MW@Xw)~6<);jb>K#7qt$48qH6!mn*@xfNvRDtt)jqb|^b-e0s}MUe=Lw7Q z5n_%Vif#Hw%Q!+}-@m{ey26n;_D&RR6B2UjeB6SSGE13b2vElXY0TedBm`c45eM@t zTy4-d!DT6AokCAev@GdS_Vcow5v~NHh^Yn?>dSBmFps-K5BH9naxL6+hP3LTIGCg> zL$bGL{gg?mu;eq6`ESq7oX6|jPAT~Ug==CjT)T(kBtCC83xkzg2s0`2)8YA%LU4Cw z5rPl&_l$p_T56n&+TbK;TR%#;V zWV5E-c#@#a%QIZ2ALD}8p`~wCy_T_-eK4OFv~OoeS?gLb5y-(oRg~%Q5sZAlsC%fC zMOn}@=WWtng>JF|Ynm=F*9NYeih;7$`xr1BCHo0ri@q5*K;%bqhsXQ@+8aWl{)#hMc!UZEs3k?{CfhRs8cN#+B_B=D6dAnFj1gW4Ivu$f~?& zAW^N7u}@Z9Tk9g|dGr(%LUnj|$??cF!F?kYH31A5K0fVUB%9xX8E4HwG6GcQ1>R3I|;cVm@Ea!`aa6+C@2LG_-tr>Eaq!SVkN<- z)&6HEj-9Auz8TTQrM4Qp8d0{v8%?3M(Ivj~FIgKp=q_L>ib)vG-$T#G>pb`0ZLMWs zEe@Lu0^ylJia^`Uc}`F&qZN~g6rDOUlThKDr8trNVDc{uUs!l9vv85mntVtPY2PTS z>6k)g=oqG1rr>e2ZWz&=>FqyVaOHu2%{r|;&QmhJKd2=>^&%#QoB@BWMH z0)O5={@46$48YGirdIN22>(RSyh4jvh(J_rz0Kt9OEryUD2YJ$gcj;@v&G=^lj8&! zJIJ;9sHzEBWcg6ZOJn3Z2k?FA$M`6ySegRk1l~z=h!J2Bfe?WpBQSxi_78Lqbar<_ z=`&OTiIajk|Mb*~_qksq0e-mo7f=0X!~P;D{W|6WaDN2KUk;F<7MuAPPvkmVIc!?!}e#*rN*l0wOnS)R5ZuT547WJcvu5Wm(_jhvf^c zuix_CUZwNmM6V5$Ief>ml7G{JD0rqi_PgesJ8ppQBV7%xwsC`FkQ81NG+t*2V4gCV;?hP}qE zM&peV`{CwVm;}>nxdkP_If#&#LawXD7Ty1l%JZSAK^0UxXkeVLJcU^uK<~BQ2g*sJuM6={eRy)=E&NdFn*=a4qX$^Bx8U zM?)L*>bT7}Cxn-O2$9u2P#~|L-RufQa40>F3m<2ax5xt={b!dJ@&JVh6oALJ{K94b z46MKSV*Ycg|60!GB-b_spt9*d=)M<;^!B~CtUJf;d@ciq0(xL-2!sxayF|Ie9qk4` z%jtbm0L6+}^~*?I)yt}U0O`cE3ls>{3q;h*j#_kMWu5keyfjj{*FwGT6aCtdpvuyu zehk@@F37`yOggNr@U2Ycqi%-85r-wjc@g<8zgpvOy@ODH}03 z{hs@>x?p;I1a8MpG~$Vhm|*z6owV&|K4hF`&R0C2XTkFU+k(?#E`%&Pr*}3i*!+>vlx6vMcw(?Y8Vh)(ju zOE7whUJo%U86FJEp=K*`;xbi%QxU4O*kZv-o5AT*f zAbCj4D0R2yO>(AMOL=d(Lesd$0~Pn|hw=8<)^1IHA=w#Prm&fNKe6bziJL_GK!0p( ze8EU{E=TTCra5pmgEkpmQSv%mQH+DCz~0=v$9N7AtB{B91G;?MOYprxcTU^P#HyQt za!|Bzf0}u-j_M2l;oEIgm!?D)bQKQN4aji{sv}bcl(1ve;oPHzrUc-UY-G~(uXXuETs1ap!6nD*fIAwG+Y@p?n^e>mn3S4R&O4NHeE!p%_K0G~z(73c{ z+!`Y)k_GyUSXk^i6RFUK7{Nhf#GfUqS{7O6GYr*+WePqOCEFR2>?d+Js1<*64d-3L zpFL_ke+g19ix>r7R6gPUzUQ^>yi}mzT}QFOl!b8iGEC1@(6~k0f*Vjq`i{3Dc35?P zS7KG#4zg_=B#hKWLWa%pBumrY-v0o71SIDsaX8nkU3-paGyn(sxjPjd8&h&1HMSzf zx+x$(d7t`YAe*#d#H{@o0bzAL8~QNL`vD<7Fh_2yE${`KE$1UL&?B-j-eqNA# zOy?|85G|MatM;Ocw@qOmHjI!vdfy^f>UQ>)vD<8^GCpE<dc=9 zled*@(;(Yymv>jlno^}@`)^b$c*SW-8R1-)w0dxwDoT$v%J#X7lM`ck^JtCihY=VScRkqaNiZ+%FJpbtrB(UMWW9968NdT}0z0@M=@q>;7JU zr(NC-)2pPVAShJAQ2si;clkTmB=&IpjSPZmshV9t>^H5qMriBbl%XCPHW=$k$US`7 zdJMP?r`-E^cWJ>++ETqOeP`HQ_vV6Kb2QEX1!*&E*!d{ZMN4bRRzDie@oO{!$g#If zS#TS7G|30hv3ufbc4!*thO|7IA3JDFnlPp#l2Af~`%E+!ybTMY9S9bE z*<*kv&K=t3I>0uC{3b}m@LGLEoCzwcM?0q}u>&mE-?Ib`<1)w@dEPYRaP@}=-&oO# z6+c|1psHAz_*4Xy7C$`MF_fyF6kH`yPL=cVI_wyi8L(PxCGFiB;i;${^o65&7h5yi z8@MRU6)xZL>GZJGTVNXkI1^czu-5K6Ku;o+lzSF~| zDGH>-j=RTjR9I2UW0dJA89YpGp)Ft zTE>~)kJ8;i5_0c9vJf$`Gi&u+!=>+N(}7xxAn5_fut!3OSDDoncd&=)DV5NyEK&wY?o@#Pu3B%+2QBL zkTtj2II?AIhbx24J5Fwo&VWj`t^;>M`L0oIsO6C#tetMk;%Pn*{@H*{_FeKh+fkG6 zGW9m)^^EPXpAaKKb7f9XxOH}U&NySa8mz~QfBR%$Qt{>-^eB|cmih4~6JabF?ye0# zn+0|qQMNV1_%>nmR%w^Eo|!wGo;wfD4fvyXrwTVQ1DmpH-6Vy(9*<0bM)Pfu=8nFG z+Ys(^)f3O1@rtce?>A%F0i3Ii@cj!eYkKyD410c42AtG1qm?PRYtJqVEfRac@qaM}J$S zj9s)casz1ou7>@)GTCcL{nL0sIs1QHDCrgRdf6L6_+@6vbQQuKSQTmtyR!{n4AtFV zEo4d|A--^`rs?bru7s4TKQua%=k4jZiOy+1GQWRnr;sis0B1e3xVj?>{Krm`9qj)u<-aLrEj!`fz!<`wB2*6{=~3z(V%5`(32LVMw1a^)Oyzmnc^t#H0KEmPiz7~vic`n5A00yoBp8s7b{EGt1 zZ+o9?tbZvMM!yyd0TTQk^M^eWyov8i&Wl5^CF-fj#h7CNe;^lQ-W<@CC92hW12hBt03-~ z7;#{pE}XQmCW6SS-DMl~WY{bGD0vKms5xDpE|7O3rhcL1+Gbw?=O#jk*U9syD+ol{ z-h4mj0et?GH-Wu}TF3;LI`oUVeHQsHX+y#?;$8@?g-AP7`h;~Fk5rqj06jHgHUmp2nVseVKt{a{OA zoS+7zwGWgA{zh_!xsH7+W|PL`8?P76K*8jdO~0)*ysyxU?8)6;bIPd2?tN4lFPrafAZP zUg~N=$u!*NVuGzU5)X%(&X96QHoG6G<MEs`peZWMYLXT9t7VN~4qY=z0)7Su{)a z3=Am*_8Dgdj)9#K#2f6|BOAQ;AYxOhp3+a89V$5a;=p3ieaHD@r+-*=*p9UWwO9%t z#T8Y4>y-8*geJMeh;C(XeRmwC`4K|B{D%dcBibWeOpYC1QMic_2e*b>ozBglvzN1F z-+q$>uvl3@fA8-A4A1ubCno#fdpv$mi2-5-t23B0K)3)%7Jt+ux?*R-kvbj|XEx$z zfZJZh3lXq`-*t%@fL7sU2#_Oy@rCa>!rTt-f7d54`TwI&qymAy!%*`jMh2n!nfpqC zDGoUS5S8$^sQQbdQdn#(mHr+*buM8NC-g3IqeRw+A$SFHO}oF5f?M=d$W zEDaM`Qk)+hGhKBt5^>(gB(>y$0ertgNZRoM{5J|YSqUj0D^9Z#lRjy658y|Bg<=%} z69FT|HwNR3i3^JJ3-Uwl)z<}ymx4L^X;d@r6ml5Apr-%-M*T7k`*)-M=UZu?XdQXv zezoymuO#e`Ru=PWWyT4-$$!sB#z3dN{_mm$l60M-v5vkxi5SPfOA}1KZ-_vkV-59n z-~Ke=qOvo=<-gv`pVfiCkVyY#ZmdmfJaG(e2lt5TJ zBFV(`(QXh|ay!LPe6${uwa2?2?hiNMz7T?b{P-yE5d6~*19qj@0uS_?XlA4b6;ieO z>SjqlAc~CHE2xy^?__W?5k!`iNxS7q&X4fc5Sdsm=C@kYvYH1#Tn_Dhk%Pq=j2`OH z>Av-F&O%9_3mhCbwzz@}j4rEq$lFHbzIs#ST^1dYoc99u>fg)vzAKgij^O(*Z}HDZ z@E6cjF>^3;e7z9-TTSAZxA@zKRo}a_GvkjW0%ivL2UNa(LQhpATO;w0gchUpfBOD- ztEBW5WJ+~Z^wkN80zg?a@ZA6+VJy^73DN5%zkFr~={H=0A?O62+WOAi$QKU+e+0jQGV}U<3a9r;z>Ao_{L=Uh(3xfI#KDzTras_$>A)d;_<9wJr5o`G}=aN$7Dv}lWno9;pz zQ40Cw;AnPL!~)#$)783>hiYR>z?C&=^n}pChnfmjM5jWdQN%Tgw){xiDJvcnx9wOI zIZH*o9rE)a9gyw%iH;L#^1A9aq{C!ygE5o1sBcDab@NvYdFQp@6qgPw9PqMWou|$U zys#WM^xr}4u9i%EBbQc(*XZ#%;w@E(#<5`RzI#$e1*`uAC++-Y#n3a>F2zZk@QdTE&zYO z{fk2V=j9oHK{)>P0u`NXZEfuTHOnArb{Vib;~n^!4TmzqTLHPTU3_43BFapD6hx5> z4UEp{ZT4uhmPDf|;zBGiykRPn*4ME!{d5OYtVh=9HuejTHy>Az2z;KO?_u9yxUPX5 zSAFuYL*bU};`FOv*<*}GKZcHQ1I9_y2}Ale%=mGyTfz_Q!MUp|-mhG>Hlr1%>YEOV z^O>Lu34PKJ|1VC4S#tBaWZt^F>PdEV3(#Kc(6^L+W81}nowwbK-=at18_x7uyjx;i zKt*Z^fX&21G5b>YMRL?qO;bDfC_@>0)>xJhlk_b#ca@|U@6ndvw$~41XA*_{JM)Ds znL?(s;Ueo?WpqVK+a)s^%cL{nME0dbX5*q1!t9)-e&C1`LySoFwoGh}xTswnq-8HU z?3_6v-E`Fj^ts^7@~Noyoz$0l-m9??)){5v#TD)kHGQ>h{S+*isU!^q9D!upyytuX z1Y4|W={bCNDGWI>I8E&sF^RoUn;|k?7)3D)HMWS_++XrRlS8>xp?t$VwDU_VIH*pX zO4$fahg}&r#J0PuNJW(aJ*cg8BAxrlpD5nI8 zB@_keZyCPHxu}8$xyyWQ%2FpHiTvZ4=wQO(9uTD92`!F$1HAPfImpdtK{PiGz)$jX z_LdEnZFJa^glMp3Wu45mn|R=4V9(ycXOXb0P;(?%d7-TIvT4z)KWY`{FsPCzOpG(9;5r8hBbVG_wqKq@U%n}&fX zR2{jxl4K9mu19F6uD2E6`cr6(hQ0to1nE{nvKmq^4f46V;7Tx;|3FG8okllOuQu|z zvLrS1R%RHvY1o6mt1h90hQ2TYymYT$uq$Yc!IpTs&;3u4yAu=o#}?r!!IY(l{fHjn9}XA9nx*3-UXM~yYw{*Yik5wnl>}CqNbKB6QKME z#2Xn@t@A>k?5IBg0U_IHE5+#v1T5xC0@Tnc^-Y}OkV-xrd}N%LwE@(dZ34e&9E79M zF3(UYvUiX8yu&JT*t8OQNBvzWNhU3Ki@m_bl9g3{o>LVjuV3>Z(nW{K+27 z_PQ(Ep%e+PsQKBq8|kNb(oMbCazckQfm9+3L`a zkqhdR>X%A?_^B*gl%1Zzs>pGQ;mG$lY=*i@4d@LxZIs=0!*7JxOAXk$NRPp(7_&Ei zaDHi7T&8|}?dgAm-5CLcZM5;OD}5LeZD-hnx}AWXa>jGbnbVa&1+Z!0ByqQ((PAp@ z&J?oC(rqI?^UQN@ywd?RLc`9|FIz86g_{xr?=DS}W&Nv!WYe-8vL2gb3Vfi%gG2n4 zV3l^279E7>NrCZtkstla{*Nt;c`VliouomDA43Ky@ICqH-NoevNgscB-Ff(ykOgD5 zKZV%N4sU-Zj@V(6q6?&{)5t8%2zG;Af2-um^Sy~(XXtx@tbq~e!vV+AL135=6eIL! zxx1`f5l#hnamjw3pbgh`IcFs3xY$I=BeW;9*yEg!=5DR^lV4I zOS9&&r7DreLO3qsg0Z;%AA`Op0h6CLf{{oZdQ&Bi6e+PXf0*4P^KOt#3Dxd)IFExt zvL#D5S#c5XpsOkV(!SC4ZLv?q!wlJ8#^L{Mw)BnzwP&f;6xF5|nYu?>J( zV(!4L)D0vH)Nf`Aob-SM9CZo?aQpXzx#`FG3p?wL~`Mh2cXCFZc!63M=+3*ds*Bv0ChB z3G8y7HD&KGBDSigd3aVoxcE%h(0$(G_IQi_JjGYM2KH&G)1~7u=(H+yHAz%OqL!UbYFiSUR$4SxWLWvm9s(k??;QK~nd3Gt(1NVOs=cB=|4?K-aIY|TS0PbgO?WuW3ceV3Uvo50k7T!z=2Uo62Y+c{ zHO&nL_shfYN;qg~Hj{%(w3F>`f%w_)3~KzD_@aW~xn70+W1zCf4{`c4nlMycsiQ$& zM|e{wW%q5$u}bnKD*a9y(#&jl0SYT}r5)Cfne{GP8s{Q2sWhw8ou$h$CHzo>Jz-Ov ztZ9$^NiCV%UNJ7nIt#r|*?;ACys81K3Gp52;NEX?VG6vHC4bG8>F@j?(GVY?%u-Vz z%gmP!iT?GRuTXnmlL*d#r9(x*J_S}FbMGjh=b=5pd7KpaTl)`E4O3?4hDcr+0!bdg z>Im>wMcsBb+5D0|^kq3GcNc=XB6c7Bp}6%? zZx11wq=%aAnek5$+#?BcP^0-tmQuE-JO5yU;bZeRK(c)FALef)~KfPXJ*`caw3Fqp;9TZL~8-f zVjsT=$^tgL`N?-_cT{p5(5#Fin}D!ib3?fUiXW#?TDX95`czNp@sN4-?dV&_ z^Y7PBlMr^Lc_=Y^pvJ@~dDSij3r?_pc`Li`I!=CT!EW`&_WWl=9NWZx9t3=h3a?t6 zYF!VKHd6C71~wY0szK;MrtB0FEmTI$^Sbfn&!#cw+W}a)!SWP3^%1Xe?3-rM0R7^f zR@DZR3%m8V<8^d-uI9A;e1`K=Da)K9Gmui&30(YL?%{{0=oI>e%3|Y}?9vSI+3WhU z8O4_K^5OekXeY=#j20=F*qYQC2l;q z%az5Yfb4yj#RON+(`*Iw60L->dn(nsDhiQ&N(_;1I$zh4V2g3UGX8eeH99dm!8c+< zaf)LsA+14F{D>cOH)zu;yvuPSI>TV`aHu}!F{qA(UYcORM&twRN|Gr)4?*L&lEc3w zm1eeoHK)Ykjnk+}OeJJh0Q2_A)l@s@Zg9Y{0Y<4WALPd%uuUY$a+u>x8+^j))*_y} zz4Y2eO=F`;OllrF331A<0YW8_4`5hBQ40d%3CEqtXW7z=ricBh=d;>e_1Tj_-{C|u z{EUk1wp6^{TU&@K&D=C^^B0G7LivuOyN12f*_*{bMWHXl(*V2rzSKn8?YHjal zLzn>tehr~uRqj~6j#!lAb_AGIQWUTt$|G_mh_m0dbdlw0Llj<^T0%y?zPQF9ZH897 zVm++}6CfxpolM_E`*MJU8$r$I$LeC*Q|D$48EfTDRNUhe%cBL{sx_DU$n&SArDlEW z(Yt|K6L&`xft-1?H))YAiv#CZaA*r)5UQ5}cY@AOgYGeG4L(Dgv?Cqic>kNc(=t10 z)PG_X$-k|Gf2uYA3#&wIZ9c`C|15(jl~uLR!$O;w03{J4h8+pykVdrA$RC-43XKb2 z2a4pkf~BE@!RB#|oV)&oK8HwtXf4-7?2f5n-(g4Z)2MCm}=N(t8l+QP3XPjRG zfW-yqC*p8=3g01)oEvxigCm%==8y-C;nkf6#zHHiu=?29;m%s4E8Us%gK=?eELw|p zIYjzHFV=1;M7q*4jYA{d9R2gSO*=>k>CgiO`e6~o)*P}2votQ(Ep(y95B#+aj>p}+ znHxsbgEG<(wWQawGqCTpBF4kUIHdK)T(N>Dw9P;y>u4I<#D4a%`ZZ?BOfigF)#KT< zYEJOd(7{Nf_?aZl!dlQs2ILTXH%_!w3QhP}gKC9=gLlr4rPg!)0&Erz07zY!^ ze*ylJoWe@=_MyueUj-XtZ8mQ=+D|dkywy?<4;8}QK0MF#`^t7E^R0dd5nM4kOZsRa z;}#ePwVYj=9oT2!isu=*gibA)mWI;shT(Cg7b@r@bJ?z+U&sh{s<2K!DfwQVA0^O2 z4~G@5>*E}a#jg8t!E3Qa&ur}sUqh*WJFGT=5*ttf2<)YTX|qNYNlD}FX=&B4ZhPT1 za2dp)2}rB7R@Zb+l+oEK@+|dR=prk#X+2@GbaAhuNm4!E;I~vWefN3fxIQ%AonkJu z+`Qj0iIS|rTdnDem-23zAq+1U?5=Q6FJm>2oM#YWE#OXH`|>Ii!Q(Wyf&_7QoIgti zIuk|8#)>z{EL>(3F>-3oAGalnFLF;B>GZ*K+D%m79CRGf91L%^-6EMGd=2L`5$~Tu z?3OR1K&)P|e_w0ojKY_gmg^iyqKKzNC@=QtF&07fM>Di*r6;d!fx;>Ht%m{!o1ZAV zIH`B$13YAT_Wo`DD(A$Rt;RaygiLq`{SOe<`uT&)s$BXRC?kU^UOfPe0 zzlQrM73o*h(c09q*oKe486sQ#AS2i(z##nFOGecH^APx1SWf!pHje*VTK|bK&62pn zhX$&hih^wPK|mqJaH<8h*&ldzC8Iy4|2y!?@6jWZ#&>(J&2BPE??^Tj}@Yuw2QZS}FBG9?5xojKDsP zS`pO9=E(CT1guc=$<}VHa9_#m`j95L&M5l1C+jCY-8?3pQhqm)n7gwN&qUC+Ti$%M zvm9Fk$b*q5?O{)ob=a+)3#@Rn4_7RP>i9P6rQ6y`WQU>iMwrUpoU;j8D|7(sbF}S% zhsykN4RXe;QtI$_Z3WDwW|@A{FSDgtCdZbbLSXHhxxn^}UaUf^MJ87uo)Kck=aHi& zzA>Vj#@oi(%-F-<;i@xy!+hwwnfqw6Sw~cfysk_1*ZxhCM4eS0L&dg;EABzWOBm^u zV2(J3qmJ|)g2k~hLe%u!#>-5O7+0c|Z5#U=%Ho{vq7x%P{}L7xW=ay$ee8OcYC~WB zoxndahQaO&R2coSijZn3_RF5S%~}m;kNjNrG|q18ja_qGrlVoNDQ4Z!)RY^P8c{PA z9a2WauWrG+AE`(dT8^WoU{%O0qVkU^IJ)&NvOd8_k{B{dgNe`0tPArjTyQLIY~|B- zijtYL$*FT|$llfv>xJs9Ibc~foED$%8}a3i3}+`?I*-jt2CK}^Bj))f#=>PP;}NzE zZy-$>TM9O6nqvmBTd`Ef*tw<@g0!;8qdG6j=EjY|@gaJ;X7hgh@%}XncG-nm-+Zwc zW~3Ge$aw~{T%qU$Em@o+5lCJG-&J<7{16KL-&x#!caViWwuveq!b6}w%$P*Iro|+F zh~ri8D|ZH~neKIXYdx$cwE9;ZxJ5k(%|V4;`_)j^Nhc#c$`?l?jm9`|qvM?+5(vJ8 zj_~sch^&NkE)Tp%+riOH22b-V_UGDurv4a)x=d`t??br3piM&A#M@%#ZRF#}h}|fn zcK^K;^xF&VIQoR8p??cY|GWeC-(bnv=3h`L=<^O3sv;6!O0$(lvj5;7r?%o*^PJ6} zgS?>>66m^FEE!Y-nGJ@N_DKiz7FWsNh)=klca%G*Bw>W|6z^2~8`gPf5}s*ot}d5p ztfnR(Z+{-}1;M3xitVgXc&cd~MMC`igEP#3@F-DPP@PEZCkGF*jp5MXSi!3X--Kje zACLwIs#>v-o%KSPrrH4g1)`b(yq>#_p5aEgerHdzl=ll>NHSxbIw|^j$br@!`}eK2 zoTR%_j7Tngp@CZ18y1Pu(_X>kXA%y4Nb!$GRkQZZ_}}8QZ82uAzo-XKX7o3`Q!L@~4B4#y={YlH_xwO%%{fYlCBhukgRtx>8gdZH?u$UDQW z@D@90udD_0+Mci)+PRm7%ZM3ws2K&#yDu?o`BxEc6B7cNVJCbc-*=CO!O7Bb&WTAP zHt@-x8=pEGmJiO^xHT{K(vJk|S*`XhNP??nnpKXH&detF(@@9nko6QI@{N`^YJl-U zit0HzdB606DEU}Q{n6~a4B6~B`6QR#pELS!8uk13*U%=TIDf!0#iDup@un1$-6x>w zg!sE#Lzv5dW2X%c5TF=7g&$1uE1j+0XqyQj=(F0tIKE6SK~-Y+XLyBv?c~WC4r(XV$&7I8t2NY01dPlHM;0PQWEC&{ZN&#SQ{PWQiORMsWxG?Mv=o7L2MggWb z)NRi@bhn*+)|bl|hmC|K5^KDyiSyO->_0!d$OXK;pCR<%YRE+6&Ih2Bv?8U9l*yfT zlS9|_H{ytPssru+ilRnE{=5szKp|ErCKCo6Ad*Q-K9OSuOB`SkVKS^afit}=F2XF& zsAz8}t@=z>%V?1XxM?`byl*iKjYcKj)0U%#)q*vXxU#x6Wb2Dr| zYYS$UB@R?FNmY0c9bHM5UY>u3uPQE6U8bvWYuGDBbr#WRfOFP&7GZ1yBT7DP!G7^1 z3KevO8!PKTj}#iaOuVPhhJ5aKm!(x_PbsIOy5QwcMy>Z(V}+k=%2LLjT657@21W@F zI-B4Ha88!^UKjsLUgGoVnX`an)-}6DnJ|ycKTAy(s*Vj2B1gX{SDtgE$Puq>+BD=< z`U?qU#(|NPEGA5}pGZLci3A3JBY~@4u*rheClbi@6s!kUlI=ym|Fqz7C%?2=w?B1u zR&LoC!z%d%gCU`uh}47|5Js^B{0s7)_WZd=jXRLj(mfzhpH^lX;xT7A4GLOA+{c zQ51oCk%3Qh#Wau|zJL$dMax-GGR)8ubc*SH}igexwjth@cbhL)rUrle*{J2!Xo%Vn1sr{~6q@e1JX|V1$gcYq?Ejkitt$ zkRyXntc11ez{0gg$m@ImHO|Y)+rJjkttLpDG?U#TYPT+CnfVy|er3N^9Otf)SgS7_zD_Wr2){X%*_%BedGxpoZD z(fOmu@R%kk%+deom%)NzPaE74i<(J}J^mw1AKe!A6kq5NyosW8UD!xl;YzBN)DQ_5 zWh>$OXJ7}MHm8$_s|j|Wg+&%Ii>ZxcFi?*3slKCou!`NfLNxO|Q)5QzEWIe=3Ws&? z{FFn4#uPAkpRKkl?mo;86K#WIu46xU7Xlbv#QUjWXd)S;AO**2kua5M&PA3zd0`#` zSaZHt;wf2|<2YoMN>`MrvAVeN7x|*pn__|mhnX&Bo zZ861UzD#c5M^PnrhuiR6RKCP)SoAb$Tq$MW%(Bt`6iuBdRkJ2T21XFe#);6D04cLL ze>6MvN_t4z)b_nEj$)iys=uvsVH{^sa*Hty(;y*7qe!qQ>Uq6ODJJ`HqiFeUu_gMG zKSOz@8RI_t*P0y?2FWME-jEfQYvfQ?Kgr-()RFc+yv5F43X%G35B8+SC%+2K4Y_m( z`S{06eoj2UF7muwJzTB6XnztF@Q#_X+6&3#T1q+}y1YU?!e9_oV`xYix)l_tiNQR7 zc?HF5>PzY;xE$Kn7)CVSo)nm$eamp_@87y$e)hJ&?SC{ZYx4fC5KKCmfETf~)K!FC zf8o27Js_zPldBAD$KryAZfZCgzv|zV=65sm={d}WjX8sqIjrXMA9HJptEU#evLn{)@ZQ0M333EQ1Aya zsf)?C$l?u-pwDxjI1C!jQgnf?@>b`#^(h0dzWB7pTk9Z4;(uYy&-N#=V2tFXU|a#N z+b?l0<}DbMYkyD0xpvpjSvRhlIoG$8Zp@BoUlp<_I5h|KX-$9rgHFJ&mgK!mvqD|A-_n?PnpHY@q)dkg(8WY zU)-ivNX(T#fq*##xdc-(iz^Ach4l0_QkIlM&F*}JJ{_pEhTB2KAaTFI&qlphhs3^{ z?L4^Owh$ZQAJy&dQhG(={LHQ1qn|#YQoIk9UTc{$k&w?%ctssP*16Sw z`Z~vW%uN#A$@`3Huq~4IhFT|cKsk~yACqfDGA|NGGZh#c7O!GkY)Qql;2a4=Hx;=) z`APF~b}xv21SVS_Ml%&+mlzh_8k|4ex)U^X%!stPem^{bXpdnJ;2hP6>f00+=mH72 z2Z@{kWs2sLf8iOOo)hzdHI^FqDycDGe?0zM$sq*xNT{KBYzU3zrmpHd2Q61o7d6lVfOECWT$-kIRU(s__XamV;qKl?BQo;ZKb z1C!AIeZ%#yGr>RQjsG>*{xuWGeA=e1{;Qk)WAmP+qOJUwmy$ylH#w+yrZF%)yqPUF z(9ALdd>|PHBv^qcztNjsA6hyEUX~+mNxHijlSk(`$Zj{NAfTWCl`&Awgy(lL=GH6Y z8~mvw2Q;B^mLlT=-%;lg-_Nt#?-j81N z&O$w~0)yxJ$U34SbgEROU+DTu2Bu1W-=BCTU|Gp0RPAj56DEOaNpW#E<&oUbenR~$ z=fu!kW}GQMX`jWk`{EMyPfq4e{dGpnU@7?M%RJRsj~e}nm)J|DbvVLN+?Ah&8QStU z=c*2rM#t8~x1>&6&I=vI39H&nq%AF<{rQOUh)dQN`Jh2(7sAz+;)_iVrImH12UTC zz)TmVrJy=U;&SP*mkhFm)bH)!)oUFzv~t8$95{6A&-<*Qh3v}<4^zK0XZ1t|eA7F! zJ;q>sJoqWIcz|7J*jWKfw97|S@GNY>soqoRXK4>gg8eq+_Fb%)INgFNqDjXUR^8;T zNLY=KU9`_-x%eU6kY>$3eiFzQ6!M#iht!YuU-NhO4HpHDWpxM((p0-VXttK_uWevr#-151;2Ko z2OINu`*E7B$b7w8<^<-wjBFY_#?_RD1Q&)gz0ZvUccz==W@E z2?6^(AxP^Ud%1mkKogEH<#nNB=2|trcaQ7Fusz8GE$Q~08==Y$g0pY9&+<8SN0Hf{%OBrrZ}dlsJaM)i7ArvicD?>IiX zI31G|x1lz8{*Tu1h+|3&epZCy-v8j~T~XpXcAxz${NJuR|0(DDmwx7I?C{UwEJ;P% z5%sf=$u*2}tdlneg*E|{2HMRNszLlYLIustouPT0Q+K6WPMEDUT+V(Ky4(xXkM<5a8xFO(>>@Mz|dG*t+xPzZ(9$uJ!x}+t=7rKhL*ZY$~hA1E`zeh!MTp zNr5Tj$rK%dA){4)P0T-L2+j_ha#I&ZOTmvkqK%L*sEs_rb@&ZLoNp@`WVnkcK58m} zKF#yQHYicX!+sv|>Pa&9iZ3tk65QGkoKX&N8QslD`j{cNpdy6V=AhfA^OhyEP(8 z{-|+2f%B*EcFifKWBpvxeZ*!1Wpbf~xx;2v2YPdRyMgaxXR|~1^i`9s32cXenT-7& zndGLnsQpwn`^6!4El$N2dk9XeN`uKE*~)bwBrHe?VjMnjnS0W^2_#7&q?+STv(s3S zsP{TF$|}QiIhs^=m6Sc1^tr>4U*tl)T)Y0BGX5V{)a)qDRQB0gd)yq@Os}LUgRzwK z6B~jRYZn*S{lJ18ob*oL&G>SAu3crhXL42syv@k_LAx#N7f0sIPu*We$?-fNJ5s=mDq-`FdOS`JM(+X^o})FB%BgQ&gwIn$Dh^Wrrx^)gG1=bp*dY9 zpZ-8~Kt{LKp57}7a91t91X4`#PF78E>=YAyl{QZ6w z-cj8s`1$(m{%>EOdH?sf2U-2k$Ozy+7d&MD@uQfHv-N+-60%gJZBf$1Lv zkRhbHW+=Q7xeyW;fl;x^`j?>w3KAXr%blC2E)YoX+aJ0>TBs7B>=FANgO~}ze6q49;qE*3d&P$`Tpa(hCp!MT%Cx=g1pYa<{bG&>P3oVAv_wKLE1n+H54D%T z@OcBO5PPXs(_Op}JN}oW`2*NZP_QEWE896HRPvPCm@1_$jHsjIP>gu-DPVAdc$nFH zOat9jg-C@*lf`1VDhHdiev4bzInyeSVy11np8nCdCm6VXJ|Owkxl&8dg3NUFms1m) zArEC_8VMg?o5L1WHXELFwpWP>#$>#C$3z7%w)`+XT5$W@?}mFUn^j`&MLttius-GB zvmZ_N9RQS>hGuIXL$LxSX15kfbr%y>NAbx<)@}8RPRpc=NDW8U-^)f zA2Qa~xBA?TswdJ>ShKCa0S2ki4lZ6@m9iFmj&TUD%fx!3^N5JPPeEeGk^n6iG*!1A z4f!r0vfuN&1I~tW0(N{Ig04vt>P{lWDzJ-cvNUFmk#)eGmGrp4 zcUYFZgc#qrAF-;zwCEZ1bDFo{0VJ13M-M*!95VpVhqDn)04t}@~_ zZLwvVdu7-a4AmD;E*VQHJn0x89CIp5reL>0hO2kzH>(z>&efH>5Nm{`vcL1UHs1 z)AO^+rT=Y}Gyngq^8YC9BsE!OJXJJ4KHbgxMnPX_^Qd$)Hc+_898nVkHX((HFBD`0 zl5mpKGjLI|h$km$B*|(V$!Atd#`VgWbQ=TkV9Iq)`+Z3Qy)^0!PKQI~i8q~>$l}L| zN%_F5-(HW|j@x{Xd`~A=w%wpiVDe&&TN1*988p%Rf#F?PNjJ&iKs^F!13cS^U3_fR zzT4{X1S+TyNo-}BHRh}V4=(cHc@`5Dr`<@bsc?O@A#UueaVjYVO8Ds}wc*T{dNAug zdl}aS4h!}M3S#>O2fC}&K(lsRHDRkp9$TqnsvptZs=5qmm)HeH^K+`D$?zUacJw!! zY(t%55m*61<(i`m*cHVI+NIx&r^|UX92dtSItx@wtbqHIQM~=3M$%mIHem$`!?B+F zqh?sE?WU`%{;GGkUVgnCnNlw8jYi3QAR~u8n!>J7V9;Y%_I~eS{h7Qt1AL=WUMuF{guH&q96t&NJXq4k72a6 zvR6=21p5wU?V}lTT;udm3W64K8QT0KKW|-;tOIX{y>P@wW z-h9Q3+qTp}H-j=xfuSE5NtWa?9wt-?GC61ColqzbMCh3s`vdD=SkG%2@Rm5W5q?)#2&B z(XR0#Biv?Pfh!;B`cau~;Y7>do*7S}905Nd3T<0Mcc`OjO!aV>wfg6^%>7UikYKa~ z0!%Z$U>;*1W{z2rkPyFvH%|2MU~h_1Iv14sZeYT>ddDH&CC;GBhGFJbGHUU2|frc z7?AOke+T9q)W*jvkEN{C4Bv}NZHcn@`+b{Px>;$HH#WcMt+71b(RtG~6psn}{40t+ zzQc^sgky%-jANFXg(_^3fQ9ltaGKW}Q+sgA68Cs24nUT79G>G`Eo*D}YqM(HU@~%f zRwR5|g06=25S4^l39i-lr0&8!*^@p(fl3gP;np%*wR6Bidnm$lN2g#|@~6FHChc3< z4f87)2mijKQ&!C^y~+)GPG*gLP$$FX?7k`R2^{{-ui^=o@D;~P?w(iimHEqifnXJj z7WKgN6At+ZV1VeOC3N--tsdxSeM?GUiovMZ?c6y=;1N{!cuY!yc02Xt4V_2vi1>QC zJ)voME=sb7J+7XYKv(*`|jb zJ~ri(b6ozvat_tMQaJxT=kWdH9Q7zefuU8e_?_X;}ZRrmbnn&6UxkBXG zxNUcl_!kdYQFCJU{J~K%={@}z8-556_K|xU@70IVf}}|cVU>=9P?rGJdrHMKly+({ z1M8Q(TZ#9t-l8bT6LeG_GhF|0%{*4mC?NVL_he!Y!n=-dC*^r`<1eWq1yygTUOuj` zv*?^i(KMQd7War9`HHZ^pj*>!C3o+4SfjIPGn$o2)sdRL==XPZ)sde`LCzH8Odx3& zmm!a3H>1+TDOxUla|4Tplbjmy-q54ox9vk334WKGxmHDkJwSX~diZ1==)49dbrgE^ zS4)S@45_=~htb)zV%2kKR?Rr9F-B-4oI(bbM$gs`YY@SLQF;qtu5{>?f#6dUYuUBTqK$Hkcs zH79sBHySi4YpH%6Q$kQM>Twp9U&ueTDtnGcI{wLs>%^M+Cg#Hs+`!?a->~4m*;NU* z?)#DE`T=s3)w_C%`R!XFIR0<%j4e*bkN3##u;3c=HkVCJP2Ejp0y`uuWkr@^8caU{ zNYmPMVsobP4^@O0X`$mNvaFrSLuz30QI7DNkO^2qVVWoq@w>!D^w(&TY2_WP=y|Dc zAH#YS(}zKnSY=7sq~vzJBe>mpDpGtQ%>G4m$wu>wJ%}+r@F!1ppnd#pLem4s>?Mey|I1Y~S>2kcjk|8F|mP{)Z9le_7g#>svYg*SqF_s-Bg`KQH5=@g;EC$EV+mQOC@+Blb{} zn+%gcLFbDL*9(%UBEw>!vcjXb8P*P~4wPJ@2g$lg)E*Texn|B3!=u1XXSMM^Za7X) zd7&POvEHcLWlkiNBL7VqoWHzcTDx|G z+slM2L7r_K!WVabqa&IYM1fA2SI(aqb7Y{XjvaWqkL6EQdSFaNLf#MHQ~8Boz+};oAn0Y=A2h=&*Qy zFUKX%r;rcM(lq|vV4dyS+%$L*ROEntL$q_+h(t+!kimQkA!yEgKK62@^=RhLGu-6| zU6CYXx~M^kD$~L=uCQFuZNP}_TN$%{UqH27;c3f+bZU-6aNdF&o|Ee&xXgO6v%9%! ztj9fA1llMmfN^%TWP~cYS-yvVw%C`a>W~*(FImkLtOxHG^&HU;vP5ccStGIV@o&0{ zdQVWVu;Iho`dt93tlYP|#OmyRo!DSL8qc)(_JTR)s#WbFr7a6=^<&x{nhW}|A1dE5 zxz#%34UeZySBBeiS$i{=aNU-Z{+81F-2ihxKHVVppP$wL=Lq@N_wxVkld`h4{g*x; zr1IZIx{<&j5FMq`DA$F(rlS86=_<`ZhZReP+$=w#UI#@?9Crwe-B>AEz&d-bCh&Po zJ!aiyZGIX<{y_TDsiBd@67=Hz8jM%81JwX8U^3dk>!Sy^-%zvrett#sd4d@R<66+q zKZJ!~bY%30(WlKQ`cObW_TDLoIN5cXTO{9z+mn2y+~F!qqiHmOu8n=ZIyIa8!P<0U zyD=S(m3+AZ7v3@B+mQIqg6Ft%Wd23FPF>fyB3;os9IU&#-IlZG&x<1|_y%JfKigID zQHz&0r-NGA5}VE{4&Wr^mo^MB*2qUcB9QqCW#*EY0A?!bb@q431)(F6PUAJd6Xj>_ zKVxI) zXFWtG!tKxvCB}f2d(heCz~CbmozjtlTmu;D;Ii(*?_q9AKS{s#9|Q|7&Qr(uAkf8d zDp&U_7wXgw;tSAXB^#khj_qrY1IzZ%lZ`voZXn2!0VWcEY~T14;-nTfMuoA(Jwm=K zTLW}~z;7w$RgMnkFAm$VEG~O$Or?plv)TH>@*jp&fJf~gzxl??js^l!FXuJcDt}Ij zeTO4G%hO9Tn^W=HEp1_{w0g;KLhch%h;bLngjMck+mo*^`Vi%e zEd2WQ$gIU5Sf9K)IKsccm$`PLKx5<=lc;r(KQED-7Ar@ZPD=~~QMZrE$F2@peIfj7 zXGGb^G*$b#1IPWhJ8;tfndM0u{mY>9pPO%lHW@4ksuTrfE8NaFJM+^f>ryJQ9y19| zA*AwV5f*q*eTZOaVbzz@+d)&Owq#qcD*nWw>chi9$PZt{cg)}45(Ggas}Dt{R!wuf z{ygw|+`j4xyo2q4xTxM6G=f(FMFuml5*FAcqbj%pTF_)fnaYHFRam#g#e2We0GP^m zw5ijqd)XWu+N$>;Y^1h4U`$9-RcC`94_PQvo-sUq!QHw_car@P(LKqKep&#EztJE` zkbNHI+;{0kGMi3Mj-#!i$DXSEsX|i1YI*c~F7q<=R?84#)7VjY$8*UgybRrIy;jL} zTy2Zpnl_1AW@!W&MyZ9&j(V1e+eWjx?jqVq{hppr)n!tN#?q#pbd;u`P;+qMcM&@2 z)tqm9jTEfYb80T=CN)dE@^BP%DeAhLq4rSkYiM0j%2@mO3TxPYJ>?&c*0B>!6Gd0+ zBch+;gt8_=Br3}}_W1KOW34jFc3|zePAmt&V4$U&nd^%&9uq7a*Unl6NEiI6>U_gP zxqjLsoVi$qenJ6rnJ`r=;3ZjbffLj(RyE1mT!CDL)n#=QH=(%F+M~-Cv(OdZ)LyQC zxV3608UkM$=a$Nh$xgkWD0l_Z*%Y#Tzw%Z8E7(+OkSNO~7OwF;Gsk|j@c_29+hnbl zd3ULvMnD+ZxYjgq!u}pVtWj`X@tD0*PgO{=ABPT}V+q}AL=O)>BiHj>*Pit0#-vHr zo!)XK{xnBVvo|`}<4L98^hs;y+~|(CW|2bMU7n6~#y;OC%yahIg2_+< z6*>n47VS`#E$+sPAbmlgw5G=#aLwq+W?wIT__;pDk6tf|kE`LsayEDwI`6x%GBHW6 z8Ln)q7Mza5!UeS7k)_nQYHUxqg`xP1tv+t$ecR2D$w53_R5%NbCVStuBy^gwWjTW?DbZAFT7*!?F+K;+}M_VL_Mf&hX{Wz;whgGZC|Y)7DY-=rfo!~n(3lydb&E{zkb(t+po3)yvfN|shREmAIf*~azTM?L zbI4mG(EP$4r=OPXv?%{2uEcmv$xGu$#tta~IjT5A2dTggS|_E$YWoxa+W!e>3{l~v z(O91lV3Ug@&BOIX3wX3MzQ$}+o1utB7!*ctggwubS1JJuCMY1qCm;w7k_@6fw(5He z=>G8Zy%D;ixd+pRty3_4X4f)5|_%bPhzT{&T0cw0XEo&@*OV(k8%;hWp_tfuB~Qg z57){gw(8EO7wr?~y2F{8Q0b1u)GSgClX-)1tbxdk#KM~D*DP+t0K7h0U=j`(d<`-H zxIjJz9n&teN+JFLULaXdcVtIM+L^SY`&)+?*@s?~n;FH5m{e#0@Cnx@6R3!hO zdzy^?|K+_=Th;yRA({djE?9`jKYR{HGX*Jm!J-1hf>}&DsyAGrsEQ}h5(|fdEA7jr zOOs2TTF30*L*Ad~y#OyoGoS9Y68`&`@;{eG{(h0a^`|yGE;W8SUUHlM%JK2}Kox|v z0k0znv%nKo67xYv0N)+9bnxK{{fZZ7#1zUDtkS6yRB-$B1F0V5J*-`rXfk8nyIE=HbVU)`&jZ)AnrKk zku07M(gQsZW&b6SVEovGheJ;@IPFqN0d+c^Ta)vGm@fenCK;bERRSRsi+7_Ww|<=o z-lGM?r_fkJh$tJsNYuKINsL8+nWU2RMM7Mne>E{1dyZb@Qro15fHl;>i^Q_XaQ`Ke z$*|mrTWp^KH8`Q$}O8N44x4G1K~*pxzb*;MM50g=a`wD0x#%u-XW z7(i1lTOUXarDIpF*7heUlgBpSoB~ATZ)8lG1TxfFGCYu7`9*`=rnbs>NeLB{;Dc`> zBc>QT@4y@UDDH2j2S>jZOMxf9xnJ#b$O4loVNr=gM(s1QNx^ROdz1LO{VO!2nn`QfL0gO#Nl3euSSaQH7=lq#9O~fC|Ikg3`4ueMzD24Gp7ovk`1Z7! zlKrWVuA0%({UMN!Xx2xncWk8g@yCzd-5&GaErV|y?mhAF>iwelbM#|mSrA(Xg7KAal#q3? zm+eKo-Zxwr_cAt;zM}@;;Q!z`r);W!VOOa4}0s9_k_!5w2`;AQFE42uv5)5x{`i z_&ylG@xe>uCDFVUuqLO(9%AhJ4K!NN8C9$il5I(bj2^1pW_gC$4(`^c)XztFl52Dx zxle*yp?OxD_A6fqy_4)P167+lfhK%SEGO`q{Bt{5amhi(WMMhYSxb}QS>b?wzUYBO-e|M*VJ0XjufZw8$Y5HQ@%y$x4}HmV4J~A7zPQewP<}>jw+$po7q(-42uvSYb`K# zXDm#&4=&F#H*p|XLYiD{1m2|A;t6a7IuE-WkQ5-xB}-Z}g5Pr4cj(4{@q%{t)G{zf zj&n_2#e~sv1ysoGbU^!XqW(eYPr|hO!nbm!)x$k78qjd+GA2_EGkUG~aVUmKG~ag> zt?7=r`MKXPc4nK-C$S5OC~*;!O!w)XpZ(L#L9O)F96w+@v!fa+kUC4yc( z{{p|TXEJJR-S3_6-$1idVNBZT&u>8sT`J3*^KZA=7e2%%Du>X$k{jad#_%Et| zYo+zSqILMzTkTJI%oCKTQsx3doaay+6JC%8q@~CM!G(q5XbPpGHTuM>;UC(=pT55P z)le~lm4aP)erAP2lS`6He{0zP%utz_x)S)z*D2l4^Aoe8%a08I3d-qZ^~-MFH&~O$ z26x5ZSn#{*ciG|QX#C)FQe>#-RANKbbvOX4XFql_9`g0ksA9TMU& zyvu@IitVt}yuCoh<;ylNf)(3@o&*v&tKq1__v1MtD&tqUjwP&SY>4iLg-9M{U48E z!{y1O@5IQ+G2=o%iV5OL2}WA0xvrGH&09Eau-fY;jqdk~rllq1=wVI8Z{2os1os_m znB~?zjm&oe$7(I2CX2{Pk)3cYbiyv(2Ea@~w!7Kn+QX31f>)GgdQjSd$ zjE#;gL2DTgCiK&$tZ+PoNj@EMz9?!VELuG@c`CQWamFLn7oNj-{iX-a-NcR#Fc-OO z0)h|A*t*1nT>~J1gBInjTPD|miq44E#3ew%6^pSBv2H=AxZ8ap>1c;J+(?eFK&hA5 z<@^^|O657-7|H390jU@F@b-7iznB%cYt9GWC$p;lx33HTi+bg6CEj204gVxqQL37@ zxT;9+(HASxT?YWlBEb$p^9!ypVsNR9W`zwfkZ9EO*mw*W%f|uk-YxhJQ+ib5z%Rr| z!q+|0aWprmJ3%P1t(~_8NUUc~2}9mHy$!6}Q_sKLmpbwBj#M)uG#YAEUkrk8(o zW{Xn$9fFNPS3(UiQfr>jg3Makh!CkcT}t@v#@8FK+NuNJjSNYed zb}1-jXHPfzwHq(P&?ez)EQ-dKHg|y!y(%bt8Lv_lCjCANrUYA6zH!KV?4`s})oyD} zvn%{idPTffzo^14{p}KTwbERDm3iB7eYM8LxQRFqzL$@Wf+w8$vg6|B22UQ+{&Ez4v%%o9D=vag~IFtEih-%AW+I|bF z+cwAgSa_BiZOPNjR%YofvgV#_xXE;l!2!Q9K<}3anUT=54zbm14SKc52Z~{dzEobh zsV`gKJP3eq0oT*ZKpq?#{CyFiSL`Aq`yk|QV(K;#d}ZDs{Igj0m1|$}^x)*9!HDg( zpdt79{vq_&eiK7bH!tr13u48&JQ*7WAqa`1ytgBnUch{2@ zwuBAUeXt7c6O5t^jq9boQhYiQ+j@xX7sxs9B{Hw^?hue|j|V36ao4Bow!=%3TvZbk zZ$4F*Nb<{8tgP7v{@|xSsKuuRj4L@H;$V8Qh)P6=Q^{xoLTAr(^Vs z`Pfuf>B_&?7Zr=dN@kb#$23c*ckN%qvweF=@3Eui5)LIE?FJVCsdM%IY%3JLS#Qerpym;#g{?v!5(>QrU%l<6NLM3 zdl`mduM+R8QEWmJxo12QE$jiZeKy3>kHMrF)(=c9mh!tYv6FaH@#-)ZxjVQZF;nvD zd@0ms`ryxJ9}h@xU$6+^bHn5%y`!hE!GHFqJR#^RcWt|@bB5P2MPY}FUgUPqSj~)h zusxQPSwmi+0x3pJFaO4@(~TI3i_ZpP4f+3oS^szcuvXRntAFq{kKkFPmjifiNg>@(#_qhP5!eK9q(WOnU46MKrtbmWMmvAw<0 z29v<5i*I0bjP0WaE$O7_svA;`nTPkBF>J}0r>8kJI+H}X{er+~py^-+7-=<6DnMpE z^~H$P94;mO;_B;-2W=M%HJdDCZ;i&~HZ7`uR2zJA8oF=41(Qp{Z&BQ+<(XrsesaJC`1=OkKJoM@((cPDNWcEGk8G^zH_MR$~>8(+|L z2&IZxj{RnvXUSdop?uR(YTX3x04h{gZanOI<{-x$m$qpo%UtM3d6Vczz9F$w>}RY3 z-x-Atx}S=~)fTY&O_jv^H3}xP8Jby_N&7jjM(ZR^bIw_2m>pj;T{LMszBzl3t_7|$ zKozvb{`=01jyMW%xyPf`a>vV4ug9Qj2$0p}Q7O5!^uuze`U_lT!}mJ-y!M|76ARI0 zqrdtlw$fASx93fw@?|nOt}-cqXJ0~8qsqDooUw%kB+iiWHjxKxW>dx^R>I5X5jzK= zFgk8o{j{_5fQvq!l+}wgfIwtR5oo3IEJ7K}u(m#p31G2Fu(GSx^7h_Ik3sl?iA51v zY=rT62tCbw3AGz6#FDcJt%(eE} z?|ardd+k5w2Y7ySjH(({cU`xTdVEf!D;ADF*flH_auz8zViqi8FD^D1((v3Jng_&` zG8(~qR8PTOR?fP(=(a?Z>}v$&n^Cvn@liF)18USr&M9KQMnkxScEf@|2RKE@VDqYFich6qC>ocFTO$Ay7nMPyyxAzS~8T$xqN%!qAdBde2H>>G!Lx*x`^H0+9i^h8jlcBq!RO6Td}_S(~zQHfJ#dc$@$eq5D`8?%5MjY zR3(LwKm%vzuWYR&p3}a{O_cz9%ko{Hi@bCE?fL~}S70I1Ws~xw;*8typ^9p0ZaoLT zY!D~nvY=@JW%vQCs4@k}EgA6~falw+u%3gn-G=71+@{`?+Rgw*5;&cqhyX`fsI1k2 z3lH?Nsf|GJ;&X(Xq|0)hO_zhAE~g@MJDDXWyd@VKOXbVg;>LT{(00RZ-AbI6@UI{e z56zSTk8mBaYY_ZBp%Ao(<>L!!?R{A$cG0cecCbA?+}3EY<}|16y|U+N877m{XJ@f1 zcYL<$BcqL$WF@>(*4I?wAnu(>?$DMhQe&$?b6HQG|Le9Lo2;X{g}_nNQ$x3eoG#x{ z#}8BZ6eitNmL-=J5E(h0CITz7{1e`04)ai@{sj&gOF|gJ{6ZM6*)Dc)*N1e=AN`tr zfqM>#X$6w=2rt0tZ1f+oBxkj0jXwZ0(8uikPl_k+g2&Z0FqVY<*I4pb7h|)3Q^(}( zooo$lEWJ!s{_s8jdo^d0&mz;!EqRvBmM=D;t@d5Zt{nKSeA zUhY=TC(fW#a=?`x#O03f57~^TPhzM+Y0OuK0+Sij*YV*f#j={5=DWsO91cRd{7eor zJ!GJ!pWm{Myk|T=PmD}J0|DO!G>oeEKFy1|wk#M|R|pW1eU2v|&9$359r7CXs*C99HgLaAmZtjB{^L@$97Aa{(>EV2lWH(Z}8< zBSYWm3wx&GMRJFxri6@TF(&Uq()ws0EVMuQH0ql8BeYt_B>z4SSJ_p;^+fYhJxhs; z4$ip0rv!t3FCt{>sx=@Yq~hu4PiPZx`LkO;98I&2hhQ|$bAga4ceJj=F~EiP66}UN z`_%?*`;4yZn`BWrPFj;cr#SOt-^KD)Jfs)zrGI3H=$WzPdCvg8S zDmx1&bjFwSAZbEUF5lk4J(vT^ftv67|c}~><*o*SXK0>48hM4yt zKO1nI{Z(RaYvY3pI){pAxY%eUO;h}%pc);1ZCKzLTjREgsWp0>kF&`SQGHW>LoS?T zWu+YurhoSOG+WfgHldu2L(opT;ZASLyPgul<(N?s`7rJn^ zIHAM?I%U1oE;5WcVn;*-JEB-Mv^qe;vEmXutpV!RHiG^;l8gf#RdAITNs2*qQ8zZG z53K!;t=SmTHESK~p#^a$6AW|ICF7(@#&g#oSi|wSSKI(1}@$JKw z$4Ti+4T`3ITpTZ#%W2$Ml=a@YqrKj68+>zDPb9K#(bKh0%Uqw?f{>qR){)S6dy`(H zS0*J}gKN;1uowZVB2F-)0V~Y+J7wHba)m|QkEn`L9K!R-?-Dgl;n%7wsux=A#Gg%V9CU4 zlMUH0nRo>%@m1JuFL(@~pnf^SQV|j?!|IQVYNx)~>53peG~rcbiVdZvH^?%4MY^{) z3ODnfChbexd(oypy+#Z;xHemK^++j3wQ(3?fO?f+#xS8Rr`)NFV5X+d$@}TB^I`qn zDwabA^q4-B$khe9F}wIaK9r+Lw0?3Vc_zh+-mBEQ9gf=cOH|xWW6JL#8jOt^%DBgJDKDGy**r<1KDtW1*3~I!3 zU&+#o8M0YPHaI$AACjZ608-?_B>^g=3zVO*qvDDIj(`HudNBi(ld@NSqyBsBla5A2 zDnL43|KoJ?JzjXKr6=Z_0Aiks;V2ARr6C%FaD>etGKfXWNkF3tXDHJsuYy|^FEr`E z!H)|40s*Gk^pkWxQujO`VJBQr{kUa7n`>p}648QWl3)@lks3szC^5i+DXRPKPj|is zwHrV(utzrooEHAC0*KBm_%D;fe*l#I%c1YD=`34q?TYc5P@vl9?X66c(gPrEV%mijOKiHNG^Ez8&pHSc2lT`wtJV)*RTbDe~x0m{U;EaLw5hYA1f*gYf%=tzrD%3AmF@Z8nvK3*wy5N^o zX-fG<>SABo0$Vw?ue$;f_tRg;X6)YsKa?1241@;IX~`YXm-g#Pi&FL)U-G~6D?8}+ z4#C(#1-pu19%pH>u}9gA)JCpAmn1Nxa|Ilintt5`AN@WX2@>yUK7eMCTW6zEQ+Xig z-kX=F>INfjIpaX*i9k=XNmoJ3$hg-sa8_Ptxw?{x-oC9BlU-${050Jbq1a98z`sDq zcd?w)dU8-6uf|)ElwCKfN56seOUG}4)`K+7A`&yfoplF= z{KnTArP2G0Ut8yu1mKHZjr*u^a`xB7?MPY?cgh-)4}T*sjpN2?NeYX`kQUln z@GRNI7^jk9Z>(swCQ;Vvv*fMVL5&+N%rg)R3eUu;_fX2~#-Hid-aB)qGnQWNnotGG zLYrw)tWy$WY{^$DM>8zFNoM`xZF#;}%&D=_1Jx8VqhCSrTo2Rsl4Sc9Ya{1mUoUhnUO(o*sK_lkEMz}Kn3I&p|>gZLAi5E3#9qsVN+{l zM^|{1pVqInG~gE+p7rO{abv2DNx^s3J?l-Rzu=7$*E00x)Q)2EWsGR-k4r!c7pjtn zy*yFE^7iT1oDt+MP+A6NpMFx%x(M`^F+~5XERyao)d!^CRc37y8tI`v%L+Rgmq5cd)Rs6^ z2$8O}&v1KiY!Z?Z9;gQuQ|XoB4D{FZ!jo=?i2cn-W3Mq!2$rs}*|A9ayILD!Mu-_5 zwj09whZK#rB8lT}o^;_&-?q9!{Hz+MM#pyevZklbjuS4#%?W3H5viLKzgkSdo$rMc zrSB^qe&Qoq7peH31D7AZX7Ekvbld|PPl(RN#j$g;yA7ANp;sj!n@MY%*tzkFdyx^~ zD(igaVsnLf#bV_jW9lPSR--hC=M!S@h`F`H-}Pwy%>30g`C;lsO;;S`=n91jk8i(I z7~wQT!*R3bj$N-1(?~YP10Iz~zueS;pu~?iIGiAZktu?sRptOT;D$?DMlUM)Vq-uh z^!}3lc&Ie@?y=eG+m}0B>9qON2No}am*I-9>3c6t_RqV2HvizPdM%}ZktyIWI)=aN z6aRtorf3iJa{wB1{53vB|35=3PRmSX$|dq7WePebjxt1{j_<0%5ipdL$|1q~X=FD0 zs{?u($O1hASLg>JpOUw;V}-|8Ei;RK1ykJ2hFHv}veE_o{og?phm1izX^)h|2fhWY zajQGE7z_55$FxH%8emT=Ehx>^RT~Ep{T6)^<~JSITtEm~gxhoktfX8$%Xcgt>{yqa zDt(`a(HT1B%vXF=QcNTe?XO*h`I)of4zb?6HPl5Tw!Ov>BuQ!Rjb@?9P2>TWxv1&K zaz#ckEM9T>h0~2T#JpLQ6nBAjo6B#?Z|2-t1LfOA@d_L)rr(J{#bK}m5*b6ds{i9lAzKMU!u5SW=jk%+*rxg zP^+BsPB4OqseiDk+8EIXR%D!nsQ{%4!!`b+sj5cHV_B7o`d1-Y(CO=*evy0C&#_qQ z@5V6Zipsi{O-EeJXj4{_yW+d33J?2S&<4?#^C|gP-ta#JZja_oh96sa4}};P)qe!R z%$Ea4SIyY*szDEo(RxGfJ4VLpL!hl%$jA1%ubarPfMnl|Ru1m=4q1 zzV@K?VeT(>lQ?^T**3HCi9S3+>oJXZhhR63T#~jNG`a;>bd0qmbo>zAQY-He?-ECj z{$?-2T&j3#|r6rtUrJZ(fJogcx^X^AV% zO*X@7h$YY~&;vQ7(1S_Oymznwg=ECPb5_ zdYhVKNmNHdN0h=2s%0h05!r7YuqkH8b)J2Tk#oN*z_N?(VES5o_OHI@fBn^#ESZ|jMrQU^n=ECqT%Gs~f;vJk zV&Y)Ts+agv{&tSpvE3&jun4UJBW|EjHcaId{GP5R=pl1~t;mQ5BRMxt;pR)gB&D^s zR2^JHHNFPAu&G$}=#KbotrXho71p!UoBBBdzOI%r6gw%AXeWP__`x2TN-wQc>IhDg zmSPE835_eYglBoMT^0%>-40WZq@ATi&tppRY7a%yBgPY2YaCWHt~M;|8zzdLQMh@R5!9Qt z&M!gT>*H#QQ!|Sidv-Y?HSZekxh&$Z%2a4cD)5lyr~PP5l1WO|&?2#4-eqb6CCn+T z(=+s>uLvyidNuTa!<-Tz z3%G{N(5*uVvjK@7PRzV}ZC}`$6E|^Yv+?l}J#lF2g|r8TS#G-GZEG3sW`gHT-sBxH z_)N$iKY2LA=n3RQTuNEi{H^M~m(!cJL0kf-Q*<*+sa-66Xs_?}WhezIqDFXgRe zC((B5MuN5MD+cSN`NF)r;$wbUCA!PcWfr+RFA5`|^SOJh_z-0xczzl_M$k4R5g@Y5 zr0=sc2?vhgi@7?`h z1i62AdZqc#FE14rLnoL2f^`#K`wpM)R7br@Nj;k)+?hu?01JeBDu03Hym6zf3#Ni5 zFA3SneLBpn83x77{*xe`(}-c&cWh!dW%hXXcux2He0u8s$=IWcI7*a4JPyrBmF%mu z7^WRn3tm4SI`c(27Lb$q$b|e8lo!oNSxCD#DNq7spQ?}b$r!pz(?=>$z_{uc%H%%0 z3WF+#x{G%}mFh5%>n2@U-)|$*!4c)xWyXmDxJ}WOuWGQ}knOC=AhXjnD<4ju$Zm$v zA7hiXgdvQI2o7J?N5&r8e_>ZRTGEOxDqk=Cego*6yKc+>IqqcTXR6EK2%;!`zlQR{ zOBnWT#dNf^9bGmsV}t%AlNj*^@*bx`6}tonrp^r?ag0eTU?GZmFU6O*4|}ZqSazP0 zXFaEBtiTi>9E<~tp{ms{cf<;XIA?mFEG-dB%nsKqUFS1qkTkWnTKo4SIHt(kb9e&O zI-Itd!tFW$g-5v|4hsx3P7YDU4mAWR+?U%A=<(^KjPnG>{g&y%ufcec61Hz53$?Bk zqs^6+_w8-@nd{i7qFmrp;AgPl4LEwc$$=dJE;QEhLP5!oAC#=!i<3$et8+<6{9I-k z-Nt9f7tB)$w5KK!{bqa`WhJ)$q!ws1UqJ3zF$7Gx<28R9^gps3Yvnl*P-H)>w)mfG zI6rMvv9E%bto&4A{#xv`=9b*{uQ0JG+=QXC z=s4*Zjue5=m*@|wo9Pl~Xanhw7jV%(sBV-%svB~LlmS0C>Ieyt>PB%#;VW_FN_gTP z8}Ivsh`js;@vK|p^ldwqTx2<#R(OE8K+`R~07!L9oCZ?eOcl2OMRj{KiAP3>1XA5X zc|RlPO5zi%Vj(-t3anmkg}xx?^SSr|Iv{PEL$Z-4secro)&EI#b6F{D5zpAST5=2` zHXSvC;-G4ZR0K$&w)X4HKiU7GyHEKz~<%{==J21qdei|Mj1j-e1(v z{p{TmS8RY=d*|$ya->v0&d4oEiUi`&8s#$BS>YvDXH}6YGDqBYFJza~qw@ti{X#)3>QKrq<#(JW}LM9*sSBkv_aeHRW`cgUn#QauTqcl=E{vS7|wia_+*} z=JNvX_L#SNvH7r5=cWnaFqT`}QFWaZ3z^~%)x4_O`Uq%lMkmVxOKqDdnrhc5hlM<0 zmq*#rEEGxA=(IU;a(fS*Q#o2!twYo0w5D0W(LQw^xH%dmHh00b>{)7jtU+4JvAJC5^DYKHxU*{IH}rE6Y44@@>|z z4997ZT*}s1n@I280tUX?{vD}MxbIrje_?J>9`dwY-z7#hb~tVCs%ZgP+*5*DMYjGp zEODx6{Ig8Gxv6P{4GIl+)1Ers+fxw$(>1G~3XfsO6wkX>W2ojT;wSu49)r!fu~~AA zbo4e_xQX|q525{mZ1YClgj=x$zxC=Sx#NvBxcZYNUd=8WUUx5c$U(Aa;ht+p{$6Ee zH`RXg6COkDi<*Up%n;Yi2jAx6HRSj&&RAIP&G_ug-KZFW(Ne-fF6@c1<7xxPh5EuAm@76X7hMb}qo{}i#5>$a(>un56Ts=J(yb1kig??i@P3Pb8P za}HuHcaRJe9Qr(lCOU4TkFGicklg(J`Yx~N1Sd~exs)zGb^@h61gelUW+xLbzTu|r zMpC^j>9fTg<8Ew5qnn~mmK&!9b#a?86Z2&`kNJ(uVH6M*>^UArmH?Rs9jyT@p7I0y ztLuS^#w5~HB60HqCS^Tq+;S=n8ro?0wCo%FI}#D=`z&+W5o_^&r{CGC{Arc>neV4A znf>>jbQgkkMaqGkRxN$+M14(D>SX2O)stx%1^yuyRzw|sUn4yxh0#^D=|l2+o!q^$ zq7I6@Ic_V9EX8y(=^ih#5}9>V>xDA2iS%VF)i280=IuQI1WWuBKuclyh28HzIfdYG zwdS&!mBo;XEJJemG3GCSHaSvEJvMOevDL>mB@0CQap|3IBv@BebZ^7DqM3B^&NP;u z<8QLCa@IHBK_pj6ABU;LST6^9?U;?aCMg#A!Dp?<}x*h_=Yy`#yxk87YSY;s2U#S6*S zQdJ7J9;Bztr`UtAE??~c*(FW4@=7ZVm1uw76^29Km<`kceI|PEyDiPOg#|)Md0dcP z*)-#H0qi)DBP-f%pchAL26>;USdBrdI3wsyd_H9dBocqZ_J!y1Rs329>)Tjx zjoLua4sHHzmT`%7e(X1TR{bGa^*qY&$;ntH%*aVM-(U}oBQe(bt5)l{c)g&N$qG$3 zl&b7Y;}yRgi`Lx&3rvOD*mi_SJ7aix!}O>O6aVfg^?8F2(|+-zTBkH`jgd|GFa79t zu|RCJYd5*{pO!r_qo)wRsQP@}C zO#mJLRs^PxABg?)>zC@6S5Ti{xBk0Z{2#I*!4{;dlRe{*5DLQy zwJqeCz;>^`e*D={O&^psqyi2J-{Ak-)A1if2mi{xvZi+Cf9Dea&kHgILO5?)8_6Dx zAx+S-BM3u?F3+Mj6o!PKGjY*as^rfB0^+p))ySVO$ihp%q&ypvTS2Bz# zM|9)BLpE0+-TTQ11)n-?AS+k`27fO+koFKgim=S!b0i#z#9iouR)&xW9H6dzic#yD zN|o;9DmLfj%4)XBBjN6jz4f3Nd_x6#3hW7m%4hzm<2;^#lvm>l#F?03$l;AZZYCJb zLZZHrePVivS2@FV;kDoQR9OI&&W?~sW?h#^;;6Mp^@q9&CGnmEHJnJf+iHt62uVKu z4_8xR+w8)p9B~Eoony_9gKmJvi^AY>CIW=iOX=+@j`&Fl61eHCKZz($I$)8L@1&7s zm1oGkw`)!ga&j8yI%rICx*QA|s~_nc&YVeBtKf+xAjBe9{=6_~ho%6P2Wkd=Q{>1E z3C>>xNc)iZ4jRgUKv*@@<~H+I(aRzEB#6JENjAA;Qp0f<I-NF-k>!&c+ z@+~shA^f5bExt5IM_*u-dO+0F$Hxfq=H|24q6&{<*I9vkyAbUh0@_K>E0$IkTKiez zfFrmDG-IHiP9K(OV%3|~{hz4L#K1lGabS@e_Lm~{?;VzZn5V0_8ae-2rwW<5{GBxs z{qG&*CMoD0^-8Exw3<$onmjb6$~+4yt7L3nW_TH>6rhO%^E=uQq(4X(5P;_UD8ZE@ zCj;D)^;v1)0xlu@dQYyrzTdu4d~@tjosN{nJZG)bQE|ZIK)c&6j{0i2u1;tu+)H{v z*%DdCSpQQ#@*pP)8~f3e*C4K#Ztcbl3*`C_g7;CS17Nem^j6rluzy3tt4uaWa+B%q zrv5^Ew|xiB%UV5zDA`>{1)LjLGvp%mNJGoJ6MIeG7Mp1?*gCeS;ZR>rc=dJG9nb6Fwbypxg8?ZN8IU& zVP+fzK9w*@rtH80D5Xj5Q8d5VFn7ixWSrGtNkcv$9}99HXU-!8dPCWMe7hqjz9fFF z7@6KP$H?DiGx9iP8Te%ZPhN*R7&evD5A4N^-!>v9NC=mtJq?oatK^UtB%JWMU?>}9 z!>0v(f#RHU#^o=(LkM8_`H%v8#z(%!#1+!mOXDrowGRu2v^LLK(#q0C$JS)1nXCg3`_A}_~ zy}ICUEfjlxNQh{X9;F5_b1?Wjjz}yy6T@lA*P?@8f>^D!i)CUIB5RnR8Xj=WTjDtA z^h)iMTW$v_)u>QL)=UfAtT>AwHxOPn;2Q?x#@FPp?!_BSwTWYO2dCpDjb3_C3mvkG-k0vrQ!<#|W`pS=Kisba%patoh z|F9f|tx|Wa_ijrbCRx9~Zi&`t6fyQeJPwK!X znMA{Kp|;55qi({llcI%_%5G!KJgO+!B_2^EF|ziT8Qd{~E$#m~5x6vwLVg5ZsF&xilHZZNDYj6 zhz(Q>mvM&7=^04(TEpmRFwzm`vI0v!v^bQJ0zpP|4Y+_#&pBq8=!1lv@slE)_}&iP zMQgDQrp|kEEEmj)ww{@ebJaPSmk7h6Eo)8FrN*i|n?hA!*;g)aORRO6SU}F0vwST) z*`#AUFmafASDa(lVn&zEacalD0%FysCO4Io5>+n~D0t99Vanq)YNrTIBHcPbQriv5 z)x4NZU4-CbHy4ov4mJ@-+ewAAA*48+X{P3G8yb!>)!_Z8_3;gE1a1Lt4An!HP}SWv zRGO3^0j`2LFGr6Gm%xKxF@)QiBdeat)QcSd*vV>qO{mY0_xpAffFll*v!lwAhE9TI ztrDc{1w(-t+dZlRevavvr3+sAF=9* zl7yOlahytY2vnlUrS=*GWGLt4)kAKP|B=TPmzUOeYfJ}_TdX0n_gq@S(6Kb(@EI87 zpb9ZsV`zXS=YvQdP5}#PL${if`E2fJb)Ym|TYntlcDK)cqxU4To zfIKe<`;5y8{652OLPVsJlutk2Vur54WSF7|9KaNaC4HM6&=l${5}&?6i8E3P>s*j%n%w83!M3OEl_rDgrFE`un%YWZ~5WIh83@5`2;#`a6&r<2L2Rbn6 zN#J0z>d5XU#DLLTw-m6~JdlK1vb|RC;m{vT?s%bau)gMxXX2Q#j$5^m#ihCFP_&RE zH87I}JViCrg1cdU(ZJ{v*LsO`Yn4}M+g3aC8hOC`VaK!A8!?B*2%Donv3SOIVwM|X zN9MrG(T>D^xat-YFIx?(Q_n4I&dU*JEmW=8pmA=4#d&YjYYEXRJEqjUVdd7PlbHMs zyiuA)+n`nk8f4ioSyfp819jTIN^O5D0`f7@X`wpQP4I@xnnGUUq@eSc>Uqy?^L6^Y za88z5B7MjxbwGnzqi$C|CEc6HTL%e|N?Z(x^1zbNa-y=l*co?F2UefRG7_1K4vm3Z3 zQI=Wce&|>s^^S1(HldadL#q;L4yH#`gfp2RVEN>eXXp}k8-+zalQ=F-smuva!#&B% zj79Q{zdpc8&iS~@J~rZp3bw?%?D^1iBC@ItfCQSkbt|CgLTn45{IY0=tRx8*1J+pQt2_(WlnLq*& z|DH681d@Ss@B92@DdbQPN9*xKB8%P^#7Pek-!3@|DlIeabf3%Logdx$H*?)vKCpSP zOKO$L~TZ|r3<)KEUz-uZrqf~aCwBz6%@z5mnda;RYsj-w56&Y!THZ50D+GT_p8P`fmdp9L`axmR6V5aC>=fMku~?MVmZ*#C)d$X{7NN!Z=)WVt$E10t zLL~XtWfX%wKy94pKs|G2u9u|s2pP>(VbDTm zE#Ir@xy5f-FlAOjUEQ!oHJ+SJ zH-U8SaaQ~F#$cL#Fxa?TlFD@DZf^RP@z(;C=b(EJWh7Ht6$$iXr-|HJ;zOQJd0WnE zeKFjFYA9eFz@VVcr(DkM*|3Dt*YMp^xGnfIe8qHr&n#nL15N~%nt?TCex)I58);?6 z#8HQGLWt zHY~2_MMqX;D&FB8MAw;iKu+cK=C7K+g4jeOXR!8wwP)e`u!4$r7uCMB@<2qz*&IT5 z)H#^vuOu?5k<#SJJ=nj#Sp%5w@ z95;~C%#h?a+T9I5#KyFrw90+`b+(e{{krI~NkfS#*S>x8BT}_I2t9Tbg6!qxwTRB_ zaQb97n4#NsQdu%ALSm%$Y}D`er-&9iu^fJhTAfL~C)47H!909~3L+D7#2M;9&k}9-NP1W# zXtxSSwoNBgE*AS|xq}w%zMoQ!C2T}R z)+(B4{dHf%!Yfp}pNy77q%Jmu%ARPAg% zbiNLyf?e^g&NA^mkl0puRRW6GXbVdy?W0r#*z;#5mgY2b<`$$XTliE~k>Br;N&*{b zosk{+f5jG#7vva!#&anQ)az;uWdampnS;_R{z4H*bqsk$d^YflfL`BrekP-GcR&}| z#<|$#_Unaw!XwyGxOpEO(p$5#DCruE_lhuQ$T4qkA{_lK#T#8^bFKT%hq8`kYrAI- zt9{Ld;He|W8pCA!sO^Wy6DEcK09W@dv}mSpM)3;KO_@WK$A3r5$nfw1(hWH=eaGG- zrVIV>nZ|9-3AW)4+dE7wO#vUfqes(@ajWyY*h$e+#Y*G{=pR*+%PvC*2k_xV3-kZ> z)c=mYB>T@D4OJ)CzqK)J|4qJZ0g^A9EU6A=W`oU@rN?8$kYEecf#gf8IbsZ2ax*B@ zR(8%k>Rpwmh@Zv0q|3KTVa61VmUAITlRCNH7p>-pQ(FYxpIEO;qfi#j98phA(Ug8D z(d?>YW7wrSK)TzmH#lyI>*igFhOY9W4=>^V22tnnssKCW!z;%e5z-jITY*p0x+B(y z_|3d{;+fSr?#+i(>Z!Eu{M)Hi_)!<-MO-3(Egba+AAcj1sVm`C3x9yEM81;9+|A34 zVq5r3!0AbVC7XD-Ab{`Dw7JGd1Z0gMA3TLV&j1wrvD9>jH(k)v`nUqI4B?%jTm+kR zR`Jcrw|=I95++HuD8;>y^kJb%UZPTVaz=Is!E9&Qf^)eC6mrQy*WgWc#@{CMHis2M zlV!h*qrC1V?N}4O+)%Y>cV95XY+9C!!oTBWJBwxOXpIYYn}+sem;Y?`a9i&5Gi!-)O zC=NHRPx6eqM3M2Ti#zt1Rt37wPHLap1)Uk~;x)!lga!-Thfj!a5;QkDZR_T6TlM>& z=c&hh_4gZ)duanq@&7FEqyNw6$-~*kg+bKb*wxnb?>?x}svAI=A8^eBS5k_k8>E1; zin16S$6qmtxKzz7?PMMnOMD2HBG?!n6-7>g8&ChI#uf6Fc;)1ACnE5{O9#Hn>E-O! z;O*9J?=SE7_Wl4W_?ZlzySm5`&l$(ACr(>l1pgLiR#UMqO;{)hh9x?)rD(S)f`>W< z>qP@^3fUS?iln(OFX@$Ul2O%-R}UJ|&9m0_yv+og?swC{g=PRr_nNp^hpQFbb3K9T zgl|PJ->uy7%Fk=Q1|{c^=lSM7(2MZsrXP|_NrR@E?DF8rJ_=U=%9O{dHdDY)$BB9s z)B&BbZEd{;pRV>PTOsI#95r(+0d&2(U-AnmeuSNd+tN)G0bhw7I;dM!+rj%7F@ogA zEAylm;M^MwrgPYA-sLd_-_dHm+F3xCcU#=;_TNO%iLTxB^&H~H*c^DcSHLg}4-o=X z*B2ZS$EYt(J-(siiB*<+l#&Fod75CG$t%X9CY4U%ZNjZ|vVV&o1AFy72J1+<=F7=1 zC-D{vtg7(%zQ>fqi1opvYNh4w${L_23>Re1BSTliMc~osoe4+6Ct^5Vq2sbT%xJm) z&hFkOsmsc4{53netca}!)yW*N67zb*$TP-<-vDzX6g^;KAc?xR$Id)HFz}Edl(Jcm z0C2uLOeD4BIQ~-1kVs0hk}3f5TNXIEae0s!gb_cP|BA^7xFro|BtK4pdzTz}k))?* zjn7N>`FZz>NlF7dLY@SM(OqCKmaZ)MK;Rep;>7A29FU6_7f$Jci{lnH1uMIUZg$NL zqD#Dm^jUrvBtUi!(E-V2y$;~7__f%m2ivKVDt4@ByzbtxS{pHC2^|5Ix zF9h?G5h<(c$3i)wUr&WzMqwy^Bp*8OQy`YGC3JXW*_|!E&$n0T_>wssa}z>m2C{{H!f|21R$`*TGMZEVCmj7=T>P>=s#R&t`f z0#Ls@nA;8yQwWEJOQ`Z$2^*JL2^oAq04m%B#T1I%sxgT{?fwCk#f z+>dgvwfRRyVLwOn(Yp8KCD+mVntpe;FC=5kGiRFvmAraBdUnhBMmUB}_#Soj^*MAG z3-*xfQuh9ZDvjMXxqC?q&qS3aGz*FylS`WR!VLT2qnho|3|%6T?z*~La$tVi!OzhY z+jFW@0DIrGj|_*ac?w8&P{jJeTp;nV)BW%P}-tqll;ch|)XB6EZv&o%yg2yz> z%v1EJ*bWPE!T`H-Wd`+vT5B<@XfQH5wKAj13YMF|-~YIFh)Z4^#uB>ObbL1^inPrX z&L}M3cBMW`NUcnb%}c=DbX_EaAUo9|*I$Bke8l6MA+}Z&Gu-Qul_l|gm{=D?Oq&RI zA%1C{gulMXuiW>y$7wufUoX*J4EToYbv%{{4nZ%O#KNRfHD^ZA4=v0$A2?)wn0oEu zV(6JwkxkljiQ~1bF@gYJVwylb?L8xRY&pvO*h+j3n38EkD4L+T{_RQ@eCruwGN)$| zQK-~0f3e0%SwiVkYPDK`8!xN_DnAENxl5}#-vw&KPP%Qu;JPN%9T)mbV1yr4UXWc2 zqU~+OfjSCk(#TWd)m2SLJD$#a^snfrOW!;!^u=YMeDe4GG1JI7%zQ@GGaXPHvLBglrA)suc zo{D@+ze(rH)w)WP%Tfttjhu)L*e4g@Vkj7V|MM;Uo+c*z1dJS3|Me|Q@E;=w(Ba4h z=&SgzOB5Z=gb*l*B=$iV5f~B@om|E4@JX5kJskY{6KpyX)CyZI(xlnWXWk@7DNz_) ziuCc0+}w}cn%|(`Vt)iBgQjjDR2Hh6wJ9bb5$r0v5SIpz2Z=6)jQ9B`8CU+|r4*ZD z#+nlj^uA!}f}iHRf}<#}Vu^`}fL@#NP*!%Xc_T`${Vn%`1(jL$l#r5zZ7Hx)Q-3I~ zmMuy1j==y02HO`Wm)6V9%fY%HqBZo2k@BaOau$BUy%zXsIKXP*pW_JYUq0T-(9O`u z)X?sKiUfH>H%oIv7kejC6`;1##?2HMk77h7aL5<0yg*e_h@7= zBUq8r4NiFO>nzC2Xyp%TYa+Be&=;kdYz@izK{Lmx^;nk2_0~%Q2K!IHmZwOfZ6UGG zOzKVvEgcymnMLGJh8^fg`;>T~AUE;4Q!~zjAIX+BwFn1E%H%>7=D%eU@){1aCaWJN z5ouN3V<}f{ryN(<7MYs!{u;ZAc=U}xTMO9siwzxp+3HQgE)OHxQuErDLA8K*6t>20 z^1&BNP>v39Q9VSABMyZnDlDC~V8tq5SS?80Z%15(D^d#dE1-J4Y|XM`L% zth3v4i5Hs`!w0UC#Jj=We@qN0)|%!_-S@PgZAlqA2u6-i%S#oWD>Rd$sDp{64BtXw z8@_k|`jhCPTTECSYeP-zFEl=@*NUf!AfKw5jvR1;e$VN_-y;`j#dV|)o$zcB*JV>VOWJvPBOy&N{OUxmBCu`^ZC!LpubsoX9N5vbAZSBfB((DD`WrK*7@gu z^IxYrThrPBR|EZBJ>f?}C3kq%a9!eIHt~?17?BhzneE;%0wrgYH5d5>O=a?r&JnMJ zi|W8R5X=0}qa?f_wkni#2gvx~>!it+aw5vw+QRyZevF?Xjv3PppL*f?2mt8_M;F!V zG@i-mZ#%#)t@ot+Bwvm9ex$vCH$so=lP*{`C&nOzPr^`%hYvT106x?Xi=hujt}#Jw zY#!baiRd*rzJ635@{sToN@n*s05$572AT9q4IdG3h4kBxGceI3cxcJPrxV$c7e@%T zt2YdP@0wHO%?xbp3M|(C`icGbJ3^vU;E+3sW{?Up@a@U&lM63k(1+;BJF+Li>o=~- zHMmE?YsN|YYlVf8wO(LjEqUVN66ebq&JI$0)nlH6rsQZKbB^p-V6knXTw<;N(M8Uk zVtDVJhPR3>jcMdP5Y@~F8QcOf(!r9~zOkzR7BlQ0v>>Y!2 z+m>z7Im@>^*?M+4-Cm<9Lr0x_Qf6=ldqw=)=^sv;?a_WYM)^xYgQHO_G5yJ=FaVkSxbNM%ua zVsh!ISoiwrgLUSUX_>sJWW=;ka5+qq_!d{^*b_6!4h(~D1gT8XQW(t)y@7|Ip)9D- zlV^zI2nx1*a^xZu+#2wxcd_SUo{7k=p z3$z(@50+naAZo5eB&OXJ8Cj6@j9o$ORyr%oF{#__hmA5Mu{sz_?ncmi6u(2us5iJ% zGEQg=Rna*aNmR)fHz++L^~*)WWU8*TGcZ$JT+q^W61tdKaOLdQ1-SQCyQTY2=(|$~ z*zlu**-FSU+i&^h$=a!1RY;)P;D!hPAt+=E{DsxCcS07C7QI{Q zMiOC4k2)y7E{Rad?t(HjBqRaLi%uJnyVFWGwPTgU5oUzMJM0ca$$g5bOhO&uy61s| zTHuD$ou{Bx<9gCD(Xg7QsrW`y%oV*0+%aocCu^wzPD`7|{}-sKm4HtRQ-s@XJhu}sg;>8;8CU{hV29KyVoE`hWNez%}jQDHZ5992#)-A%Y2K?%L&CKn@CiT&7UJpQ@$QY^NWZ2_$+F zs%Zv|8NBX~9xP$7HOigC9uQboh;4|;RIevz^qPI4aBH#&uHZ?_kFP{!10X@Eb)vd~ zxF8s(7#p!ZYKND9QB^9pmL*U4=N<`Fb?BFDLBvMjK>6%ov_h>VWTcN=q?|7 zj>`e}%0P!`I;Q)UZS;dUruub-`lXQPK46OCqLCWnH*EcBYsK0*v;Gu#!bQXkjY0=wM+giJQ_oLSzU0 zaAwtcYUyB2Opfube5IiLJ6eC!)8^Zh=Xo`)0R#Z(WElZeINtCk_Qoi>jH$&L_krAA z1(;uE#fAzkVNHo74_GPD6TP|xS%bIgTHJ{c*#d$TM$6$Jp5}z=6e23E*l*@2c!aWd zqBnS-e#mZMvY3wX9wIE=VUj}=Q(pneL+qI=e_zsXlxiY->UBJ=>8tx}%-xtb9NF1~ z;nRr|OJb*xL=VOZZxrHPVeQutPN%0a+tLZQo)9OJNb$Zz;=V(M&y@Hd(5QClL?78q zFQA`6zVQRTyVUP%*LU_z@FBR(dT{UpHX?TUpe zB*7r!_L~{X4vG(?g-Yqx8q}1BZIB2K`GW0q2R$|shOAkAte&IcRFfjIb&HZjr7-w2 z6>k|c%b{SBVNTw;lUXS@DEBle_cS1fYH4RQd6;?pFmU!is-Ra{AiE}xqQ@-U>N8{c zm@|7B7{p)KxL)_5+D3r6Ho@#z0l{rP(_93wrSHu=Uv2Ox34~S#s3HC-KG1T84WME5 zliKAX)2$SMCDD(X2=4%&uK_q|EdqjVevH+#5gGI>@Z`~t-Kc-T#cgO$IQ6XO_^v0d zsKCVFJa6SHBA%H}CA}0TimUjCX;lf>r07|Dp2q|EdKU(Ud5Q>!vl36N=7v1rUS0ld zX!OD^owTp$Y29pDX!K)Q2ISSCH>hBN=a%nLOqKkAjjy?ayHF@|3qBx`M|J)Ku37%E zA67e9SNy!4pn;7h4=;!z7*AiYe~|#;NANSL-=pATG5$B)`*)2g-v1rE3tJigMezL# zvyW!t(gR8fR%^ zAo$!fFmm2~Oc-_h@^t@LuuljH4@5#B8?_@7WDhSSib0=^+g%) z8#nk(Lp=v}X&!Gi{~&D1bsByh^ThRAW9CRFHMGWSSenqoE*DJ!5PoAQG^O(Qm#j2G zOK}Y~oYP>ZLN#_S7i>Cq_9f6>9j%R4YY?*K67ftQ2n9-l+OIf))jkfYkdJOwgAr;B zy5m0@sK~EkiCt=;BoAeCMMYyp5-UFl+o1-jI=N0UlOP{K)4VzSO>(94){YR-Y$K8j zTLdfcn)oM>>=_3p=ZzBE9+P6J4@f9a#+8V(nU%$Dv)kM&N~d6q!zGrlW^_zdOr$oH zLLlHI8Lj3C#*Mt=wY0=H2R9)a>cwbkiBOR(zW%lqcG^!}2>S-{e+}UM9}xfVQ6>A2 zQ5FA|4gYl@`!5KuAZ`0?WbK{V;<}FB$1}` z=6Gpkq_*?nGj=nruqcd3tT1gG0!4aQI_WIkWf*JMxh1XNl2IoxrY6c|fnI(XGGwLN zuj?PiA(P#Azpmk8jmn4Xo-&8b+0Y)}!=_PVTgMfD9A;JwZ1&fnj9p#}$4XOV1U zvhzQ6eOY;_OM|Ufr68kJ7$T#v04{7rrufYq8l${de%Sa87_O# z)Sv92E)pwN@mgbu6M)C4=0a-W8U{4_y>Hv*J(B9c$s`|*#}cv`#}Z!DZ|7u-vUTH9 z)JxvbS5c|xz0w}$m5l^NjZfX(MU$TwSG`d|4cFQ zi>*%v;3>62AJ-=IW$}OU&hKJS&CUE{TUnL;x0?3$cR(!q_j!@_9}YSHo^JoN0{HJU zqr^8AAn;8EsLAO&nf)u-f|aDd9cYobr*S;r>CG`&#WMx+sf(SlNJEe`5K{ThN#eHI zsL6u?GQ%0!5~WP~+_0d)z{8ORz?8ogZM^{C_0X6CWkF+2zW&g>fyj27MhNY0L{u-G zZ{Am}PhIZMPqp1Y(S|3HVg(=o-9!d|QIHV1iw`p?6j2Rg{RcP{0rZ%X1C>`uWggzJRqvg;MhgqUnqP) zbIIAZnk>%BIzG+Xx|Kmq*5TV*w$jAPy~L1JDQR>Gy7qiIXZ99|#$~C!vB74cV^>Ud zwI@y=A!X(IkUP*EcwzOlYqQ+lKD zQ^1THpXWwe&?P>|k|_fvu_PtCM3eDQs=GS2(Oe5e&R)8o>W~R)7uo+4Ck~)g;Fa4F zJu~FO{2TrQh~fZ~*mV%5*=v6Yk|(3<{Gp2lMy@q4(~E!B9?ma_ATIB$*#Xg6iW>|I zF{Y|7&1N$mZU9RFL}a`3#q5FLAR+G52bxR7J_+E0P37D65}UA;sV3J~d9eOPb3`6@ zm@}~kE!%8qbsTQ>q=A)TkI)*I49lE+g_n_R+6UDnqDRJw&?TL&L#}EiZL9PlPd~Hf zQ0ZlYhuKDWV6_Yg0ipp_-sbvXH2Qja>WlN}pMp%ZQtXXlYM+G*_7WKYgC+n(Ix-m- zdo6P);_JUGyidvipS7QUi|kBP7ox8q_!hzzJp9fl&J{Bc^$27h{FKPm8d_wu&HF5` z;AR{38DoYSJ_{Ol8K<(!utZ~!5Z+AhjeB~bO@v|&wid2)t)(L}0_+iTmiVrJvL|-e_&nK|zvFFS3)jaoZfRf5+XuuW0-w7L z?G@pAoeoPo>_B>rG1uW2MaUiq8-#NU*5s*V`o{WEAXD- z)y-!Lq6_bVnDh;K*dg?{Z!|zxFHx5;xNE(iryJ^)ebSa8Ht%y->4`GIDi-~q8TW~y z>M`e$VeBh6SC0+w@}3)PVG)6LAnM2)a`eB3K||m*I{y0p;!ONU78K_nUmXd3H)ES` z3e?d_-^R)DU(4TFVf-6OAaNIp{S=kMA?Vr)fc&ll(9;V+m+%xohf^{xh=eY%kO$s0 zF9gp9<8F(hUnv#nIXNCpr90vtHD2M?+Wx30D~jWz4<}C&p^r`{f|@wBk}2z(f%*~?TuWo8VG*K0wwjyIiq5x|~chKdkw6}SRFMSm_9)ZBKhF&U#(symT zlgD*5?dPW7om#*>(J(mnUjz4Hx-bgpt z2!W_6z{}Nc^)WCRkHIl;Ka^~k@JX1=UK@7gYH=C$Odd20IJuA^3Gd$?!5k$M0#V;+ zqWB+_;J-h&ylD!M_XE3+dFUGe?Tavfe$9I6d;A#Y{g=i}eGdDAamSKi?_0ar! z+^A>nr(v$}54w4V@HJ3xkkZOaAVKE1@Rl@b5P_#>J*i}kJOZ9eM{4O$b*F}WDRdWr zVng2n$N1+X5!pL2DaP^ymOxf`^D)E7XVwJ$wD*$gPpEm`vEQZCHbozVy4L0UwYdLdtPnV;WEA?`7b zBvi7tP*GXE*hlZ+Mx#pAeJJ@N&AWc#2W3fn`5_E?s7i)d<>&D>{G$s1738y&-};^w zSARkC+)RBZ%J0_>@*iJ2*8h7siRs%ISsDKqa4S|f*V9r)<~cG>Skd8J$s{q)uwjx; zETK%YnW45GW2%-WZ>*Y6Pjy)xl}bxbLgI(>kHBjO6Z;8V)iAoq_oKcFAR-ShGk~DL z&kwAO3gUZidN!-A$)%CP8{yN2YpUZn-P(HOV|%-R`osq*T380E(LM(Q2@B3U-E0n@yg+f+h+6V@M_(w z2k~orGj!c+KPa~ITJ{;W`#m#Lw&f)$bGqdvEAz|lPS>Vu`%uyXu7%%*$tEJ}7;jeX zJlI`L;4nWC6P4A*hD+w2L*8{445+i4HEw+s2aLqZ4q6zBWh9j@!37U2T3Qgmn9xhJfi>DXL!pP;!vfY5AfIO%o7EHbD~%J$M|m;}&X@n?-L4o=Dm?UPIlO`PDh#c3@fO#{ zj@VpSCav=dNTX(A6sf?c33ADL*7@~X342s${iY6#M=ScV7+zbk_2i+oNL(P7hT3m8 zM*@@+NsLdZ(ZUgdhp1M|Z20_o>%pnS_Y?*d}iCt7Acr49U%g>s4!?v~{N>LnQc zMdVmCB*-oq9Tny>pbw-+3YHJ8BLc0~#7%i@h~9SP)nR~=nCGlmd&M5GmEzUDr$V7C zBJDI0p|MI0r|-mu7$NV>lFo&#mPL9CU>2m`{C4{=O4 z(JNY$Ass5_pk%W%NK|QTpo)i-tAGHWq*G{AVz46ajhNxlRPPPcb(S2CBE5AyXdob? zBEDInzd@zSt01Tdpy5|bpF+{D;a}A_i!{Tt7VtZq8x3ka*l_<|<9ag5HouCD=;xo` zXvn02JP}uI{)3&Wcz3Wc$45l)OWDW-PbL5izPNWiYhq$0iI#VxlWJJXtyvF1dq)w< ze#zBN`%=6R;ebs$1a$y3YEb(UwPTHJc-0Q*v> zf0-uLz0JV;CXb&qLuc$9$^hePu@|;-6d{=iTcsCX>AiugapD+8?r?=Y0A^gT6-KmI z1Y1QQ6y~C?FPsNkQvWwhteqo~)y$4*T`Wv^K^$AX)UZR<%#OU9ROs8zPmWhXEkh^& z!_IBzssRdY9|+h}wdg{pWtrFd5YN~|J1poor>a2?Y!AHC0T1lqo_-FNGOIm@$~`r! z1$(TRr5!31=AWdeY~h)KE$LCx99mGR$85lv&RG%ENLgOWG)h`g8{+ z9a5Vrf6RS;#b;k=gQxVK(D|Sfov#pae6wdD{QZdU1 zjl6n{P`jDP3(n?bx}Ghmy7_l+nWZJ>|vrl_>!e2^1N&)7Q-pe9Fe9 zqoKT$9}5#nG!(2!YAfhLm4PHcRz=b^{;(Wo5JJ}zsTEax@MT$yiXX+k?D>v>Ku|0w z4Kz=5LpUfnBG3>Wh+38Lc!NNahs~>b!Ra}C<6m=wMY;e6b&f38Y(UL&1=F`Iqb9}w z!EYhB4G3tFkGVJ(W)p#@e|9YXgjanlCo!Q~!t zR7e|Te#k<5Z2*IZ8%VF@;ATDQ`g=->1;?qwbzia^xN5K2vUT8!Uays(G!kZrGnB9p zVjGH>B=@8+mFtiD#x)Uz#ve7LL9Bk5HjU~R@eHxZ@gi(7pE1owuf|E1nc|yZub8c{ zUV(BIy*hJ@Ka53<&sxIIyMoWV{*)A|N-DrGUR0kH zl1bKP{>GI6dWWf_O>1APX0m<7Xv}Wy?#$)%$iy^cTC261$y^Jd zy%;0*yE%z4wkQc*3q4VV%a2ns&G$(~c2ST#AHR@N6E!LrT9o-&mxOt4xmcaG9c)5n zcXRC^fiQH5lV7qaQIm}s@k@#TEO>wXDP#ug!QS%h;fBoXj>elCI)ri?ZKy&ys*qkW zCO=f_%TUP!3s4K&M!R^ycM*#Czjd67#)Abl#m;a;oJc!89JgC&WdkDlWh?7uP50rt-_?&8qVk`W>4i=ktQQ zlPEb5kix-2`l@$-cGS5dfu?EnZpsBUxx~$H@`>Dd)I0Q+QF2+hB2g2!iGis;S7%Ug ziyGa4!7uS5RiW2*=R-|zFc3PL{02>XmWs=ynTAU9=TbHT=~~5%Z$T2gn3T3j*2pUw zrD_@z+7YIZMy;2gqj%7K0m|9x`99dkchy=SN@sO^Gm;)ig&s;XPi50ir<=GQj;z>3 z)mkmpQt5_9PB#H)zDkHs)kfV<8Oi#Qp!Y8-7}{XRu8qouvXus8>d~_)42+E)Td%9D zqS$TS4s&G=bLD&9@2KUE;^tecm^EddUV!n@f=s08ARm299VID6^N0bZsN?y1evt#T zgH5z5bx#L|yZw~vg|r6#wGuI)_RONiw^~VFN`sW#?Qhi)X5l0+BJsWJBXwbq^q?GE z*r9L0q$V2HjyQ5^L8OkZ?GV^=vTbv!K)8(Rsf_T!!1q`72Dj@2=?Ip7Y7CaU!s{W@ zAoNSOdQya0qSH~!$XRyuqR=Y|owwTsBiUCNc_W4!#iqJQ3>}>znRX?6Eo3+!R+7X1 zuq{|`L3Zkhrun_553p%GC>|=mzX@sPOzizjOPKp{O=#Q}amO(Z`%& z_XnZIqwkL!U&|xX5OewWAFH>pgylLM(;)D&FJI~bFiH-3G8Ob|P)045tVOs~8{1X) zZR4V{xXJtsv|XL%VAWJUYIHYx6^Q63i0I#;hsh+X72^OcH_62n?m-t9ZH1D+ zFL&xE+LWR=U!yAGP^z(*_ml0psYdobYxF~srWI)etao46-|V5rA0rhP3K@5BTvSif ziEom`S(ZH~%YZQjR%%CU`$-xOIQ1=;0xyQ8wJ$byBf5>q+cYJHj^)xx(+Ce_TqMGi z@g(l*Nc^jy8Y~r*RsVZ(RfY+CpR%>qDu(}NYHpMMKtqaLVI*kFGAX#94P{GT#{ zR806k1hM~Ai2hCJC^*|VnOhtG+xb5@e(kUGf5;cLT%Hm<5^Na#y1m#jpjivOML;wL z{yOS<67fuiLelV@kl}7H?6x4fX{yML*Duby>0DbA7hRp)oS#f`3~@ak81_~pW{lz0 zL=jNqf~G^A{pz{8!F^9?5ly%)DGJq#rK>oBU9?>AEa)y2-D?%vAwEmeC(&Y~Yd%}(&e?n;TnKwRd{Ss*y6LEjv`B_sZ2b8Ku-TTw80~pxVEz_#0!v zyHQzDS!Idk<%71#N`q!Hyz;A)jPSO!loP{SHY=-A6HVxqcv4;6YYaDkr=}&bZ)PR6L{Ct$|C#8uj z@_#)~J#l2+(dX*g;{K4aj}yh45J}UB!F| ztapVE8&$KIKXkR|k%r5mH^PvhbexLgs&PSAn9P%1FpxA~$%*o0=-A=T<*=;gv+Eug zG(IzDG!CIK7;#O)d7cBx=;_Pj(~DymzqKCimePMHbspySh`br!;Vpa$e0~BuS(;qEJj9{`M$Igp6KU7=cNm9b zwJglP!x-@&!}xE-mH%rP|ErRx2I-}Ako=XKnckYt$qIW*0EpHnIASP3b_)d*4HTRN z1Qs9BPTeUULdTXKe%I4Dc-iK%G`G6w;%Y5u+`guKqT!m_fFa~k*@U9$YPnTyP;G5p z`S{_Z>M`YNd%2!21=js>vp3~B{p5Z0KK-`N^>9jv3tAV@26exO4+xmHV6QRU&oOoE zCN!*${Z+l^>*S?1TnHj@oyLX3dJXP1=SNf9){(Lu4#yMh2om5%5Jq}qp6@;6=U-~{ z(A{w3>u~Yw_O;Q7imKA%S{#w%gU83k+YWYKB z*cR#@tR3fFW%$bJeUp#&Q!fve_UySZhWErxc^Fv0PL_%uA=V@TJfM|3KCGl^pxTKe zg9M0W5TSm;L_l2ePA9-t(t%B)Y#Cls=&hkJaCX6u8O>DUPt1NC@|I<>!R;lScX}ZG zVZECu1M{5E2u3W)Dl9aq=vsTC;L5BS!MrJUOtf0Mkp&?>6T+mGY!Rc1L7457wZ)^> zZ4TtnoaUZ1oSDVa26+m6G0zW=z~B;M)!%SK9~_ z`s(ynICD5Dsc8B_U1Yk7AV}VWTrjwsmE%VhM%t+n^&#r+D#&}Pqpn)kR#ZHZTj0#> z@RvWko_IZ$5ZOI($ z+h9@!()qJ!^Y@jGn6e$vY%ONlK>4%){xnGn8%V5ammm8tvx#;~w$}KzTVpH{ys*q5 zoNz_94XefJL&FXe8CA7pkw+}#ialuh<~!$he+`g1KE zM0-0dg08&}Zp4>+Ur&!}BMi&<1k6Z(+Qg7jouK%2tBip$x&H_62+pyCDzO3Kq~)L-x``V!p+cmJ z7C|;u?bWH2?V5r^d0sH*ngXo)ePJ4w+M90NSb~a!w^WFVK4r4;>ZI+{!ZUF?{`pUT z5AY?^-GbaP2!d2(4lgn;+6+!QW~Ttnz9ch z)^W<9ymnBm8IAHftfPey9N;_XhI2)ePQqD4Z#4KNnDKs8Jd>lPUKX{NAcG%Lcx+6)Y1O+t!|sI*%h zi1p1k8(H_l$~c*`JuMVxJrs7RUn~4oQF3-u5MxP1it2BK#z~=+;jZKkj zf)&#@k1sM$(uKM0R*B|N37D)w!9pKsdb&cNuXTItS^6&ZO!>6$my<_kwxR9q&c_6f z-JePvx40osUEKxWNz5YX>>JVV(M5e4G3+gNWt1EmBwFElC@w~nT1O%S%R8kV$-?}y zJ^Jjb*{t?-akgF=bBwmIbK#{O$IQ-Jv=~G?mNqNFDBes!C)cjQM&W)d;VL51)kA5jf#53zZQ{_AQ=MUg zQw3?bQCouCcN?jDqoz5gM2jkANfaUcKDsrX_>AMXMDz=c_vvO0ISw5Ax;YEPI|>!U zX1lbvyNAw;Ev$Px*&Me|clY5Pa{#k$OTUiq;zw6#e)hhu!V_SG2O{ql*f@Kuzi)75 z_k(>B*LFlhERKr7={aBwnmV+B7(N!w*pTYTA@#4i@HVR^b}Ngt=r1&=PjD%|r))o4 zjF#?4yK4K^#TG4CB;ZoihE{JBJ3`@=B$S3$LlhR!$Odqf2KOr}D+6I^&JE*z1_qJ7S*x&MXU_qcSiir-f^>7s_z&Vi8Q?ZJ4Z*p_EERy0(}Qm`bT?P z*GNYVT}_U3Yb5eMP(B>NDuY(}I)e>a znN831q%Z^tJ&0vUcQOW3=t}T15@9Qi+e8)CtK^L2= zpfM`UlCP?^OeBnvHgXQ~&M*H%Jto=UL0Rk7@ujNxS-_bVsCM3=HX$!sJfO~W&KVu- z9S@UB=EHSvm^{c*I^#y0(i|R-lHF?%-7VGkxTYTTDBSlsujT+EDS6G&>d@Lyi*^T< z0#8z>qB0I1+k1TN*{bE1&z6daIt5-x!kM$6&@q-w%=g|wx32Q1>bsLa(zE;mN(0;! zPJgTI^Y|zYz^C{169WGoCHa~A^hPwML3MUSL{kQ1wHzpWzaM9=J~tpt9!#CV9y58z zreXj*BM`J4Bla5fbRJ2CXLSfGbx+3TXLEz;qvO^)=6VU2*lgiujWf_eFjfk-IX0s8UMKOy=iK9SCKi5!Y_VSV~I5vWZB%c6s;mFUmPo4 zo?Klyu5GtJYjZ4Tkb|EULu0sLQYj}6s9SAAEcF&eD`!6A3w@>wneq!3G&}BjfkM%w z{JyuDD17qJ*vCMf!Dtq)aq{$~{M8BpHG+m? z0F`Csbok}J14t86#yCthM(L-T+sONKKl#pWe6)fRQvdo|Ahs|dM-S|1hA;PKf0RIV z|N9!4VAOZ*l@gQvRmtl+%D7WcKDAyUp~T-ZcydnB_^Q^2Wq#=r`k0tRS}OiDZqd5Y zoc#I6ddJWDCyap2=rkBNoiM86^8Ij-4uk#9P7?~blcx3Qhqb%?S}!}~D+J{obB*nE zLB^EhI!|cuJy*sFa8-eAexQyJtT*b%Jp#xHG8REj_%W$Xx3RI-fvtTqt}8-q)ZS}g zOXi=N!|+qK&+tOMpT3n|VQ&q%kT3K1xi29|4Zh?Sp9=I}%)y6W#Dt#@Rfk`6pUUZ9 zIqB@WnjAo_nmsW$@Vm#Ue3D)XD$0Wi zusFR*>5$}q(vup<07cAzXD>uVCJDp)P>>_3c^Q2bj+!N1h?7jfkxboUm}}!)$8C zmFJx#C>3!C_#SP-I-Z#=Z~du$Z)efj#M<}lnzb)=wl*xY;*Qadqii+CcI(;cEz=HA zyo!-zc_x={ZAYm>K78nVeUv-2vA%DAU|8Wb;p#s*T;9R5HvINg40VqOYp|=iOB=D# z0yC8R_hGspbm;Tto6!Oz{NIe$f0nZR&51||$x8n(g`%_knhXFv9JjFE2Cy(cO#$pH zNLn4PAH969P=HwgepgDdx~yp14`nP( zF+xN92tYt}K=zR5RwV^pIwQ$y{9H%Rfn-b9M%rXeN>}uPB^_P5A`OM`N2_(jPr|Ec zF!5%t(Ac*1)ckIsLJz!BsKJz@_QyC-ftCI))~3vdxAs!d8c=2s#Gi(-GoJMKG$y;EJwF6$&#edsRMx^H>Q76)@;ykAb$J#COXR~;+)W(5Ps^57N7Wrjvv$b6#C$ojaOLq63Yv&;rv-~!yRizJ;2{u_6L<-g zM$-Wey%a|Ok5=lCk-I}4cp_D*%vu)=&-E3$r&Fy{m5JAs6SacJO!%iB3r4NS8CtZc2lUBk6L&H=F2Xh`bUzwEP982DbiK%mK%J60J;OjM=G;|)CSj?vNfvq z7~>_b6~Vhg^{Pyl>SJf{{NzmR(!NycdcXR4nIj;bVK$r-G(nMJ^dj-9+ynJejRTm# zHphjswF`IbSo&H6{$YX|`XC8)Y~uLAU%}>=?BwNYb2maxD>X5d1nI9=tE121*Q=ZO zwKFk&AU6U;f5^& zs`$cBghIR;aT8{m_ey-a@Q6sH?oSjvbv z7)SO$Tm;;wT%`lY`noufb0c;)7h>MxUxjUSve(jhgvQ&vCjX=n{5g2h93c z@B@QhK~JEtgFZDrcQTxSlYHCGsPMx{ph7 zW)<)}v!Q@dpB@@Q{Ba&+I>AiX1}V(y305nnciVu^at12(O}oAQbQ7_* zCSB>xPpPUu2(k8;N9!{UW9_Qgb-2?#bX-W*MIISAWZgPiD)$8R0?>o~DF8tQHi7rpKgCJeLv4H zGE$dbpTX<;{xL10s)I5=;BmyGeqCfTGPF#*m?16_J z1*PyJeDbOuj$H2kdQ5?a4g^>7N@`q8l3GX4K*vBw@Arcck`Ry)5Hf7A2ZAUaZTas_ z@5LC=DgFB)Ccf|gdCY(R7@_~$WBym4{C}l|vZdlYA5v$e81ViF83n8`|24l?H*qpVI($E%I|=`G#vpL)QH zlGimrSCZHMJ#K*~(S$Uo$t0?r8R8Xy;(F#Mcl6xFF?l}yE0x%cvbEHuN=2=9Q`we4 zuT2>^kj$`N$^o%JHhKfnC0vI~<+YLeq;hMe3BT`*_bI!Ek!m8wuqf92;d)^&S+#T! z!I}(p8Djs?I!GNDE-N&xq)=!`>O?aAD%SSsQxfZBF^3{f4Hx7bR*`-zx=0&U&P&|H z6$R@!2C@{@qu;_ob-c$sx)^n>0?Gx0I&irJab9d{UtZ@D*2A+@ZL>#M(hMMupThm( zyZsVnB1b@@5)u2wIFOn|zR>A5Vb?CCM+5n zrM!e~R_nI}_w31R7vk~3*nafn4#haWy0JNFSM)Z~!-Ji&vGlwAVa49d2{ip@qnU1b znA%w89fTMA*LzCBfxMiEeE416$V80lZXByU#qXjn1g51hr3w&nK^4x49b(da+9HK| z+cza#c(r4;X@4uW;l@!f()t}XRS3jJpC(1y@!l-A^0j!K3b%$zQ~dV4c^Z>bkofy$ z7F08g_2SYF_^r|8{u^7Xp&`a$6zf{76ucTX&$>u>! zp{6jh7~R&ku>jU`{VeiD6@enVbr1R;1{fPa@ed?l?cgyET*{(eThKchr z*(q6mmH@D0cy2d7F7zD*iqmQ&MFkXwt7o5sb*O&H<%_lB8i$>h;}SyOjrLu*XUp8q zMzyo;xH$*6yrI}{?D|#G$&|6wLUKwZ#-g)z=fx)%jhL-Q4ec?al$P;92Eh)cO}&vt z?zK}JH6GX)!YBfcj^VsZwZ2O>q-2Q)Ys)Q$_LMc2+~y{1%>@vrDz_Rt7@_L-kd_*& zENE>)xE;@D=uHP1XEO7z)dPwTXCH`-2dAs@k!dwK}$RXulvbp-Z zT*v2j_gQx{D{a50*HW&%LT-F*T7CIU98in;^+!Rzg~+H{Dy{zFui(zF#O6@`q7h0& z-vckm6H96}8$n}l!Ozup85&89T%uJl#DlboxJP1?WZ*gT@ksJHE_x)%+=8)$MZg4f zSO~RSP>_$|74kdTzJPC9Yvl~oXvjoIP!UAMP#IR?6M~~&VJdEMB;NbwBA1GM6`RU} zj0;fsnPScwtl?Sd_>YlZ+Qex%MN&GS z{%*Uo5MPck`Oe+!fAm59y9eJtQSAT9-G8R-ceUK+yW=k8>$morG!!*{7DO@hPMi`P zFCPUEg+N78ibOcUPgbi53g@I6O4G;;SAl}yNC~`NZrR>MJQG$DHJX6VwCwD3TbZ|y zqodj%8g6x9sIC&%@~+(UFR21j88AJT6INM@3@8!@8QxW3pO%asMQGF@CeJ958jc-{C z?O9CAGqH-}-EhuEQyeud%xQWEBz~sUP4uv!seHAng(Tm7ZpkbhJ9@ubRFwZpIGoiM z;Y)$MZxe3jnG&r-M0AZWvaI5)b3#-%5^HXvvC8V@ARZhGzT80=)kE=%AQ!?EW)94q zv9=s?*Ts7a(aLpaRIpUF`}0h#)$g1D#afqOY?;o=tR4K3A9v+kgJ`-rD$Q7Cf@@-^ z=2D-?%08EoSlN;tAImUTLzRUj7cY1L^-#~UrJY^yK*TX%fzU;Zmk)R)Vd~i;2CyyHk4LD#Y{oEx?UpVa+qP|0oK$Svwrx~w8x`9&Dp|2@+fId*ob0!IclW!$ z{`MJXjc2Vf*3U=xocFwhF))b*NAg4XTN`xPp`(b4FbRIjur4=$&HfdU6_ZAk{0;&B z(^(s1I5igBP7;fs6hSV+jvqE5RR1sYz-KxFxIJf&G7QB1dyrF!xRYlgq{iDaEM5u^ z{i;D`UWPcv(`P4olIO_J)a||()E|@wjyk+t$iLLVPezG)LQ6qBw9IngcCa-EZcUK% zhe3gTgg2hefVN?FzJkReZ)||3PoHCBuW7*MGCHwGsuiETki@^;w1#5rtGMw;hksdKX$?Tq$fTA_4OcvNqG)j%vl)LTzBYfUed zA#1`U>36)cToxMKncIjZPZ$K9_-fx|*@X+cwLxf9>1kc#s7o#9X$MLL+wnEd#VPW% zxorC8&V&TpMRcX%PEz}lP`C42x1CueH+_e?lg6_7k=DF0IrjMooLMJ5Mi{xbY}L_W zLw5lDip36^9Ii$P254pd&@Z>H?O$36OS>3Lw*z!J9JMB zHCqhRLgdsFRd~QHnzXH_gmt8D6p36WriiSRYGl*j>5)OF_uuZGfg6#zvYXySmgD%j zreV3o;G*}kV=>`3Vs*KP;JSkEA^fNiCaJj(o;Uhplv967Ms0)KGz6$S^!xjEUh9!zOIgt)u_hXsRFb zf=*pU_Expjaf>#|LS9=xN#hVC40iPEM@oqxFL(WSiWcR3>b;a33XWVw=$|nxz94*U zx?6f=;nqX=9mynS@^T+GK`_=Hn7@yp+cym>$Upb7z@(0a#>xqO&W|Pa z2}x+4>UB=%H{0&h=~(Ew9<+?IM8CY(v}fpZFWx}AD&9eRbM0%{llgLyW+m*aQ04RR zbKKhEKSmbL`XE%ih(3!cJa!p(XH0Xe+*%5f1}qdnY7fkP(H2(56zf_%H3)ZT2!~I} zH74sFe-H}+OCsJ7mFyNGoXEK6L((MTg@O^&UG(MN>TGVmgEU2zS*JRpEt1Yqz3|0s z&puP1ra1(q>-4M4>I?l4Ui@;wTu}`Xd87du{waBBbH5r`IetnM9}pWidx_VNH9&$V z1}E%t#UOTN*R)G;(eJww_9kuA*o&0KesPoii9|{*ZsUYsY0V#($#;x|7r>CYf@S5q zqDxQ~*8WDCOgN~+tAv^m*@lVtVZ``W4(ecbm!61O{jB9PoDgzs!6N2Ht@;#Jda1mBCv($rHT=wsgusb%y15{B*h}Hfu z>js1L5rJ#(cw(6mD_`FT(QmNB7m={9cD1B;H*L^9;t_J`jqn!fV<7UKm0(yuJ)jrm zkG;#;^}EzFS0`J|4%g_+-sM?7tIf2cH7p@t4zv;M;vl_nuo)iGs!r`~0LbMm!i z?ZJ9@;{j)2{Y-P!)25y5r1L0UN6=u?19gj_&XG~R*|dnWY!eIxg4Bd7!%@cliM3I_ z$Hydf6~1F_70&)kg;g9qE`SBR9=GT2O~ax+Xz+uUWuIYUhq#0^Pbj?the>&oY>kdi z&2T`KRIQ9lqxi_MJ2S4@3fQeev`v?O=qF7i|6+7>wn%Wg&9v!PEu~hVs_uNP173JUkNxGRW}{mY|ZXp z5o%Q*Q5f$sg%iqnI+WM;On%xO^)&WOO3T$i8w|1F_Z%OH5g_$Y7fNQk5dBKD9+|=4 znVc~@>lD*;r_0K39VPKEqR4XCWXD`&Bnue!DBDFnp;`KtJYXgah46D|hx0h*^@yVNn@ymSK@v{QPD3Ppq{+8K zgf){d%R8qsnj~sN@kiL=a5LOEHkG==$On2+ek^1EhtHseNu7=nqTX+8KBY z4y$g98U$L8F&cUxL*m0Gp-_C6*I2Yvauj!kQFcViPQsp*d}0QT_Gq?V{XjDcWF zr^Tp14a7~a0dWTvU#)A1SF_bB+JuAjxR(5A@u#Qx@Y&~v(7}lw+-xOW@QJ*;aLtL= z$Wtl-oet3p%4LfLVTnD9GZ4F1xCIGY8n$nwgV{56a&GbVI2j}|xhEzJ2C^{nrG^;g zRX*m^EzHj%9W@fj7x2hCK8EPH z514PkloAM3M)1lQDod#-c2OD&`KL3-N=2^@veG=k~|9_mGqwAp=EMVDS3GfMd~Gwy(Tjs8hq5w z`2BTgtp)(E{$jGEB)7ZzYk!7S;_ZFy8dw2zWj zdQZv$TbX;Zv9`d;qLX3)l^uht*%wlV=WBI1w)v|1KGWim3iS z{6{$UGd5jq4P}#9&8M=jeVlu^HgkJ>{{S%swu8Oa^@3VE3S#;q@t6#*#Bd zGN0n79R&v_L6g;ek5zWUPctJ4m`@KkW{G8W@@J2AhMA&m`-M~=4L+48JBceDs>fW_ zkb~J`nKF#Er}jv|$XheZHO@K^o0Uo}$5JI-J2ho)R<=S0jMY&p6LowBD{6-sZ8S)& zPmi5~4PZaqf)yJ8bxtresIW?V^xQ{oeaIvRYo+HCPoudJ6--mWfK&APMa{e^<=xCV zEp1c<&ZF53=1(@n;@m)cOtNML^kqaJ0oM&|5sEOb!7?6Nwg%@*kKNvDICe_s>^R9@ z*+Nag8a$uD3P&?oGt$`+sTj|uOr_y4vQ)wvfD=`5&PsN-*rB_3EJH1~tPd?lCL#Kr zp+Y0H@zfHYt*B|?~}iDXr(O@dqXAP zSfr1>WB4*TJ9rjtlZ(78Xf}Bw-4v?$is|9=GbRx6@PIR{2vl|`Q&p-n@bJU3I|mF# zt&@XD=GufIr}_rmPO-e_$85ZFJQ)ll_3^|@P2NDB`>7^&;ma}NxmXB9{k%>#5*pnS zc*+Gag8zBLK(tnj_7hep=m&M>>4vx^rR()j9kuUmFOW^)wIHD{nb1Swssk?$qLy)< zc^^dsXj4|PNBYv$1!mpFjCpVaXfE={2@reIA`&r=>~C&vi||A?VQs2JC&Lvf0zCOS zrr{(J;=5MEPVxJw2GgI1yA&kt7nH%I_RMYOC$t5`U40Od!3PW&La1Z7R0;0k!MH5U zXXHccC_HPZf26d$i$miU))HbI0QSt%g!~2wiW_2>S2JOc3a>hUNa&9KlcyLoZAAUE(Q7pXape znswkd+p5QA7wdt`CD(Xqf2MnlO?Fd7?fgYNzuNJS18U~dxnqsRp(||6)%=BP!|y+T z0dve{M~XgQQCJP3q4z3D>?ft6?(28Hfd&Dicb2#(7@2Z)Fi&Y zIyXTOMVSRisF8|=3HT2PNVEVH8;nE)u;;4*KPYJBk{iTOi~s~GC{MfzC~OC-1CS&^ zI0%Fs1Vf#hT^$X6!rZZ24<;VDf>p9n0I-LYY1MriyO7OG4HJ{LrDCY$Wy*U@u9c(Gn& zHK$|?YMat>{f7QVK0oz^3W2#KTyahFJ>?wdaB%s5z76LBQQT66f|>Cki&KPhnRGJ6 zg~axL0Dnrh(Gyed#s+ty+@Zjrs6dM%7h`!b;{wd7Sc@cQGW3$`23#};y0H?r%qPZW zs+ewnM1;vyvD|W@T9Yh+yG*0AMuk*W)Sha}V#bej>XCOF^R{HWOy2m8JI_^gTAs>V zrP?k2p$2wh&$Ych$(Vg~vU5|M4u#-SrfbS}KU;kh_h?gLFl)$6RmNO$swhdrWc8{k zBVaCP4XIMg9K~anlzVOf5=5P0w&iK@7ZzYEFHV&(J<$-b-*TgKt?e-M?5MAo#vs4W z9J)%}U9};^Dg0>B#UxUL-`;3}B2Rk3H{O=G#*rh}-B_uY@vk6%i#~r|GWMrw7V1Ip zm*hGX2sU$26!@gx0_mVh)xWb@Zu~%f7Stc?pHD8I&XhWhiW}qeEve+0c8X)Vx zugqA;iJYvn_gteZRBN$I24#dYxh*;tD-NG+w)+~4c6274Wh?bc9ctF(HlKdWY`fvR zfdK~%19CUl*BW?{(Xp4A>5XyOO>c>Im6MlIYKE-#>vGWGGC!VqjUsGTKH4 z$SH=>+a^R%Fu}6@;gJ&*BIKHAP9m)?*3kj(e87%p{gv92pjINE)JJ)BfsG!-Mb`bS_-6zWev!&$L+NA=ICjM$ zK6~O3?vdUh-7xb*=cXTc6LJ6eof~(%$eD|m9p(eVKiE9OF$n-))ASe)TD5nyv*(sK zrM>WhibBt;0s_7D0@DM=+}W}*BC->fv6{hUJ{9f% z@$rf;0EviUXb1?1DS6z-d@$d)!+ye}VHXWh*S-CgfLL3%xtmPnbf z9QStX&3~Z0YFZYoV|RQRqxR+xGB^5J#z!^*# zX021YUMHpvN;~W$s)`$VOeBStUede97s=qRf|m__Xl^bishFL~TOS%= z-l(((HS}ntuqOp#@Vs!XMJ;T1n}Fbt1#CA)5my${KxnoNy7|OkU{^GE_ts5tGu{6D zWnOyL$=G`N|G`Y!g5&+Vnd0tYJMhau}lOoiXyqU1H|Vu!si3dLVm9OAi^E>XYyEDV1Q*6dZ=^5(yH}k zxBS%ZaIO7zghd7cnML@ODB%a$HEN+vv>Fz9ae+#rNi_wnX9Th`c1)yg<@rf!V+n_Q zG*cjUVSRRqDok8O=7DI3P55jbMYT0QvRN|9Jr}*YGPxoxRYNa|AzKI;xNV_Yf?9DT zSrlk4u~_3_B#BgoRy^S{Ohbig#oHq@8VwD3uR>Z>;anGq+EW66s*kcc=8i}jgm0uh zu_)D9=SmSv{jjv*&L-XlZm4*pBa9DG>^8e=w-&W9z3PF3uER*Hd-tJJ6u=Famm{?Jmck2vm90_iB8wT{dA8c=8kELB12Bo zb({5)#^c3Ib2i`_E8?PDSnQ+u49qZ$q~MZ+rNT>BxM?UzipMav4wkjFM~qa8dF&dk z#d_IF;2@7>8`sPuS{3H7aADlA>d?@cn6<6?^P!4UJFN!7`ilalvgMAY9;|BZ4{iKY{H55j+*FZX$ z#GU}ch-x`riVDpzVuezI4KCMCgIJ4k9iwIcYkO7R#6&8Qs}r= zekLnMdK;AB65V?#JD44f4Kf);dJ#o7wC9!i0|d2$i>X#wxa=@e>szQ;jZED_x{TSL zaZr7^3NJf9DUlf1yO+@g)2s}N*0PI=d`7)Vzrw9(fD-p!Qq8G~R-Oefeg?^(v?qd? z>~I&835~8GI{uQl$04|+fn^*sGTSShZ;7|j<&CFwV<_E$BA&S#Ivl5tYdpJshrUX3 zlrKDkb17fux}LN#wF?l1qb=F97x`4`*`@7SKG&-L(vLm3VX3tx~l?Pfb)f-~uls zvCOzpO|zUu#=GH?%*cw2XmrCx+f^cY;)&d79oV>?d}+{129BlW6Cc0TjL)661zC=m z>1WGF6-QtT>kpBlpHoBa_my&J4|H9}9}I23@rHfn&FAg%JTrutX#k!aG!2@= zTwpN2@_)FIwx84jN2<`Qbwq@v0zHu#D?B6th&RG>2~mnOG%kH2cS}2E1Pi4~M>43o zz2a4t&&YmNd#3QUJCrznk-5-d`jss6F~<^i2eVunnhrb3DhLpjH$xB1QYL`%{vMUY zxsuF^PI2@KhmfUc!!u=(+==vTt~;{S3#`0wR_d#V5j4zZ2^vvB;u)Mfi4|~dwIUS# z1h_>IcI_D2x|hkKW@U>2<(^c}lhNwb-o1lV97eu!f#*^BO|@}NE=Eto`SRaurAsMG zrHPbOm-Fw%MJz)mz;j)e!7Ba3?8!K+9h^EQ_NBkuxDRIKj#x#U)Uh@S+rQ-a9kWrE zJ=aX~)VBwj5|So1RqJ-5o>kzQW_{?~Q8m0ZloV|%31b_w5BnJs8yW*!$Tf$seEd|_ zo)U8KuqoRq>7%FGQne^{C5WeDua%DH~ZLx1Y9v2M(Nnvu`{+5K?tlt&4biLNuv;;oyf z3f4g!CNXZRse&2EFA)1ZMC`S&F1EvQYU`2R0y%Rw1{Z1$zIQrc+frWY1=rNzrF#Xxk;5VJq{9RKcpM-(#2OON9 z(?`o^7UnJ|QFwH}NsWR5sB#4v%2L?cI`(Ur7YN4u8paJNh-bGM^FP#N9<9pdsyTxd znl5Y;MvveN@XIu5byf)QKSisXMK#%$Fdkprvin@C?}(xn&FdmO0~@K*y!+@fr}6@x z&dd}6+O97XpFA0jPQe9W&)}<%(vd&)6))a#aBpy77PpnipYb(6yvJg{D;&Hhp!|^+ z`81ar?o}A;i3IzIM195$dEIs-{0K;Tro0;NrGoj43A-gcZT5Y5@(Q2JNBk4)IH&2F z82kq-KEZn}Vg~Zo3_Jha0oRVCgS;p#KyXY+f9nulv9F%tT6K@6V09;5p@sS}Zft=9 zI{ryrs8{ulJ>aOob_}}=-E=*933End%H9vkwOUo(wEhT<27p=T*48YR0pRXPWiPO3 zq*~KKI}ck=CrQTiyfncG1`$OQMyFYVdc9|mLdGz)z)V@8Pc;-+Fp#Md&{~ihwy9rm zi%bXz;v^HE_+?nb9IJszwIG}G#$&&lkxScZ z`2s)~uRp`F0w&~0E}-ZgirSyG21T6AD*eDxBS3N>yaVTuQ;PQYBhK)$wS&xW%hs^{ zsd=Ny&3fr}tsH<@MGE*eEV3)MhEgc4v*rLEJNlh`$Mc`5H!|Y##LvG> zb5MmMyV<`I74*^mCuI5WO>_RG6H_pBa{i}(>rV|&gDg|*Pd?kkTG`%a-B!2p*p|-D zCf!xOj_RuOj^;vH>3R4LU{dSemJCa!L>CvT$Yrzv*u%0PM0vs)OrZ~7X%nIh=z=N; z$jHc!PLbi^EdJMNY_jt%!k?bKPrh5nJzJEX4?*77kaZ$ct@}hhwYv!L?rRBw!fr)- z3_J|K40*1G5ZN}2#c>dlCZO4*wR_vy8ze@n( zzVRA}=M;p$Zlrn3 zQ}r#MoA+LEn|V_LL_M^aeZ}afX$rPW_PO5W@N<`Myj?v6@jvq17_FWQUwevn<pqrZy+9C^lW)tkF2QcD-_GVyEoW7xXNd+aTrv+!|mTS9x+>!Iyw!MA2_5aF+_ zo=fqYIkQ8b7M}F2Jio(#s%?L+C>G+igA-Co%gt~DyOUril9XG0Daln0a5w3-xZNbR zGK-RWS5$$vl+^t4Btt1Weywe&XsXi3;|EHr0{c^4+=jJ!`|yd;fI{DG9o1~9Dxa>Y zsBe-{**tm*<-Y_N48QZ`=mEZOpIjnLZJRWCd-)i;ubg1W)U5BXo>Sj@zT=y!!gyB` zZFWx+Ua|FWsRh{nT)u`^hf<2du*cM>0I>}vs+>CK(BaeVj4^05Z;gx3?hvRPZrwzE zsBlKJfOhv14&-uO$eUQmt6E1zz!mh@G(K2Afewu(GS%u_lv7YcD~;#DdwAtpV#rC) zNp8v8wPXzp4CHKzFHKATX?l!Q+c+vhRIzk=+xmib^}xANZB-qyK~+=+)i;qe)*KwO zRmb9!-2>w7YF{~v|C>c9Q^rU`3-qH~j7dlK6E+onkXenGTKPsfCj_8>OAyhkpS`dgV=l;Peng{oqmXZF=?L(*Ej4i_${-SeqH zRH-_7#DWtpi?dUyItSpqbC<^%WQ)$>cHZxL9$zB(x4G6w3+qFN;ef^%YQJ(?vC45~DgI&C1klK}+& z+Es|@>7|Oy?s=3eRx=ojY{M>nT{X)`)JCmzm&y)ZG)pAg8LUlz?)BzeTRG9w`toB&ZJAJ_52Ui1bTiaSbgV>+kJ6yu-5rd?^a)fV!_*U5as2@E)>7pZljNY8gGMROkUxSdp-}CxNjzg_ zmRwqMS)E`@rMD_qlq*{_txRsn=W^vzK6}24L#!Y{aP`)TF(Wk@D$KDraB6}YdTcX< z6EjlAPSQ7996&eHGpbx!ncu2`q3Imke}e1}nQhUY>Tr+@(!$~DLk|TF$?4a?$StO` zQBrHqAX{kHOtWp!O=@)I5-*mGlFAxjizCmODt9PlI3DxlUYkX(H;ag97cpdrXcQZ6 zRgII}Yh$L5fQZ&ws`HMU#UVglPhcL`wQLFJj58s3VVqLE3@|uwY;ecg^)ibu4GJq4 zjY^VLXdhi;gq%sd?dO5lZ$*Y1oc5a48w|)xnKxXqh>Q()j>O1yl9+(OHpU_7>}xwF z`Pfpi{w>))#2nMS<|&G5$-)vz)8i$c%rNI-7BlOwl5$d*o{r;~jBT=j1|>o{W4Zq# zqRB}y0X2m}Y_Hxry)KtF!NC2}lzC-oy^iNQeLvjJctx%*wpOOC8^hCJsgyOJBuge) z5m0L<(NTb;c_OCJdXt)T9PUvSY*Vo(z8UE<&tTX`rgUfKG>h?&tgt9 z-YB_fA-B(r)5)RI&VzRI7#ve%UqZ{RTCp`M)>58trS02X>8bAA-068yml++%jY+0F zHlX+l-nsZ?uK7RNJXV`EiT;nr!btL?Vfu`wyT zUXf{yt24V!1`*RGgM4%vSy$81-j}kG?s3taKvRv2-!t!N6Fs%Px~0%fxv^#$O!McB zWO+3rCMM#V^&S80DRi=}Zg?M-{Gr#PNR|D7{4~n0F`RdEGqg7b{|+t4`W>{H9oSc7 zX5hqf_gDB_5{cQ+kj*4+#nl-CrEU6t+jgus6DvoWv{#o@L24zRtIkok-7q}8TCr;p@- zI_IQW#O^i|s3awY3p^n+7^&BUZ^1TwL=>G;Zwby+6byto%Sag^)OL&|yCnTy^+1@$ z*!)%%y9d?aCxe#iS^tFBA?JPyxU&0Xw28O;ZyEyOS3Jru&^5~)z*IS>Gn z`AsdU1;7KWtC;BmIXX0Ccv8D2;H&d?pxsdL8GL&>gfYsd3rHEhuk0trkDj2c@v3 zxIIt_4i0jJ$#4C81I;Q0Dv~S!CoE|Q1vNW*SB(hFFv)i@qJWaP|Dsm?-|NA*xPsVMm>=cptIwTcvBxDnuUXca6SMFTXd@ zav?V?U%0ap^WxY?CPe?JiWDIy59`vvU}=5Ek~;^y8_frto12zy2TM)?G}huwAq|f0 z+S|QzJ!oGiDpM$SIDsokek@Y#V1q1)0F`F_2t$>GfTFqv6c36k>P-jgp6@l(Z1lVS zp{X=Yp9dO%4n~|ePg4t{Mg{~Zo{3~ zaDO+_gT&3+$2HF70A(ZZWngL)ZLNOgN^o(5e&A{}CFCAM_)K~fS zj2k_EV&6iL{-H2_!!Uke|KgU~{p$Skxk&$h&3Z1sqgcPgB{}Rkds||%r)y}RRIWtj zY4)3q`6I)|l*U|Xq&-ciX7>t3sw35wCPk?u9sUjLZG0sUJtqZaUE_M0ISb2^RoUQ5 zrDrrlv6y?DGI<6Y+F%Rl3H=;rV22B z+Rp~1)N^d0mv^UlFwKCjoDeEGFm6H1lQ}X7nhn>8htmwBa$zODuSw&p>hz*NRX>>+9ZrO;z zhcqB9B0PRH#PJ?@so=7?{P>G5<(AD3)CdOzH1%(D<^Fdffy!4L_TP~`-~W>Etyfoq7>5_^0qJXDRSw0G z`t_yJQ3Fii6;b$I9?e{^=}#HJK9V9(P$M!=-2Fp(2Ryvg#T)5=1KN*symOBEr%(Sp z9|_j*AHteIRbH0YJ;*s563)+d*&kBd9kjmo$cH=4b- zun{kf<)H||TE?eEXuYO&`H|ouTxp>|Z?lQ*wY=fR*zuVsI0Z+vDaG*#I`vBBQyNfT z^!%rzf=qHT&>gYhu$oBapTn|Q=3TtD%FUm;>#VQcyf!dnqC+pK&|G{0Ym_!r_B8S! z;WLEnEEDpAtjQfZU#3G;2m|dZAAx;&YjOnuzVAm3D-59fbj*0XXd67T{MrgzlxuGB5yNa#-6uupmRrhI4&L zUG801i^{{F5W4ar%m9+rwlf_3_@ozV(?m?T&=1U#cWi4y+6OxqFDbZI)PUsjmAAl+A@u|2XQl#0 z@+x}j3P4LT$tZ?{a!y)ZxOT7v8$)rEYdd5zOmdvDk3DN*azYVLTb7Y^d1*Fx%>hx+ zL`?isT{a1avPn;sA5M@P%Zv{U{mzF)ytR{&$q`SJdm5FG*sV~5z9Jj78u{heUk{w~ z)^sc37Xb49Z}n6E`va$H_aEY^{~?@GSy#q&Mf+gKM43yGrqTd2stA{C6S3+}&eDQe zVlScxUK7yP?FTXJr=W-u#y9u58>M7qeBOC3!2ij;h8=*7|F#18Ni}?Z!9W~rI~2xu z?9O$}v)z7io$LSU17ZMnP7KDp9_{R*KcI?C7~Y0a(8kbO4s;|^3fhJ&1l8EkPF<-j zI1x1!T=zo;DXKveX3q`DeSnJAh$|R<1AZq5#NM#6Adga&&YrBbNq18sm2G}uTjZ0{Sbt27R8;| zRyK(QT~E<34q0dJ(!0={tyR6nao9DhJ|~8wrv5~=sqrnYhm0&wvDl6}ZMHkn{q((J zjUYH29q7^$_)QsIQz_qi4*)ltDjqY}ilZdlcNd z>DCgT5gdnL?d_jh?0o81m$=PQ@~kUfayy^;-M(Yp{FoQx`*G6C8#9$#EPoQ9MBe6UVnKvTj*@M9=it>E2rsKBXxOig^eL3t-)OZk?ap&Sc!JUjAR zynE3t5-q2@jf1R7bHKoo6#1rxG7}n)?$LZoYewUT?PHK~*pAHnr!c3LR?^39tlG}I zONSu+KCgZ`kv<@C7>F|PJ5|UAA$dmEZOM^=9e$sPeBWo!Ef+kZK%he- z*&pOCJM8!E!bh648eh8Lz)>kDm8ujIYOVn!cPO&*!>Qb7(4OtefXphu+qa89s=uM( zxThMMek+98^iY;vzT zi;G&qqwxsZ&ie9gGM?iG<$m`kO@EX+kXfP>WPK!m=_(<^UrfBYb}KI}%{j!Zc|54x z*}JHYdoQm1I`^desq48cqz_1oRO|%2s^Z0;1I#6Vu6;sSpEGS=LT#U0AbMLPziX1G zx!t^d3Q>87v$~-@0!@c#Q(Z_j@CjJ+J$2(;e9-(>LFYL)pp2_SoTd16$4mHG#L?=CliHXh>| zFJ7#mPG6@F<8xO-{NS3?_1GfPvGf6$KqLkH@rIBk!ji1b0wIi7k+Lm%0!rrl)qlCsx56!jei zbpVP!qB|Y3tADRSJ8jV8ckfK2BqJVMeWnMK7t3uN%anJgU>;TjE1>J8=f&*kDc61* z_=3c~Z@>%&qNQk5vn>{vqNTXkat|Zu@-_gA;J$^k?7P{B%G>+5+O~~zH5|hok4?VN z|rP-7r36CJlIhw5CB)@kv%v7xjJ{y8V_I@**1z ziHw!{ghBGq=FezzWB4>|wIgqu(aDT33z>tHItpDL!S82M!8DZDDdZYoHqbB`E-&7L<=AqHz^aDHXUK)5LH;2mf;uqAFF(xJ(oJUN9I zGKzLGRHq=!hhZM(k8|=^*M=7RbBI{-BuA4CPMS_y3oI`PC4L~fxZ{xxR#NRD=&0oC z60kF+xIIOt2vo=O3d3zdy9=-9Nsr6*a#&)nh!Xb|IIk5(oxlGQt=lqvv4*}1=kwnR z=fBRY{~j~uZ0PYdvbJCp^sxMAW}nKNwYDnW=f;t1Qc2v;_V&qP?p#}Q-0j+_b~ee* zh4mr|%OzW*cFC)`_06q;12Z)&s6Zm9et~$Hz}|2skgWil69X8M5dkn{5hOvdPq zyR*&g?>^UmeE5&Or(XD{xHvvvULk&HX2OjJsgNmNLbYbey0?G;5fMUtb}md&Wp zRgRR6gw_@8EkX^&M-jydK~)l?p^MCC80kn;F7I2Pc7c#r8;~hBX2sg^h;CY8^Iw63 z2Mmlhr6!9gB1x9qMW|3MxWIQ|3^rFbS1c!t8 z^B2=g@Ky<2h;`*mRzHaszzn_Bdp#nXxlA<49=CyPAE2Ed$S=@@1~N}J#mHD!ny|rm zjTVqJX=%1bdI6HVC|`fVH}i~% zjV!%k!`0eis)p&N5o@$rLI0hlxcC@K98j@tT6nsEb1~bVX}Y*|kjX0BXmTrGy~Q*p zc8EdGdqYYPje3qiO4E#o9Wv>V<=RbWy}(xG4Cm|qnW1G|LL2+kx}Ab>o$4g%=S;uO z+#0>$wpzwxHmO#}VXG;o+Dc(kfx1aCY9b#}hcRfGtyuRt^=Buv^Km?tJ*MIQyD8(= z-kPc=`+iKS-8cKJd0h*;Gq_j-##$Pt$e@+5KV5R}Uq6?IVhmz=EyR_U}`k-^bp+k0E~_QoP-fzTKi$JY&1Q z2U2wUAotc6^)@E^*CqQm1pC(q`+LK*0w}sRPCp{#*lzv*V%@WF?26)lRWi`O5j}xz zqW;F!`^TUEc6j^eGGk=uY|1ENYG&waim2~IVuTJ^yn+LdfsBDMuOM&ekX*8?-S*3TtZkU2OOer@}>uRQsOt-oRaLDL%K zh_fj9I>(2v?|-{I{OeWV{(rj)%9eKKHl{B2|7rU0Q}I9IQvrqa%`khg-}o`;;*oGr z_96Bl3KNmO^&#oXjYE;UTCEv9)9(d}pnm@q$Fijsh>N*L=6>~))p?qW_5Swd6(KJY z6d#6N#pX=HfHsH?hNeaJg2^HlPKd#_Pr=gLZyWEfKHlutusknbItF5}Ck4Ut2>i7j zRQo~0F--4N9vj|ia4FpAoMIaB;)9n+qAib-P7DG4?zYo7IobAan=7~WYmsy8bQnmv zU-74$4cCz~NpND)Qo9_w1Ym(Ja$oz!?D=@cYQs)ebFX3CmljTUlF@#~m_=g$BM6om z>@ol4DDK~IWiwc@pT%V)Fe>KLcLi2w8kN>n20 z22_B7cLNhkt7IgP!pt2~uaIrATc{b`fQ+-@Zhs{dsE*;>-5-%8hKJsU4)A4>yaX-%zvey{ykvh|Mp1# z)7Fd60aq1iE6L=1xB>roSndZ{5*P_j-yY-pDjC?g8=48vNGvesM0OG7G4C;tBR4iP z+SiBeA3tbl)Kn-26mU#%;NVG;g8%gqPBPq%D|YT0Q`*?{?tJsz?(u!w+U&TWd;($u zuQkg<9J34uNTH~)KGRd~N}(*#NpR`0Hg#9j?Z}KGvfpL7X?whsY}&2tF8U1GMfwOX zT&CjoxM9;{+SVRL8mt9=V1KoB&KLvEs1nKPkJb__I!?Ux3u_hO28%Uq7OVPql`WlS zkg?gg#w1;5Z1h+wNQU)Eziv0c68d!;u%i)N7}C3MtjsveE}VFm?Z6~rYOXHA@AS&p zd|T0BG89jqbHri|$u4Kh8XRU@Wb-WIrc6e+P-yclG~&n6rL%sw{B*aqC++<|guP>w zCPB0%+FiD*x@_CFZ5v}35T}azM9BrGeRv>qlSv8)wk`s3j{Bhpcxe-n&cN%nr7EVh-WhRy_ zqA%)cA8jU5!!-wy&zQ9}{GyK$h810Ox~Z~pQZE3ngbO%)#Ym5?#h=-n|LRpiHK;1| z1&~(4shkv8#B85No7;fL^J#(dqCY4IlSNHkXWLI72{LTm%jITu*n}>VFXx?$P0Fj= zDjBJKs7j%%KqEP&H?5Qud7#Zl0R)f~(4^nrRiR?V8Sf6pO3Fge(Od750rs8I@4q6# zXS@}WYA(130bphr@=VkWKJTQqf1QEB8AkUy^e`gmL$530{0Knh2Iw!C{(&cg;JjsnUCYB>a11E$BwIw1kuIdwu=J6{pWv9e1rdEKnH@m=Z}iSJ`Q|NY!?Y` z6W=?)Jxk;-R_o4OOYWKh6b!{)mIX#G_MAal_m3P~C=i<`w1C}bWS2n5Q?(AU(UxLe z0k|^*%@^?_ew!f0>FQWsjHz-=t;Fj2U0Qr7yol&fm=6*&}4KzxkAV?JtR2 z90aXNboIQ@@ZvNwkNoixdYQOykda=<;Xe{VWN&+C#Pzemb&33Ae!4%om>ZB4wH42Y zrG%TrvxIBSmmMC8Bh(=v?SuN467V4)-S7B(h!nrql#h*lJqKll(Yc8uJ;lATt6D%ruvOTW zE|sX2EmSgBFS5njFW?=)kH?JI7bHVAWiz%MP%k~z#+v^DG*jjIG;DsRXZZgs(Vp=C zJTWQTS{nb)3CLS%O%YiEfd{#tI8FK&a3Bff9xq0+zz{3~DoB**GK$6N1V}JKAhC%6 zwcZOpUZZ3@Wz`+<2l>QRhJP&J#^BB6`SS3gjpv7h@d2xkZ3*>8UxpvZMSWG@Is&IqQaN#+)R|hVK0z!W}gq?Fwo$XQATNk0rZS>v-ZV#_3ev{;YS7~+U zxE+r_G&Y?Pl%LcHCx!GkOy|Cr`DxN>U7Ze<0Z%*X2$|mJ)IgOygwDpEoC7XrK4SHydX6urU#smsUbjbrK zbE6gR#(L2??#YZI93o>h8ltf-$T-bL$+0&S8<_{i1=wv?8nl|A>P7I2CCxb2qwrc> znxjGCe}y$NqWD{8?{Zh5d|wY55up`J1cED$hyBG(sk>>Yh>X))$}qb{;g+q{gkU;D z=$2p+J}{-|!sysLOh;mg3b5ePeL39hBD)h4A%!S>Ml#!QD^ga3C9fTqepjSk8^c{3PURFP772T zPvWrNzQkTMjxlcZ@P=$Y=ukYY0erGtX$*mfYWs*5Ljoczx_TQ8xyHB zuSGDL(DYO6Z?BquVQ>VOV1!C=lsWp{^tPp0`1LF-OL|X@V_nxn!m#o zS1U;yO&`2uFkB)Qe>&2OT$rM}5|8XiPm75;z?kA&FvS9ozdFIimcj!15kuEu4kCaN z!hAKk+@tbeW#5B(Hz+y(W})`gYxf1|$38-}pF%vvmgcsk-4-xCHZ8oh2rpjx{>RFo zEN9*A>t|Jv|KBL4|0|{@`~Ufx{)0^UKjC#y60}u<3d+d$4(qCMV>j?0Y`^verQ?9l&eew}!K|K#T)2;|R+Gh;>#tNk2A3+Bw2F%7=1 z)mCi+2T8s=?tkLa$C=lgPfrhPMr6Mt`*yJ-`@MmrK(GF&liv9CI{1TwszPuR*DC%q z@K*tffv7}tQ`V2_H3G5(#r>mBb`#j^;ZFw23c*cMtMJdI&Nsd0<$(}6zvlZlZY>yy^#t)~=`%3*dan||M&#))cXC|gPXt+H`r z-Ow~(CpoB^U?;KcxWAEVK(M;O-eFXUdkbr>Tlz{S1Y?>STI295ytbK3<3#xgx-hRH zh}OrJT^lv+%wEw%>tyY!^lrNJ<|T{2Pf(N zB;Y%1F5;4C_WWpK$G&H;_)s_7R?xwn3{h(sQbM-@S$O`uko8L0w3cI{Q7fDQoSI8~ z@?5e23z+c1+u7J(Nu6Pr>kY#i)D4iG)E|BULcC6Vkb<#CI)P(>bxx$i`ei_c3*N~M5?kW z6njHvnHwHAV=R8nWTIjrTedPt<%_FyWfRuAZ0+D!Uq_LdvR4z!uy!S8Scw)xV_uuu zXCL?AN^)7PqJVa%)r;#P;N&~Ai5x!P+Er#mt1(qiS$vhrG-aQQudI_YYFCemwlaF? z)^612TbhP#B!`gfp}oJkvd3tgomubUOGC*n z(}lgcn`f(O?7&oG_w(XD9l!x#5dUokj(Bzq8?ca&dZKdn(F*zP3miGLfT4Y1u=+Qv6H z2c>;W2bcktW6gce2Oa^(u|{BQvB#L3;@PHlnVIyhVO}MD5)KW06i{#VxyQ7cHeW3d zw#%UfwQw8+Rc~q&_R0GGUj!21`UF?OUs{2l^BGlgaYYLnLU+%n;HtshqL0o}P3Bh! z&GH+iS&O(9e9p1+EPA=oiX)|JrD|m>rEH}wr7dNyWzS{sWie$lrF5k=rM9KlrFf+| zrFx}1rF^A5rM`gR_%ulqiZzL`X-N|*io}b2Ky7ojN zM{=KdQ32p1d8gvwAM=+yqT&!A>yw02a43xjl|-X-595qBV2Uw%nJj2k)^!0%ImYup zhX{{092|Qpt3Fym&D>L^9(JMbqop3wrQU~a%KWnkg*`0U8LHwI7B^A{MplbfQVUmO z#IrpJmN_ii86e{ZpK<%U!D}$g=P%9+cE>FVllN4aPXzEw_L>i%IVbH>P4>yPGmifzM)r9f|A^23=%QK~I64NUL8rD3iAms^4Kqfi$oT4PjE1o%_QYv$LPWq6Q9COUvayNY2 z_E>s**4TPm`tE4vusu=h5D;1)=*w}NAB9m(ozn(6r{uRw)lo27tGcDp?H&%KF_m%gYlu{zxh09B4$z*=w^?ee zT*PXx^;)SkcXFzs^5z+9RBTgf;(jHSF>i@gh&eZxd*G?~)>JxHdtB>mZ+Fz^3B3h9 zslk;lC`nudmBds|t31^x-92sRs50c{b9SCGIJv2~S1XBR9YRW5GLdr;VujKP;75`0 z#r|!VN@$l-8dIbA;1g1kSmDV7*fl%wk8ym09gbHNF+a4BIe#1O>b;mj>Y+DF_Upm= zUM@=s{|SZ_ir-yYgPtHp)eZ0fm5?I+h?2@a5X+*2Z8`^BLT4iusA`7rnN(pb$J#K- zq@xzbq>@HK&wCe3kfNwJ?FI2Yp@eBP3^5*mU+QcOm(W8hAodPEPxxw8T z2#;D%6$(g^(%6X7Lr++R;R(_q-NEZI|Bg&LJL$<85k<|IdCAsXD$q$08G^LhSf+&~N7Ff;Pu4+}ZyH zR*zawLnv!6oVkx580E-%05ys;IC#Mf;Y`M05P3jP@| z!LZlIeuL;MwG1!A(GFxAI3uVcw7Xx5tOzqKB2~sWJpc|sdtg6mIEnvFXvz^cH!rthzbqQdvoVw3bPUI2}x~7 zO#_@lbBG1vy&xEo86&P5%>Qj4a691!aKmZ%G47bhw~61WkZKGhSOF-4GdY1B&A?8)~b!l4jR6O@K^6ujV4Si)eXNlFFG2;m}tUQrc7oOjYTtN|$b7EWBV7o#m2qxlqJl$`G)#@sp@jzi z%BWk#bmKy)f)&LcE(j+IeWE;-{t8>8gYxDzf86Ndo#!J|#X@&K(W zDU4IkW(n0HqdIxx(J`%%>i}*bjw_1PA!SbUid8n&GqT#DW=@S13)LaVzDb(FCP~vM zebbgY5j-;GK)@(Unx#A5e3&-P=It(aP240kWL)|l-F=l?#3YU90FjBTVT#H)nnM7W z-Jm+gXjw(w(w&UDY~#KScL3_i=RRjcOLeK}KE|t}y2f*8{Lbh; zgiBGg&NgBBq;uEKBeh+dGMe#pewX|i)@kiacfIO6-XW{4$_09t?b!M;aY}y8wRHeo zl2d74Zd}DA%jtJy+(>aPUM2}mC+@_DvXC*Zzwyq#%N}=$H;b+t?u#8`U3ow_Nl@P&-EuIn*D*!$KO00 z6PvR~HrDLsx`umA!?kyK=jhe?frLlbGfXx%{Q|RwnnTvHKXKUd(sAeMmGFVML+h!n z_2ra6X%knzAq)HL#i^^1vb^H#XPfB_L^N1)#?_zE&mm%4(uC@Dy;=tjqO<5CC?aUf2C@R5I7eXP1P-uVw_f6X+~u;QIoZ`b<6Tpq{x;CyMAz@y5( zQP(uHXa(!fDXge3j&MMANXF3K=@yIn8hj=iG~sEsK&zhel<> zYGMR^V10uSJliqjZ@i{Zcc;TqVW?)d;j#={S&@-U$>}UqwRdk#aR1zb~W8b%vpu6 zbO3Hrj!HEo_)7&|fA%X=%OyA_<&8 ziJ(X5>4T;u8O|B(4AcIxfZmTc8Q4h&T{veHv7HyD5Y{2y1}5NC>9jhdkbClP$oUa{ zYWL>xHv%a$Osn5-OXp8N7L8ciDqrXH0GJS~{yYd*_6Voa!_A4+)?mSAejk7@|A^3k zZek;1Bc}JybC9z?o13hkEKn8*r$qVSK@dXs(ZPt7ns_*k#nE@#CT97 zT}a}<8-#u&7!(i~NCY5pddRpNsPTQ1=Xh!>m;EcSzv4x_6??#mck;1nQJu;tdl{UP zmQBmN#TKSeO6O)v=BS(n%hU2F&s$w>o{$|EoR<$V_uj{uo>$L5`Ks6H{cTs;PA{b1 zB{v=%2V5$Y>rd%TEu4J*UjUlHIM+=F`tXc-z- z2DcCqVj5P)x5#K4>Q<(80YkEAF?DX4L$qie8r*$`G02`8*G6?YL;g-M!*UwjV^c0@ za&_#Zdk7H&)X}x<<9p_4GqrB2ziD*=&(U?BGe!IE*rxXVVQ^%+2(>LurE#SGx+)cm zEEaWou*_&HB7)ug`vCv!>}7dzXkm*01HHjNFc6`V{xCHEq8^=WA-OaT4-iq zHO_i9_0=$p-l$T zin1$jYqR`~g8#`xFE^>NYG`JB7xwMbB6Oo04U=vu^eaB+n0Wxps_37pu$Ck~`Yt;N z5fiLdmteZy;i=kZR&^Y~lW^}T84|(LOsK`6kUuKw!z@TzsM z9mVp+FudgwLI|CXFMv7Ipa;`t{={2DMYb7=N-SPtw}32LAAfWF_x^Oy8;DY{$$aIq zZhCUs?nFD-A6<9Gwd@KBST%4VO_2mlsPiL=*|cuEB95Ssz+I{zPcwNEGz4^ zviR4MyAB4dlxZ!~Z2fRu7yVS)S^-V8jrD1mXid~M1`7mFZP6L`8k@a_xDje=D~!_i zdn|us?`Crhc&60nS!5HCwFVrqRL!$TNp$9nWlpbGfTB9j9HFS_^d6HuXxqpmoK}u% z_EGn4W|@-{+5{lgsS8OkbQZn6c88W!SWr8Y-G6jq13TWe+NTC*bMpLLj>DYz*YMrH z%1AjtopdbB!og1oA)qdq;|~|pMLy%5+TTGTo=f3IjowyIi9P*Xe3j#-ESw5v)#NMm zoS04YNpn}wW#psoW@(xT$0@(%tr)rC4mB1Eg|4+RL$Z3Yweh^y zn&XEN0~y7X!zf#-fTx8biTH@-qQInZldCcF>wxlE^Wv4eF-6_XwA=l&^9b zL)X8FdH#-nD)ULb4WLBK)M`l^=jXLmeZhN6sCr;>zJG_VH7#~<#i}mRzQtaNu8VMH zHAXp!s&GvwxWs*>JGsvLl5GV%kQI8y^U820Jm86&#`&Z;(ao2LKa+m`tSLDXHJZUO z78gQ1;Nq^NJn&9^3SHx;NxMim>xnrTLp)gHujJaJ9)8W!yg~5bnF|0JmEM@pGb9PJ zI*f@To^sC*M7rRf`WL>pJ_4@!zu*cLc5=%VYz>f9pj-%_QDLf6l<@?O$&(D|{!x0A z@I9M;b({lhP7W~9aoc~v>Mj$B4ypcAdsAKFuS#m{%oseriJ+UKo+hB~77+Fl8yW4f zho2W8jk6n-3sUl-^%$oUDdr}78^0&iLL`){i|`sEfl4$m z3{)fxPl94lO`{neVx=~Yu3Hc{X0>ipde|yycbq}=mbf?h;J#$XA+Mx;1BF9TKyWW^ zIeSMwf%t_>zpmeG>y6n+a%t5b=|G-@Ch*NqALwgE1y2H^j^ggX{?I z;aqxMf$JploL}L6i0&ctVvJ*~j7M2+6n(<09=Q_omJJNp8`;QNqK%#U^$<=~J2#G-tiyVFKDkc0 zT=C9ej6K-BSJLu9ipB62YVG4RZA+QzdnCulbZu|a6_(r9BQLq?YowLu&~xy?N4ddA zW_unXZ9d8VCRzrypXhX}gZ6zl*@|4)x#{2|wf$#$tB;U&4@vd6WWRH_v4lw5^vQuF zldpB6r5Swq7No1Ao5OHux09dj3pW+2`JR{Zt0P7Z@ zxpxzuX$*`mM+~EEQ5CHtn8Ei;4p~QZA=1T}k|d@Xx`?`60z0By=u%!7mM0V!@Oq(N zU1z@7Sdg>LbrQcl#~>$l0tLGU?!uXo>F}!@z-w`8l}-j;kUd>cZ3TC z2JX%kW5esNLi4vhQrOy>1+6Uj%`WnLHmkE&mJ-T+m1O1sX!XDlFpHrn={jKU6s$Un z!724d^L!F?yuA?V?9G?oC$ z?55bWBF^l9IL;-?*VYEMk&Ge5@Qn_mAgJIII zp`{iJGJ7yoj|5)*F)e2p=2c_FdIC@)#Whx%ok zpPpl`U}Aoo)+E*w#F%vpycoTvb5W?bCficzADzv(Gw=R}!{LK#Ky1zKQ(_x;|KTveb+mUn!s}ttV@J@K9nTTU+nJn1TuE|Q zu^3;9f=rXiE{PF3A@Q6+rK}FS_0WX87!zgTgmEsE^lU6&&Vo1awf8ZtF$QzDjBMS7 zC}f!EO=DOsjylUcX0UBDTHt5GkRZZxE{WdM;Ge4+K{uutrkWUyI!vu}lP_U5jN5Aw z?%Z}Vjl;NAxs^*mfu}h%0Z>`SRy2}u$f%BlNYt{@2CVVZw;)euN$7vv8dy>EZ%Wa_ zBTWuS=%?=wtSSYrNz!vc9^Det`zOwquS!#?-8GJjGgLh(YF?H!T9h<$N}D?e&YzJN zEip(|ASbHQkw{eFYr>pOJn+pmKDWmVBwOBB<98Z(?w+tbiIe@gy6lCIc7j}xcu>|A zqdS~p=VD*6S+42*=lcz|-1LC^3}`)voNV3$vC{eCr0NlFziU3^O*g=VA+Sm=VHfxZ|YNk(9ohKBnrfzh%a;2c2vhT6@hCVCCN3|Lr( z%a~s(=+P86P9wGL^Kgs~f-{}*M%?e{{$PX7NfmS1l+E`Sff;g4H-Ef_3wrKO9C5w-rgq$RQZ_%f{A=dt;P5zZVw_rUSZqJY zu3uA-zmLB7Ha}7_z7LPEwr^;nK<4Mjh1=x=B`pP|{!kDmiNS@~IpiFnoNk)l*kp;N zZ8q+kqp{K2)VJ9?E@WrGbrun^ad2M_%9v&!-IYSe+_jFmhF5R8?iX{hfp+GFC_Nl> z|6%KDJ58W{3-{rsJSgU4!!1Gohaz&CuMTq{C)J8^fD({pw!4d96U;e8e-+}$)K4MG zIYf>dePjZYfH6^^h#R#(=Y}iuZ%!CjW^WE)Gw!B2T|luZeR#@@D|1}@w}i=!IUz$b zdwNd+m94>@Gepd>Ep24sm0PoSN-&#tZ_cnjUwscjYK?Njt$ve0wU8(>Cex7Q(Gc}o zXR3hZV_oV9ZHc>lSAoX&*fF%}bd~fh(=bcvCCji&$;vL&BgD)u)Q{hSxV7&O1oVM& z^|Q@gGPB6XBT3R%FPNTn5g#@NRjlH*!dhYFaGGs$_^R5!oG>c-|tR3%l}Q?NIQ z)X{8hJlmYj2&ZjsbN2He;x)P!SvHs1qeVsEUOWuCT(l=W;@l)qOK%{J!ELprMfpo; znj6)Xh42nW_5CWn1K3x08(NDvXP@|vXV-9+nd7RY%KHB9&@8S~B{z!S8pW0EgV!Et zPd$w$6j9sqseu>jX1$u%u!~8PF@YccoD!@eK11nE?lKDOMQy_?=(pg&1|bmhnE<_2 z_L1C^1NahVws_+38jXMXnv*+7p>7#8io$B};_?##GDy8B<{thwe}wFQ_mo^SMqN_^ zA?o1}%?^+@8kCgv$p^3*9v6vtO(8mjc=!(fxm!lQZ<6uH^wBt~DlxY(8f{tLvC^u! zV~v$J-=Je)FXl{u$RkfN$ZkTMxf@-+&QVZ zt$AdkJ{W8~gNa3^y9pwq<_Cq&ok*gIIOM zgOg5oC{Ffa@kv}7Qz+3uD!hb=)oRYWRs<%4tz;?4+cqaKZ9#q79VMg7xQJ$S2E!UZ zMks*U%tQ|f*7^V`-ef~B}7${wms9F|}`K))?< zqDW$gxmTW&3`3om+hyApS2&@LsA#ZIXtPT5Boki?THej1$JO&F53?S8$8B~)h&cd^TT6!sd z;}F+rW@e2QnYTxF;SesMW!(wy2GwTD9{OUm==dliHMN0(&~Il&XCgPa-T%TQ7gRDr~)Gr-lkGYFc~Ct~N6 zJ(8$>bx^NUz|ye6%q5hjeU*}SVd!uV9Ij60k6I{|`QHYhExI^8C+uFE-zR$^dz3if z8Z#AbYtz_1gHt{>aCZ0PY$2`gaV^?JB_C@_+?>;vD|e+yVk^6qv@W%ZpmWUfz33>5 zZovNd6zHWis~08i5@EE}$8;_Zj=;$5eL1Ky3t6MkdO`1NsAt%zj-jC$3G>3CJELnj+d5riD!L$7kv5f_c1I3>mW zQ;|_+VdqqfWp1F)_zNjr#`@;E>v|Z@W*~}$osFY5hmpdx?9fV_PbbADD-OeR32>4HJ+>p z;rk+EYY1AyEb8T3Wo+uYB_3H>k>DwT;#FhDVzTS30ksZEOh}Q#{%B9OhZ~4lP>A>K z^05!Nm}(*w%2mi|C#cEVbmdC`y)3@o>Xl^Md3gbNs}UB2Ry0Z!TKwNV=0P69SKUGDF2dmI5U>%k{zI)vu9)xkST-fPcGi{! zMe;dk7iHSm;G~TfnX1?Mx-Fs!tB2RvIDB@Q4*LkjjDxI@Vx?57`XPC2)U$8q|SPU3g<*% z&Vd1VHdg$&n6p>{D1?EAfeavs8KOcoQNf1rS0r&y^Xdg(yk}*1Y|dKzmYqEf$1v+O zJpR;sQbH^9zsX`{{u1x)NUz!okXbd|o>~3ucR(pxV84{x>ORZx85W&0&UlB}jm2yI zt{yI!k5asp_xpS&kL?Rut|czl^ zn7_v!?xt{5oit)`ILsYxhY-dLxNV&i2EMs3syf*SxHen^o-{fGJO<8?GPV8D|EZYC zU9vKMCLPFejrwt&syY#EVcPUlI6OR$CE_8?e)k6m{__(bDjJ(|ur)F?EgpR9J{}EG>3yZEwk!B7v6B&2&Y2Etypj$#?98 z07rezI>B69=D;2u7II_nL-YmQwr7!>EyCZlwlmNjF-2gYWeK+^omA%rRYx5OCh{2T z91!Ax7Nc*4!k!@Q=4Jrzz&qIcZ+AymJB2;WW<9B6|o?U5}(@3p?p=1ftsSInT3^mSX^rR5oHSoIdVF~E_bxQPs z6A$3M!v6*|#mph+@F_whpEs`)ElY`_~j9Lc`{ckc#oJu%J!fo z%B!vZ6+C-u$qfN*UHH`rdTF-D(C_t&M+EHMumjRWUNpom&ca5zq_+wsi(c!%pnG(L zP{GeQA6zw@w=|Exx**pYA;=6xBsA2}3N64s4c(t=ko*Fnz}ikb2P9eu4I4gVnq_VO ztpD#9pSM*m53JjXR}i`w_$J7_F(Kn1zzOB>gtj=hr<6agbPz%zNWw6B%9}L9q1d4D zlota%jBKNI#$XRH>N6VIYrL!gn60%C4`&i6${fj4h>Y*LmOkh%}~+^ohPk$IRGi!pxG4R7JdFN%j9@bPQN@T*owj6 zQqf3U(*m`u+XZt3Y*TN(G^|nWVpTVb?|f%VmIk#b+J5nT&?6KEsvM`$+mnJ!EX*i`Ef1) zGGc+|mM|;mcJDv@h1GSel8yFnBN9Vo;zLA*dkQd!Rp?~0`sM6F8hhAB;m72mIW3^a zcf?SQn$?I?F*!pAq8P`ewx>CPOZ0Q97lE;(6G{O!5i8Biruzsse1&x1lc8io}h<&Dp2jviRe3p zg)eXx(~z{vzUTOzG#y8(j?Bs zu?pCLTm?rPbxo=4FNws1C#I>)CtOCemZ9TO8tdnsG*+_20{XSPOsbq`^W-3!)2@#q z^rlJ9mA#zFh;*onF`{{M7stPV#Mh<*rehagBYY?UHzO%3CVI?taOZN zzDH<>gm1OOHsi14RW%HfppME`)WZ&j?JdVh6JgtJUd{#ptmKB-T=~tNLz7Z!KB20O zG^+Bv?tZq(?1}LPX4DZORlZhjKM&8^Fx2}nMyGwLr%8QO(o>8lj0M3(G9+dBb&*7cu_sJ3vKV%Te7a}JBQ(@fm%=2)lq$0OU5sff~A zo^D##MO+Jid?A4K@pCN4Lr^+=^D7@rVH9}#AP$wrMSc4KhtPM|Jqq2Q@rKXW>IEMQ zE)H%9nb>ri<%wzK04Wv4=dpGN-H8@GQf)BQ_D=a@MI6@oH3{*Y7I9CR`7RjeqXqX2 zi?en=U$@Zh6SVcmi+)!OmVi`aLa8Z1PZq2;3(p5-u2uAB$^I9Th+Fw{F}n6~;t!u< zm*C2Gs(hsoxh86)QYaD?mqc>kA|;8>qr}UqTe2=0?SFjA=BDw zYRJVRCN7#5Jw+3Dx|b5_kD|rvDL0hDd72W`2#xy1CqscVL5-N>}Ejh+C1?s0?w(Gw( z%h|-z>T&4-Iu!bNmEp)9i5P`AQ}|Q7<3*Dn>C|e zEnv~g&ucYx;A=EvsFp;vOKb*VEg;y+3^wy^hPN!3u2fq7@j7E^E>c;!;nLq;NO$_q z9btbL1syw*X6vETSBLGH!*n)7B~&~6eXNC_LA`bW>B&o;q+QyJ0B>eUs>3|B&gVOt zmPva~pKJ=;Tg6cEaJm+W_LVpD`%X&ND(GV4?dvZ#HW+rQlH6z}^;)U`)u`Ba8V0Y$ z2r^DC0a7mksg`5(T%+_{3guUX1)GuPXEdeqwjxCyWEh9E)T-CRijTOJ^3VCAUGUCl zpEnioxw_sE29E|-s=k3$XGW{lxPwh+1laO1dlHZ6(PeVGtsdB9OG@k|*~8Fh7@eiO zQ7KENx8ZNt+wwUhHH&|4ir9dk>kc(oqj|Ck@uts0U|RU_Qkf z%%qnZL{Hsg~; z!_gF$7BLtyR8$_zEA8M{XyaFWq*vaNY8+ZarMS}TdjCmSd?wf4F0p%!?LQ=%RN@;Z zd{k;j@ea0lbc9OjL4MQQ^?1ZXq197r{Rrtl>{%`NqPtS-=?h5z8^R2pJ)6nu1g~+j zodmL_M&o45I_JIe%h?)5$4LH92(4bni{wC)0-eOhi^^Zbbi-t^kGRh9hlf^9Eoh8j z;A2hbQ-#vyA=A?9i2~L*F>At@b#`0^M{N-{TrI1X2lgg$M;VR@}^DG9X z36Z2_P{$@4^?c_MsH$HTO}M4YZ@o2-A_2?rQJRR&7QpsxtPt>)12?U#*m4#`cFI^` z`|Il5RY`jq*4VnU!~31A7(KJ&H|eU;(3(H8%oim?9m#3Bl7_`Al?m20=EV*JoIZ## zm|HuMN>MmXLW>N}V7b#T?$%vlLtrGgt|(EAZLHuJ>)a2^Xa;`G=)g@R==n55cGe`K zmP_Od7FLWY8H}d#txZX-^yZlVC$K~nmA+UV#UqB zH8g>tnxe?(1ko#lB(_bYXPdpQ7hYhs>5aRhmX#@}^m_kzX6G+-qxPB3jsEG6a{mD4 zsA?i?Y(1$xhUu4*!{4*97$WU%wkhsLowDyK84Z_z|E<_WH9F%HO1r*vQf5sSS<~=| zz%@sCOtz)+uwLQ5csjPDB&;6U<2?v}W~Xp-A?PbdV#unRw34 z@GNFHImxzxadOp&>jW(^17AW1vgsx=e_lA_Mf&%P<9?sDHiBk(=%wp}NFFLHb$BPM z_Zw>-B|m%lwK~c6#P^l@{zqX0-4|>l8O<5T4oGbna4 z?HRGX0sE=@#%F)g`P-`29l{L;=_0htPwA?5_{wuM0>@l_pPpG`G&- zxDM+`Km-K^W%>`sKJ%n}VQ#J;hKW9UaGrSFSfO~_-@k++Q2)`wVFos~8l3O4?t}@p zuHIiReRsOHI$p2kdVcjXE7#A$LSv{;_71^xj^TR`C%f1s3%FhlG6pPGYN5gek2j-0 zKTe_U>g-X$X^M_l4`mr&ty$n=D)qHrGL5F_*wXa$VF@02Zg^kUl~eCH0hEj<=g_PKr&sV30(6DJ})cAI49iN@9CKo8i)~KBV$DooGsH z6qpj0|EtaaN96!ZazFS_*zVOA#hg?|nA1D$|yj3!$%Fs?!6X zY0t>vN>peJ^b!{_L&LDrcR_oh$S>*^=tYv41?m zjYNl8K~%w_isAU=G&SWc{Jd{QhL~aQ{q@7r_vSQY$b8Iq^~@aCQ8AoPCS#7!5$Rm( zs7#NoTz`HVMDe=n;&i?E2W+I2WYhG}y1LJ8XWvRUuTp&=8@l#G(x0N%s#-6fNIy}X zNR4jy6C0`KDF4Nk4UC=vU_0!fZu?WNbQmGs@<~o|wv$#|#Cu(?DxyNA3W)9N+JnQ< zW=Z+*2x;l3GLWc*k`srH@Z=_7<>>I`+FDv)Un@y#Kf-6I*O**6M+S#GB-vA9`?pt#Q z$)SXNV`OIalMNhakKy@whXl}`^nFwF{!V7tr8yZ==z$dU#N(|KhB%q`OYnf3J7{F> z#E}3P?EU&uWXBrZL5Ok-;lC(CMDs^4MzjPm3>58@!hf2BNa4RILFDyk=O@}GLnxp} zBa~cE_j{55Q3_=eE}au#M=^vS5NiKK=Z-A6N(RNvWAPC-;|7We4qf16`h8m`8W~LK zVj0;#Y|fK|;1NCV!F#Db15$O&BsgQ#m_5U_e9vBW3@tdr;6^B%IiTl?v?mpX&Ne-m z%~|b989p^P-c6X8m5aCnF-RQslFpx5h`56gN@hOT0%900>LrI?Oz{7Z_Kwk+u3gq> zY#S9;Y}=~Xwr#sAdcsO7wr$(CZQHCkCwsr$Uw7^A?H*^GlQHr$Kkk)ygD}4HtJmnO&aBDT_nUR05O@5bFfOzne%`+n$Z|u;5w-Jh$e#+CjYhomvz`~oo)a^k??>vBoSKuFff;H?xA$s;pNGbF z7nf{RLe@^;?yMkEuY0ev7;LSus)3x6%WrH|#J=^K2Deu@*Nnzxv=rj0SW0VNEy^o#YV8vw>(jzmTbGdlkO#Om%@;cVMG7tGGI}e*D$2LEB-q8i1 zeuIW=#RS?yCxQ+M%K<%wK-hz|``&?1MX{4;L+b+t1aU-^`nFMSrw}ZHQi#n(Wdk{E zqNtS+^!kTDhdWf;cjI4wB??i1)&%kjTxP7^yb{KIX<{&jf>shz>{&&j;kSm43`7&Q z(2_Iz?lmdzHkp6%kg)*_(07+km&bLP7iST}lVV1Zf$J|XFyJoPzAN<%V~(qbWFc-)=VDSTHH9!cG%Rdy5PA%#WJm9R1oj3vl=n zKM|cu)$kUY#pff6Jv%Ke{AHPaCW=g%1AF%Jrd?)|TxXIZ+ZeeWVU!{@v|S!0;UFzf z9o2`XNYKSDN|?3}s^juGXU~-wGn`pwk(OJrzs)(s&^EHeFo3B}qTLm*obA})iQS7$ zeJz+ZD2Q-3{gNz{-ZFt&vVjuru)3izlq7stkdl!=LhG7nm`|BFIQf`rV4H1)CqmBYBI%X-@0HBx*3g_$@` zLGIF8^flAOFbgCuHcm~i41bZlE4pzT0G8=u3sfPvl}Q!~Rb`osN!i3ZBnr#b_Uz|v zaWpb;(B6VrGu5uqnvr>PL7$9mYqsUCM0%7{uY&mu#pGR%IiR;3nRP&ziSL@~r8r{p zsu^?hfVQn7*|9VGo|sb)sds}9;xvurHM6^4zTx0%<_ar{lZBG~jz^H) zP;&zghNNj$l&BP%xM6W&|5@{F=$`Lou{lh36@j48K;S_2Ib{0^1JP?Puw?gIi1yV%cL2U_VwF1-2A`@AdO1dslh|IedvIG^p$|e~O0e<*zN1MjD zuDKX4`bFeah$s&`<`A@B2?yZP-*(o~Qat9Cv``2 zqVWnC$QPuJj6hQ83SA3S83X5!UKC5GonR`w|7v?A^!0(6WlSqzW)O>$WtV7?LLL-? z{t`DGQrsuwe}EzA6s+GQ#r6A&>Y|mA8chw_f-O6FfhTPc8wAGq@XG{>NCXLZzxH>Q z>$V8>KzF{DWCMc*mCID&D@w_LNm|2~uCHK}oI7JigT$_YLwTYLR}VMz3!VOHkF$(! z!RQr~2RNE6rY1Lhl|WGydji_qC3=($Q3sKsFIqopq`4q{gb1;I={GA z=&#qHx z`e|8*J(H|6%*70565>GGC^ez#W8?bLx{EJ+Tln1wMxoak8Nz2I7fLjxh;*$V`gQ|Y6**IIuhOJcoqr^ zO~tV7<+dweZ;D--P!6|SnRk}f)yvFDdZ448c7#T*HKMpzeH=LCDN*yg8RPg-lFT7@ zJPR}sp=A$zE#0C(C>4IB*$)}u?yEG0v@r5fHCXuUX058K5c$ifFH#)2I$A>J*Lb6& zP$?#>mUGBd+mC_~Wf}4nzaWj|nuIS!m$RIatY@iyHgGE#{iNDF*6K;;7;)k9Osc5W zxO>F^<~*;DZNem1dm-d29w?hKJ|46t651S-nm@KV*6DAXhr^sOyauO>IZaczON4e* z3vV6(A*v|R4iPuZXahUet>kZ>A^i$kZ#G2{FuZd*( zp~Nw@RXyMKbUWX_$?aA`#JQM0nZRiOU;_K6{i*(~{gnj&uF;~dCbrH>b}o)a|H0Y% zU*ht%t`M@W5OiV??>lobAwT+J;G+84;?m}b#UM=JGhcI@-^%*J=6K$A`oci6^7v{{ zti~C#I-H$-Bymy#S(upYKR2f_NDEs`4)U0oLLj;Q^L0iQZzTy)JT*d1LL=a)k{}F9 zOpK9$iWep&#-tX1%Z*6N&>0vR>l^DE0s)g@d$Q>$vfigRSH+jV8#j<3VZul%n_;QD=qbF( z_q+D(syYb|rBIm+DQkzbFErQ1<8eX0%B&hC6*tw`+Fm!hRWU&Umi7=8H3aHP^mN_*Xg9X-~-B>tLuWXw!`u- zLkJjVLuQ}gD0vEtbw!$v>DYgMktuF6vuE2&@q;G`+eG?U>n8;*gklgQC+cJH?7lU) z1~DmBFL^`<^%B3USPFz7?-3WpQX<+lX;POBjZ;>79T2C?Jx7j*TXDSt;+8c6qUCaf zYL=30l*n$3wsBgwak}H1?RLEzy|*g(mYNQgirqfGG5wU0;*(`cP`q4dlsXPJP6vLU z`0;l{cUKR73HXd=xIgrC|B1b6|F?+#Tg6TEPw)OI-!0iIfR>gxAYxRnITgU(ZjPRU zScE2Whh|Bn*k-#MV=Lh{N=ExcE9VdSNz90{DR!OX-+Hytw(P-NWp_zm3G{pJpsA66D`+QlRXLtZ;*65NZ(g4y=|x`v&b;1doRb7q zy7nsiJTDy|sB37AKPgJE~fux79g>%JXys?X)rpFVIf#m_!EC$bQ zxQ@q$jptiZ)lY9e#kTTuQMR`B$R+iWG^86+7U_^kAZ4zhR%d2qVS_Ih64R8f|I}lgi9j!<26AfHkokeQ-- zke@j>jcr??L8sNMBM}S77C?Jc8NL(?MSVlAu+tOM?9W&>B^yt)885S2cK-ONk39xk zL#*;z^SjO~AXtcf)g@$6dq5(W9~v|Yb%+zoO=@?qXwn;}8aU_6x3d^OyC$w0Uw=bp zMn1|+NUlJLNnV48B1N^Z`8abLo7jKxYersn4=^UG=IaxJ)G=UNnHg zyae0LNpdDDPIMMw+^n>0^s2#aVpP#TE| z`W_^iSQfMZ))>H1+n4-xg2w?P#0eY&c8|)T0@*SB7j7U8vSaKolO`2H>b_=~H157; zDOb-Zj?zAdPf4$|mp%`HG?yJ7k_iZh6l1;AJWEu3^dTd6MMAl44L=_8z5cDUN1xD1 z;j5FsALd;OEVnM7$sq#rf2(?5|7SP;?_0z!QM@pph%0E*-1%*AU`C9l&H+*1Bs)F} z3u%>=j!}@!pjL9ibQ_o_j)N+P5Tkd@Xk#$7d1C?-=xZIAC5Ve3M0Olis)djlL)5&) zZ~#;GUHVUH4*Uw}dJFucInmHzu#~d5J#$dra0Iw|cB%ab>T=hWNPLd$)Ft@=szotV zDmf3@PU#45#m~b?$jGS=(br+rl#DuuN&%tE&T}8bWC03$^e4F+D16DXkushO|I!{O z;Cb%9%Kt(F%th1ZXTtpv&;P_dH239~|e zvC|I1sR;T3weLNcdfrnak~yISTbqxdCwzsyP<2?d zW1KH%wZC<(E?u5?7Z)#q48=#xh0Bo3LvHs0h`CHWO_aMBwoa#!fs7rS@yE~jjTcT< zX-X2H25s0;L@caIj=L}$|ttTBglf`0e88y=DL$VCwLEZ|DcWvEW z7}#yGE!kSLaM|)UcZTKEZ3A1$qjnZ>?}4`FQu*z5rWGZ}X#>Ew*sP5ODO~)kvQhQ9 zn8m)tcBZ?nmKw}EqACm#{Ce4}F8b=09vx}ZFliVHcjp%UIVt&T1!bn?9Nz2M42%gw z0&BJgQe7kJN|z|41x5Cx_pN1<5{T$g^~a>P?Ok6w*w z8}m%6Dv8Z$ntMjv`Qi36;_a5%S=d@|z2s7Av*eaR&UsiBgL|)67gIa@wk8$kD&jac z)Ni1`m~Y~Q2A>RxUV=S4DCO(UE5x0_4+6$}P&6}6P--NeP`}Nhr-iNL*T|=TkPfK> z2&j)pR3N1H&P!gm=A97qzYo`(*}=p}5v4p>D`#9^j^)ypSQqKdmvg}@F z$=1BgChz@h84i%Wp%T4q9b$K9i!2fY-+=KJEcO?x*@sDqvX|`=RX{Ax@is%Hn3ra_}a9t{^|Zh@77`AZh`Q#N1pg0c@_=IsuR< z3Cdr`8h#rHqm{{ zp&8g1h0#Wm#&pe1c&3KcZ`EC$8@9&~zC3o+9?tdk``;*A-X**e{*#`c;tx8({vhwa zdVl}t=TF8dB?}vSYZEaSTcf|QwXmJ7^QWrPzaaKc<-Z~Jdx1_%z7Ay_lt23whz(^q zrgEM;Xg3vjE))bkqf~N2zsag~BUomHofzuo8z`Suj*TJe{W5_GPc5yD{%^nF=5)@( zmky^1;(ttX@Fy_Fg)F7k_r)wV zR_TttJ0!TZSZF$|kmVYOVKtX`4mQw*xmM)!O2vrkt&>v}#9P%@mb|hpvXvR-bcI7B&f_A{s1;;O;LCWb#p9(|Xh72fP-8dJXUuvLV7kO!a{3-}l+ z!Qkr)R+;@KYBd$VJkU?af=I*By2uSaNpa`jPz-t{&z%tCpk-{d1$PoDu@v(VWVtJX zl|RFtp2{`Ea%gn{y)Vv3VQ0fap$qN%QXrO0Ibny6i{ZJhP^kC(qe~T!LHfH4{ZR_w zTN~DMR9ju)H_=qLW87sP4p}Em51>h+ZEzv?P*i6{97c{% zr8>nz#<@N((asbRE0T9SMLaw!qfi|0U6moZ)n7Z6pc}*yZfx3Z$TNYctp;h;l*AlT z+)?e^!M6=d$PqE3zkITr5Hy+Dra6#hB>de3N_sw$9W5`oKM1etBeyj1VD{Ze)>K3( z1i!AypoYS#Oe+aLx=9%nC8wC~i4jZN4@ zl%aTlTaZ{sUVr>mvFe^Ss~77P21Wa)F+7BeZQ`|SFl0sLl7;t!9G=GwLbJDkZJp8Wg1WoEUgO1Rj=t_k)Pr~hE z*pS?@X^ZW%X)En( z0wR1Gd?Svb*>R4BKQ!Pk@EUo(@~-2jZd*c=MZfr)cHgX3wOVDhwvD#=a4JT(QY}v@ zA)|aETj4jNb&hP=V!P$Gd;@Kxe2o?SAXUbmc13H){6jLu=aG_DK5qQW3w5MQt#;?q zH|ES!VVaSztyFI~(#?!o(YN8Ka8y)L7 zzL_i)GA%PyL7UBfvTv}-PJg`*6ivojf3}a@-8?5x1h_J}DF_=>i>yI`tvcWvnd^0N z*Oi7Y$nK<8o{~a3G_3Yz=8DG0bk}ADrX+^jVs+8ecw&d-)ZtryFp^=WAB zFm*^jE0xm5a;hEUE0AXGzDTi3@#nVqa96_A{vT|5-x|c-xLNlKaxl2p<&2rNZ-ze# z>^;FN9=^GinH<+GrOp*&#%try#x&spzkU?Ah{U4H3a{AScHFaW)=&Uw*u;b;4+&DP znD~9azRDLkK>N$te(lTwoolX&TXfeHiojt=`wkQR0l#vg)aUE>j%tI$6o+{Xd{G)1 zjI}eOdpLa7rw>PeReV)Lv_X~2!iNgH;S8pjEY6M9mkV?(Imj)dm|{rz_?uXFC%xx2 z)&a1?<#UP!iW9~>7y|qHgOdu-)y9`T9pxa{`znwHuNZ#F3@Z2Q5mtgK`4N@m`|F`b z)F>F8yeg&5!_lt>dV5d=Q~BMf;BZlI>?{Qfm5nkbHkS*B|DeiZ z-f*}elLmJd$r@LjExHXr@xKK04nb@Uid$H(h`ToxZ6m_*Vnj`j9cl^r41#U`9w%Rw zNrFd(X~XYpzy6!I|Krs)xazZ z#QVF0i<)PfwCfeA$qQC!qWLEV=Sz?7)U4L6La_3krZVzjeSniu38MJ?{)Rny_TcXv zaBW~ZF_z)fahYbv^>+XAf(Rt+o|T1{5-|${GL>QvWM-VEGWEl0oFfX>u!W*PiivKt zDJKhC6ROux24K$`Xw}nJA<+G=a>__-6qj9`cL?t@yax_gC{}6Dvl1O-sJGxvG&XOu zR0lYv6Jh-vXBN+WV8ZkT^qYlQN%4Hh2Qmc~p4Hh-Br3%tlA85rmGLUM@|BjKoUY9r zMAWAZQ~TyN>|ePA+poZ^6{k&{nnveTitw@(*qYRHlG~{-?`4qJN|o}QlYq<3&n&tV z6&60_&hd6v&_%+qgYRQI8kLd52KgOr{J{ zbe)9>LJva*#i7w;O~C=vh-$z=t{;pHJ8}^OU&BMUYCNW^%+cs*=~E()F?QQyN1JHr zO|l=Y0DH*_rS6;4PlfUgx=Wq_;Sh3y^#GEixS-U$hWlnw=*h?d*sWu7MombRE5ww~VP(1kpJBtn zfZRiRO1X9rWmdaG|pz#chv1n6@Wn_@Z}NxHgEB*pSrhma>nmp zrP50C19?Rjx<-n0FNFP(2EUf1LK0n6%}KN)vibk2$4!W|#hjn9*z!j`{^tww&sbEk zbu@9Zvv&O}694gZ43d|T0%b%?Yt(T&)hx$AyC!ab0$wMOKNh`{$E2U%m}M=aTotKV zo$1^!o(kaaA|UM$nGOI)O&UvOx5M9iGkSx_3YPVUSYdoH`ht{0ov*@6_$9+csT#?G z(m6WPvebE+p8&PT>XrohT-w5eKT{^p2PrltUe?r6Au>p%;vJ*+Swkhz*3>#$wqNn& zPC-i}*>M|=eN?++Zsh25XMDH>B}neMHu+b?*xJF3YV%U;Pa{aVAWu_8Y0^ zd@dCWRZ9EOIN+fuQ3b{VR0No-zX=R}hOe_vX%z|dkFD!X_o-dAd) zBQme6Dlv}t@1)yXgU*LntwCR%AN4-%nKpFf#A@2!TlwAh8qU*jL9h#}!Lp|VdLjAz zdrMU}UY#{+JDXK$`ttkV&n`zO+0DPYm41I1^q)Oo%0IB8i?f9_y`Zg;iPPsu?Jtu` ze2R+x*Ldxxf{ql3AR4b4`?$*})A??Bhyd*xfj$@tSbxFidg(6P@(>&BF2#GfE{x|9 z3J%!<1$ss)I@-ygc1z0gds#o!& z>`lA~V{wPVV8ch+}_Ounnl##s9(2X-rW@b9^ zSNY~PI~bg-+ytW8iu9XJlF21-no);HwuWGH+{FX>y}HmKu}NQB4nqT7#b(8r(&l`H8xX>moU_j+EC zG{;MS)#n4T`dlkAnPweI^dyjtfY$Z{bJsHYn_PNLrF&q-ZerR{>|p{krE5Eva7C#$ z4G(`ON>iIG>0*w|#bp^w+w<4%Tnt8^#bQhe0^yz!zCvO@t_byIT}372%0a$2vq1J) z@H?8K!Fo+B=nh(7Rb0ACXnMF5&UyPxYM>coYkjmY&$XK^EXqb7RDlfKPDCgX zTq;&CDIUAbT8|AtqF>&E29R3a+In(Jg(!lXZg8@R7Ai`9R9%PbK-flQ_e~sQ6wWCf z;5@HcD$#*9ufp)MiK>sqvuv7T`%R79wrP;m;Hc8R`a*=H#Y51{OS>{7w#^z{w&-Gv zMym(ildMos4H3s@?z^XS$`{~riJK_>xHAndn`nN)(;q%iriTbw%eRo?-pbI2LkJ2W z@+7UYc4yG>>s=l<(rmN#z?i`Gu?*7ZB)`PGaNJ-`lU1K8H{Zd|x$pM4Nl-6W2`TSu z^I%fPyHpKg!md@L*};mZTg<HN<4bo*J{dPWsKfo&W|LyuB zCQe2sw#Ejw&i}^kRcxG4KVPl3F|M=chMUOYONt&6Y}pD(XyN7ZFd&TcVzB$5y{=9c z4P>pS2L-5|kNj7N91~Z9X4c$G*r#T`{`_LRhh!vDp}7Q(7o2}fYo~cV9Q5mTz9H!2 z?;B`$2a|2|eIt|ID)Ebw$+LF};en;8sD3oY!oct_3hgh1sJM+5b=}mTtno`F6MK3M z^V1?DvtR8pBP&>P8SK*W^8+}p*?|p&txiNLnNwA&Qq)=r5}vEJYm&xvbQxQ}M8-tt z`iBq$yv+tz4Tbefutcf*7RA7B3jTgZc zM+HS;BG7pC5>oDEuzmKe7lxR1;j{}IE=2HG@ysMu+5ufp>RdAS1=dY7l^h){8#g$N zJH57B)XR#bKbhXS7=fMg_ebPC{N$2vlRKneT!NMh+apQ!mD9ySe}Tm$p9$xjSQ#cEW1 zG`1+lx*V6%`S>+|R4C{dU^*x6YtE|a>bQPQdc#@wt<0>}E+s{N9;f zv~MJl9|42Z^A`SCA(l8_?drf4K~+dk)c22MPuIYKuT*c0$EkCRF!8q{vsEh=+$><< z;qZnsoe%v;y$}a8h*!mYg|mj_t4nZRng$EGAA(NJd&W$%l8D z?yo^4bXV&RevxSe`vDn26~Ehsii;?O<+vUZk?b)=yw!@ zANpkrXCRY^$p#TyZLsFvFO5tJTMzlC6#iq*OsL?Y4*0~s(|_RKe_{;A|1G@#r`i^; zVD&GoF+M(DN8{xqNqiOm0vbUWhF@i_59RY^(E@MT)Bvx)bDlgqi(o1$%ycmVAA<$d z&2%EI`EZS!zA|bO=wykt%GSTizz`Z7G!>!&YWOQr5Eq%U`BYFV2c@Jm4L;s1x?wawp0AFp_-n zm1I}!shxP7+O8SQvjn%fSWlPkyOO*nj3LUy)1%^37#FAhn8ha|J#2sq3bKVZT_pfV z;K$64-_c9Cm-nms7&p}tU)*IL=VT2aY3QvIE_%FKUKt8DA>|A5lcqoyr$5{qQ= zt*crSM23D_-6rIXWpLJBD75-HaGz2>mm$zNPid&sN5Fz2Ecs2TvI|_*zW8_7M#N7R zCWVHwj^PvSZMtBUak4Ve%3Hg?a&f;t-mvT^3~~4ahWzuf^5>e*-+)le&f40}?Ng@l z-=tz?8N1I0BJZRtPc^TL&<=+~771nd{kIScN;Gpy_@^Irk$BdF<Q!ArhP_O%0)Z4F#JGL_dcE{O7pciBsEbg>Pwg)oYn;E=ZYNUt-=Fu@ zfNtH9MBo-dle$g~-MbMP?Xt!;VkhK$k!4p#*utIY}djRBB7Nvdl5AJ9u7-H5H9^#~RrY)0S4-hI- z*s(xTY6=(7l-RKbYFZRV&nO_ZNB1(Ul_vC+*2_vY%ZHJw88r(uC(BaS?3sGz6AbLf zX;wnv-cw5oQW~)oLkmkEXk%%ZA2Dcigf&!ln-?y~*d<3y*K;b=;ypDOm8)IZd=45U z<96sc!WYAID^FiUjJ5@ATErm|5lh+(N?OG1z%8G{Y|p3%Fap@4y#)*{@{|jK^<*~9 z85l~KPpPW1S+#xwY?HjDvfPlMbyrkVIQ_HSSgpcHV&2ex<9e%Y?y72>aH`K~iN#kI z<>U{4lKX;(MMyP~?P~Cl?-FMuR?+SHpczXWXbLHaLC-Ro_FXZ}FzKT7qHCLo|30ei zOI4|`p-f3;4{LkRZjCFt@sEIyGg<5P0Z4tUbN4EdbIyaI&sTdeXs51I> z`xwecCil=uiOQ=;8-pvu1yf_}{&^*(?9rsDNknE1#fsCrc^BLgj@mP>9s6D{8dQifD0xZyx>_B}fu<$EI-mv$H1h`Ar6Vh0F5|{D7K4#OMoWkwpO;>gIFQ1u_X7_GVlo zzk=DhGhTt{Ga&(@MhQ$phnB=Ap?sL0KK&q0UWLlh{mKnpLdh6L)1M9)DG>M1|l;yDM%>{Hp- zxYL*#QAPfTZV_QZ#5~>Lh#dn!3dgoVK_d9v%)WHBKZ~d*6K33wc*imfn_~C|n9Y<) z0mRT8B8Il=wd)#&?!E9HO;*BGr3Z_HeV6fceOuItZUSNS-=s!iFAB@ywqUIUky(YTYrU-Xf;i zgbG8HBN<&y)pBN^J3#Rptfv8ic15#xI$eyAkD;{0ci+Jm(@@mXQ347>P#zvNAgArl zzaI+WoC$`_e5g==)cqx{!(b(olk+u96)|$axr}6XX_~sZPU&dFpVeN$eJxTfS%OoF?R<{d@3cys zFu}kq3lP)1E|;A$Zg~zfMx*pHJ3+AeV=&LLuCw5C*F@TkE1vA}jMmn+IvfaOw?9=T zcpeiVW1G%<@uZ=X9(tmXf!)Bzpqd7^q;OmE&omv3gbj{DY(`ccMPl!zjVbGk^U5h9 zqUh{Ov6q>o0T)RIro^c?6*=E_25rNx_vhmZPLjc;vWqHEq`MXCp?=2&XcnsI)SF`E z=^LdNboG|PRdA+iYDv$>yBkpFCrNPTFB|`?D=Qx<7@0IF933g~07T<(q>9Z=u^0to zkx7b}xy^gSvtGX1Y7T3ZWFLaBkz-B7bz|?r@r0#KOqi(H1hDKGD@`BA{))eKuuQ|d z^Jj8?nL__!J4dFUz$9ZbxuPHqc=0Fyv_gC7pBs!0xlYlEHP(T{%q zo^_F~v<}UF^TOG1+;)o_WR9Hyj_3Z78-f98n0=WP*F>!>QVJT3bVP`@ZMqboyyAt0 z(aW=s+U8}x{%!F6GIQqJV;B;)Trm^DkJK|9Mqi0GUF2YwK#4mr#XDKuSd97{L;oB) zR4Yg`l?7A*G&O5p74(Qs)*9`8j&kkN#-1CSeAm)9lhFZ8DFqYd0RqcrL>H*Mb00ka zWw7m}afY`%Nx4DueT579t4chgt8xU3LWp6V;JreedUaUC9CPit&ED%Yk1)hu?yIYtiI;=p`WrMIJny_u zxC#d%dh~uBH>b64YMc;OORs0jk1+%a(7E?PuJGUq1GA{%HQc9)GhK-%-eZEo{@id~ z!PwkiQ9m6fLvNm>kY~~>iU~k{jA`Wq$C_+BAYlTpv94nvgD_rv5h(wgM0&HRM<~&nw2Ji z1nz8;?JjW*OTO;C67)ClO-m7`y~r}yVTLz5wUHR^$Pjbv0}DLcyDwJv^yR#L%4i4t z4FN5z_8dQ24WkSm^02?C5edWE3fT-7S*ERE6qROX2*OQ!Bz34pXW>?bU3P^z*+sj{ z6oSe2Cs+>q>IZg^YpV9)L{TP~&Y*19nbO9}dhMTbL z5`qJpfwBKFH%j+0iT8fo@WCl<`GKw@oz}I+_uK-k$7RX5TA!5E^TcuIj5|+~O444- z6_5V&?0X)%(xgG2E@3=R7-JsKl3Ly}dqmZxLz#5=Ol16g^-SCY_;V?jSZQf4oeP^j z!N4>PO+51pbif-|HZ=5DA5(DklIr#D>E8#jqsedx_Md3>{*Ug${|6st`j6ETMH#zU z0VJPOG6(A~GYN`WaY!pbPd`Y|pb>&3DNu+NVS;nMG})}F)JAK3^$MWq3*PV zE18p1YmKYJ-wl82xZKjes%0Bld=B8U(1nJ30HlZ#ml4HT=bLXr3cj3*M@gY96i#5#Jc zZH{<{D*{Wkw0YCA$g*4th+jEHN)(z-mHZl54YC|FAo}Xw^&A}( z_UGJYBvy?tp?e&ILh^+!N2K?)atf8IX&)>6T0n3NBxJ?UmSBhr_oncIV2lMGZQ)Qd z#!4~3eQiz#oFSfro?8zgp#+mMT>f|FU$Pf3#0AZb7B`58vQ;mMbQx1?%q$-c$VH1m zvAVxK7%(Vi-^O~SJ(uqS-w*XOXngQt>iFeK@zn1?Y~QHW+pobF$X7HdV#XEV%7`&6 z+POk|P*hPc*!T0AXO;s``TCJSWZ#&}#uzd9Cghi)(VCNp;`^=bS0Wy2-FSR#L=lTt{}@1!m4Y*8)5&N)jcmO#!bM*iYH4YQhBAhxzT zMs%dnmb1pjj8PX;63_U%nRV`G{DJ%FZhZfL-HrKQ?v|f$DW|1^HQ0H0*U(6dIe;a~ zy_*(M4HA^F1A{T350zWirA^MzMbNkpN0*@G>P4iV<7HxKh@n?XbdATj9Yki7LyzIZ zjQRonfqKnp)9f6Q(8tF6JFRfC@|JVbY2~lC6Xy>)@4auJ8xPw&D86?_0{!~%Xlrrd zMEn4U(fh}%tEpg&h(`amR zD5l1}Y>v@;F$^}n8~BT`)UnT=`~mdsHY?OUY&FL0`bhxZA$wBg@hTgDAoeglG{A|n z7flJ*3fo|Pk(o1wCGSRqmpxYtpq&^LCLIP0r#ZtC#2PaT3oaOQKvk{jNg-2d04vpa ziy^F3L|b2CcVe<%qkUq0TTqTm_5>FwNyWLY9Vu<5D!OoCmujXj)K3!NHCI<|16Z)k z4)@$k+25~t-;Uu4jVTlmm5c{eM1lL9*4)GO)(6!BlvKq96k^f37!vz1(tnaJ+@!|r zwve(ND=_e7$5YRd#n*6VYxSe2hx4azR@E4e{aV76>pP0^urwFa?geKlNt$8!*-Eux z(qun^&$1@0+3V9*Xeic8bHGBi76O1YUtow*g@;w2yXyGDCm`M%?C6T;K-FmpDYX_U zj9>=SkZ*QgSB0%PAr!Vf^Su-qmNyk0+!8=hFKjnoBl|98G2bBqkTud+a@!kb!$;p8 zHE}>=BkLtAb(>A5&VA=l_iWV{SIPvxdizU zt@@=qhfD|68y_JPSZFmlOe==%7o2?~`{<5& z;tmFk-%pA!ob)>@QEw0`$_Vh=F!BIexRf-Vj}RCDbt^ZR>UJ z?>8qKH5vqN-~I7E0{j*P`dkhA91Z%M4cY=}7k|p8T4vOxwQ}0rj%vcKrO=>TXnkx- zyE;gHo|*mL6!2PO^$5bK!P5^}=)JcTym;&p?Z_83QyTOxs!eJI&Tc=y`-1ydmq(G$ z7E$3dK@~y$_m2BN*F)I;@0Q#@ah<4*{l7ropEJPtm`y2ML8QUXR!*m5R#weff`)mK zqkx2+_`B*E%up=x*7}{ zL#Eqz7LY4$b%W6Ly?Yy#hp5v%HBhB2mK1#{3EiEay2~jxVuBpmw?p72f@XI)qD+D1 zNv#R!gHQCrGW4Ui3zO;HgUrXzEksY_pzvdxQ#bEasw`h=#;XfAZtD&7FMog)Mg^38 zcKu*KvHpKeVE&1b{!Q2K|MCZ0=l?vv|EV%Ahx-lfW88hwiaR{pI}Zs*Qb}@br_ZKi zCGHoZIm#N=jbI>}Ev&Wvu&c}&D{yge3Gd$2!;}~=OK=*o!}gT8ew;|j465QsQPJgi zg|^#nL-jtpo$1EQ_~qM1#OvWHW+x~|WGc4vt~8E>_s9V=o7u9r?UpuRz=7=$UYq9! z3!TFqm{;tXkHMBBghrZy6KPN>k8Cw1&ZDA$R&^;gNDjrXrbBBO=LFSrm)5Q2cgOAL zo|0Ou22eWY`nUi zn#yi+&c~P06A!0zFv^tL6;(uYert_4!tL6;sg^&ahwwnb*6@CnH*kEU%otpP=4>dr* z7TxGmc;Fi#2Z7v;Ah&e8u~x+ZG~a*+7RmN&0ZX(YF(YJ3^050ii=) zE5x3Y&7iuQR&n(~*K7@+6}mgKI_hh`5xE##fmqhOeXg1t;Fdjz=RLB>srOSh{D#{Ki9b;)Wk1{ z?zIBaB;)j`iA|wUkdeLdazJ5NZZamiuJ1B;c831K%3VDh&7@ z*ieQ=cQ+u>ylqhG4iTyIk^x*ud1Zaft;6Z5WY_j=6$-n7RdZ#AR-#v^%A{ySH)(`5gomhem{CJ#5R z+?~{5ZTq&cD&MRLe4vUpHEC74FK3>h)GvCoSeuS%{n&@wNQufVt{T073wT6vcyvc| zfdby;&G=KhN%Svr!qJJ<)^4MtvGtbw=*Fw!h2%${Bq znMiTuHs1Yz8Gil`=jfHj0Fd_M*pYO$npH9_JyZb!kdm*dCITW$L)kZg+u^l{YPZ{$njkB!#&VVQ#gz3UJjFjiwV|tojMo%{ zY?F0!xurfdt~zBy3&%D{u#yo4_VJsi0|Sqp9V2@&Tj>b0Z2vqsQ9O0r@Y**#8e>?-*Ta+hvU= zRk3Z`wr$&~*fuNNv2EM7Z6_61Y`dZ_&(nSS^z-(6`g}k3uRX>dhAh-{L5$~;LX(f z?nXDCk9bS)6^(QZWF13=iYw}XbtaePF*UW!LN0ppZR~dhhB5;es4%`ip1TQRYXwBO zL(pIb1v;_@DOsIhXYkanjmQu;l#a10GrkUj>@T^*c|`;RZj@F>q6gP}et`mR$ohaX zRAqh%M06j|Qc7Pm(mjfkwr@_ihrL&(@ey)}>$IMQTKJ-r^3g>1EK;r7YyqenOF0=A zDKP{ZRXtqMP;1sN`#N*96vS>&CWctlLme8#)p=^2AzU|nhP&Un;^6DVy@S5*8aao` z+pBno~jrH7iSsm)RHlS+pH5)PrH3t2HhXT`VYtY;kI7&7LkGJz2Dg*hg6$ z7Q_>5F}>u_)Lo}i7@?>pQR79+!8D3mr7LSi;AIF=4KvRaxVY|&C&b}N<>ru1sh%xR zL@f`7R$L;cE_uq-sd05UE=d+`PSl~XW@Dvcc6A@&Xoj4m3wQ$ydrO`^hws0#B0j(( zKG13nxgDeM6Oj52Lf#-xhvyIu(T|4dGm`iY6zsb3(0%kG?|Si2exwuI;YU;6e!Hi% z2l4X8qJLo-jupjLEJoDrI;DdCbEO*kXpq(38qiG%XGnWu$J!)|@cG4xz7{JE`(HP{ zSo7#VSo6PLoh1Litoc6*`y>r$ZAs7SQbvrT?A%}Q<;&06T2&FwBN z>lf9p<{ibKSCd~m3>-XcJ=>Wpyhq&IPoLT3HQsL*1we=8X`rbQW<{JNQwIDQg8XWR z62&u;cbzQTYz~8i+s`{AvGDW~KULC==5d}1fVOY;>~8Ymx08~P9S;k`l;?Z)Kkgj` zD0*~4$vSsOD%@p@x2XjvyXmLk-`sIa-k%A#7;N$I@RFN)5)Q9SwljRAeM!td^APxl z<)LoSwvrD^$hIg4MW4kjrbn0Ef}fsb-V$&OKADmEpN#kbGH?AcpwGR7{I3pm_dWMU zhcJ1g^V9V|UJd;Hfq^WG#=KhvJ=kUx!ff6Bh85!!2#tZv5F zBgLuk^jS#Ln3AS@5{(rmsa&&+D24H!E5}vwCiiDnXzztx+_{RlYS($ZmzmFWCeu+T zhZjFWq`Aa(Q~CU0ly@F}HKGJv%2$XzmD3ozbeB&F=pn~D(ZW4hY$;oU>fUl!SN5!N zD`_g(+|4a@5jR#R@c~Acm^OpdeV^-~o?oD!l$~5%Lb*Dr<5He;kIdM#%HUo@9cCFa z8dD)jULygA!Gd!4TnJyL&R91oMwvWpj>6WOS5E0~Eldg(^JLQuBcaq?tq-TEzHy(- z@je;~)0VrtjyI=C*AhD^*H+VS3}a^<>Y&+S$7)#nr z&MnnVJrhVsN)hihDydvZKR-s#qrFLlj7J9SKawoN z>oo}HC?ib4j3+r<#7HtKR;Wz2g&b*}&+dI0SH!vQT=|XdRfx4Ff6z=l{l^XY$&D>m zf{?-CWm9tKiYyfmdX$T1N1I6r4c5BocEcTGQcN|wK~WjT+C0>%>CK&^7+o7qgYBs1 zp$t8?&wJ-tJdd01^F`NYf5QX{RudP&aDaTxiyA~&H$+32tK*kp(%WE$p_Sxbsfjz`+DtASnreAYz?~=+)5R@<-;$rGltQ4>t#bFSRHxhbcX&XZn5v z1P5VQq-m{gEnAG#2m-s9ikNEV91BX9wII#pP^6mzH`jG?0GW1>{J@#3b{PL7O!Qp6 z;eKpr6Z_<>!B9q@wXKZ8=8hOiz8ZVhVIp%j^QwX#RlX)tj)-kXv5emd_q&;*s|%}i zOXB{qv38*>Rs50?c48g(>yS}{{<5f2e1;cshs*mSk;5czgKNTm>zrm3hsMg2xMw_Z zchi+*ait!es1r+0b?>bjU1x4p`+*SCpWtBeKH?E7XV%jQu2l!a2hD!p8*+8ch&nZk zg?XyY>loSDlsmI*)%O*lgC9dWt#=+fm7*;(b@8LFevZwf^4;7O3f% zs*jRF236hij^T^vNIotzp;asND|bHe#?ITePcp3MB|ngRsC9~Fya9L7nJ=c(HPdPO z126bHT4uhuR2-(IX6s`~+r6+JoZfUSAo8OeFsMo)J4wTd!|IO=#dv~(BZ$x300j*k zjKS1;!AM+@IfP-{3aYnL;OC0$f#-MPCsZf>B?7Wvuj6<@BV8maE*PYF_2>$o7}W}^ z7pmNsT#;eh^O-Jnx&WePuTfQ&@p*R7fOrtHK71JJ4c8r$9U?` zIK}3kdDjHv^&%sdn)o9i-hmjraRX+vJItYY_m+HV>lf6AC!D1>!VKAtqaF{t3!HBr zI3IuPyNHedTw`#)5y(6NZR8LzB?=oy3X}L7r-$A;wuD%1lI&`s^98@Kil?aJ^k$}q z{}FSW^+8GqxD=+~7j5v65<`u;^xx6nGKGPM>0$NzbAMUe&_Pq#0&jTwfk^I~C;vtf z($g5#HM%a3@R5M=6-^eG!tkBGAbhV)M>|Np?TS?ga5Z<r)N;Znm?>p5E)I^UX)Js4bQMPL{Y%n!43@hE!~O!)oLL%b8!CJ zDYdyWzxB2_y}$?dGF{2dr-1yJGweighES%)9mQyXDg7oWd6k&S3k)y=liN95YFEJ< z7O&;IgyE<#$HwqhfkSdS#(Aymcn259A#CM|o^Xv9_l$|Qdu0B*74nK%&PM=c%Z%n_ zHm>^{b5kK+c6o|aY`k2*=zX1<)KAK}xEiAOrs(?>sk+jlEBnG8NcQ#l&*|i?afzN? z>-m{+3H{8tZh=3yfpFjK;D4k?^%k;x>(*NR5qO=)b?i4Qa0lWmUF<85z*o#MkSbD< zm8YXo3d7>)U3OcW`e>NI%iTUd`y4^)sCq=fyGml4dISK2DJ(a6IdjlpLAg)0D2g_TK`Izou312MuUa-OE$8(hb&R)T{ z`gEWgDnY`ChnvbJ@-l+rhRiBe6OGSnuviz937T+nx2bc}-bKSLuCS(f3bz8G zEnI4O?}%{UJmDZ5jm>$8C5#EG`z=NbDo0DKh(ekT($hQIs-+^zn@1-sWKq>!#O1d`6Q+EHm4l3K2(l%#Z!VFR zzmG~E71fOzR#lkh{Zpcv_Pl1twClH_6ri-a`- z9u9zEMtDCulY?MancH_WCWoD6ZwEm|Y8Y5;<~#!%GM36oOTk4py5l9q05X0*pqbOO zC>Qj)<+z~JdkXEWY_S?-bv(>o(=h7txvANDK3uKj!;M}U6%^+cQ@ZOFj3(kSX$;Hz zMa$jnz@{i$ZW7*CNZgUqJw7!-NHsx8E?s`pvQ3S`#~;CK5lg2H=IZRbST4-XW!ke9 zwnes21}SU7+=~~j`aZy~OXxSL?a1=w9rhBNQN*Wsrw@9a<(C6zr@ozem%ZGlz~Uoa zi$~~9eAK0V&I%PI;%=5%kwp=v{n|CSTY5#N`$6DtbyBk6?eulNUCKuSr;~NT%yOe% z6JhUeoTM{3*O}+~qXA~g{dcKVwbh3nlZute#ZC%U_BiNG!In8C!GSg!1_-R`a})J_ zmiZtE4;bH09sUfkAH&Nt2=JC2K*xQsfW;@s*eQ^EyXlO{q zA=SmUemFAl6!4pvbeXr3Z$YQiMExWy60d25v4yqLDNt8@!rp?j;A8%KD(YdSPV)Gf zd_D&+#$e|j#aD7><_8B2Xg5nSOLr~G`%Yk$I73db*E{1yEv~o3;%fe6k%d54ue}or z=_v;Do&z8SeJ;N{g3Tqs)Ez0u;C!=E&(PI-$lnWUT~~_-AD@92MgGQOw*cyL!OfY= zWCyi%8;u2bu21L*p|eB*g)0CQ7sWHLQ?fPD1xfc$IWxmjhc}UTqOz@=>#^-%&SBn} z^g@@$F&hGqCYI>R0pR5JM?eJ${pMrmTe?MiM9?Mat@rM{d3%F|8{3KPnD7eer+(v! zo?yEnT9IqiI}D%8H3Sy7kcqGcPr5mJm==Yz%}m*+H0~?ikh%+&%MLIfzfSra;^VHJ z)k~&Ed~=bYT81O07jFscT)Wjg7)h{-rbhoJL9*nGkXIUR+g1ra3`|cNtB(ymASC7+ z{xC)`1?#Y3yJC=~5szi0Aq@-Jk1)jmRULgJ8OQUYbotJAt{|0P4+#+U%ZSFbc!RACB|d7Nxr!Z|^XCe*?I=chs15en zTCgyD>8XW6XIL?qDf_KaFq{~+APn*qBP@n>CYcTitrry|wOFtoB~kPP^4(8T*?2C`${t%@e0&r+wQ)9!4`n*CdrtT`9_cb>QPUB?ua@-L zi(*gco`(bayEWF9N8X;z(LYFKX@qwv-(2vJs^8xB$!{75L<28cfN|&8&tiS)OurRS z_%QR68a2q>e&S1k-w`>{Li^IqOkb(?wXJ^ZulxU6@hVM5en#`vE-v z6Mg+X-}wpruWo{-rJmXwJP=R-!GE8*{HxNM_^2~M6q3oy=DkE5e!v(_GpY@m3C}p zd--5MqQE7!dv3m}0*}gdD4}Wl2BXe;8B?RlN)#=zuG5qwmzCP413)3~kfBx+ATiu1 z;}(#+e~lFQHc96QSgy3V(XnBk$r2^jCnJe#f)?`_vzKvr6kMfETg;`m;X zY}df<rw~z`<-!kPQ!@nafUt!8Oxmq983u-&?OPaZV!2D)V!#Kj_09+bI~Y zH>fH)x;^V8$i{MbF76UFTmtPlM0t*+Ol-kV;UI!yb>91?`!%lPjJ^@nD9*#h#p0SP z`dtTbFlOQD3j#>;klM*XFEjXA!MsOhWOgY~Cl*h5Cum>ZyZWo^EHtxh^dbx>2tQj@ zXjQ0Kj~ooOg%cE15@h8)^{6eFEw+-;7Snvp0ZJ?Gl zn7Kz(umB)uYv*RA`U%rbBvVDKQtj&#c15|m1VUW}O1i;|uY|Q$g^#(7vxJ^2)Lp|2 zzcCHb45hG4auQ_c>{_i-jZjY;|jwoUlafw0|6~?!H9g6kKZbYsdm^6T}olnvUOpyM$ebkA!4@| z_U`dR&G-m$#_zr1oM8#1ZeX+2PNwYQ2Dy!6M_{1tPm%Nt3M8*OYt)I}xWIV3SXjHa zO!|Yl1M?T?c3)>lH=MvrhMF0?AxRo%nf;+qIE-DY#t!>>4~?&X7WgI{^J#^3T@d^Z zbAOgo_F*Z-f2_an`Rj2oV_)~}{?g4H{zEtOuaCpO89^#Ini!cF|6B2I)PL@PvB`E= z)T2NZp;4hp(OSf_brVn#C|FSzS!iVl(RTl4Ya>}F>u_kG1dU_IHNzR%NuXz#F5Lqk zj>A;6_*w>=rT4XeJMFn<4?WtDT`vN0U}}5X@S5R0@|d33V&#B zk25#Uwn%!xGSTZWAwVZ}48(-B7By+aT7FkyNJHUbi97UwR zI=Iu;bdOkhf#~AA!n5S8_1n*!Bt)oXau{WjiC{{Dm@{RMwbj(xFQ@ocTkOti>pxkU zib}I5jN}f{bj(*-%u;xAd5tDqhSQQ#KD0Jzl}1Wt8S`yF_A_kOgd!MaG8(P!mqH8y8v8c8ZxCU9MY z7%3pDD3|48Wz%Ryj$3g;ed(z2utQv__2aHuIBXn=+7-i$H;GWv!iZPq z5Czh~Re3>lu!wj#gDfJ51^ZQ$7_ghia|*-0unj!tdpoH2)S-Md4oUG3h6WfjwGqNt za(4%Zrv@ssAIFOn=Gv-U<9iyb&XEBcb3fdipx9K$0szb$6+60cgPffuJ3Mq0zq-rQ z8kG*5tNH1n`ki^u==1dlNOja|tytypLWxC-118KPIy4q z>-$f-t~A@WJ)aRx&M9}2SsgA4_?Nl)n8bc;L=FD1+-Shg zuO?1z0H_|~6;`5#Ph*y^<*SmE?hInVSG*6a>K2%_dX)ng!`Tw$`>0}-8fUt^8Y=iF z_td0o4FrBJ)eWH*ei*hT7OWia)ZN+|fOkD-ag(sMir&`99Li$C5WG8(P#*EF`BUbExTahq8j|X@6In#uQwtnfOL3&KrjBiu_5ha zag_y$jg&wW7@fEUp%qrPk99H@N2|BJ0)w>dk`2qfCB*orXmwTFPW3Xi1i~R~f}++d z+MI++_4eyR7a2V9oTxR4>B^N4uET}xA5>Y#z3@*lL&&Lw!kb^ZVMKE9Gp0h?$qf^} z@XK?@e)vVElZa;xgC{r^S>$r)$9LY4$gPnqd?Zyd5@$x9ZhUcyVF-I&_hoKIjDmAs zl2Rp-Tz-K}eCX7SdpdZI1p(U>>AvaU$+JQyznE|$=zg4mI28^y{fRyQz}4TgS9@7(jnho_ZwjR_xt zN}tDnU)JFIrVgrKwy{i5|DC)1>m=mg43Yoqvi|>G*iha6%Wdl8lFazd=*0k{F}J9( z$>x`UQC-n}i4qJHz>g%ik*i&@dThQHn;qNO`?@chnQNM(`&r@BzwIDOy@caRM^-UDn~{!fHCo)r_iB1ePZlqSPP&2wd$FdS$-`W z?>Q?8h@ds8P^;3bT8o~DkX98;`nE=d{JGbT@h93f60q~KYQ(WFWK%(3yC(JIhQR~4 zL~=_xSYq9dgT@tW-kTbtP@En&7{A%Oi|J+n{*c@(omGH!9?zSD#2VVoJXzc@5;8Xq zJQO_WduDWzYYw7^;Fcb^!b+A-@=}VJXnTM^awj6 z&jyqJvvAuPu`5O?+^4zbBe*5*tMe14nA|n@c#r#fZo1|(yqXsT120eB&Q=A03-UAB z{Ae^;_a@4uP$N>*O?Vz`KKU$m6jt}UffhdB+=M&DwaCY8kx^0{tqbBjo@IE^3hx| zBK{%qXBnwZA(0XWf%p)~QA!LZ59i+G7Jg;qW7DcU0?NPl z!U$HFkQ!t_;Vo-g;^NZ6Xklu-0ZxF&z(nW+N70R(5{VEHMeS*2rmn`t)O@{pj6&(p z1C5W-$4A#6+Y&GJ64PTlYm;V~cU0Iv{px-yIROj|bf>WEVgW6B7JNy6ZoKmj+4Z<~ zs<4rlK=$73XoT6Csw(!2PI&$ zdy2^cdQ@mKF!K3wYfvy)D7GKzPmThu)c)0MQ1%%e+=1qbd0W4L?%S_W{q%zPB!uVE zRb0($%pfi#0&|WFi4Uq6%VVlh^-)pTB>5_W2L&+X4HY5AbryL`cN5ARoj)?j81Wx( z$WOZuKpc?M9oDUx86mozCxPfvLvRsh?BkObnMB4+K&%)Mhh-$o5o;2&os=M_URo1v zzN^C+CC(e#pR^rgc^q00pw($J59S4RQ0Pzp4lWHxS8)6rtD4!`y!&xEwrcU}BE*m& z-}vWwgaMKSSN5h8v|YX;7tS~bV#rjUVZslwwg>zU6N)Lju<7fKA$?r76H6Ng9ieEx zdRcgalFWteLQlvEl!-*vrf(GO6it^bs26VpBBo#+M|q z)hs}Gl_q8b70eR)@Q-mc9DDknAtv5H7M^)Tj~@1^qnyb4VZ`11v6dZq=2H&3`S`<+DjMz+lK{0^hX5iDBSznaO(x1gW;xIJIK z{vW%V-q__YH(wai`iE5XUvWhAKid}nfg@)-TNw+d|8!~fiMO#s`jQEMLaW0~D>pVj z_-pm$e-o{~Qbe}0778Fm4BW{Ar)k}97mwx@exvXO(>KqL{Ux&fnitss?lZ`eGI?=6 z`F6kIuYlN(@4}uY(svRFDGmm>`9x~}VvpDv947L99kVXsZ@Gf%E2=oxvDzLhiK-DvU zFtyO*bCADc@zVW3?!=QQ$#0y-d}*6P#YP9z6^v$iO;%a+pz^uxJKr7KtRe|2F+U+C%C?wZXH?}95j*6`MDDqPC?txm5Rp*gOiraivEnCD@N)QQH3zK{hpcnh z+egF#_*yCE+WBet!R|Qp0&4}=%yTPGXK;x;|BQW`$%Zy`+N7oIKyhV9;T{w?pr{G0b7bNpA{fe)`xrw>R0?|_tP_+UAw=+~?fX88)5 zOIzhN+PQh=crxdBa*vKFu6nBUa*O}3%N;pun(6fmO78zFl>UvLM%mfG=zq4r)Yfgk zh@{r4q%OCAP%_B;V%-83RHC$0TOk}|E1bnzVqu~y6W*?57A7;EI2w|WL?;0W z!Y-&g5Fs9wNL&B`B`MMYBuTel4e)YW+OJ_3_v?MaCQ7HF8|Clg#k^xXLD|Wp^htHU*r9!czZ7ZTp=sC+>h5LUP2yZGmxr~(VLjgR5 z=}{xonQ8M@R9Yfk3@8azYtJ7x0Bf^TIu1WG*y>Hs$_r9R?pyk3PWt&BhZ$gxDuZO! zxGPEzJ#7tagjX_8s@)SNkc61kB+=~wW$0%aR_#8Dx)t{1inT0F^_6P?jn@pq66-~h z$mTu|7!g}fi!J#iYr}LCF3$nV_UkY&Oi74h-ERS`6Na-JY)j*j89RLOLCz`GWb5&E z5tJ!QT5*iJ$Eu1|?X=OPBpuvAGAmqZ+2_ObhHcD{bKb%W710K1le~s!8Ovx+rwd%E zR7;*!8(MHh9iR_Nu96Q4*;N^G6DABk0;c2bmnhn|82P$x{vs)r?NuiYfMd1#0$OrV zHk;`aRqd6aXq3o35ZDe$r9MR-iXDYBYq_eVGFDLd9fM%>^V9&v$T4@}K2{y|-0&St zp8Vf5*~-@xa*9;6Px(zME8{QW-D8Crq^j2-a@3=cEf$$^_MJ=N(xzYJQ;RK)PDK>1 z(auRHus9b)w=aW3Hf~d!3-oMv|M+u4wO_#O)x+-7sfXkqLa+i5D^Q+6Qr42IwL5jb z!(sJ{^$19q&@cU_`Lf(O`|-TW4*#z4pjybt+c;Waw*YzHt6%S05jr%WL%-Q?8)Ig~ z;p-UcXtaTE(I&RS;naQCb=9eRJ%fHncTE)D+u%9NCFPf^(r{y4IayjT7ygI5WTC^p+rt-wa}M z^SenTy%$*rv`I(ci*{&%*rB%Zmi-=_C&yH4fv=9F&UgMbP~TwH0Mc;u`kw?iokJ8p zNVYD&dj`C>MCrGTLbmM&E8eJ|Ahyp@gnTjW$zXn zYtNUE2LyLT#JMzXk=g{z=NAc|wjeICYxMXVneAzzIbH6#F2Q(b2#>IXJk111zHM`t zclXLds(;TZTwn1eo3~KH_}Z4)aB%apvg(MJ?+>366$+AkSjTR|Z*}{vD|Mb%ZbNIO z&?!vIu)G=4Kd8FhWasQQ!4d4($RiDOFMjTY-oM(nQ<1+pqCfeBIoP>=+F{VS)8^CF zuWwzB9%OvJk-98jku^Qjej<2}bo}A9YL*3k`&Ag*Z_r~2v#|Jd=iXNm>*O^y%_MT= zDxT+SORe(D4eqz7TV@|;-16UL^5;!hM$8v`ef)=D@L%7R|AxK(9R$LpAuFS1;bie& z!Bt-&qV77XsC?v-%=BrJ*k3+9k{N8WEza@I5Yp&Ou(HBZ!U-(0^GQ_+`=lNwObOFU z0SbbG8|W%Q^;C4KYS4|ODyt%Fh{nn&sHnm1d8I0%bstY%+;&@&UJ3mvR~=5 zIiJ~H(_J2?KcDyoM5H+tWjanA;CU5A~MydGD1NlV8F-vfM4iquck^Iw`meD{hR z^M11i`<@kT&zwQW=1gByIrK)p-m@l)Ry3;k3)uF><94(%ot+0G}1dY8@X z@jAi3Z#IwiJkHUBnq7x_m(Kg?b%IOy7LDL54)H0T_vv|}%lKT4;jIqyA)jZYM+Wov zZ=;w7-*slf%j)D_lhC7wmkBW*C~7FSO6(ZYd##q(hxI3P@dQhw^7Tzn$*a1jKWEXU zGXdS@tk)OV=pXZ9?Ek0Q1~31ZNxIwA0#Q8KR$ zgRM~Xc1`$kRa@0|xae0RE|r46>+vZ%W25j%?j)e{fpU+Qc)F*Bqhf(&Jj+qt*Bp>??vlQvZ zm}iZ}@zE}0pF$gn*u*@B^k)b&>UvM~1q{~WnWeAbMZto)0)`tU2-0Q;{Ht{H2CpTx zx!2gw9C#5?P0f~DcM;jhFVK`^8mz268|&sY1WGMLM-ZqHgk=smgHy|Kus}|O@S-3H zm8E&|qM%&sLA)4XV3UxkfYj=6=;WEZ7&~nOi3t}b+US4)&Io26j9x^*WHog^F9vQd z4K&K!N|^_Bz=Ln!YBdh7WlyJL!ZgXnt2*NIYO`BMmG%e-g##?2g@?3wVUTD*8^}^e z(2m9Y)VLd+tqcOKuyvhci1!ZV?|S{RzY=-c-p68pXzeS^#leu@&(+dBZWWtC zhP2DZDbUE;iC$Vf4cWWp50zQ8L^00TUq;nUb%@pcDu*msA?s}%%p*u*Xm1jvEf)Q= zphM?rmoEdIIhP!HAAw;G8N4uih^r3OCZ8g{M7!z?5Mv>RhOiMWV6+jit~eC(P`9j} zBgNIUOvTECq(!?}*>&J$T0{#YHOQf@iHo`NZ8KWgXeuW%vZx+bAY z76v+~rsw3KsGpG;Ima>rV=5ZR8x_!Kpdq%9tExMAb>+=wuttqp6On2lW!OfR9sa{g z!Y?v+f1cl}GWvRqwD$d-u4!(7+Q%DMhN zlLNP#d+UOD%N-cJ+lzZa?8zbC^KT_ZhXe@IM1|fo#Kxq~^5aquB6U@-)|HWrps1<- zJX-T(Cuh`!{oF2z{u}t&A&xvj6z&rP2Zq=W3aH_8|Hs~f<&ZT*R5B<9p^3d)F+m717<83QiDRMkb8(nqAEx?P>`55|y%sJ@Mhg zda=;7)iJE2VTUp@f!8fJ=y?g$r@?VqK?*Dxl6GtWan4fZ75%&6nM|$9Kz)KTl13-} zzk|j$ZXdqkhYVR3wNtSaj|4X(Mu!$)hz1M*yQks_a>2^!U`KY<7I|84l{%!J8yWUy zPZBmxK-5MGA{J_nVFeJ4fHfqvA~GynF!U4u_}nMLA30$-U3S=l`8DLcwKm(Ld^Uod zNAo)Un`qq$@$#5Bw8ETe#~q9i*fI}Mv1Q>Z4t8wNoQakA_D>`ZJq!X@A?bVwc08-J zqfRrl@ca831<<79R@i=lL~8oC;Kw(L(>7s~Wo+YRkcIy1<5D!tALULJv27K4b$E8k zpuO%ew&=4h^0fkzB2$Q+0Lx5Ap>NX6GsCvOST^3qi=2E zg9k0E^{u4$jT8sSyKzhCdUhbbGQ}>)ilHfEpazFxA$nR-cUo}vT9xwO3A(iyr=PP< z`9;q8Wjxj|i{FG*?ET0tM(pu)!(EvU3bNqmKnv%E+F|thoG^Vt`6Bi6ZXL@UY1IyP zT7D^Lp5%bWxFbUWrZ!RLQMP%4Pp{ zPY&FScj*((2b=Zn!;IvOQ39G=UE|s;z^yv9{I=qbNueAJw!*(2 zlcgGX84Wv(nudqk@8~PD;`cb6;yEakfBRg|gPth;x=+)ihID`>1=5KLNni zaowTWlFLh+V_Mens(WI~NP#pxBo)iSm2|O9h{i5~mD!obK9XV^tVlxz@s)f%T4ss_ z6oE~DR5n)D;RfcMFufVf~vF$WkgOzBc(M3 z6a06b!wj3C!x&f$C7}= z#(a>R=9u~t&f*lo;#BS2JYSPd$ZN^UqeacjwJ@}3o7#?WI%3W?F1)5vWKxb)+)X9x zBb#oSfS2^V2T7%om#v93c@3%byETK6h=cx?%D{%g$E4 zqe<67duTXZx{fhr^;|{UwcOxK_i#6r>B=R;oi)$^@v@wyHV{eWnLjxH>E4e+GZ&aNIx$yw}=8gZfyM7ph@ z1eXTYgO>d9ZAmxG=wVv%J%ZzPKmoNiq-&4!Js2i$S8~BoM)d`QE_9l{&u)c2u0%=d zy_}&I@umJ*-uGud7@%!nzpFzK`y3DkI$#n~ zKhK_a>Q`TbO|)|aLplUJkyiu)o=B2+2*Wq8R!e@%Km|L&QucgIdZ!zGOUNCny*8mm zf`KODp0auPz!n9IEG%(%+cu({CtR2rtsUi^gWk?Zute#7W2e_Hn}{$A_3#{8rvNo&{N=UytMCdt9q;w;R*^GB zB>xi(5KtlEe;+vhYbAyMkFMjtO|poJ?ttrOfDx_nNLuOb?H`1az5~WZgnPzdYLiA1AKh|8y}*Xk}xw zEeD&wotsZAW|7RZMFcM-B2nQprlbnV&t7eF zuCrp(hx^s^Fv|4j=j#n}FJ3#IHIIFrA1t^mys9;q`*E&l?Slu8?FBNMmjxRHz>r9l zK~lW$jAdM0>BPtZ5k5$+K{&wcR`SHDY%dg7e~@aK9&%>AD7!1K6+w__k-&W$e_R3| zU~rW91GmU5zIHJpiDz2eC(Q@pJ&5)}4=Ze6#kj6*CNeor3aAf0DSlOvXxL~hxrzz6 z>N}c#+IdFrN?~fs_iw>qJfte%O31EjP9koH9?Ij?WbWh^*`l{L){WIV3$|rb-_}u1B*izCCvxGd91;M8>azeDsPQ)~NZ8g)>HOFBy2R-v#5wC5B zLRdD{p2hd`ld5)!5CRE5Ghi30+RIYp(M?s{Jz6c=M~{hV4uP94_Z|QbxQmIM-Nb1ifNZFgJ|+W=r{&p)vn$47UcxLdg=9-}!Azj7>tPuJKr za%xEaXp>mVNv4G9Z0udDx?kvxQIcg!eM_+NIF0N!U=!VN#Md4M!f#l zmg@fvPX5#F>c4Qp;c7FV2)6bYPQcO&6;i^#D?;m*jB5kCjNq&yU0=BuM=f;2M)9 zxsmqjj3;cf{r(_E(96Kf{^nMi9K-$w3WkFi?vsY}hy^Xej_#p6sf^fp=N=z)o4};C za%IlJ@Kx@)YXSmE`^&S9EoVdw-Mx`b&hz@RMyrMe6Rx>p(2lb+!OCPNqiembdg@C1 zD`};@zhC%=dj`G2(s|M?O6+^KINjzCUrho|l$TV-E1;R7cz8FM-;M4;(eC`D&X$(b zAHFZHeFFMrhqVuTU>8o2s3NzgQ#E!%M`vlO1>vt5B6Rw&mS0S;8~a9g@5J4CW**Zx z4<|Q2qjnG7G*()WRyFh2BJcU*BFJ&FneGz<(Vo{Qd0J}6t&$WW8w`xl>1nR;|3Znu z6`#`F7fM|ISClaSU)&~=w#Fvz|C|aYecdcbf*8K0ZsXr47RfHgK*^jTC*w^BH{QwhI^Aare~BP>y;8qLqr-my?{QBItE~;XdmO%dZyjZ& zJ@x4IfGP-*MxlgLlGK&|1_WeS1h9TDVnL$7s)ebnwB++`6Y@tQj zCkS4>_(*XZL#`T2Y}^#0+cMH5%B672d8GK;y~_5*mU${If^D`#;I%(QD|~+gtgpI! zmw$1H4FSiKO?5F=j?7d5u{{QdDJCw0Xy&%f6p~(*^G;Q9KBj|dmqlFHr8+o z(UW$m{8*CjkNV!Ck6aKNlrsJrL@W5Xrdd8=Mmue?m`R_NCJT~(1}`ciM_q#d9GFXZ z>1A2)qP$BL-Y0?vihT4VJ$1+f852~!PNF=ToG1QWu;vIn&;0U!ktv)0DheyV1m-(7 z4ECqXS8BJ#%RPdkIf5tdYwP72zq^P3ha6NRjkCEW{2$YFEmAJ#IZojh8pj}~ecn8d zk_K~Je@$zcsrivvS{oSKDrz^yHtGHDNC`Rwx&eYWktlrg4e@ZFVN<q;5md?bwn^ z*1RFnaf13p95hX-*so8#+}uPf67*VOWcj#e2+I?~8zsyKjLy#wGjAfQXS}F1g+nqU z4&@k8K4QuV#vL`CoR(18hR0CX9RA`WJ%hs`l%p8r%rCQfU2Z7Gl?x4>TUaD7afU6~ zhfkiloXA&JofvyiXy;ZAW44) zep49sS`VwGW&Ch*>*_elK6AR5(ckt3qA*evM^hFa&83)XWGMz<;!4UCDaQM9t;!@Q6I6J}zk&R|^8OugKH7=5jOhbt~&S~Hv_d%1qw zmLUV;<(ffw=b8oXWz|W!MyprQS$EprukY&KL0ihF{_qB9n&Iw`O7^^55^7t*;;+T# zxqcgK_`ZJz72-ULO{DQcELF|1NiUtuC1-D^SH-knX5%N(wh(ou+c)oz&W^AIK>x#f z)1Q3By4+%*8O>r3jQX9J!;Tng57;e=ZFg1^~J! z>@p3VRlx!;(PSNrOmVihSK))d>e%RI;?vPge^G*}iNY>zw<_7*4O40ec;r%g$SOf4 zt$}KRQ?lduEk4QM4IkSufbWgw9f=Bs5=}IGk^1&!l)O)3g0UX`WGv4+z zFSSUx^zfVzNuOwuwB9J_n^z3TdOyOeAIv)03;!M9X^NBp5WMUH%_64Th}oH?=WakOb`SU*th8uSMXg0~d`#~idREQoxzAE(QN z)&Y0?Rdn3Ag}B6o;J%}n+z3le=HV z?9aaqmO$C4|2Tbt`s#lL^*<*8|CYb~2a2;aq1{oIP(SP*8OMwvW39jS`3VF7rfio( zK_F0I{g0)P{6QENm*v=m>swbhFTWcul`rjfP<5B7TG<$B<0D!rh0gGqTU9*fH81g9 zyuRBuU8wV#nKE&AVB&TkzP2)ZUA29_%(NXj9PO=s;(8znFn>_*Id9PHph31swaWHi zAYI1VEA)$-IPc0~l0IX=yWQBc!#`d3kC?RHw|JSjYYYw$;cd|FATzyn9`^ar$Oo$9 zOXQ+FNjw(@$&Zx|Off|dV8A~~KQ{)=jA{hTNV)p~<0UG_gplw|3dD?Z0EdiUQ}B`R zFzThnBK8uJF^tXTq}XeSVTk|Aro_WbA!LMxlxOHqK+2Av3okL@38YWli+D!5dS&Xt zO}a+KJWG`)?;fAm-`ml|!=o8mk-mXN^Qy*~*#m{#PQ0e|4{vCpSlz)h5t%AXET#G# zL4su2PF!uwWGU9)0%|IX6nJV*Qc;{_%|!cK7hQU={tQ$nYQhbol{-GL(au$!Chu`y z3~bRkhY6u1ZM@o8CG1LJp7Fy*roCaHF0wbi+Srq#Qyfzjd1r24!rh1|9a|B370<-Z zI&`TLl_JJutzp&KnjobpYAH(BE3r$8qnZTJZw7m=Sg_hO;RYE>VwGM;qJTExOd^h< zA`op-%xVsuv0MHj$3@fpe=0i@c&fTBfSbw`WeORRDH$RuvodC$Nus*A=Gm1YsT-0h zQ>dger=m$EjS>nOlgiMb6p|r6lJwTmM~*xA-g&?Ke82C#^FM2^wf5R;?Y+-Fjd9pp zd8uYwQe)tp?-;|aS#i#e&uCur){PbAmSP%`PH)*YVvT3}dU97msGia$t@vKfp|%&^ zCN(s@wi&nj%f4R@P{BQ zZs)aiT{Fu%t*EGZM%7AYmvL&yZ_dd&-v>_J#|wr*UsE`@|q3wO1_kUSN^@)>Y@$nHB22(wf#0xkM)! zdiRr>h>-ym;|({F_Q}&{DIZgWO zYKsRCTpd0RaBf(8qC!2@%|+JhCBC8BL1akx-aZ}WR&SB~G@*<&>lJn$FP2K`C#uy|rOrC9J)Jq!aM_vD&NfaP zayY6_?Ba6aVf*p*ve;O}_8Xe{-eTVb0$ckW_UhLqU`trl#&Q~?Gls9PeEaGB0hO?G z(OLJJ5+6)2KOVI9=&=9Uk4JewCFp;@naM3cT8Sed0?2W-^uu!8_VI9+p0WPOl+p#Hu0Ww^3x_ymDkaG zM@sC!#_a8pryBnuWy?OE;?r~StafX5rET~?<+4`;l~F3w#zEhPo-zIy>Uux#821+kOsnTDM0%oEny&&br)4JIJl?eDX+B^slnV(T8MiubZ|wk5R}px*1jZ z^PfSF?%Nu188`0UeJthi@-p-KQNQUr zasF%fK9sv4djmh5?|#QC;F5bOwNzOi?n_|Ix5F&O4a!}gozs8mM)uV=`lzJVF!y)t z5=qYQwZB$$z+mt1JIN1>I^O(jc%$Qe%OfY$;DyqK3cZHC*bA~Bjh;=c?5N9opV`;l zi!<6}qPVa9i5n#hpZCI zjk{mOF=Zx>h+DcO^dz{;l_U+^vF)EJ@s59`RDCz2QmL}p_5KV_xW{jcyIs%p{_iK) zH*I$FSmQNhJeJU=_jbqhZT2I|{0XXK9?MjVK0anU85tb8N8fjK!ZZ`@1>d+mo|G9* zMs&NcC7eCNlT3N_=vm1Dx6tJxD^F7F@v6Lf>y8em%+~K6`@c4geJhRfFN{i+%r4rK_P1oZ9Zs6jo($@EtXn0+sr2ZKBcp}wihvmE`UAszsC!qW zU^W~&??#0U+GpL`Dt79yicW>>p2+gINBZT>eu?(qF~0C=|An2(=N~lEx4A@5vCvvp z(FdmU^;6Qmpgiz`fv;@~{`LL~x0TQ944QrZa^Wm}{Y}mLt(1XH^fz0W$N6b3+vsoB zGLNg#zUUI|@6&m;)9lsHK-1qe7YDZw-9Bu6>b#Zcmn8boWc8a>=WR4a^n%L9!;^T%99a(^)*5^@tO)OiGuMpl9slH;!>h%nDydm+LpD9 zMK2oi{7+usT_^(8l7c00 ze(Kq=g5d0;;B~CJtU9sXU1N3{zq=DlG3{!hvTtOYjndl&j4u!IYv%J?dr3 zRnn)A>N-boa`=5M{k_$8Q&&%#to4c;iPekVZp2!*V!*&OamCG3tf7sVEAON2BdhZ` zxj);fMzKv%8*ThmW^zWWXL6lnqena6uo7QC&y$ZvaSu69t>NTeQ~2CjbB9qvY_{L2 zf)N2H?~A8D9L_Ear!q>Vdn2}bWBqDxNtWx{BZd~mv5oQ^d)4U-!}EK6{C%rRBWg^m zoHU$y<%4Jwa~v2j%n_*!LPp;oo{V7K#EH#e4L6HYdcPy$!nMgm`Fig8eZM(A{^lDi zZTU$NrTI+R^2G8?8BWITP4&gYoF`x2=B6KHO7htq%fh*P)qT;N_T?iQ2cD$HvG5${ z9ue$-BUU+e*=#VMj~v!4IMhTr#;)AtOxqOKr;!_BoE)EdHdEUqX=4Dpg1Y|6vztn3 zZd(3x{QZ;j`;P}iOeyx)rK#VyTRtu`K+mVW>zIa5{!QPlxo4i9(O|iiB6yi2ph}!~ z{mXqtu9bQYeAY4J3RY*1GB+PT_N7Ue7N;cI_gts%{p~^97ij`V3`W+)8sqDH@Aw@X za9f)xVUm6GVNA)urPwUiYYN(1M?U4W{DZN5YqFu>?&me)zxYFsiX~84KCpfpHDw$0 zMdsy+cLKew1MK&H8C5h1zhQPPW>oH4Y4h!KnrD0&*Om{glAIYidUgfL3fi<=^dfyl zxP?n^Upi(S^UwY*_wSV6_V6v%`KA=RE8*l9p-5R<<$dgHV?65FUz+_mv{SzQ-dWSk zyDy9R`bunXZ&kOy@?6u=C{upb#qk%RMWUDA>ai8x(l2@0(%<6Vw?{7WV$p`Im%U7F zEfpo6-)*#{r8yjZ9_aJD>F9Ly>E@)f^1kr3$@)n2H8az=PT{1W11q(8pQMR#?5tQ{ zl1&vL~xC1k(jN@2@ER{Pjjd-+QpB6_8z^Ys|L&s%+aO>4Mvt&GE46Z$}*kQ-n@ zvnwwiUpRiRmMMxFwmZy-GHjY*$Fc2M-l zl@z5tNzR=ajz?oJ3BKhX)`~RFIchvHQ}XjsPk6+-)Ob3%RI|L@(+5&2yhYD)RhdUQ zGIGRrxU+_Q(CMGKbIv%>{+aLeM3%=VqoacHyTil}@?R2*lVdJbbP~IAE+)H7-){7p z&DAuH1D6Kw9|LaQkiS~U9nWnp zt;O{;>E>s>}gGJ1gD|Yc}93LpK|T-Im_LerNw1 zUyfey>rY#^ZL7IBv`Hec_tM2tsWVqL$f`Ljoy~cyQmdg8bBUj48y`TLzCCgmr_SqDSM0v3VUG@0D|Buo15o)$e3UVWKHLz=DSSg})*4)CE@_mrQf;XdT*{Y~8 zl({z&np-E(+Y#sHZ>k4Qy!R#9a^s*pzHs%wzD#}w9{iH#=C4WYu{Bo+!RVDhPPGCbV}8u`o4f2S+QtStS{V(Xlki=2Aoin4)b$>GanuRH}JM~rVZFzIS`UFNY+1lUJS zccpqf^z%3v{@mUvIUqT@^6IbKt2KW-jF72+-KctQpd_fJ&j4eZ=Y@6kb9(OHA{7(K zQBco*UqwUbWXbVlu4WO+3hE-yH1f zFntD|8NvS;stSc{(&=aM9E;e$L#pmt0!KZIt@~+}#>XME2N3KlNR;ygJ4V2~#NRcg z#dZ{4(vE+u7nN?{%dX8;^P5jYsV{Qp_T&s2RsniR9y4~PoKowDg5Zddyet)&g&UHk&l*(nD~dSOEMp2k7k!? zt{f4m*~weTU7M2L>XwNgkg+UPINrDA_0geBHO-Jh?ox&DeF|==7;`WC$Ky&pJPG`* zG4d{1xP5nwQwM0AO`4vXc7D8->IJ6*)N{NxtR1sWIAOF?zjya>4#|C7=DXXgO;7o@ z9_?}tPG^`1iH+D87kZgt{ObOE797(z9pSFa8Cx@@(zb4_l{=7o?b(G#?UMymU1f>* zLc8{@OsC(y2>Z@=P;W$A>D61^We=*jYxOeIje#_#s(qQ=>%1aENinXnk(~KgoHtIp)=)aI28+`pQfB8wR$d%3tz zn;D(3ui9y<@S<%0jxB0U3WnUjyoJ1~ub-`w$=$BgaQ)4V(NjXa?R8wYZdS#AIBuVA*x)HMR#5V~bTo2X_{k zcH0^!GD#0RW)`21!`NzR$hz1#ewvVGdb{#oXF=SWa9K`9si>_ro~?bBSz1z24SFAW zv-5{<6g_at6*9do;l3f|S3y*5Y9s%tM&na_B|9W`9V!~rRE+OGOza-oye8J|5P z_(OU{D;s*J;%r6J%JLdF?Gy6Zdf(>FFyjh~e329DPoxfhn|XVtt(L8vr=YcaZ_%gh_?z0*T#s;F{N@D%W1Ug z#+YfPoz^jkUsrC}`ia#srld*E*g>V4#)wTsl*PWt?Yb66GrN(6$i*0UIiu8*#&Vh# z#aeu3_X|$3-ZP3G>qW|~TLW3YA1i6cMQ8~%hZ)K1OA3_h zwLWKMj9KmGo?>HIs%3HGiFwX$xtqF@LgiK#8V-uh3`V#0E(@32w~EIIn_VhsWA)PV zkSk8J*@25LP!@T~)|KDq9mAwG;VLU^uH|Ml$SP_^+kDM#*M+FJdOj~6?FmhL8?FDf zaOWWPSji!}?|zYcyb~RzLYwgxbiQjke3#!HrdDkHAQPT*>GQBqc=phhN$Q91Rl*BH zf21}QbFH{wFiz$@FQVHd^UXg{2O0ySzA ziS`yD-Z)IKcCaJX7a6?&9jmS2qvB?(W|;3w)d`wzq@w!36iO+6EckuSk@Kr$gay9D zJu|B}M_R@#9zH9c9V0qJ@jKzr_AEuI{N%PIQ5Toqdin2JJ`LW7 zrl+R(9#QmK%DvBtRbOG1%aZYGjq`x4PdtsUwl>91tJoD1Wz`LV%W|iAd)_JR7Ge;6 z#r@%v4uw2*naI037o3ZxfWpI~ZOx7wRI}ox6mOj}KF%PW$>1Dm7ux<*u^C_8t@8Pzoo)p#kP%(hg^hoWu@ zaab0WY?){0O%4B9<;oD%h4Z+uUFyp}j+LUfMBlgj)8k(XB|Wnf#Jr*zOL|9@K(qI0 zKJRAjSSempvy97U_~e}pt&5%yCQ;k%)Z`JRKH1U~v4`ooYqKvur`#DWiJ`95u6{#} zcU!eecUP|XmNcSUX`E!f+O?yNUuAmiTgAk#4@#~~j|~P`!^#qEHMTf%WW`J5G)J`_E-f#* zout~39(vh=Id?$l*Rn|=Gw-JN=BmbROc!*|GwbbAHGh(JslDz7o!f}p#k|1d4*an# zUK;}A^_Cx&9$oez@zd6D?oubW;*+N0Qj;xr4y&G_9>$|S17wD84vwvw_&Ggb>^+$Q# zo~D)j`R&Hy6h3{^LtnxN&A+M^{l=d@c)5%zLPW#%RMPq1R3$7wXBT*i<3i<`U^#sa z>PvYQ{#{5OJb$snKN)FTs!Qn^>qr~wX=)o=Xm7*?KM6br^h)KW%usFe)We%3Qmc(!Bc%?Rag#4sm{+%PdWe%B55>LkITW zfBfvyO;2U)w9QaYCf|<|mTy`;3G~H$N*LP{lh-3Ke%a&ObyfwPjkFxUZs9wY5oZ3Y zS%CK0gH=K-@5jEhqKZOyS4`;#TPi@cE|H~e)uHdyY@^*si)z<4aYFGsqBuz zD%&emS(9R2G6%gB#S)|cxtU_kbii)i?t|ZJ9KV=YmoxT<>+c&`%e8+rL$aJQ7R{?5XO^e%I|YRH+trd?>5KE?x%{KI-26MfhDT_oqjfifjtvDb8|UF3(YX zhVf6xph=HBC?ew27M7geo|LY5)}Z1`-fE5>mayMv{XM6r6+3^d8TG25`+Ur7)A{e( z>LbS{C8d^$s4Ta2*3N1jm0hkCbN({T3}coBJ}@V?vUB2~sS(E5W@}|)U*u{_8YLFP zA~8RHLq9u)xD)iJ+q7%0xoOU$feBKHB8h$Qy#UD4S1@A?w zWEE!6JXZ<#c&_Z?tGw&^(@wS>%E7AdkHp%pD!Y7z?yrx`2z86jOv$0g^%pIsTGvuZ2MDn>bW&GDNfDm>zmxrwU1Xj z*fh|EH{QEaQ7p&xxcQbL@5}dEI5Xa-ktueo$5KvkkK9g+-eqo_q**IA!GYttXXxk7 z=k(Kl-Ie#jNpBS{vwvZ4nPyOz;koM`Pg!`kp62cK*9~JdhteLz=RBlD=1(SZ->9b` zcGS%tazIJNP7TMZz(t>d9-QfC|1I)gt0)H5k-zh?#MA(}jh%uH`48Myc6u9g1N<|JjqkgZJ~v(@mH1ZnEe=*eSaG2{s2rcAY4&8r1XqK<=|*TR1v-30TX~lK^ALZ4XP1Hbor~o zIU!uJp1xTB0J0pkCS@TK{N>CZv_h^&qI>gR)Xm5|{GWUOL@gu|&6b*~1re!&FtLJXpZD_mW7P2q-N2$+ABiD2rXIe+Ec1 zBtR5keSse(3kEtX0mLHE*Vo7Y-*YV%vu3n5*Ly(iwH_jj0E)E}XRdj8$4 zO(+?nC60vB+Q$%_E`U*yXg+u4;rl_*zcj?pN$&q%C?Wzi5UD7u1ZV;QlycqD(0?}z zFNW$xRq)>gXcPgITWD$MzaKzd45c65a<>Mc83a%v*gv&Y^W})^wET9*?*@Qo5~yFy*zs2;e*YS0a`j5v4Y;cYbu zkf=q)g^hm#OC$N1$u-ZR@inv*6ykFj_?w3x)LKlMO;iYaE}?`-th4Wzs7eG0AAy8| zC@!lWQLe6~ks*oLiDWc2CLJz@UY2MB0%mFKIT==sgw+ighS>pAlI&p)#eMBV~t9 zR7!e*tcjpZKdp z$7(}%ODJ6I`7qgTvkCJ6KqbRZ0Df~<9$ws)5a;QMSla@J^(CYs!i`p3-j)i8I`|>4 zdd*#V_yIzihMPCWKZLYs8w*=r1_R*~{DkL7@HY=%=SCo!rjOU`TT~>)L%R5Z*OPvV z5J2z1X&*8uVwyVv@!z3d-66oo6C$Ufk0S<|T{VT|ka*+O`c1eQ!N%RtkHk=PNgtAQ zvIatA{weF@k_^;9h{nnxJbd{3f*V5Rq9CA31h@T9<6Zu^P19+C9qI0tb|#BRQb29LK#ZpwjzpJ2s1FpbpZpGD@(}1$HkK?kfViZ{2)zHE%Y$!V`f|{# zz`RD0ZW@w6l1VfkArcNHF&&wLcJE|bZ1tOoq-Z*Bo>1};mk@Ezox0-DtH9IiAhJuM zB&1F!$(-8>f${VtPDZ4?_o{QDxzg-GO(0vloj0{(-{x7e;+paAqVcmp~J#^o)E zCMob|qb%K>K&1uGKnKD11th7+gbap+@es#-csRkX7l6+Rx>!OHNhsM-0C9;|1`p3H zhwgyXDrixkT_H_%adRXkDiRAnY>BP@4DEjn;){kVLmdI>k`A-o`#a z5=N{&r6iF)B!&Q_;j|qkN1C9~Nnm*>N#?IS{K?xSfly1k`FcX*NoOfY``_JLbMOlY z`wiNU_Npg$mSB^JhDgwEnc>Qdg~e7Xn2Hgemlug#RQE|yk&K#n{)24GVewMZpoI3z zKzxM)a{hu;`WZ>04{kONkgyffeBS95?%vRR6KKBZJQNXh>vNLWKraVUK@n+u=9=2X zFc1~_%CsPgIoU{xX+k2%A~L?ZwRinBh$qqvi$dPovzw20YqOg54sysc9JCe!>232Ke5D(zQ-P61O9Wt!0sq?taB5TW5DU_I{uoPXf#Ha^nHI?`c1jD)N9gKiH& z{1Zn#=5Q~m$CzV1XR}~Z!3q&y?N!*vM-T{{k&b}k8h<6v-M>VZjrc9k(++xVP>ci& z<^m|X=QmPx(j7KpZ7suN@Q51F13Iw$9wSAwgei8?nnn6TY;r&vC$xSw-C{rEoFqy0 z4yPzzBvGs)5;Mhc*w6z$1niHNxR8z%ezue*E-~Ux zyoaKbIG_V?3odp5>J?;>Iv7VdtRsZ52P0jpsq?TYB!EPUbZ<@q>e6Yu+)l69LBJt< zL18+2{(?y^Eeay$s}3$60Is7R z>=r^@%?r)QXZZ6~Z1BbR_9{KB9|V!b?11 zZYG(u_}!~>8Ije^LC6L~QEDPM)S-aD25BYa7{ci8m@+y~X@gKE(EA1#a!jOmN#N{ILs1Bz zoSt_(0oRaRm5v1374P0>z5xpK#zphpQ$%P>mgj4uoiZ~4_XK_d@SD5x@Io4d!ugP? z%aNuE1v(6#2Sf|}(8c}=O#+(He=K&{5^J>(D3o>-eDIsQ^6->e1W?lTsMX~d*=?;R z6^9`V^FksjG{=FzdHAnHP%w86lbya8f8-c4;(lo{l~WZDfO7buQ;7Sp3b)8-jLDRs zh-o7OFQu0O2r(_Xq3N(*vIs`HRzwWJ_H=^|17PmL54{)QlmQ`%d`Ty?{O+fxAeIcU z&}|$tB+VjH%OPLe;w|i~pMX*J8q;F;r7+vGIA6WnaJo6v%=&I(1dqNdP2Xryn~szlALZ7%+LX$X!xkC)^^>BU45pEgZe_C^ZN;h-hfnbFn4D zB3VBn=Dpn8Z*d7Y{qRGFWbxeutp8XzAzaH1FZV(9ZT?4{@n{{K@X(3BQ@hibR2P z@I#wo1VaEMQy41a;$#hkbxngoxE&BW*MZvRt~~q>N8&7!6(Qm!-&Qeu8H2{&K>{l_ z$AZ6kcxLB?xcQBM8a_Uru!(N&jZ8vYAXJG>xLwylNI?SXbvL3^O{|+IBz)wla@VV* zX+TzHh+F7Ut=yA1)yErV$jC$SACBEcrm(9)RP@v+n=dIS4&&w>KpvZpWzzHo>~?}; z!z_RVHqd(sQKK#Qvm;aEO(3ci%2pivi87Hrm)hP=0Xtzqlf1aU9fSJs@R>*_}X$2wcRQQqL^S>dY`2kxL zrJ&`hM7cT`&wzQG5|?#-sZ7IFaB&`RaWr#R8gZtlj}I9+kziChDqI%<>TLk^3Zdk* zKS`9S=R~^UNYQWdW0}?y5bz$%&xxRbo3e-k4KYiFwq-%*e)B@ROF)-sq;4(=WWW;9 zqQ5gycMx!1Fz1Qx7q|0?BauFbZdi>T zO#`bngLes|907NW1e}b~keTEa?iFr&K*NKtqKCNMcZd^bYZ>x7uufXG8QJ9Z81#T1 z;(kD#O+>w>K9FfaLP#DfZ~8%043Oi{70`Xv{}EBFxlf=snXZMDC1w%Vd6BiX7GR?1 z)4stTVFiF`$#PG0IxzfGD}z(qC*p?h0hCkd_> zc_QwEbd)^kK$2mxr2g-S5-t5P-T|=ENJaz5$oRgKqTZuf!;tvpbkj?}jhj_KF}|nA(D_fB-rp1O7acpZP+TO&#C&FH%76qq5%z7M9ba$szdeDt z+N)OJRgU&os2s60meJ z-cFvx*8Y%BQTyuN`se{tJq4-IeZ~r299SfkITVO)Ua$;Jvdt2K#s?oeY>!~zl> z+u67lBHf9<4QS6R>7oZ$6bI6mB+e*k<3-2N)>C77aQnQVW3y z#!1}~+3PYNF9?aqYYjiJY`9ZEtcRZf{N}Da{PT^Ai2+CsO7>+l=4JiZiB}KqodBH96 z(Dp`vqdQ{zc4FXpuOZ%e1i9%#uNg9bfXuQB%o!Q}=HW5gq>!X(nwP4K8sKhGP$!xu zp+}TP(lCf@$6Z!xuZ8BOK#C@el5K}RNm__62~#7){=3q*2mdv-Ac|OKOq@vC(nulT zx3T*818~T5(2>!L9pk3Ncx0{1rV)F8D-6tg*%wDG3QICDvY~tbnXMEzV1l>-279!} z#M+Z#!s=}RvC#n0VL*4|?X}QmWREi1DoO6dkaOz^q`k&u3q?2bDk?7|xM(7!7cruh z_n$XONOu%3nH_yFj!;a3jOewocE5#0Gi1xZvm4e4=_!PL4jKGp<=<=bfpFB|gy>;Z z3AYe6_tG)(#dKuqze+yQwE&zBw#F@*V$6oA^1q|f9BK9)=zrh#m>mTEwKTCe(GY%& z{)J>LIQLy>xDv{_3q$@dKAF)Kar%>{+je<_Mpi<2Lyz6K1OLx+2=$G)SJAmQ!AMD& z0|7}8)r#$hNzyHSJg`J!CSpH5^QPNK<=X~53tdtlhl2r0XnmGv3892Yo`yh+=~GNy zpj+94N1(fvM+`}*HP#>TH6m-n2r`$3xA_7f83h*0DUwbSIqMdN*kEE%M44?9MRg^d zuor6c;w)M)mps%Qi*X`FuCcUb^=V(WJHmG4a z5YYuycnvX{h5D?V+WVpSvG57>cO(&cDz4S=B4<~w08OAvpdiS^3DrEuC7pRAx?O#3 z@*eDYrAR^Ak20QV9U1EEh(IQ(M;84anaO<*1cBoT#_Ix@e&s0h?C+0iFSSJ zcW7k5pK~dos)5~)Wc(9xee*-Rm0;f;1rwNQ14^Hk?-x>M&;3}q(UkP00)n0XVLyRP z*Gxi4L{EZt!}|PRw?|?B?n@*MM`pbQ%tCCAg1wr-Ug)Xj*PjUB=uMTR!HCpV`}m&0 z9vTYBhZZg8mBH%mBB}p^|BKv+1p|0k8IiQ93w#$H6tM#Yc+^%(@?!HJwX;?NeRzXD z(5sMdhDdW4?B*klM{=9GQ!AK}1@UnZ9o^*u;LXoPTAADCtcwY7HNyB3%gYevAl~UW z4=~jTnDYND$&@7wj0n?Q&3mO8@Gd|lh?cVeg3uCj5;=GT2@Q;zY)3DHM=*kV(c5he zel5wIJAXm;yr)*B2U1hoGUI39ZN7!x7D&+VKgEis~rFrJG)MgWJrT!0SqYVcmzB2E0Mbxa)Gv5q+M zShlPN*`I(72CN{;Vn;WSz~X$oiJ$F(i1~XYCNmKf`wzIRFpAeKLCC{l9G7%~g&z?{ z>+-q`0dY3@lC?21v_>|p5!+;j2)XdPyyyvzY1M_u|CA^!{CMknREww87Q%>r7>-zU zMI>DKtxq&mSbb?Ik?@K@7k;A=UE%0!E)6B}(a?q2BJzNR-^)WU^L*A``T?`Ho6q-% z2bhK54naG^J>4arKpeU7I~eGx5LU~@Nc1O27B(OGZpOk-EFj;_n7i`ur(o^$Zx@|y zD4{S&zP<2tfAmu0v7H2nxi!Im^H_2R*&ytNXGx>Grs=Mw*o4v|srkZ`C-Gzs0!i3@cm50xQw{hlAz+7+$uc^T@NSY`pDB(I_0k6X&ub5K&4;0P6dH?_b literal 0 HcmV?d00001 From 2ffe0e2bb3cef9d8389d02011d8702a704450b28 Mon Sep 17 00:00:00 2001 From: bate999999999 <282742732@qq.com> Date: Mon, 6 Mar 2017 03:35:20 +0800 Subject: [PATCH 053/177] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 218 ++++++++++- .../src/com/coderising/array/ArrayUtil.java | 360 ++++++++++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 170 +++++++++ .../com/coderising/litestruts/StrutsTest.java | 43 +++ .../src/com/coderising/litestruts/View.java | 23 ++ .../src/com/coderising/litestruts/struts.xml | 11 + .../learning_1/src/lib/dom4j-1.6.1.jar | Bin 0 -> 313898 bytes 8 files changed, 863 insertions(+), 1 deletion(-) create mode 100644 group12/282742732/learning_1/src/com/coderising/array/ArrayUtil.java create mode 100644 group12/282742732/learning_1/src/com/coderising/litestruts/LoginAction.java create mode 100644 group12/282742732/learning_1/src/com/coderising/litestruts/Struts.java create mode 100644 group12/282742732/learning_1/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group12/282742732/learning_1/src/com/coderising/litestruts/View.java create mode 100644 group12/282742732/learning_1/src/com/coderising/litestruts/struts.xml create mode 100644 group12/282742732/learning_1/src/lib/dom4j-1.6.1.jar diff --git a/.gitignore b/.gitignore index 8b13789179..eca0d838ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,217 @@ - +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml +*.publishproj + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[cod] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg +.gitignore diff --git a/group12/282742732/learning_1/src/com/coderising/array/ArrayUtil.java b/group12/282742732/learning_1/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..4d93afd1fd --- /dev/null +++ b/group12/282742732/learning_1/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,360 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 a = [7, 9 , 30, 3] , 缃崲鍚庝负 [3, 30, 9,7] + 濡傛灉 a = [7, 9, 30, 3, 4] , 缃崲鍚庝负 [4,3, 30 , 9,7] + * @param origin + * @return + * @return + */ + public int[] reverseArray(int[] origin){ + int[] newOrigin = new int[origin.length]; + + for (int i = 0; i < newOrigin.length; i++) { + newOrigin[i] = origin[origin.length-1-i]; + } + return newOrigin; + } + + /** + * 鐜板湪鏈夊涓嬬殑涓涓暟缁勶細 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; + + + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + count++; + } + } + int newArray[] = new int[oldArray.length-count]; + int index = 0; + + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[index] = oldArray[i]; + index++; + } + } + + return newArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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 length = array1.length + array2.length; + + int TEMP[]= new int[length]; + System.arraycopy(array1, 0, TEMP, 0, array1.length); + System.arraycopy(array2, 0, TEMP, 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]) { + length--; + } + } + } + + + + for (int i = 0; i < TEMP.length; i++) { + System.out.println(TEMP[i]); + } + + + int head = 0; + for (int i = 0; i < TEMP.length -1;i++) { + for (int j = i+1; j < TEMP.length; j++) { + if(TEMP[i]>TEMP[j]){ + int tempE=TEMP[i]; + TEMP[i] = TEMP[j]; + TEMP[j] = tempE; + } + } + } + + int NewArray[] = new int[length]; + int num = 0; + for (int i = 0; i < TEMP.length;i++) { + if (i parameters) { + + View view = new View(); + /* + + 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瀛楁涓 + + */ + + + //Dom4J璇诲彇struts.xml + + //System.out.println(Struts.class.getResource("").getPath()); + + File file = new File(Struts.class.getResource("").getPath()+"struts.xml"); + + + SAXReader rd = new SAXReader(); + try { + Document doc = rd.read(file); + + Element root = doc.getRootElement(); + + Element action; + + for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { + action = (Element) iterator.next(); + //System.out.println(action.attributeValue("name")+"===="+action.attributeValue("class")); + + + + if (null != actionName && actionName.equals(action.attributeValue("name")) ) { + + + //System.out.println(action.attributeValue("name")+"========"+action.attributeValue("class")); + + Class actionclass = Class.forName(action.attributeValue("class")); + + Object actionObj = actionclass.newInstance(); + + + Method[] methods = actionclass.getMethods(); + + for (int i = 0; i < methods.length; i++) { + + String methodName = methods[i].getName(); + + if (methodName.startsWith("set")) { + + if (parameters.get(methodName.substring(3).toLowerCase()) != null) { + + methods[i].invoke(actionObj, parameters.get(methodName.substring(3).toLowerCase())); + + } + + } + } + + Method meththod = actionclass.getMethod("execute", null); + + + + String result = (String) meththod.invoke(actionObj); + + Map resultParameters = new HashMap(); + + for (int i = 0; i < methods.length; i++) { + + String methodName = methods[i].getName(); + + if (methodName.startsWith("get")) { + + resultParameters.put(methodName.substring(3).toLowerCase(), methods[i].invoke(actionObj)); + + } + } + + + + Element resultElement; + for (Iterator iterator2 = action.elementIterator(); iterator2.hasNext();) { + resultElement = (Element) iterator2.next(); + if (resultElement.attributeValue("name").equals(result)) { + view.setJsp(resultElement.getText()); + view.setParameters(resultParameters); + } + + } + + } + + } + + + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } 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 (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 view; + } + + public static void main(String[] args) { + + Map map = new HashMap(); + + map.put("name","test"); + map.put("password","1234"); + + View view = runAction("login", map); + System.out.println(view.getJsp()); + + } +} diff --git a/group12/282742732/learning_1/src/com/coderising/litestruts/StrutsTest.java b/group12/282742732/learning_1/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a44c1878ac --- /dev/null +++ b/group12/282742732/learning_1/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/group12/282742732/learning_1/src/com/coderising/litestruts/View.java b/group12/282742732/learning_1/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..0194c681f6 --- /dev/null +++ b/group12/282742732/learning_1/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/group12/282742732/learning_1/src/com/coderising/litestruts/struts.xml b/group12/282742732/learning_1/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a4ca47c733 --- /dev/null +++ b/group12/282742732/learning_1/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/group12/282742732/learning_1/src/lib/dom4j-1.6.1.jar b/group12/282742732/learning_1/src/lib/dom4j-1.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8c4dbb92d6c23a7fbb2813eb721eb4cce91750c GIT binary patch literal 313898 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

^<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 From 4b40da8c2250eb8fab4cf9b485d07efb1a5afc70 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 6 Mar 2017 18:04:38 +0800 Subject: [PATCH 054/177] =?UTF-8?q?3-05=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 72 ++++ .../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 + .../src/com/coding/basic/LinkedList.java | 381 +++++++++++------- .../download/FileDownloaderTest.java | 60 +++ .../test/com/coding/basic/LinkedListTest.java | 299 +++++++++----- 11 files changed, 672 insertions(+), 245 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..d71540b497 --- /dev/null +++ b/group12/2258659044/zj-2017/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(){ + + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..2a61b81ad8 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,72 @@ +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(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..249da5d667 --- /dev/null +++ b/group12/2258659044/zj-2017/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(); +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..8dbfe95dda --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionManager.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..fb44ede457 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..4cd0b3eab1 --- /dev/null +++ b/group12/2258659044/zj-2017/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/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..32f03efdc7 --- /dev/null +++ b/group12/2258659044/zj-2017/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/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..1281dfaa9e --- /dev/null +++ b/group12/2258659044/zj-2017/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; + } + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java index 460298ff56..6d914f619e 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java @@ -1,137 +1,246 @@ -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; - - } +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); + }else if(index == size){//娣诲姞灏捐妭鐐 + addLast(o); + }else{//鍦ㄦ姇鑺傜偣涓庡熬閮ㄦ坊鍔犺妭鐐 + Node prePointNode = getPointNode(index-1); + Node pointNode = prePointNode.next; + 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 = pointNode.next; + 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<0||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; + + } + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + //缂撳瓨鍘熼摼琛ㄦ暟鎹 + Stack stack = new Stack(); + Node node = head; + for (int i = 0; i < size; i++) { + stack.push(node.data); + node = node.next; + } + //閲嶆柊璧嬪 + node = head; + for (int i = 0; i < size; i++) { + node.data = stack.pop(); + node = node.next; + } + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf(){ + int newSize = size/2; + head = getPointNode(newSize); + size = size%2>0?newSize+1:newSize; + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * @param i + * @param length + */ + public void remove(int i, int length){ + + if(i==0){ + if(length101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + int[] array = new int[list.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = (int)getPointNode((int)list.get(i)).data; + } + return array; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + * @param list + */ + + public void subtract(LinkedList list){ + + for (int i = 0; i < list.size(); i++) { + //LinkedList.this.remove(index); + } + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..32bab332dd --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,60 @@ +package test.com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.FileDownloader; +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/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java index 3a5ff822ad..2aef09741a 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java @@ -1,109 +1,190 @@ -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"); - } - - /** - * 涓や釜鍙傛暟鐨刟dd鏂规硶 - */ - @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(); - } -} +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"); + } + + /** + * 涓や釜鍙傛暟鐨刟dd鏂规硶 + */ + @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(); + } + + @Test + public void testReverse(){ + + ls.add(3); + ls.add(7); + ls.add(10); + ls.add(8); + ls.reverse(); + int[] expected = {8,10,7,3}; + for (int i = 0; i < ls.size(); i++) { + Assert.assertEquals(expected[i], ls.get(i)); + } + } + + public void testRemoveFirstHalf(){ + + ls.add(2); + ls.add(5); + ls.add(7); + ls.add(8); + ls.add(10); + int[] expected = {7,8,10}; + ls.removeFirstHalf(); + for (int i = 0; i < ls.size(); i++) { + Assert.assertEquals(ls.get(i), expected[i]); + } + + } + + @Test + public void testRemove(){ + ls.add(2); + ls.add(5); + ls.add(7); + ls.add(8); + ls.add(10); + + ls.remove(0, 1); + int[] expected = {5,7,8,10}; + exceptResult(ls,expected); + + ls.remove(3,1); + int[] expected1 = {5,7,8}; + exceptResult(ls,expected1); + + ls.add(9); + ls.remove(2,8); + int[] expected2 = {5,7}; + exceptResult(ls,expected2); + + ls.remove(0,9); + int[] expected3 = {}; + exceptResult(ls,expected3); + + } + + @Test + public void testGetElements(){ + ls.add(11);ls.add(101); + ls.add(201);ls.add(301); + ls.add(401);ls.add(501); + ls.add(601);ls.add(701); + LinkedList list = new LinkedList(); + list.add(1);list.add(3); + list.add(4);list.add(6); + int[] exceptArr = {101,301,401,601}; + int[] actual= ls.getElements(list); + for (int i = 0; i < actual.length; i++) { + Assert.assertEquals(exceptArr[i],actual[i]); + } + Assert.assertEquals(exceptArr.length,actual.length); + } + + private void exceptResult(LinkedList ls,int[] exceptArr){ + + Assert.assertEquals(ls.size(), exceptArr.length); + for (int i = 0; i < exceptArr.length; i++) { + Assert.assertEquals(exceptArr[i],ls.get(i)); + } + } +} From 7a1344c8e32730b544ecf926cc82190a2ad0da05 Mon Sep 17 00:00:00 2001 From: 592146505 <592146505@qq.com> Date: Mon, 6 Mar 2017 18:54:23 +0800 Subject: [PATCH 055/177] =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/org/wsc/coderising}/array/ArrayUtil.java | 2 +- .../src/org/wsc/coderising}/array/ArrayUtilTest.java | 2 +- .../src/org/wsc/coderising}/litestruts/Action.java | 2 +- .../src/org/wsc/coderising}/litestruts/LoginAction.java | 2 +- .../src/org/wsc/coderising}/litestruts/Struts.java | 6 +++--- .../src/org/wsc/coderising}/litestruts/StrutsTest.java | 2 +- .../src/org/wsc/coderising}/litestruts/View.java | 2 +- .../src/org/wsc/coderising/litestruts}/struts.xml | 0 .../org/wsc/coderising}/litestruts/util/DocumentUtil.java | 2 +- .../wsc/coding/basic}/exception/NullElementException.java | 2 +- .../coding/basic}/exception/RepeatingElementException.java | 2 +- .../src/org/wsc/coding/basic}/list/ArrayList.java | 2 +- .../src/org/wsc/coding/basic}/list/Iterator.java | 2 +- .../src/org/wsc/coding/basic}/list/LinkedList.java | 2 +- .../src/org/wsc/coding/basic}/list/List.java | 2 +- .../src/org/wsc/coding/basic}/list/Queue.java | 2 +- .../src/org/wsc/coding/basic}/stack/Stack.java | 4 ++-- .../src/org/wsc/coding/basic}/tree_node/BinaryTreeNode.java | 6 +++--- 18 files changed, 22 insertions(+), 22 deletions(-) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/array/ArrayUtil.java (99%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/array/ArrayUtilTest.java (98%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/litestruts/Action.java (87%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/litestruts/LoginAction.java (95%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/litestruts/Struts.java (96%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/litestruts/StrutsTest.java (96%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/litestruts/View.java (91%) rename group20/592146505/{coderising/src => 592146505Learning/src/org/wsc/coderising/litestruts}/struts.xml (100%) rename group20/592146505/{coderising/src/org/wsc => 592146505Learning/src/org/wsc/coderising}/litestruts/util/DocumentUtil.java (97%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/exception/NullElementException.java (90%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/exception/RepeatingElementException.java (90%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/list/ArrayList.java (99%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/list/Iterator.java (86%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/list/LinkedList.java (99%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/list/List.java (97%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/list/Queue.java (92%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/stack/Stack.java (77%) rename group20/592146505/{data _structure/src/org/wsc => 592146505Learning/src/org/wsc/coding/basic}/tree_node/BinaryTreeNode.java (95%) diff --git a/group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/array/ArrayUtil.java similarity index 99% rename from group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/array/ArrayUtil.java index 7bba1bb77b..3caef64d35 100644 --- a/group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package org.wsc.array; +package org.wsc.coderising.array; public class ArrayUtil { /** diff --git a/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/array/ArrayUtilTest.java similarity index 98% rename from group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/array/ArrayUtilTest.java index 009dec2938..e459aa175f 100644 --- a/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/array/ArrayUtilTest.java @@ -1,4 +1,4 @@ -package org.wsc.array; +package org.wsc.coderising.array; import static org.junit.Assert.*; diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/Action.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/Action.java similarity index 87% rename from group20/592146505/coderising/src/org/wsc/litestruts/Action.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/Action.java index 083519bac6..87d08cf4cd 100644 --- a/group20/592146505/coderising/src/org/wsc/litestruts/Action.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/Action.java @@ -1,4 +1,4 @@ -package org.wsc.litestruts; +package org.wsc.coderising.litestruts; import java.util.Set; diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/LoginAction.java similarity index 95% rename from group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/LoginAction.java index bb23f5eebb..47abe6d963 100644 --- a/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package org.wsc.litestruts; +package org.wsc.coderising.litestruts; /** * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/Struts.java similarity index 96% rename from group20/592146505/coderising/src/org/wsc/litestruts/Struts.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/Struts.java index 30a418979f..33f7804096 100644 --- a/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/Struts.java @@ -1,4 +1,4 @@ -package org.wsc.litestruts; +package org.wsc.coderising.litestruts; import java.io.IOException; import java.lang.reflect.Field; @@ -14,7 +14,7 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import org.wsc.litestruts.util.DocumentUtil; +import org.wsc.coderising.litestruts.util.DocumentUtil; import org.xml.sax.SAXException; public class Struts { @@ -24,7 +24,7 @@ public class Struts { /* 0. 璇诲彇閰嶇疆鏂囦欢struts.xml */ DOCUMENT_UTIL = DocumentUtil.newInstance(); try { - document = DOCUMENT_UTIL.getDocument("src/struts.xml"); + document = DOCUMENT_UTIL.getDocument("src/org/wsc/litestruts/struts.xml"); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/StrutsTest.java similarity index 96% rename from group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/StrutsTest.java index 8101e95fe3..bcc10d1e8e 100644 --- a/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/StrutsTest.java @@ -1,4 +1,4 @@ -package org.wsc.litestruts; +package org.wsc.coderising.litestruts; import java.util.HashMap; import java.util.Map; diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/View.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/View.java similarity index 91% rename from group20/592146505/coderising/src/org/wsc/litestruts/View.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/View.java index f21906d1a5..c2722f8c2a 100644 --- a/group20/592146505/coderising/src/org/wsc/litestruts/View.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/View.java @@ -1,4 +1,4 @@ -package org.wsc.litestruts; +package org.wsc.coderising.litestruts; import java.util.Map; diff --git a/group20/592146505/coderising/src/struts.xml b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/struts.xml similarity index 100% rename from group20/592146505/coderising/src/struts.xml rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/struts.xml diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/util/DocumentUtil.java similarity index 97% rename from group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java rename to group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/util/DocumentUtil.java index 9125b244cd..4effa19ab8 100644 --- a/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/litestruts/util/DocumentUtil.java @@ -1,4 +1,4 @@ -package org.wsc.litestruts.util; +package org.wsc.coderising.litestruts.util; import java.io.File; import java.io.IOException; diff --git a/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/exception/NullElementException.java similarity index 90% rename from group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/exception/NullElementException.java index aa7763ef00..1bafd61d7e 100644 --- a/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/exception/NullElementException.java @@ -1,4 +1,4 @@ -package org.wsc.exception; +package org.wsc.coding.basic.exception; /** * diff --git a/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/exception/RepeatingElementException.java similarity index 90% rename from group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/exception/RepeatingElementException.java index a5b66c54a1..63c9172364 100644 --- a/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/exception/RepeatingElementException.java @@ -1,4 +1,4 @@ -package org.wsc.exception; +package org.wsc.coding.basic.exception; /** * diff --git a/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java similarity index 99% rename from group20/592146505/data _structure/src/org/wsc/list/ArrayList.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java index 28b8db4132..761b3aac59 100644 --- a/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java @@ -1,4 +1,4 @@ -package org.wsc.list; +package org.wsc.coding.basic.list; import java.util.Arrays; import java.util.ConcurrentModificationException; diff --git a/group20/592146505/data _structure/src/org/wsc/list/Iterator.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/Iterator.java similarity index 86% rename from group20/592146505/data _structure/src/org/wsc/list/Iterator.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/Iterator.java index 59590bbf7e..92d1909c35 100644 --- a/group20/592146505/data _structure/src/org/wsc/list/Iterator.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/Iterator.java @@ -1,4 +1,4 @@ -package org.wsc.list; +package org.wsc.coding.basic.list; public interface Iterator { /** diff --git a/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/LinkedList.java similarity index 99% rename from group20/592146505/data _structure/src/org/wsc/list/LinkedList.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/LinkedList.java index b909cfeabc..bcccddfbc1 100644 --- a/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/LinkedList.java @@ -1,4 +1,4 @@ -package org.wsc.list; +package org.wsc.coding.basic.list; import java.util.ConcurrentModificationException; import java.util.NoSuchElementException; diff --git a/group20/592146505/data _structure/src/org/wsc/list/List.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/List.java similarity index 97% rename from group20/592146505/data _structure/src/org/wsc/list/List.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/List.java index 2fd90c6395..bab268a048 100644 --- a/group20/592146505/data _structure/src/org/wsc/list/List.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/List.java @@ -1,4 +1,4 @@ -package org.wsc.list; +package org.wsc.coding.basic.list; /** * List鎺ュ彛 diff --git a/group20/592146505/data _structure/src/org/wsc/list/Queue.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/Queue.java similarity index 92% rename from group20/592146505/data _structure/src/org/wsc/list/Queue.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/Queue.java index 2087335e58..fb5c83c757 100644 --- a/group20/592146505/data _structure/src/org/wsc/list/Queue.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/Queue.java @@ -1,4 +1,4 @@ -package org.wsc.list; +package org.wsc.coding.basic.list; /** * diff --git a/group20/592146505/data _structure/src/org/wsc/stack/Stack.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/stack/Stack.java similarity index 77% rename from group20/592146505/data _structure/src/org/wsc/stack/Stack.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/stack/Stack.java index 96b931ca07..09f83c98b6 100644 --- a/group20/592146505/data _structure/src/org/wsc/stack/Stack.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/stack/Stack.java @@ -1,6 +1,6 @@ -package org.wsc.stack; +package org.wsc.coding.basic.stack; -import org.wsc.list.ArrayList; +import org.wsc.coding.basic.list.ArrayList; public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/tree_node/BinaryTreeNode.java similarity index 95% rename from group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java rename to group20/592146505/592146505Learning/src/org/wsc/coding/basic/tree_node/BinaryTreeNode.java index b68784541d..eb77f74070 100644 --- a/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/tree_node/BinaryTreeNode.java @@ -1,7 +1,7 @@ -package org.wsc.tree_node; +package org.wsc.coding.basic.tree_node; -import org.wsc.exception.NullElementException; -import org.wsc.exception.RepeatingElementException; +import org.wsc.coding.basic.exception.NullElementException; +import org.wsc.coding.basic.exception.RepeatingElementException; /** * BinaryTreeNode 浜屽弶鏍戠粨鏋 From 8548781cf625985a099292bd32c2117a8f9c117a Mon Sep 17 00:00:00 2001 From: 592146505 <592146505@qq.com> Date: Mon, 6 Mar 2017 19:15:44 +0800 Subject: [PATCH 056/177] =?UTF-8?q?=E5=AE=9A=E4=B9=89=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=99=A8=E6=8E=A5=E5=8F=A3=EF=BC=88=E6=9C=AA=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 30 +++++++ .../coderising/download/FileDownloader.java | 80 +++++++++++++++++++ .../download/FileDownloaderTest.java | 53 ++++++++++++ .../coderising/download/api/Connection.java | 36 +++++++++ .../download/api/ConnectionException.java | 37 +++++++++ .../download/api/ConnectionManager.java | 20 +++++ .../download/api/DownloadListener.java | 17 ++++ .../download/impl/ConnectionImpl.java | 35 ++++++++ .../download/impl/ConnectionManagerImpl.java | 23 ++++++ 9 files changed, 331 insertions(+) create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/DownloadListener.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java create mode 100644 group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..1a39d7d741 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java @@ -0,0 +1,30 @@ +package org.wsc.coderising.download; + +import org.wsc.coderising.download.api.Connection; + +/** + * 涓嬭浇杩涚▼ + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:03:41 + * @version v1.0 + * + */ +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/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..99c6097409 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java @@ -0,0 +1,80 @@ +package org.wsc.coderising.download; + +import org.wsc.coderising.download.api.Connection; +import org.wsc.coderising.download.api.ConnectionException; +import org.wsc.coderising.download.api.ConnectionManager; +import org.wsc.coderising.download.api.DownloadListener; + +/** + * 鏂囦欢涓嬭浇鍣 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:04:44 + * @version v1.0 + * + */ +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..3815c9698b --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java @@ -0,0 +1,53 @@ +package org.wsc.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.wsc.coderising.download.api.ConnectionManager; +import org.wsc.coderising.download.api.DownloadListener; +import org.wsc.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/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java new file mode 100644 index 0000000000..5c7c3bf6b5 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java @@ -0,0 +1,36 @@ +package org.wsc.coderising.download.api; + +import java.io.IOException; + +/** + * 杩炴帴鎺ュ彛 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:00:53 + * @version v1.0 + * + */ +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/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..a3c794ef97 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java @@ -0,0 +1,37 @@ +package org.wsc.coderising.download.api; + +/** + * + * 杩炴帴寮傚父绫 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗6:59:41 + * @version v1.0 + * + */ +public class ConnectionException extends Exception { + + private static final long serialVersionUID = -249834831447340792L; + + private ConnectionException() { + super(); + } + + private ConnectionException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + private ConnectionException(String message, Throwable cause) { + super(message, cause); + } + + private ConnectionException(String message) { + super(message); + } + + private ConnectionException(Throwable cause) { + super(cause); + } + +} diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..8d9eea4cc2 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java @@ -0,0 +1,20 @@ +package org.wsc.coderising.download.api; + +/** + * + * 绠$悊杩炴帴鎺ュ彛 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:02:30 + * @version v1.0 + * + */ +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/DownloadListener.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..5d785032d0 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/DownloadListener.java @@ -0,0 +1,17 @@ +package org.wsc.coderising.download.api; + +/** + * + * 涓嬭浇鐩戝惉鎺ュ彛 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:02:58 + * @version v1.0 + * + */ +public interface DownloadListener { + /** + * 閫氱煡涓嬭浇瀹屾垚鍥炶皟鍑芥暟 + */ + public void notifyFinished(); +} diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..6b52b77f5d --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,35 @@ +package org.wsc.coderising.download.impl; + +import java.io.IOException; + +import org.wsc.coderising.download.api.Connection; + +/** + * + * 杩炴帴绫 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:10:13 + * @version v1.0 + * + */ +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/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..cf516fa0e7 --- /dev/null +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,23 @@ +package org.wsc.coderising.download.impl; + +import org.wsc.coderising.download.api.Connection; +import org.wsc.coderising.download.api.ConnectionException; +import org.wsc.coderising.download.api.ConnectionManager; + +/** + * 杩炴帴绠$悊绫 + * + * @author Administrator + * @date 2017骞3鏈6鏃ヤ笅鍗7:11:50 + * @version v1.0 + * + */ +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} From 222095e5c2e6ff38b4207f156382d9c0d4cdc989 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 6 Mar 2017 22:33:42 +0800 Subject: [PATCH 057/177] =?UTF-8?q?=E9=93=BE=E8=A1=A8=E4=B9=A0=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/LinkedList.java | 33 +++++++-- .../test/com/coding/basic/LinkedListTest.java | 68 +++++++++++++++++++ 2 files changed, 97 insertions(+), 4 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java index 6d914f619e..1071c17eeb 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java @@ -211,9 +211,12 @@ public int[] getElements(LinkedList list){ */ public void subtract(LinkedList list){ - - for (int i = 0; i < list.size(); i++) { - //LinkedList.this.remove(index); + for (int i = 0; i < size; i++) { + for (int j = 0; j < list.size(); j++) { + if(get(i).equals(list.get(j))){ + remove(i); + } + } } } @@ -223,6 +226,12 @@ public void subtract(LinkedList list){ */ public void removeDuplicateValues(){ + for (int i = 0; i < size-1; i++) { + if(get(i).equals(get(i+1))){ + remove(i); + i --; + } + } } /** @@ -233,6 +242,13 @@ public void removeDuplicateValues(){ */ public void removeRange(int min, int max){ + for (int i = 0; i < size; i++) { + if((int)get(i)>min&&(int)get(i) Date: Tue, 7 Mar 2017 07:13:46 +0800 Subject: [PATCH 058/177] 1 --- .../basic/collection/concrete/LinkedList.java | 128 ++++++++++++++++- .../basic/test/collection/LinkedListTest.java | 24 +++- .../coderising/download/DownloadThread.java | 20 +++ .../coderising/download/FileDownloader.java | 131 ++++++++++++++++++ .../download/FileDownloaderTest.java | 59 ++++++++ .../coderising/download/api/Connection.java | 23 +++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 13 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 55 ++++++++ .../download/impl/ConnectionManagerImpl.java | 49 +++++++ .../download/impl/NoFreeSourceException.java | 10 ++ group12/382266293/src/test.java | 128 +++++++++++++++-- 13 files changed, 640 insertions(+), 10 deletions(-) create mode 100644 group12/382266293/src/com/coderising/download/DownloadThread.java create mode 100644 group12/382266293/src/com/coderising/download/FileDownloader.java create mode 100644 group12/382266293/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group12/382266293/src/com/coderising/download/api/Connection.java create mode 100644 group12/382266293/src/com/coderising/download/api/ConnectionException.java create mode 100644 group12/382266293/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group12/382266293/src/com/coderising/download/api/DownloadListener.java create mode 100644 group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group12/382266293/src/com/coderising/download/impl/NoFreeSourceException.java diff --git a/group12/382266293/coding/basic/collection/concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java index cb3d87684d..adcbd9df6e 100644 --- a/group12/382266293/coding/basic/collection/concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -1,7 +1,8 @@ package collection.concrete; import java.util.NoSuchElementException; - +import static util.TestUtil.*; +import static util.Print.*; import collection.AbstractList; import collection.Iterator; @@ -16,6 +17,131 @@ public LinkedList() { this.size = 0; } + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + + @SuppressWarnings("unchecked") + public void reverse(){ + if(head == null){ + return; + } + Node pre = head; + Node cur = head.next; + Node next; + while (cur != null) { + next = cur.next; + cur.next = pre; + pre = cur; + cur = next; + } + head.next = null; + head = pre; + + } + + + public static void main(String args[]) { + LinkedList myLL = new LinkedList(); + addIntWithNatureOrder(myLL,5); + myLL.reverse(); + println(myLL); + + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + + */ + public void removeFirstHalf(){ + int deleteIndex = size/2; + clearAndSetNewHead(deleteIndex); + } + + private void clearAndSetNewHead(int deleteIndex) { + Node x = head; + for (int i = 0; i < deleteIndex; i++) { + Node next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + if (i == deleteIndex-1) + head = next; + } + } + + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * @param i + * @param length + */ + public void remove(int i, int length){ + checkIndex(i); + checkIndex(length-i); + } + + + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } + + + + + + @Override public void add(E e) { addLast(e); diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest.java b/group12/382266293/coding/basic/test/collection/LinkedListTest.java index 5a2d7213af..bcf2f9a05e 100644 --- a/group12/382266293/coding/basic/test/collection/LinkedListTest.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest.java @@ -28,6 +28,9 @@ public void setUp() throws Exception { public void tearDown() throws Exception { myLL = null; } + + + @Test public void testLinkedList() { @@ -38,6 +41,26 @@ public void testLinkedList() { } + + @Test + public void testReverse() { + addString(myLL,5); + myLL.reverse(); + println(myLL); + + } + + + @Test + public void testRemoveFirstHalf() { + addString(myLL,5); + myLL.removeFirstHalf(); + assertEquals(3,myLL.size()); + assertEquals("2",myLL.get(0)); + assertEquals("3",myLL.get(1)); + assertEquals("4",myLL.get(2)); + } + @Test public void testAddE() { myLL.add("s"); @@ -50,7 +73,6 @@ public void testAddStringE() { String a; addString(myLL,30); - println(myLL.get(0)); // for (int i = 0 ; i < 29; i++) { // a = "" + i; diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..1456314140 --- /dev/null +++ b/group12/382266293/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/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..f8702be4b2 --- /dev/null +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,131 @@ +package com.coderising.download; + +import java.io.FileOutputStream; +import java.io.IOException; + +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; + + private static final int MIN_CONNECTIONS = 3; + private static final int MAX_CONNECTIONS = 10; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + Connection conn = null; + try { + + conn = cm.open(this.url); + int length = conn.getContentLength(); + String dest = ""; + createTempFile(dest,length); + int connNum = calculateConnects(length); + DownloadThread[] threadPool = new DownloadThread[connNum]; + int beginPos = 0; + int endPos = -1; + int bath_size = length/connNum; + for (int i = 0; i < connNum; i++) { + beginPos = endPos + 1; + endPos = beginPos + bath_size; + if (i == connNum - 1) { + endPos = length - 1; + } + DownloadThread dt = new DownloadThread(conn,beginPos,endPos); + threadPool[i] = dt; + dt.start(); + } + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + + private int calculateConnects(int length) { + int conns = length/1024/1024; + if (conns < MIN_CONNECTIONS) { + return MIN_CONNECTIONS; + } else if (conns > MAX_CONNECTIONS) { + return MAX_CONNECTIONS; + } else { + return conns; + } + } + + + private static void createTempFile(String dest, int len){ + FileOutputStream temp = null; + try { + temp = new FileOutputStream(dest); + int length = len; + byte[] buffer = new byte[1024]; + long times = length / 1024; + int left = (int) (length % 1024); + for (int i = 0; i < times; i++) { + temp.write(buffer); + } + temp.write(buffer, 0, left); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + temp.flush(); + temp.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + 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/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..8171ee5763 --- /dev/null +++ b/group12/382266293/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/group12/382266293/src/com/coderising/download/api/Connection.java b/group12/382266293/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..9710e270e1 --- /dev/null +++ b/group12/382266293/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/group12/382266293/src/com/coderising/download/api/ConnectionException.java b/group12/382266293/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..8dbfe95dda --- /dev/null +++ b/group12/382266293/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group12/382266293/src/com/coderising/download/api/ConnectionManager.java b/group12/382266293/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..c732657bcb --- /dev/null +++ b/group12/382266293/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,13 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + + final int MAX_CONNECTION_SIZE = 10; + + public Connection open(String url) throws ConnectionException; +} diff --git a/group12/382266293/src/com/coderising/download/api/DownloadListener.java b/group12/382266293/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..4cd0b3eab1 --- /dev/null +++ b/group12/382266293/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/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..fff7d830fe --- /dev/null +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,55 @@ +package com.coderising.download.impl; + +import static util.Print.println; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionManager; + +import sun.net.www.protocol.http.HttpURLConnection; + +public class ConnectionImpl implements Connection{ + + private ConnectionManager cm; + private static int buffer_size = 1024; + + public ConnectionImpl(ConnectionManager cm) { + this.cm = cm; + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + FileOutputStream out = null; + InputStream in = null; + HttpURLConnection conn = null; + try { + in = conn.getInputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while( (len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + println("Read buffer Complete!"); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..bea080edac --- /dev/null +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,49 @@ +package com.coderising.download.impl; + +import java.io.IOException; +import java.net.URL; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +import sun.net.www.protocol.http.HttpURLConnection; + +public class ConnectionManagerImpl implements ConnectionManager { + + private int connections = 0; + private String url; + + public ConnectionManagerImpl() { + this.connections = 0; + } + + @Override + public Connection open(String url) throws ConnectionException { + this.url = url; + checkConnectionSize(); + URL address = null; + HttpURLConnection conn = null; + try { + address = new URL(url); + conn = (HttpURLConnection) address.openConnection(); + connections++; + return (Connection) conn; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private void checkConnectionSize() { + if (connections > MAX_CONNECTION_SIZE) + try { + throw new NoFreeSourceException("No free connections available."); + } catch (NoFreeSourceException e) { + e.printStackTrace(); + } + + } + +} + diff --git a/group12/382266293/src/com/coderising/download/impl/NoFreeSourceException.java b/group12/382266293/src/com/coderising/download/impl/NoFreeSourceException.java new file mode 100644 index 0000000000..f2f68c3aa0 --- /dev/null +++ b/group12/382266293/src/com/coderising/download/impl/NoFreeSourceException.java @@ -0,0 +1,10 @@ +package com.coderising.download.impl; + +public class NoFreeSourceException extends Exception { + + + public NoFreeSourceException(String string) { + super(string); + } + +} diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java index e4e7fead2d..ea1c6646cd 100644 --- a/group12/382266293/src/test.java +++ b/group12/382266293/src/test.java @@ -1,14 +1,126 @@ -import java.util.ArrayList; -import java.util.Queue; -import java.util.Stack; -import java.util.concurrent.PriorityBlockingQueue; -import static util.Print.*; +import static util.Print.println; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.FileNameMap; +import java.net.URL; +import java.net.URLDecoder; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import sun.net.www.protocol.http.HttpURLConnection; public class test { - public static void main(String[] args) { - Queue queue = new PriorityBlockingQueue(); - println(queue.poll()); + public static String url = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + public static String url2 = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; + public static String downloadLocation = "C:\\"; + public static String tempName = ""; + public static String fileName = ""; + + LinkedList a; + + private static void createTempFile1(String from) { + long length = 0; + URL url = null; + HttpURLConnection conn = null; + try { + url = new URL(from); + conn = (HttpURLConnection)url.openConnection(); + String file = conn.getURL().getFile(); + fileName = file.substring(file.lastIndexOf('/')+1); + tempName = fileName.substring(0, fileName.lastIndexOf('.')+1) + "lyj"; + length = conn.getContentLength(); + conn.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + tempName = downloadLocation + tempName; + fileName = downloadLocation + fileName; + bufferFile(tempName,length); + } + + public static void bufferFile(String name, long len) { + + FileOutputStream temp = null; + try { + temp = new FileOutputStream(name); + long length = len; + byte[] buffer = new byte[1024]; + long times = length / 1024; + int left = (int) (length % 1024); + for (int i = 0; i < times; i++) { + temp.write(buffer); + } + temp.write(buffer, 0, left); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + temp.flush(); + temp.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + public static void download(String src) { + createTempFile1(src); + + URL url = null; + HttpURLConnection conn = null; + FileOutputStream out = null; + InputStream in = null; + try { + url = new URL(src); + conn = (HttpURLConnection)url.openConnection(); + in = conn.getInputStream(); + out = new FileOutputStream(tempName); + byte[] buffer = new byte[1024]; + int len = 0; + while( (len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + conn.disconnect(); + println(fileName); + println(rename(tempName)); + println("Download Complete!"); + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + + } + + public static boolean rename(String temp) { + File file=new File(temp); + File f1=new File(fileName); + if( file.exists() ) { + file.renameTo(f1); + file = f1; + System.out.println("鏂囦欢閲嶅懡鍚嶄负锛"+f1.getName()); + return true; + } + return false; + } + + + public static void main(String[] args) throws IOException { + + download(url2); } From 6ffbca89b3a892b7252f8d780c26b4fa70c7e84c Mon Sep 17 00:00:00 2001 From: Korben_CHY Date: Tue, 7 Mar 2017 09:54:45 +0800 Subject: [PATCH 059/177] add single linked list by Korben --- .../coding/basic/list/KDoubleLinkedList.java | 175 ++++++++++++++++++ .../korben/coding/basic/list/KLinkedList.java | 98 ++++++++-- .../korben/coding/basic/list/KListTest.java | 3 + 3 files changed, 258 insertions(+), 18 deletions(-) create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java new file mode 100644 index 0000000000..276428beca --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java @@ -0,0 +1,175 @@ +package org.korben.coding.basic.list; + +import java.util.Objects; + +/** + * Korben's LinkedList + * + * Created by Korben on 18/02/2017. + */ +public class KDoubleLinkedList implements KList { + + private int size; + + private Node head; + + private Node last; + + public KDoubleLinkedList() { + 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) { + if (index <= 0 || index >= this.size) { + throw new IndexOutOfBoundsException(); + } + 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/KLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java index 2ca4452981..e3ae1bb4d1 100644 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java @@ -43,19 +43,17 @@ public boolean contains(Object o) { @Override public Object[] toArray() { - return new Object[0]; + throw new IllegalStateException("鏂规硶鏈疄鐜"); } @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++; @@ -65,13 +63,12 @@ public boolean add(T o) { @Override public boolean remove(T o) { Node node = this.head; + Node preNode; while (node.next != null) { + preNode = node; node = node.next; if (Objects.equals(node.data, o)) { - node.pre.next = node.next; - if (node.next != null) { - node.next.pre = node.pre; - } + preNode.next = node.next; this.size--; return true; } @@ -101,30 +98,39 @@ public T set(int index, T element) { @Override public void add(int index, T element) { + if (index < 0 || index >= this.size) { + throw new IndexOutOfBoundsException(); + } + Node node = this.head; + Node preNode = node; for (int i = 0; i <= index; i++) { + preNode = node; node = node.next; } - Node pre = node.pre; + Node newNode = new Node<>(element); - pre.next = newNode; - newNode.pre = pre; newNode.next = node; - node.pre = newNode; + preNode.next = 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; + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + Node node = this.head; + Node preNode = this.head; + + for (int i = 0; i <= index; i++) { + preNode = node; + node = node.next; } + preNode.next = node.next; this.size--; return node.data; } @@ -160,9 +166,65 @@ private Node getNode(int index) { return node; } + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse() { + + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf() { + + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + */ + public void remove(int i, int length) { + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + */ + + public void subtract(KLinkedList list) { + + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues() { + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + */ + public void removeRange(int min, int max) { + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + */ + public KLinkedList intersection(KLinkedList list) { + return null; + } + private static class Node { T data; - Node pre; Node next; Node(T data) { 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 index 2c6febecc3..d789318174 100644 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java @@ -24,6 +24,9 @@ public void init() { // 娴嬭瘯KLinkedList list = new KLinkedList<>(); + //// 娴嬭瘯KDoubleLinkedList + //list = new KDoubleLinkedList<>(); + initTestSize = 5; for (int i = 0; i < initTestSize; i++) { From a3cb4f47d001ad49782826cda9b9c0642871825d Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 7 Mar 2017 16:21:27 +0800 Subject: [PATCH 060/177] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=B9=A0=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/LinkedList.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java index 1071c17eeb..3bf26a1a1c 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java @@ -125,7 +125,7 @@ private Node getPointNode(int index){ } return node; } - + private static class Node{ Object data; Node next; @@ -137,18 +137,16 @@ private static class Node{ * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 */ public void reverse(){ - //缂撳瓨鍘熼摼琛ㄦ暟鎹 + Stack stack = new Stack(); - Node node = head; - for (int i = 0; i < size; i++) { + Node node; + //缂撳瓨鍘熼摼琛ㄦ暟鎹 + for (node = head; node!=null;node = node.next) { stack.push(node.data); - node = node.next; - } + } //閲嶆柊璧嬪 - node = head; - for (int i = 0; i < size; i++) { + for (node = head; node!=null;node = node.next) { node.data = stack.pop(); - node = node.next; } } @@ -182,6 +180,7 @@ public void remove(int i, int length){ if(length<(size-i)){ getPointNode(i-1).next = getPointNode(i+length); size = size-length; + size = size-length; }else{ getPointNode(i-1).next = null; size = i; @@ -199,7 +198,7 @@ public void remove(int i, int length){ public int[] getElements(LinkedList list){ int[] array = new int[list.size()]; for (int i = 0; i < array.length; i++) { - array[i] = (int)getPointNode((int)list.get(i)).data; + array[i] = (int) get((int)list.get(i)); } return array; } @@ -210,11 +209,12 @@ public int[] getElements(LinkedList list){ * @param list */ - public void subtract(LinkedList list){ + public void subtract(LinkedList list){ for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ remove(i); + i--; } } } From b20115e29c2cfce6fc4d59560a8716391d480395 Mon Sep 17 00:00:00 2001 From: Alvin Date: Tue, 7 Mar 2017 00:34:29 -0800 Subject: [PATCH 061/177] Homework 3rd --- .../coderising/download/DownloadThread.java | 20 ++++++ .../coderising/download/FileDownloader.java | 68 +++++++++++++++++++ .../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 | 31 +++++++++ .../download/impl/ConnectionManagerImpl.java | 28 ++++++++ 9 files changed, 249 insertions(+) create mode 100644 group20/404130810/src/com/coderising/download/DownloadThread.java create mode 100644 group20/404130810/src/com/coderising/download/FileDownloader.java create mode 100644 group20/404130810/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group20/404130810/src/com/coderising/download/api/Connection.java create mode 100644 group20/404130810/src/com/coderising/download/api/ConnectionException.java create mode 100644 group20/404130810/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group20/404130810/src/com/coderising/download/api/DownloadListener.java create mode 100644 group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group20/404130810/src/com/coderising/download/DownloadThread.java b/group20/404130810/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..d71540b497 --- /dev/null +++ b/group20/404130810/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(){ + + } +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/FileDownloader.java b/group20/404130810/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..3a4bcd8d9e --- /dev/null +++ b/group20/404130810/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,68 @@ +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; + } + +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/FileDownloaderTest.java b/group20/404130810/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4a781d87c3 --- /dev/null +++ b/group20/404130810/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("下载完成!"); + + + + } + +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/api/Connection.java b/group20/404130810/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..911ee46891 --- /dev/null +++ b/group20/404130810/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(); +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/api/ConnectionException.java b/group20/404130810/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..7e13414c73 --- /dev/null +++ b/group20/404130810/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/api/ConnectionManager.java b/group20/404130810/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..e274234679 --- /dev/null +++ b/group20/404130810/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; +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/api/DownloadListener.java b/group20/404130810/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..a6589e52f5 --- /dev/null +++ b/group20/404130810/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java b/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..0c62ee1711 --- /dev/null +++ b/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,31 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private byte[] fileContent; + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + return fileContent.length; + } + + @Override + public void close() { + + } + + public void setFileContent(byte[] fileContent) { + this.fileContent = fileContent; + } + +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..b92d7d6c8f --- /dev/null +++ b/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,28 @@ +package com.coderising.download.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +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 urlStr) throws ConnectionException { + URL url; + try { + url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + +} \ No newline at end of file From 0701a76a14cf549a50ede813d38abc56f2821b49 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 7 Mar 2017 18:05:42 +0800 Subject: [PATCH 062/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../download/impl/ConnectionImpl.java | 19 +++++++++++------- .../download/impl/ConnectionManagerImpl.java | 20 +++++++++++++++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java index 32f03efdc7..189d9389bc 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,27 +1,32 @@ package com.coderising.download.impl; import java.io.IOException; +import java.net.HttpURLConnection; import com.coderising.download.api.Connection; public class ConnectionImpl implements Connection{ + private HttpURLConnection urlCon; + @Override public byte[] read(int startPos, int endPos) throws IOException { - + return null; } @Override - public int getContentLength() { - - return 0; + public int getContentLength() { + return urlCon.getContentLength(); } @Override public void close() { - - + } - + + public void setUrlCon(HttpURLConnection urlCon) { + this.urlCon = urlCon; + } + } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java index 1281dfaa9e..55c953b85d 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -1,5 +1,10 @@ package com.coderising.download.impl; +import java.io.IOException; +import java.net.HttpURLConnection; +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; @@ -9,7 +14,18 @@ public class ConnectionManagerImpl implements ConnectionManager { @Override public Connection open(String url) throws ConnectionException { - return null; + URL remotUrl = null; + HttpURLConnection urlCon = null; + ConnectionImpl conn = new ConnectionImpl(); + try { + remotUrl = new URL(url); + urlCon = (HttpURLConnection)remotUrl.openConnection(); + conn.setUrlCon(urlCon); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return conn; } - } \ No newline at end of file From 37703733a1fa6784dca47f991f6ff32463b04abe Mon Sep 17 00:00:00 2001 From: FelixCJF Date: Tue, 7 Mar 2017 21:01:20 +0800 Subject: [PATCH 063/177] Delete StrutsTest.java --- .../coderising/litestruts/StrutsTest.java | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/StrutsTest.java 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 deleted file mode 100644 index b8c81faf3c..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/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")); - } -} From d12c82f198eee6d97c3ce9c79066ad271c9ff42a Mon Sep 17 00:00:00 2001 From: FelixCJF Date: Tue, 7 Mar 2017 21:01:31 +0800 Subject: [PATCH 064/177] Delete LoginAction.java --- .../coderising/litestruts/LoginAction.java | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/LoginAction.java 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 deleted file mode 100644 index dcdbe226ed..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/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; - } -} From 94e79f8cc83af2a30d911f81c51e1a8703aad5df Mon Sep 17 00:00:00 2001 From: FelixCJF Date: Tue, 7 Mar 2017 21:01:46 +0800 Subject: [PATCH 065/177] Delete Struts.java --- .../coderising/litestruts/Struts.java | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/Struts.java 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 deleted file mode 100644 index 85e2e22de3..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 - 鎹畃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; - } - -} From cb53fd04bb0cb7e6b7ea1c851d74df35ccb4d6fa Mon Sep 17 00:00:00 2001 From: FelixCJF Date: Tue, 7 Mar 2017 21:02:41 +0800 Subject: [PATCH 066/177] Delete View.java --- .../coderising/litestruts/View.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/View.java 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 deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/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; - } -} From 97e0be367e4cddfe9b3a07c744214c931cd28b64 Mon Sep 17 00:00:00 2001 From: FelixCJF Date: Tue, 7 Mar 2017 21:02:51 +0800 Subject: [PATCH 067/177] Delete struts.xml --- .../coding2017/coderising/litestruts/struts.xml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/struts.xml 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 deleted file mode 100644 index a6cfe43e6c..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/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 From d23e51e9a10513cad603a064ca71d3fc8d0f1fcc Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Tue, 7 Mar 2017 21:58:30 +0800 Subject: [PATCH 068/177] LinkedList Ex --- .../basic/collection/concrete/LinkedList.java | 103 ++++++++++++++---- .../basic/test/collection/LinkedListTest.java | 2 - .../test/collection/LinkedListTest2.java | 86 +++++++++++++++ 3 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 group12/382266293/coding/basic/test/collection/LinkedListTest2.java diff --git a/group12/382266293/coding/basic/collection/concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java index adcbd9df6e..f42f493363 100644 --- a/group12/382266293/coding/basic/collection/concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -1,5 +1,6 @@ package collection.concrete; +import java.util.Arrays; import java.util.NoSuchElementException; import static util.TestUtil.*; import static util.Print.*; @@ -41,16 +42,7 @@ public void reverse(){ head = pre; } - - - public static void main(String args[]) { - LinkedList myLL = new LinkedList(); - addIntWithNatureOrder(myLL,5); - myLL.reverse(); - println(myLL); - - } - + /** * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 @@ -58,8 +50,8 @@ public static void main(String args[]) { */ public void removeFirstHalf(){ - int deleteIndex = size/2; - clearAndSetNewHead(deleteIndex); + int deleteLength = size/2; + remove(0,deleteLength); } private void clearAndSetNewHead(int deleteIndex) { @@ -74,7 +66,19 @@ private void clearAndSetNewHead(int deleteIndex) { head = next; } } - + + private void clearAndSetNewHead(Node node,int deleteLength) { + Node x = node; + for (int i = 0; i < deleteLength; i++) { + Node next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + if (i == deleteLength-1) + node = next; + } + } /** * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 @@ -82,11 +86,24 @@ private void clearAndSetNewHead(int deleteIndex) { * @param length */ public void remove(int i, int length){ - checkIndex(i); - checkIndex(length-i); + if (i == 0) { + clearAndSetNewHead(length); + return; + } + Node pre = getNode(i-1); + Node x = pre.next; + checkIndex(length + i); + for (int j = 0; j < length; j++) { + Node next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + if (i == length-1) + pre.next = next; + } } - - + /** * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺list鎵鎸囧畾鐨勫厓绱 @@ -95,9 +112,29 @@ public void remove(int i, int length){ * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] * @param list */ - public static int[] getElements(LinkedList list){ - return null; + public int[] getElements(LinkedList list){ + Iterator it2 = list.iterator(); + int size = list.size(); + int[] result = new int[size]; + int curr = (int) it2.next(); + Node start = getNode(curr); + result[0] = (int) start.data; + int next, batch; + int res = -1; + for (int i = 1; i < size; i++) { + next = (int) it2.next(); + batch = next - curr; + Node p = start; + for(int j = 0; j < batch; j++){ + p = p.next; + } + result[i] = (int) p.data; + start = p; + curr = next; + } + return result; } + /** * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 @@ -106,10 +143,36 @@ public static int[] getElements(LinkedList list){ * @param list */ - public void subtract(LinkedList list){ + public void subtract(LinkedList list){ + Node start = head; +// Node curr; +// Node next; +// Node x; + int count = list.size(); + while (count != 0) { + + + } + + } + + + + public static void main(String args[]) { + LinkedList myLL = new LinkedList(); + addIntWithNatureOrder(myLL,10); + println(myLL); + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(5); + + } + + /** * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest.java b/group12/382266293/coding/basic/test/collection/LinkedListTest.java index bcf2f9a05e..2613aed28f 100644 --- a/group12/382266293/coding/basic/test/collection/LinkedListTest.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest.java @@ -46,8 +46,6 @@ public void testLinkedList() { public void testReverse() { addString(myLL,5); myLL.reverse(); - println(myLL); - } diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java new file mode 100644 index 0000000000..b12272ef19 --- /dev/null +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java @@ -0,0 +1,86 @@ +package test.collection; + +import static util.Print.*; +import static util.TestUtil.*; + +import java.util.Arrays; +import java.util.Date; +import java.util.NoSuchElementException; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import collection.Iterator; +import collection.List; +import collection.concrete.LinkedList; +import junit.framework.TestCase; + + +public class LinkedListTest2 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 testReverse() { + addIntWithNatureOrder(myLL,5); + myLL.reverse(); + for (int i = 0; i < 5; i++) { + int acutal = myLL.get(i); + assertEquals(4-i,acutal); + } + } + + + @Test + public void testRemoveFirstHalf() { + addIntWithNatureOrder(myLL,5); + myLL.removeFirstHalf(); + assertEquals(3,myLL.size()); + assertEquals(2,(int)myLL.get(0)); + assertEquals(3,(int)myLL.get(1)); + assertEquals(4,(int)myLL.get(2)); + } + + @Test + public void testRemove2() { + addIntWithNatureOrder(myLL,5); + myLL.remove(1,2); + assertEquals(3,myLL.size()); + assertEquals(0,(int)myLL.get(0)); + assertEquals(3,(int)myLL.get(1)); + assertEquals(4,(int)myLL.get(2)); + } + + @Test + public void testGetElements() { + addIntWithNatureOrder(myLL,10); + LinkedList list = new LinkedList(); + list.add(0); + list.add(2); + list.add(7); + int[] result = myLL.getElements(list); + for (int i = 0; i < result.length; i++) { + int expected = list.get(i); + int actual = result[i]; + assertEquals(expected,actual); + } + + } + + + +} From 37191f8e695740b659ad0eebfdf0f96320c6c0b5 Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Tue, 7 Mar 2017 23:05:49 +0800 Subject: [PATCH 069/177] update 2 week work update 2 week work --- .../com/coderising/{action => litestruts}/LoginAction.java | 2 +- group12/446031103/src/com/coderising/litestruts/Struts.java | 2 -- group12/446031103/src/com/coderising/litestruts/struts.xml | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) rename group12/446031103/src/com/coderising/{action => litestruts}/LoginAction.java (96%) diff --git a/group12/446031103/src/com/coderising/action/LoginAction.java b/group12/446031103/src/com/coderising/litestruts/LoginAction.java similarity index 96% rename from group12/446031103/src/com/coderising/action/LoginAction.java rename to group12/446031103/src/com/coderising/litestruts/LoginAction.java index 2a0b6d477b..39af2d5c26 100644 --- a/group12/446031103/src/com/coderising/action/LoginAction.java +++ b/group12/446031103/src/com/coderising/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package com.coderising.action; +package com.coderising.litestruts; /** * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 diff --git a/group12/446031103/src/com/coderising/litestruts/Struts.java b/group12/446031103/src/com/coderising/litestruts/Struts.java index b0e784d9fa..8f5913d836 100644 --- a/group12/446031103/src/com/coderising/litestruts/Struts.java +++ b/group12/446031103/src/com/coderising/litestruts/Struts.java @@ -16,8 +16,6 @@ import org.dom4j.Element; import org.dom4j.io.SAXReader; -import com.coderising.action.LoginAction; - /** * @ClassName: Struts * @Description: TODO diff --git a/group12/446031103/src/com/coderising/litestruts/struts.xml b/group12/446031103/src/com/coderising/litestruts/struts.xml index 90cf18b7da..07f80b6476 100644 --- a/group12/446031103/src/com/coderising/litestruts/struts.xml +++ b/group12/446031103/src/com/coderising/litestruts/struts.xml @@ -1,10 +1,10 @@ - + /jsp/homepage.jsp /jsp/showLogin.jsp - + /jsp/welcome.jsp /jsp/error.jsp From 14c92a8ea5d35447c1df89af63d34e58d824ebbd Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 7 Mar 2017 23:38:38 +0800 Subject: [PATCH 070/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 19 +++++++ .../coderising/download/FileDownloader.java | 53 +++++++++++++++++-- .../download/api/ConnectionException.java | 5 ++ .../download/impl/ConnectionImpl.java | 13 +++-- .../download/impl/ConnectionManagerImpl.java | 2 + 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java index d71540b497..e2900e70c1 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java @@ -1,5 +1,9 @@ package com.coderising.download; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + import com.coderising.download.api.Connection; public class DownloadThread extends Thread{ @@ -16,5 +20,20 @@ public DownloadThread( Connection conn, int startPos, int endPos){ } public void run(){ + try { + //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 璇诲彇鎸囧畾浣嶅瓙鐨勫瓧鑺 + byte[] buffer = conn.read(startPos, endPos); + //闅忔満璁块棶鏂囦欢娴 + RandomAccessFile raf = new RandomAccessFile("setup.exe", "rwd"); + //闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 + raf.seek(startPos);//瀹氫綅鏂囦欢 + //鍐欐枃浠 + raf.write(buffer); + raf.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java index 2a61b81ad8..c043ba4865 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java @@ -1,5 +1,10 @@ package com.coderising.download; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import com.coderising.download.api.Connection; import com.coderising.download.api.ConnectionException; import com.coderising.download.api.ConnectionManager; @@ -13,6 +18,8 @@ public class FileDownloader { ConnectionManager cm; + /*绾跨▼鍚嶇О鍓嶇紑*/ + private final String threadName = "thread"; public FileDownloader(String _url) { this.url = _url; @@ -33,14 +40,35 @@ public void execute(){ // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + + Connection conn = null; try { - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); + conn = cm.open(this.url); + int threadCount = 3; + int length = conn.getContentLength(); + //瀛樻斁涓嬭浇绾跨▼鍚嶇О + List names = new ArrayList(); + int blockSize = length / threadCount; + for (int thread = 1; thread <= threadCount; thread++) { + + int startIndex = (thread - 1) * blockSize; + int endIndex = thread * blockSize - 1; + if (thread == threadCount) {//鏈鍚庝竴涓嚎绋嬩笅杞界殑闀垮害瑕佺◢寰暱涓鐐 + endIndex = length; + } + System.out.println("绾跨▼锛"+thread+"涓嬭浇:---"+startIndex+"--->"+endIndex); + Thread thr= new DownloadThread(conn,startIndex,endIndex); + //绾跨▼鍚嶇О缁勬垚锛歵hread+缂栧彿 + thr.setName(threadName+thread); + thr.start(); + names.add(threadName+thread); + } + //鍒ゆ柇鎵鏈夌嚎绋嬫槸鍚︿笅杞藉畬鎴 + if(DownloadThreadsIsComplete(names)){ + listener.notifyFinished(); + } } catch (ConnectionException e) { e.printStackTrace(); @@ -53,6 +81,21 @@ public void execute(){ + } + + /** + * 鍒ゆ柇鎵鏈変笅杞界嚎绋嬫槸鍚︽墽琛屽畬 + * @return + */ + private boolean DownloadThreadsIsComplete(List threadNames){ + + Map threadMaps=Thread.getAllStackTraces(); + Iterator it = threadMaps.keySet().iterator(); + while(it.hasNext()){ + Thread thread = it.next(); + return !threadNames.contains(thread.getName()); + } + return true; } public void setListener(DownloadListener listener) { diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java index 8dbfe95dda..1afde319e7 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java @@ -2,4 +2,9 @@ public class ConnectionException extends Exception { + /** + * + */ + private static final long serialVersionUID = 4776347926322882920L; + } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java index 189d9389bc..9704b97757 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,6 +1,7 @@ package com.coderising.download.impl; import java.io.IOException; +import java.io.InputStream; import java.net.HttpURLConnection; import com.coderising.download.api.Connection; @@ -11,8 +12,12 @@ public class ConnectionImpl implements Connection{ @Override public byte[] read(int startPos, int endPos) throws IOException { - - return null; + //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 + urlCon.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); + InputStream is = urlCon.getInputStream(); + byte[] buffer = new byte[endPos-startPos]; + is.read(buffer); + return buffer; } @Override @@ -21,8 +26,8 @@ public int getContentLength() { } @Override - public void close() { - + public void close() { + urlCon.disconnect(); } public void setUrlCon(HttpURLConnection urlCon) { diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java index 55c953b85d..e30706e499 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -20,6 +20,8 @@ public Connection open(String url) throws ConnectionException { try { remotUrl = new URL(url); urlCon = (HttpURLConnection)remotUrl.openConnection(); + urlCon.setRequestMethod("GET"); + urlCon.connect(); conn.setUrlCon(urlCon); } catch (MalformedURLException e) { e.printStackTrace(); From 69123e0b62077df13f26b0d8c7dc1cf3a0417522 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Wed, 8 Mar 2017 07:34:35 +0800 Subject: [PATCH 071/177] Ex --- .../basic/collection/concrete/LinkedList.java | 160 ++++++++++++++---- .../test/collection/LinkedListTest2.java | 54 ++++++ 2 files changed, 185 insertions(+), 29 deletions(-) diff --git a/group12/382266293/coding/basic/collection/concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java index f42f493363..8b14bedf57 100644 --- a/group12/382266293/coding/basic/collection/concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -2,6 +2,8 @@ import java.util.Arrays; import java.util.NoSuchElementException; +import java.util.Objects; + import static util.TestUtil.*; import static util.Print.*; import collection.AbstractList; @@ -144,43 +146,97 @@ public int[] getElements(LinkedList list){ */ public void subtract(LinkedList list){ - Node start = head; -// Node curr; -// Node next; -// Node x; + Node n1 = list.getNode(0); + Node n2 = head; int count = list.size(); - while (count != 0) { - + int index = 0; + int iR = 0; + while (count != 0 && n1 != null && n2 != null) { + + while(count > 1 && Objects.equals(n1.data, n1.next.data)) { + n1 = n1.next; + count--; + } + while(Objects.equals(n1.data, n2.data) == false) { + index++; + if (index > size() - 1) + return; + n2 = n2.next; + } + iR = index; + + while (n2 != null && Objects.equals(n1.data, n2.data)) { + remove(iR); + count--; + n2 = n2.next; + } + index = iR; + n1 = n1.next; } - - - - } - - - - - public static void main(String args[]) { - LinkedList myLL = new LinkedList(); - addIntWithNatureOrder(myLL,10); - println(myLL); - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(5); } + /** * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 */ public void removeDuplicateValues(){ + Node n1 = head; + //Node next; + int count = size(); + int index = 0; + int iR = 0; + while (count > 1 && n1 != null) { + while(count > 1 && Objects.equals(n1.data, n1.next.data) == false) { + n1 = n1.next; + index++; + count--; + } + iR = index; + //next = n1.next.next; + while(count > 1 && Objects.equals(n1.data, n1.next.data)) { + remove(iR); + //n1 = n1.next; + //n1.next = next; + n1 = n1.next; + count--; + } + index = iR; + } } + + + public void removeDuplicateValues2(){ + Node n1 = head; + int count = size(); + int index = 0; + int iR = 0; + while (count > 1 && n1 != null) { + while(count > 1 && Objects.equals(n1.data, n1.next.data) == false) { + n1 = n1.next; + index++; + count--; + } + iR = index; + + while(count > 1 && Objects.equals(n1.data, n1.next.data)) { + Node next = n1.next.next; + n1.next.data = null; + n1.next = null; + n1 = n1.next; + n1.next = next; + count--; + } + index = iR; + + } + } + /** * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 @@ -191,19 +247,65 @@ public void removeRange(int min, int max){ } - /** - * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 - * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; + public static void main(String args[]) { + LinkedList myLL = new LinkedList(); + myLL.add(0); + addIntWithNatureOrder(myLL,10); + myLL.add(10); + myLL.add(12); + myLL.add(13); + myLL.add(24); + println(myLL); + LinkedList list = new LinkedList(); + list.add(0); + list.add(5); + list.add(10); + + LinkedList result = myLL.intersection(list); + println(result); + } + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + + public LinkedList intersection(LinkedList list){ + Node n1 = list.getNode(0); + Node n2 = head; + LinkedList result = new LinkedList(); + int count = list.size(); + int index = 0; + int iR = 0; + while (count != 0 && n1 != null && n2 != null) { + + while(Objects.equals(n1.data, n2.data) == false) { + index++; + if (index > size() - 1) + return result; + n2 = n2.next; + } + iR = index; + + if (n2 != null && Objects.equals(n1.data, n2.data)) { + result.add(n1.data); + count--; + n2 = n2.next; + } + index = iR; + n1 = n1.next; + } + + return result; + + } + @Override public void add(E e) { diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java index b12272ef19..2dfbdb9ea8 100644 --- a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java @@ -81,6 +81,60 @@ public void testGetElements() { } + @Test + public void testSubstract() { + LinkedList myLL = new LinkedList(); + addIntWithNatureOrder(myLL,10); + myLL.add(10); + myLL.add(10); + myLL.add(12); + LinkedList list = new LinkedList(); + list.add(0); + list.add(0); + addIntWithNatureOrder(list,10); + list.add(10); + list.add(12); + list.add(22); + myLL.subtract(list); + assertEquals(0,myLL.size()); + } + + @Test + public void testIntersection() { + + addIntWithNatureOrder(myLL,10); + myLL.add(10); + myLL.add(12); + myLL.add(13); + myLL.add(24); + LinkedList list = new LinkedList(); + list.add(0); + list.add(5); + list.add(10); + LinkedList result = myLL.intersection(list); + assertEquals(0,(int)result.get(0)); + assertEquals(5,(int)result.get(1)); + assertEquals(10,(int)result.get(2)); + + } + + + @Test + public void testRemoveDuplicateValues() { + + myLL.add(0); + myLL.add(0); + myLL.add(1); + myLL.add(1); + myLL.add(10); + myLL.removeDuplicateValues(); + assertEquals(3,myLL.size()); + assertEquals(0,(int)myLL.get(0)); + assertEquals(1,(int)myLL.get(1)); + assertEquals(10,(int)myLL.get(2)); + } + + } From 52cfaa249acf2729e8714ca1e188b1f619dc651d Mon Sep 17 00:00:00 2001 From: tankexiaomao <514302761@qq.com> Date: Wed, 8 Mar 2017 16:16:01 +0800 Subject: [PATCH 072/177] just test --- group27/514302761/src/com/company/Main.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 group27/514302761/src/com/company/Main.java diff --git a/group27/514302761/src/com/company/Main.java b/group27/514302761/src/com/company/Main.java new file mode 100644 index 0000000000..c43739a918 --- /dev/null +++ b/group27/514302761/src/com/company/Main.java @@ -0,0 +1,8 @@ +package com.company; + +public class Main { + + public static void main(String[] args) { + System.out.print("this is a test"); + } +} From 6e5b52c256c86ffc79dc13502d49deb0c34912ed Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Wed, 8 Mar 2017 18:00:23 +0800 Subject: [PATCH 073/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 15 +++-- .../coderising/download/FileDownloader.java | 64 +++++++----------- .../com/coderising/download/NotifyCaller.java | 65 +++++++++++++++++++ .../coderising/download/api/Connection.java | 6 ++ .../download/api/ConnectionException.java | 3 + .../download/impl/ConnectionImpl.java | 42 ++++++++---- .../download/impl/ConnectionManagerImpl.java | 29 +++++++-- .../download/FileDownloaderTest.java | 12 ++-- 8 files changed, 167 insertions(+), 69 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java index e2900e70c1..a9065fac29 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java @@ -8,12 +8,17 @@ public class DownloadThread extends Thread{ + /*榛樿涓嬭浇浣嶇疆*/ + String downloadPath = "C:/Users/ZJ/Desktop"; Connection conn; int startPos; int endPos; - public DownloadThread( Connection conn, int startPos, int endPos){ - + public DownloadThread( String downloadPath,Connection conn, int startPos, int endPos){ + + if(downloadPath!=null&&!downloadPath.isEmpty()){ + this.downloadPath = downloadPath; + } this.conn = conn; this.startPos = startPos; this.endPos = endPos; @@ -24,7 +29,7 @@ public void run(){ //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 璇诲彇鎸囧畾浣嶅瓙鐨勫瓧鑺 byte[] buffer = conn.read(startPos, endPos); //闅忔満璁块棶鏂囦欢娴 - RandomAccessFile raf = new RandomAccessFile("setup.exe", "rwd"); + RandomAccessFile raf = new RandomAccessFile(downloadPath+"/"+conn.getDownloadName(), "rw"); //闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 raf.seek(startPos);//瀹氫綅鏂囦欢 //鍐欐枃浠 @@ -34,6 +39,8 @@ public void run(){ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - } + }finally{ + conn.close(); + } } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java index c043ba4865..e5d67c77c6 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java @@ -1,9 +1,7 @@ package com.coderising.download; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import java.util.Map; import com.coderising.download.api.Connection; import com.coderising.download.api.ConnectionException; @@ -14,13 +12,17 @@ public class FileDownloader { String url; + String downloadPath; + DownloadListener listener; ConnectionManager cm; /*绾跨▼鍚嶇О鍓嶇紑*/ - private final String threadName = "thread"; + private static final String THREADNAME = "thread"; + private final int threadNum = 5; + public FileDownloader(String _url) { this.url = _url; @@ -46,64 +48,38 @@ public void execute(){ try { conn = cm.open(this.url); - int threadCount = 3; int length = conn.getContentLength(); //瀛樻斁涓嬭浇绾跨▼鍚嶇О List names = new ArrayList(); - int blockSize = length / threadCount; - for (int thread = 1; thread <= threadCount; thread++) { - + int blockSize = length / threadNum; + for (int thread = 1; thread <= threadNum; thread++) { int startIndex = (thread - 1) * blockSize; - int endIndex = thread * blockSize - 1; - if (thread == threadCount) {//鏈鍚庝竴涓嚎绋嬩笅杞界殑闀垮害瑕佺◢寰暱涓鐐 + int endIndex = thread * blockSize-1; + if (thread == threadNum) {//鏈鍚庝竴涓嚎绋嬩笅杞界殑闀垮害 endIndex = length; - } - System.out.println("绾跨▼锛"+thread+"涓嬭浇:---"+startIndex+"--->"+endIndex); - Thread thr= new DownloadThread(conn,startIndex,endIndex); + } + Thread thr= new DownloadThread(downloadPath,cm.open(this.url),startIndex,endIndex); //绾跨▼鍚嶇О缁勬垚锛歵hread+缂栧彿 - thr.setName(threadName+thread); + thr.setName(THREADNAME+thread); + names.add(THREADNAME+thread); thr.start(); - names.add(threadName+thread); } //鍒ゆ柇鎵鏈夌嚎绋嬫槸鍚︿笅杞藉畬鎴 - if(DownloadThreadsIsComplete(names)){ - listener.notifyFinished(); - } - + new NotifyCaller(listener,names).start(); + } catch (ConnectionException e) { e.printStackTrace(); }finally{ if(conn != null){ conn.close(); } - } - - - - + } } - - /** - * 鍒ゆ柇鎵鏈変笅杞界嚎绋嬫槸鍚︽墽琛屽畬 - * @return - */ - private boolean DownloadThreadsIsComplete(List threadNames){ - Map threadMaps=Thread.getAllStackTraces(); - Iterator it = threadMaps.keySet().iterator(); - while(it.hasNext()){ - Thread thread = it.next(); - return !threadNames.contains(thread.getName()); - } - return true; - } - public void setListener(DownloadListener listener) { this.listener = listener; } - - - + public void setConnectionManager(ConnectionManager ucm){ this.cm = ucm; } @@ -111,5 +87,9 @@ public void setConnectionManager(ConnectionManager ucm){ public DownloadListener getListener(){ return this.listener; } - + + public void setDownloadPath(String downloadPath) { + this.downloadPath = downloadPath; + } + } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java new file mode 100644 index 0000000000..1c4d1006a6 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java @@ -0,0 +1,65 @@ +package com.coderising.download; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.coderising.download.api.DownloadListener; + +public class NotifyCaller extends Thread{ + + /*鐩戝惉鍣*/ + private DownloadListener listener; + + /*绾跨▼鍚*/ + private List threadNames; + + public NotifyCaller(DownloadListener listener,List threadNames){ + + this.listener = listener; + this.threadNames = threadNames; + } + + @Override + public void run() { + while(true){ + if(DownloadThreadsIsComplete(threadNames)){ + listener.notifyFinished(); + break; + } + } + } + + /** + * 鏍规嵁鍚嶇О鍒ゆ柇杩欎簺绾跨▼鏄惁鎵ц瀹屾瘯 + * @param threadNames + * @return + */ + private boolean DownloadThreadsIsComplete(List threadNames){ + + Map threadMaps=Thread.getAllStackTraces(); + Iterator it = threadMaps.keySet().iterator(); + while(it.hasNext()){ + Thread thread = it.next(); + if(threadNames.contains(thread.getName())){ + return false; + } + } + return true; + } + + public DownloadListener getListener() { + return listener; + } + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public List getThreadNames() { + return threadNames; + } + + public void setThreadNames(List threadNames) { + this.threadNames = threadNames; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java index 249da5d667..0301fe58d6 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java @@ -20,4 +20,10 @@ public interface Connection { * 鍏抽棴杩炴帴 */ public void close(); + + /** + * 鑾峰彇涓嬭浇鏂囦欢鍚嶇О + * @return + */ + public String getDownloadName(); } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java index 1afde319e7..c9bca99995 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/ConnectionException.java @@ -7,4 +7,7 @@ public class ConnectionException extends Exception { */ private static final long serialVersionUID = 4776347926322882920L; + public ConnectionException(){ + super(); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java index 9704b97757..3f0586dae1 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,5 +1,6 @@ package com.coderising.download.impl; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; @@ -8,30 +9,49 @@ public class ConnectionImpl implements Connection{ - private HttpURLConnection urlCon; + /*http杩炴帴*/ + private HttpURLConnection httpConnection; + + /*涓嬭浇鏂囦欢鍚嶇О*/ + private String fileName; @Override public byte[] read(int startPos, int endPos) throws IOException { //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 - urlCon.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); - InputStream is = urlCon.getInputStream(); - byte[] buffer = new byte[endPos-startPos]; - is.read(buffer); - return buffer; + httpConnection.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); + httpConnection.connect(); + InputStream is = httpConnection.getInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length = -1; + while ((length = is.read(buffer)) != -1) { + baos.write(buffer, 0, length); + } + baos.flush(); + byte[] data = baos.toByteArray(); + return data; } @Override public int getContentLength() { - return urlCon.getContentLength(); + return httpConnection.getContentLength(); } @Override public void close() { - urlCon.disconnect(); + httpConnection.disconnect(); } - public void setUrlCon(HttpURLConnection urlCon) { - this.urlCon = urlCon; + public void setHttpConnection(HttpURLConnection httpConnection) { + this.httpConnection = httpConnection; } - + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + @Override + public String getDownloadName() { + return fileName; + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java index e30706e499..df1ea5a686 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -15,14 +15,17 @@ public class ConnectionManagerImpl implements ConnectionManager { public Connection open(String url) throws ConnectionException { URL remotUrl = null; - HttpURLConnection urlCon = null; + HttpURLConnection httpCon = null; ConnectionImpl conn = new ConnectionImpl(); try { remotUrl = new URL(url); - urlCon = (HttpURLConnection)remotUrl.openConnection(); - urlCon.setRequestMethod("GET"); - urlCon.connect(); - conn.setUrlCon(urlCon); + httpCon = (HttpURLConnection)remotUrl.openConnection(); + httpCon.setRequestMethod("GET"); + httpCon.setConnectTimeout(6000); + httpCon.setDoInput(true); + //璁剧疆Connection灞炴 + conn.setHttpConnection(httpCon); + conn.setFileName(getFileName(url)); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { @@ -30,4 +33,20 @@ public Connection open(String url) throws ConnectionException { } return conn; } + + /** + * 鑾峰彇鏂囦欢鍚嶇О + * @param url + * @return + */ + private String getFileName(String url){ + + String fileName = ""; + if(url.contains("&")&&url.contains("=")){ + fileName = url.substring(url.lastIndexOf("=")+1); + }else{ + fileName = url.substring(url.lastIndexOf("/")+1); + } + return fileName; + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java index 32bab332dd..685e51d808 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java @@ -22,14 +22,15 @@ public void tearDown() throws Exception { @Test public void testDownload() { - String url = "http://localhost:8080/test.jpg"; + //String url = "http://localhost:8080/test.jpg"; + String url = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + //String url = "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1233198091,3919880155&fm=116&gp=0.jpg"; FileDownloader downloader = new FileDownloader(url); - ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); - + downloader.setDownloadPath("C:/Users/ZJ/Desktop"); downloader.setListener(new DownloadListener() { @Override public void notifyFinished() { @@ -37,7 +38,6 @@ public void notifyFinished() { } }); - downloader.execute(); @@ -52,9 +52,7 @@ public void notifyFinished() { } } System.out.println("涓嬭浇瀹屾垚锛"); - - - + } } From 1c8a6800f87bf185ed3c57ba14e3e9d8d85c14a0 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 9 Mar 2017 00:31:56 +0800 Subject: [PATCH 074/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 14 +++++-- .../coderising/download/FileDownloader.java | 21 ++++------ .../com/coderising/download/NotifyCaller.java | 40 +++++++++---------- .../download/FileDownloaderTest.java | 2 + 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java index a9065fac29..5f8f34a638 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java @@ -26,15 +26,16 @@ public DownloadThread( String downloadPath,Connection conn, int startPos, int en public void run(){ try { - //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 璇诲彇鎸囧畾浣嶅瓙鐨勫瓧鑺 + + //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 璇诲彇鎸囧畾浣嶇疆鐨勫瓧鑺 byte[] buffer = conn.read(startPos, endPos); //闅忔満璁块棶鏂囦欢娴 RandomAccessFile raf = new RandomAccessFile(downloadPath+"/"+conn.getDownloadName(), "rw"); //闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 raf.seek(startPos);//瀹氫綅鏂囦欢 - //鍐欐枃浠 + //鍐欐枃浠 raf.write(buffer); - raf.close(); + raf.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { @@ -43,4 +44,11 @@ public void run(){ conn.close(); } } + + public String getDownloadPath() { + return downloadPath; + } + public void setDownloadPath(String downloadPath) { + this.downloadPath = downloadPath; + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java index e5d67c77c6..b5fe9afa3f 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java @@ -1,8 +1,5 @@ package com.coderising.download; -import java.util.ArrayList; -import java.util.List; - import com.coderising.download.api.Connection; import com.coderising.download.api.ConnectionException; import com.coderising.download.api.ConnectionManager; @@ -18,10 +15,8 @@ public class FileDownloader { ConnectionManager cm; - /*绾跨▼鍚嶇О鍓嶇紑*/ - private static final String THREADNAME = "thread"; - - private final int threadNum = 5; + /*绾跨▼鏁扮洰*/ + private final int threadNum = 10; public FileDownloader(String _url) { this.url = _url; @@ -50,7 +45,7 @@ public void execute(){ conn = cm.open(this.url); int length = conn.getContentLength(); //瀛樻斁涓嬭浇绾跨▼鍚嶇О - List names = new ArrayList(); + DownloadThread[] threads = new DownloadThread[threadNum]; int blockSize = length / threadNum; for (int thread = 1; thread <= threadNum; thread++) { int startIndex = (thread - 1) * blockSize; @@ -58,15 +53,13 @@ public void execute(){ if (thread == threadNum) {//鏈鍚庝竴涓嚎绋嬩笅杞界殑闀垮害 endIndex = length; } - Thread thr= new DownloadThread(downloadPath,cm.open(this.url),startIndex,endIndex); - //绾跨▼鍚嶇О缁勬垚锛歵hread+缂栧彿 - thr.setName(THREADNAME+thread); - names.add(THREADNAME+thread); + DownloadThread thr= new DownloadThread(downloadPath,cm.open(this.url),startIndex,endIndex); + threads[thread-1] = thr; thr.start(); } //鍒ゆ柇鎵鏈夌嚎绋嬫槸鍚︿笅杞藉畬鎴 - new NotifyCaller(listener,names).start(); - + new NotifyCaller(listener,threads).start(); + } catch (ConnectionException e) { e.printStackTrace(); }finally{ diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java index 1c4d1006a6..dbfa170423 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java @@ -1,8 +1,7 @@ package com.coderising.download; -import java.util.Iterator; -import java.util.List; import java.util.Map; +import java.util.Set; import com.coderising.download.api.DownloadListener; @@ -11,22 +10,22 @@ public class NotifyCaller extends Thread{ /*鐩戝惉鍣*/ private DownloadListener listener; - /*绾跨▼鍚*/ - private List threadNames; + /*涓嬭浇绾跨▼*/ + private DownloadThread[] downloadThreads; - public NotifyCaller(DownloadListener listener,List threadNames){ + + public NotifyCaller(DownloadListener listener,DownloadThread[] downloadThreads){ this.listener = listener; - this.threadNames = threadNames; + this.downloadThreads = downloadThreads; } @Override public void run() { - while(true){ - if(DownloadThreadsIsComplete(threadNames)){ + while(true){ + if(DownloadThreadsIsComplete(downloadThreads)){ listener.notifyFinished(); - break; - } + } } } @@ -35,19 +34,18 @@ public void run() { * @param threadNames * @return */ - private boolean DownloadThreadsIsComplete(List threadNames){ + private boolean DownloadThreadsIsComplete(DownloadThread[] downloadThreads){ Map threadMaps=Thread.getAllStackTraces(); - Iterator it = threadMaps.keySet().iterator(); - while(it.hasNext()){ - Thread thread = it.next(); - if(threadNames.contains(thread.getName())){ + Set keySet = threadMaps.keySet(); + for (int i = 0; i < downloadThreads.length; i++) { + if(keySet.contains(downloadThreads[i])){ return false; } } return true; } - + public DownloadListener getListener() { return listener; } @@ -55,11 +53,11 @@ public void setListener(DownloadListener listener) { this.listener = listener; } - public List getThreadNames() { - return threadNames; + public DownloadThread[] getDownloadThreads() { + return downloadThreads; } - public void setThreadNames(List threadNames) { - this.threadNames = threadNames; - } + public void setDownloadThreads(DownloadThread[] downloadThreads) { + this.downloadThreads = downloadThreads; + } } diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java index 685e51d808..737cde42ab 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java @@ -10,7 +10,9 @@ import com.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { + boolean downloadFinished = false; + @Before public void setUp() throws Exception { } From 3d5aad10f4b9997ff17278384ac3dda155aa4a56 Mon Sep 17 00:00:00 2001 From: vallain Date: Thu, 9 Mar 2017 02:50:36 +0800 Subject: [PATCH 075/177] this is a testdf --- group17/365689789/.classpath | 6 ++++++ group17/365689789/.gitignore | 1 + group17/365689789/.project | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 group17/365689789/.classpath create mode 100644 group17/365689789/.gitignore create mode 100644 group17/365689789/.project diff --git a/group17/365689789/.classpath b/group17/365689789/.classpath new file mode 100644 index 0000000000..d171cd4c12 --- /dev/null +++ b/group17/365689789/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group17/365689789/.gitignore b/group17/365689789/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/365689789/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/365689789/.project b/group17/365689789/.project new file mode 100644 index 0000000000..3e0116edb8 --- /dev/null +++ b/group17/365689789/.project @@ -0,0 +1,17 @@ + + + L365689789 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + From d93dd7e4a2f99359ceb2345ab7de491f3cf5fc6c Mon Sep 17 00:00:00 2001 From: vallain Date: Thu, 9 Mar 2017 02:58:20 +0800 Subject: [PATCH 076/177] this is test --- group17/333333/.classpath | 6 ++++++ group17/333333/.gitignore | 1 + group17/333333/.project | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 group17/333333/.classpath create mode 100644 group17/333333/.gitignore create mode 100644 group17/333333/.project diff --git a/group17/333333/.classpath b/group17/333333/.classpath new file mode 100644 index 0000000000..d171cd4c12 --- /dev/null +++ b/group17/333333/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group17/333333/.gitignore b/group17/333333/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/333333/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/333333/.project b/group17/333333/.project new file mode 100644 index 0000000000..4b0233c4cc --- /dev/null +++ b/group17/333333/.project @@ -0,0 +1,17 @@ + + + 333 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + From 33bdccbfc0ce220e4b9118fa64a953ce0679fcf3 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Thu, 9 Mar 2017 07:34:36 +0800 Subject: [PATCH 077/177] download ex --- group12/382266293/.gitignore | 1 + .../coderising/download/DownloadThread.java | 50 ++++- .../coderising/download/FileDownloader.java | 171 +++++++++++++----- .../download/FileDownloaderTest.java | 8 +- .../coderising/download/api/Connection.java | 4 + .../download/api/ConnectionException.java | 4 + .../download/impl/ConnectionImpl.java | 57 ++++-- .../download/impl/ConnectionManagerImpl.java | 7 +- .../download/impl/DownloadThreadListener.java | 23 +++ 9 files changed, 260 insertions(+), 65 deletions(-) create mode 100644 group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java diff --git a/group12/382266293/.gitignore b/group12/382266293/.gitignore index ae3c172604..88284eee9a 100644 --- a/group12/382266293/.gitignore +++ b/group12/382266293/.gitignore @@ -1 +1,2 @@ /bin/ +/*.lyj diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 1456314140..0e5568ad5b 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -1,12 +1,30 @@ package com.coderising.download; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; + import com.coderising.download.api.Connection; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.DownloadThreadListener; public class DownloadThread extends Thread{ Connection conn; int startPos; int endPos; + private String dest; + private FileDownloader fileDownloader; + + public void setFileDownloader(FileDownloader fileDownloader) { + this.fileDownloader = fileDownloader; + } + + public void notifyFinished() { + fileDownloader.setFinished(); + } public DownloadThread( Connection conn, int startPos, int endPos){ @@ -14,7 +32,37 @@ public DownloadThread( Connection conn, int startPos, int endPos){ this.startPos = startPos; this.endPos = endPos; } - public void run(){ + public void run(){ + System.out.println(this.getName()+" is running"); + RandomAccessFile raf = null; + try { + byte[] buffer = conn.read(startPos, endPos); + System.out.println("buffer length: " + buffer.length); + raf = new RandomAccessFile(new File(dest), "rws"); + raf.seek(startPos); + raf.write(buffer); + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.close(); + System.out.println(this.getName()+" finished"); + notifyFinished(); + try { + if (raf != null) + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + public void setDest(String dest) { + this.dest = dest; + } + public void close() { + this.conn.close(); } + + } diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index f8702be4b2..ff90959a07 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -1,5 +1,6 @@ package com.coderising.download; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -7,78 +8,126 @@ import com.coderising.download.api.ConnectionException; import com.coderising.download.api.ConnectionManager; import com.coderising.download.api.DownloadListener; - +import com.coderising.download.impl.DownloadThreadListener; public class FileDownloader { - + String url; - + DownloadListener listener; - + ConnectionManager cm; - - private static final int MIN_CONNECTIONS = 3; - private static final int MAX_CONNECTIONS = 10; - + + public String downloadLocation = "C:\\"; + + private final static String EXT = "lyj"; + private static int buffer_size = 1024; + + private int finishedCount; + public void setFinished() { + finishedCount++; + } + + private static final int MIN_CONNECTIONS = 2; + private static final int MAX_CONNECTIONS = 4; public FileDownloader(String _url) { this.url = _url; - + this.finishedCount = 0; } - - public void execute(){ + public void execute() { // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 - // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, + // endPos鏉ユ寚瀹氾級 // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 - // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 // 鍏蜂綋鐨勫疄鐜版濊矾锛 - // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 - // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 + // 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 - + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 Connection conn = null; + DownloadThread[] threadPool = null; try { - conn = cm.open(this.url); int length = conn.getContentLength(); - String dest = ""; - createTempFile(dest,length); + if (length <= 0) { + try { + throw new ConnectionException("file does not exist"); + } catch (ConnectionException e) { + e.printStackTrace(); + return; + } finally { + conn.close(); + } + } + System.out.println("length:"+length); + String fileName = conn.getFileName(); + String tempName = createTempName(downloadLocation+fileName); + createTempFile(tempName, length); int connNum = calculateConnects(length); - DownloadThread[] threadPool = new DownloadThread[connNum]; + System.out.println(connNum + " Threads will be created."); + threadPool = new DownloadThread[connNum]; + System.out.println(connNum); + int batch_size = length / connNum; int beginPos = 0; - int endPos = -1; - int bath_size = length/connNum; - for (int i = 0; i < connNum; i++) { + int endPos = batch_size; + threadPool[0] = new DownloadThread(conn, beginPos, endPos); + threadPool[0].setDest(tempName); + threadPool[0].setFileDownloader(this); + threadPool[0].start(); + for (int i = 1; i < connNum; i++) { beginPos = endPos + 1; - endPos = beginPos + bath_size; + endPos = beginPos + batch_size; if (i == connNum - 1) { endPos = length - 1; } - DownloadThread dt = new DownloadThread(conn,beginPos,endPos); + Connection con = cm.open(this.url); + DownloadThread dt = new DownloadThread(con, beginPos, endPos); + dt.setDest(tempName); + dt.setFileDownloader(this); threadPool[i] = dt; dt.start(); } - - } catch (ConnectionException e) { + checkFinish(threadPool.length); + listener.notifyFinished(); + changeName(tempName, fileName); + } catch (ConnectionException e) { e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); + } finally { + if (threadPool != null) { + for (int i = 0; i < threadPool.length; i++) { + if (threadPool[i] != null) + threadPool[i].close(); + } } } - - - - + + } + private void checkFinish(int links) { + + while(finishedCount != links) { + try { + System.out.println( "Unfinshed threads number: " + (links - finishedCount)); + Thread.sleep(5000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } - - + + private static String createTempName(String fileName) { + return fileName.substring(0, fileName.lastIndexOf('.') + 1) + EXT; + } + private int calculateConnects(int length) { - int conns = length/1024/1024; + int conns = length / 1024 / 1024; if (conns < MIN_CONNECTIONS) { return MIN_CONNECTIONS; } else if (conns > MAX_CONNECTIONS) { @@ -88,8 +137,29 @@ private int calculateConnects(int length) { } } - - private static void createTempFile(String dest, int len){ + private void changeName(String from, String to) { + rename(from, downloadLocation + to); + } + + public boolean rename(String from, String to) { + System.out.println(from); + System.out.println(to); + File file = new File(from); + if (file.exists()) { + file.renameTo(new File(to)); + System.out.println("rename success"); + return true; + } + System.out.println("rename failed"); + return false; + } + + private static void createTempFile(String dest, int len) { + File file = new File(dest); + if (file.exists()) { + System.out.println("tempfile already created"); + return; + } FileOutputStream temp = null; try { temp = new FileOutputStream(dest); @@ -101,7 +171,8 @@ private static void createTempFile(String dest, int len){ temp.write(buffer); } temp.write(buffer, 0, left); - + System.out.println("tempFile "+ dest + " created"); + } catch (Exception e) { e.printStackTrace(); } finally { @@ -113,19 +184,25 @@ private static void createTempFile(String dest, int len){ } } } - + public void setListener(DownloadListener listener) { this.listener = listener; } - - - public void setConnectionManager(ConnectionManager ucm){ + public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - - public DownloadListener getListener(){ + + public DownloadListener getListener() { return this.listener; } - + + public String getDownloadLocation() { + return downloadLocation; + } + + public void setDownloadLocation(String downloadLocation) { + this.downloadLocation = downloadLocation; + } + } diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index 8171ee5763..d83cf1b4e1 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -18,12 +18,16 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } + public static String url1 = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + public static String url2 = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; + public static String url3 = "http://dlsw.baidu.com/sw-search-sp/soft/de/26290/WPIconMaker_1.0.1398047889.exe"; + @Test public void testDownload() { String url = "http://localhost:8080/test.jpg"; - - FileDownloader downloader = new FileDownloader(url); + + FileDownloader downloader = new FileDownloader(url2); ConnectionManager cm = new ConnectionManagerImpl(); diff --git a/group12/382266293/src/com/coderising/download/api/Connection.java b/group12/382266293/src/com/coderising/download/api/Connection.java index 9710e270e1..63d9fc7b19 100644 --- a/group12/382266293/src/com/coderising/download/api/Connection.java +++ b/group12/382266293/src/com/coderising/download/api/Connection.java @@ -19,5 +19,9 @@ public interface Connection { /** * 鍏抽棴杩炴帴 */ + public void close(); + public String getFileName(); + public void setFinished(); + public boolean isFinished(); } diff --git a/group12/382266293/src/com/coderising/download/api/ConnectionException.java b/group12/382266293/src/com/coderising/download/api/ConnectionException.java index 8dbfe95dda..b073bf2d6d 100644 --- a/group12/382266293/src/com/coderising/download/api/ConnectionException.java +++ b/group12/382266293/src/com/coderising/download/api/ConnectionException.java @@ -2,4 +2,8 @@ public class ConnectionException extends Exception { + public ConnectionException(String string) { + super(string); + } + } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index fff7d830fe..7dae156533 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -2,12 +2,15 @@ import static util.Print.println; +import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +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; import sun.net.www.protocol.http.HttpURLConnection; @@ -16,24 +19,37 @@ public class ConnectionImpl implements Connection{ private ConnectionManager cm; private static int buffer_size = 1024; + private HttpURLConnection httpConn; + private URL url; + private boolean finished = false; - public ConnectionImpl(ConnectionManager cm) { + public ConnectionImpl(ConnectionManager cm, String _url) { this.cm = cm; + try { + url = new URL(_url); + httpConn = (HttpURLConnection) url.openConnection(); + } catch (IOException e) { + e.printStackTrace(); + } } @Override public byte[] read(int startPos, int endPos) throws IOException { - FileOutputStream out = null; InputStream in = null; - HttpURLConnection conn = null; + ByteArrayOutputStream out = null; try { - in = conn.getInputStream(); - byte[] buffer = new byte[1024]; + in = httpConn.getInputStream(); + out = new ByteArrayOutputStream(); + in = httpConn.getInputStream(); + in.skip(startPos); + byte[] buffer = new byte[endPos-startPos + 1]; int len = 0; - while( (len = in.read(buffer)) != -1) { - out.write(buffer, 0, len); + //byte[] b = new byte[1024]; + while((len = in.read(buffer)) != -1) { + out.write(buffer); } - println("Read buffer Complete!"); + System.out.println(out.toByteArray().length); + return out.toByteArray(); } catch (IOException e) { e.printStackTrace(); } @@ -42,14 +58,33 @@ public byte[] read(int startPos, int endPos) throws IOException { @Override public int getContentLength() { + int len = httpConn.getContentLength(); + + return len; - return 0; } @Override public void close() { - - + httpConn.disconnect(); + } + + @Override + public String getFileName() { + String fileName = httpConn.getURL().getFile(); + fileName = fileName.substring(fileName.lastIndexOf('/')+1); + return fileName; + } + + @Override + public void setFinished() { + finished = true; } + @Override + public boolean isFinished() { + return finished; + } + + } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java index bea080edac..a50884c256 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -23,12 +23,12 @@ public Connection open(String url) throws ConnectionException { this.url = url; checkConnectionSize(); URL address = null; - HttpURLConnection conn = null; + Connection conn = null; try { address = new URL(url); - conn = (HttpURLConnection) address.openConnection(); + conn = new ConnectionImpl(this,url); connections++; - return (Connection) conn; + return conn; } catch (IOException e) { e.printStackTrace(); } @@ -42,7 +42,6 @@ private void checkConnectionSize() { } catch (NoFreeSourceException e) { e.printStackTrace(); } - } } diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java b/group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java new file mode 100644 index 0000000000..b5ae0e5afa --- /dev/null +++ b/group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java @@ -0,0 +1,23 @@ +package com.coderising.download.impl; + +import com.coderising.download.FileDownloader; +import com.coderising.download.api.DownloadListener; + +public class DownloadThreadListener implements DownloadListener { + + + public DownloadThreadListener() { + } + + private FileDownloader fileDownloader; + public DownloadThreadListener(FileDownloader fileDownloader) { + this.fileDownloader = fileDownloader; + } + + @Override + public void notifyFinished() { + System.out.println("noted"); + fileDownloader.setFinished(); + } + +} From 73464719e655535833d167758a86f1100366010c Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Thu, 9 Mar 2017 11:24:51 +0800 Subject: [PATCH 078/177] =?UTF-8?q?=E5=AF=B9=E4=B9=8B=E5=89=8D=E7=9A=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=81=9A=E4=B8=80=E4=BA=9B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group12/247565311/week1/ArrayList.java | 53 +++------ group12/247565311/week1/ArrayListTest.java | 113 -------------------- group12/247565311/week1/BinaryTreeNode.java | 32 ++++++ group12/247565311/week1/Deque.java | 34 ------ group12/247565311/week1/Iterator.java | 6 ++ group12/247565311/week1/Link.java | 5 - group12/247565311/week1/LinkedList.java | 51 ++------- group12/247565311/week1/List.java | 9 ++ group12/247565311/week1/Queue.java | 18 ++++ group12/247565311/week1/Stack.java | 29 ++--- group12/247565311/week2/ArrayUtilTest.java | 1 - group12/247565311/week2/Struts.java | 11 +- 12 files changed, 104 insertions(+), 258 deletions(-) delete mode 100644 group12/247565311/week1/ArrayListTest.java create mode 100644 group12/247565311/week1/BinaryTreeNode.java delete mode 100644 group12/247565311/week1/Deque.java create mode 100644 group12/247565311/week1/Iterator.java delete mode 100644 group12/247565311/week1/Link.java create mode 100644 group12/247565311/week1/List.java create mode 100644 group12/247565311/week1/Queue.java diff --git a/group12/247565311/week1/ArrayList.java b/group12/247565311/week1/ArrayList.java index f15c04e289..794630a76c 100644 --- a/group12/247565311/week1/ArrayList.java +++ b/group12/247565311/week1/ArrayList.java @@ -1,11 +1,6 @@ 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; @@ -19,8 +14,7 @@ public ArrayList(int arg0){ data = new Object[size]; } @Override - public boolean add(E arg0) { - if(arg0 == null) return false; + public void add(Object arg0) { size += 1; int leng = data.length; if(size>leng){ @@ -31,7 +25,6 @@ public boolean add(E arg0) { data = newdata; } data[size-1] = arg0; - return true; } @Override @@ -53,7 +46,6 @@ public void add(int arg0, E arg1) { return ; } - @Override public boolean addAll(Collection arg0) { if (arg0 == null) return false; int leng = data.length,newobjnum = arg0.size(),lastsize=size; @@ -72,7 +64,6 @@ public boolean addAll(Collection arg0) { return true; } - @Override public boolean addAll(int arg0, Collection arg1) { int newobjnum = arg1.size(),lastsize = size; if(arg1 == null || arg0>size+1 || 0>arg0 || newobjnum==0) return false; @@ -96,13 +87,11 @@ public boolean addAll(int arg0, Collection arg1) { return true; } - @Override public void clear() { size=0; data = new Object[offset]; } - @Override public boolean contains(Object arg0) { for(Object e:data){ if(e.equals(arg0)) return true; @@ -110,7 +99,6 @@ public boolean contains(Object arg0) { return false; } - @Override public boolean containsAll(Collection arg0) { for(Object o:arg0){ if(!this.contains(o)) return false; @@ -124,7 +112,6 @@ public E get(int arg0) { return null; } - @Override public int indexOf(Object arg0) { for(int i=0;i-1;i--){ if(this.data[i].equals(arg0)) return i; @@ -144,25 +130,11 @@ public int lastIndexOf(Object arg0) { 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;i arg0) { int toberemovednums = arg0.size(); if(!this.containsAll(arg0)) return false; @@ -197,13 +168,6 @@ public boolean removeAll(Collection arg0) { return true; } - @Override - public boolean retainAll(Collection 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; @@ -215,7 +179,6 @@ 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(); @@ -228,7 +191,6 @@ public List subList(int arg0, int arg1) { return null; } ////////////////////////////////////////////// - @Override public Object[] toArray() { if(this.size == 0) return null; Object[] res = new Object[this.size]; @@ -238,7 +200,6 @@ public Object[] toArray() { return res; } - @Override public T[] toArray(T[] arg0) { T[] res = (T[])(new Object[this.size]); for(int i=0;i T[] toArray(T[] arg0) { } return res; } + @Override + public boolean hasNext() { + // TODO 自动生成的方法存根 + return false; + } + @Override + public Object next() { + // TODO 自动生成的方法存根 + return null; + } } diff --git a/group12/247565311/week1/ArrayListTest.java b/group12/247565311/week1/ArrayListTest.java deleted file mode 100644 index 846dd152f5..0000000000 --- a/group12/247565311/week1/ArrayListTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package week1; - -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; - -public class ArrayListTest { - - @Before - public void setUp() throws Exception { - // 执行测试方法钱执行此方法 - } - - @After - public void tearDown() throws Exception { - // 测试用例执行完了执行此方法 - } - - @Test - public void testArrayList() { - fail("尚未实现"); - } - - @Test - public void testAddE() { - fail("尚未实现"); - } - - @Test - public void testAddIntE() { - fail("尚未实现"); - } - - @Test - public void testAddAllCollectionOfQextendsE() { - fail("尚未实现"); - } - - @Test - public void testAddAllIntCollectionOfQextendsE() { - fail("尚未实现"); - } - - @Test - public void testClear() { - fail("尚未实现"); - } - - @Test - public void testContains() { - fail("尚未实现"); - } - - @Test - public void testContainsAll() { - fail("尚未实现"); - } - - @Test - public void testGet() { - fail("尚未实现"); - } - - @Test - public void testIndexOf() { - fail("尚未实现"); - } - - @Test - public void testIsEmpty() { - fail("尚未实现"); - } - - @Test - public void testRemoveObject() { - fail("尚未实现"); - } - - @Test - public void testRemoveInt() { - fail("尚未实现"); - } - - @Test - public void testRemoveAll() { - fail("尚未实现"); - } - - @Test - public void testRetainAll() { - fail("尚未实现"); - } - - @Test - public void testSet() { - fail("尚未实现"); - } - - @Test - public void testSize() { - fail("尚未实现"); - } - - @Test - public void testToArray() { - fail("尚未实现"); - } - -} diff --git a/group12/247565311/week1/BinaryTreeNode.java b/group12/247565311/week1/BinaryTreeNode.java new file mode 100644 index 0000000000..617ca84348 --- /dev/null +++ b/group12/247565311/week1/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package week1; + +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/247565311/week1/Deque.java b/group12/247565311/week1/Deque.java deleted file mode 100644 index b71c4b9fac..0000000000 --- a/group12/247565311/week1/Deque.java +++ /dev/null @@ -1,34 +0,0 @@ -package week1; -public class Deque { - 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/Iterator.java b/group12/247565311/week1/Iterator.java new file mode 100644 index 0000000000..7967f1827e --- /dev/null +++ b/group12/247565311/week1/Iterator.java @@ -0,0 +1,6 @@ +package week1; + +public interface Iterator { + public boolean hasNext(); + public E next(); +} 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 index 3acf90ac47..0b74925cbe 100644 --- a/group12/247565311/week1/LinkedList.java +++ b/group12/247565311/week1/LinkedList.java @@ -1,11 +1,8 @@ package week1; import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -public class LinkedList implements List,Cloneable { +public class LinkedList implements List { private Node head = null; private Node tail = null; private int size = 0; @@ -40,14 +37,13 @@ public Object clone(){ return clone; } @Override - public boolean add(Object val) { + public void 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 @@ -64,7 +60,6 @@ public void add(int arg0, E arg1) { size += 1; } - @Override public boolean addAll(Collection arg0) { for(E o:arg0){ this.add(o); @@ -72,7 +67,6 @@ public boolean addAll(Collection arg0) { return true; } - @Override public boolean addAll(int arg0, Collection arg1) { for(E e:arg1){ this.add(arg0,e); @@ -81,7 +75,6 @@ public boolean addAll(int arg0, Collection arg1) { return true; } - @Override public void clear() { head = new Node(null); tail = new Node(null); @@ -90,7 +83,6 @@ public void clear() { size = 0; } - @Override public boolean contains(Object arg0) { boolean flag = arg0==null; Node n = head; @@ -105,7 +97,6 @@ public boolean contains(Object arg0) { return false; } - @Override public boolean containsAll(Collection arg0) { for(Object e:arg0){ if(!this.contains(e)) return false; @@ -126,9 +117,8 @@ public E get(int arg0) { return res; } - @Override public int indexOf(Object arg0) { - boolean flag = arg0 == null; + boolean flag = (arg0 == null); Node n=head; for(int i=0;i iterator() { return null; } - @Override public int lastIndexOf(Object arg0) { boolean flag = arg0==null; Node n = tail; @@ -167,19 +154,6 @@ public int lastIndexOf(Object arg0) { 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); @@ -206,7 +180,6 @@ public E remove(int arg0) { return (E)(d.val); } - @Override public boolean removeAll(Collection arg0) { for(Object o:arg0){ if(!this.remove(o)) return false; @@ -214,13 +187,11 @@ public boolean removeAll(Collection arg0) { 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; @@ -236,13 +207,6 @@ public int size() { return size; } - @Override - public List subList(int arg0, int arg1) { - - return null; - } - - @Override public Object[] toArray() { Object[]res = new Object[size]; Node n = head; @@ -253,7 +217,6 @@ public Object[] toArray() { return res; } - @Override public T[] toArray(T[] arg0) { T[]res = (T[]) new Object[size]; Node n = head; @@ -268,4 +231,12 @@ private static class Node{ Node next = null,ahead=null; public Node(Object arg0){val = arg0;} } + @Override + public boolean hasNext() { + return false; + } + @Override + public Object next() { + return null; + } } diff --git a/group12/247565311/week1/List.java b/group12/247565311/week1/List.java new file mode 100644 index 0000000000..a669a6169d --- /dev/null +++ b/group12/247565311/week1/List.java @@ -0,0 +1,9 @@ +package week1; + +public interface List extends Iterator{ + public void add(Object o); + public void add(int index, E o); + public E get(int index); + public E remove(int index); + public int size(); +} diff --git a/group12/247565311/week1/Queue.java b/group12/247565311/week1/Queue.java new file mode 100644 index 0000000000..78f25cb826 --- /dev/null +++ b/group12/247565311/week1/Queue.java @@ -0,0 +1,18 @@ +package week1; +public class Queue { + private LinkedList data = new LinkedList(); + public void enQueue(E arg0){ + data.add(data.size(),arg0); + } + public E deQueue(){ + E res = data.get(0); + data.remove(0); + return res; + } + public int size(){ + return data.size(); + } + public boolean isEmpty(){ + return data.isEmpty(); + } +} diff --git a/group12/247565311/week1/Stack.java b/group12/247565311/week1/Stack.java index 5672274d81..5dcccc5fca 100644 --- a/group12/247565311/week1/Stack.java +++ b/group12/247565311/week1/Stack.java @@ -1,39 +1,28 @@ package week1; -import java.util.List; +import week1.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); - - } + private ArrayList data = new ArrayList(); public boolean isEmpty(){ - return size==0; + return data.isEmpty(); + } + public int size(){ + return data.size(); } 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); + E res = data.get(data.size()-1); + data.remove(data.size()-1); return res; } public E peek(){ if(this.isEmpty()) return null; - E res = data.get(size-1); + E res = data.get(data.size()-1); return res; } } diff --git a/group12/247565311/week2/ArrayUtilTest.java b/group12/247565311/week2/ArrayUtilTest.java index 889054f6c5..b59b14dfe3 100644 --- a/group12/247565311/week2/ArrayUtilTest.java +++ b/group12/247565311/week2/ArrayUtilTest.java @@ -1,5 +1,4 @@ package week2; -import week2.ArrayUtil; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/group12/247565311/week2/Struts.java b/group12/247565311/week2/Struts.java index 8bb8fedf6d..45658881eb 100644 --- a/group12/247565311/week2/Struts.java +++ b/group12/247565311/week2/Struts.java @@ -1,12 +1,15 @@ package week2; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import org.dom4j.*; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Struts { From 3f34116d9b7980b3644de3d14c240f8a4b9600e9 Mon Sep 17 00:00:00 2001 From: Korben_CHY Date: Thu, 9 Mar 2017 11:51:05 +0800 Subject: [PATCH 079/177] implement LinkedList by Korben --- .../coding/basic/list/KDoubleLinkedList.java | 2 +- .../korben/coding/basic/list/KLinkedList.java | 291 +++++++++++++++++- .../coding/basic/list/KLinkedListTest.java | 157 ++++++++++ 3 files changed, 434 insertions(+), 16 deletions(-) create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedListTest.java diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java index 276428beca..575e537da9 100644 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java @@ -148,7 +148,7 @@ public int indexOf(T o) { @Override public KIterator iterator() { - throw new IllegalStateException("鏂规硶鏈疄鐜"); + throw new UnsupportedOperationException("鏂规硶鏈疄鐜"); } private Node getNode(int index) { 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 index e3ae1bb4d1..719881cf91 100644 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java @@ -1,5 +1,7 @@ package org.korben.coding.basic.list; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; /** @@ -68,8 +70,7 @@ public boolean remove(T o) { preNode = node; node = node.next; if (Objects.equals(node.data, o)) { - preNode.next = node.next; - this.size--; + removeNode(preNode, node); return true; } } @@ -98,9 +99,7 @@ public T set(int index, T element) { @Override public void add(int index, T element) { - if (index < 0 || index >= this.size) { - throw new IndexOutOfBoundsException(); - } + ensureIndex(index); Node node = this.head; Node preNode = node; @@ -118,19 +117,19 @@ public void add(int index, T element) { @Override public T remove(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } + ensureIndex(index); Node node = this.head; Node preNode = this.head; - for (int i = 0; i <= index; i++) { preNode = node; node = node.next; } preNode.next = node.next; + if (node == last) { + last = preNode; + } this.size--; return node.data; } @@ -151,13 +150,11 @@ public int indexOf(T o) { @Override public KIterator iterator() { - throw new IllegalStateException("鏂规硶鏈疄鐜"); + return new Iterator(this); } private Node getNode(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } + ensureIndex(index); Node node = this.head; for (int i = 0; i <= index; i++) { @@ -171,7 +168,31 @@ private Node getNode(int index) { * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 */ public void reverse() { + // 閾捐〃涓虹┖, 涓嶇敤閫嗙疆, 杩斿洖 + if (this.head.next == null) { + return; + } + + // 鍙湁涓涓厓绱, 涓嶇敤閫嗙疆, 杩斿洖 + if (this.head.next.next == null) { + return; + } + + this.last = this.head.next; + Node preNode = this.head.next; + Node node = preNode.next; + Node nextNode = node.next; + while (nextNode != null) { + node.next = preNode; + + preNode = node; + node = nextNode; + nextNode = nextNode.next; + } + + node.next = preNode; + this.head.next = node; } /** @@ -180,23 +201,118 @@ public void reverse() { * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 */ public void removeFirstHalf() { + if (isEmpty()) { + return; + } + int halfIndex = (this.size) / 2; + + if (halfIndex >= 0) { + this.head.next = getNode(halfIndex); + } + + this.size -= halfIndex; } /** * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 */ public void remove(int i, int length) { + ensureIndex(i); + ensureIndex(i + length - 1); + int newSize = this.size - length; + + // 寰楀埌琚垹闄よ捣濮嬪厓绱犵殑鍓嶄竴涓妭鐐 + Node preNode; + if (i == 0) { + preNode = this.head; + } else { + preNode = getNode(i - 1); + } + + // 寰楀埌鏈鍚庝竴涓鍒犻櫎鐨勫厓绱 + Node node = preNode.next; + while (--length > 0) { + node = node.next; + } + + // 鍒犻櫎鍏冪礌 + preNode.next = node.next; + + // 濡傛灉琚垹闄ょ殑鍏冪礌鍖呭惈鏈鍚庣殑鑺傜偣, 鏀瑰彉鏈鍚庤妭鐐 + if (i + length == this.size - 1) { + this.last = preNode; + } + + this.size = newSize; + } + + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺list鎵鎸囧畾鐨勫厓绱 + * 渚嬪褰撳墠閾捐〃 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] + */ + public int[] getElements(KLinkedList list) { + if (list == null || list.size == 0) { + return new int[0]; + } + + List resultList = new ArrayList<>(); + + Node node = this.head; + + KIterator listIterator = list.iterator(); + int elementIndex = (int) listIterator.next(); + for (int i = 0; i < this.size; i++) { + node = node.next; + if (elementIndex == i) { + resultList.add((Integer) node.data); + if (listIterator.hasNext()) { + elementIndex = (int) listIterator.next(); + } else { + break; + } + } + } + + // list 2 array + int[] result = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; } /** * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 */ + public void subtract(KLinkedList list) { + if (list == null || list.size() == 0) { + return; + } - public void subtract(KLinkedList list) { + KIterator listIterator = list.iterator(); + Node node = this.head; + Node pre; + while (listIterator.hasNext()) { + + int listData = listIterator.next(); + while (node.next != null) { + pre = node; + node = node.next; + + if (listData == (int) node.data) { + removeNode(pre, node); + } else if (listData < (int) node.data) { + break; + } + } + } } /** @@ -204,7 +320,21 @@ public void subtract(KLinkedList list) { * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 */ public void removeDuplicateValues() { + if (this.size() <= 1) { + return; + } + + Node node = this.head; + Node pre; + while (node.next.next != null) { + pre = node; + node = node.next; + + if (node.data == node.next.data) { + removeNode(pre, node); + } + } } /** @@ -212,15 +342,124 @@ public void removeDuplicateValues() { * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 */ public void removeRange(int min, int max) { + Node preMinNode = null; + Node maxNode = null; + Node node = this.head; + + // get min and max + int minIndex = -1; + int maxIndex = -1; + while (node.next != null) { + maxIndex++; + if (preMinNode == null) { + minIndex++; + if ((int) node.next.data == min) { + preMinNode = node; + } + } else if ((int) node.next.data == max) { + maxNode = node.next; + } else if (maxNode != null && (int) node.next.data > (int) maxNode.data) { + break; + } + + node = node.next; + } + // do remove + if (preMinNode != null) { + if (maxNode != null) { + preMinNode.next = maxNode.next; + this.size -= maxIndex - minIndex + 1; + if (preMinNode.next == null) { + this.last = preMinNode; + } + } else { + preMinNode.next = null; + this.size = minIndex; + this.last = preMinNode; + } + } } /** + * 123456789876543 * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 */ public KLinkedList intersection(KLinkedList list) { - return null; + if (list == null || list.size() == 0) { + return copyList(this); + } + if (this.isEmpty()) { + return copyList(list); + } + + KLinkedList resultList = new KLinkedList(); + + KIterator listIterator = list.iterator(); + KIterator iterator = this.iterator(); + Integer listValue = (Integer) listIterator.next(); + Integer value = (Integer) iterator.next(); + for (int i = 0; i < list.size() + this.size() - 1; i++) { + + if (listValue == null) { + if (value != null) { + resultList.add(value); + continue; + } else { + break; + } + } + + if (value == null) { + if (listValue != null) { + resultList.add(listValue); + listValue = (Integer) listIterator.next(); + continue; + } else { + break; + } + } + + if (listValue <= value) { + resultList.add(listValue); + listValue = (Integer) listIterator.next(); + value = (Integer) iterator.next(); + } else { + resultList.add(value); + value = (Integer) iterator.next(); + } + } + + return resultList; + } + + private KLinkedList copyList(KLinkedList linkedList) { + if (linkedList == null) { + return null; + } + + KLinkedList result = new KLinkedList(); + KIterator iterator = linkedList.iterator(); + while (iterator.hasNext()) { + result.add(iterator.next()); + } + + return result; + } + + private void ensureIndex(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + private void removeNode(Node pre, Node node) { + pre.next = node.next; + this.size--; + if (this.last == node) { + this.last = pre; + } } private static class Node { @@ -231,4 +470,26 @@ private static class Node { this.data = data; } } + + private class Iterator implements KIterator { + private Node node; + + Iterator(KLinkedList list) { + this.node = list.head; + } + + @Override + public boolean hasNext() { + return node.next != null; + } + + @Override + public T next() { + if (hasNext()) { + node = node.next; + return node.data; + } + return null; + } + } } diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedListTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedListTest.java new file mode 100644 index 0000000000..f086efdbdc --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedListTest.java @@ -0,0 +1,157 @@ +package org.korben.coding.basic.list; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * 閾捐〃娴嬭瘯--绗笁娆$畻娉曚綔涓 + * + * Created by Korben on 07/03/2017. + */ +public class KLinkedListTest { + + private KLinkedList linkedList; + + @Before + public void init() { + linkedList = new KLinkedList<>(); + for (int i = 0; i < 5; i++) { + linkedList.add(i); + } + } + + @Test + public void reverse() throws Exception { + // 娴嬭瘯澶氫釜 + linkedList.reverse(); + Assert.assertEquals(linkedList.size(), 5); + for (int i = 0; i < 5; i++) { + Assert.assertEquals(linkedList.get(i).intValue(), 4 - i); + } + + // 娴嬭瘯绌洪摼琛 + linkedList = new KLinkedList<>(); + linkedList.reverse(); + Assert.assertEquals(linkedList.size(), 0); + + // 娴嬭瘯鍗曚釜 + linkedList.add(0); + linkedList.reverse(); + Assert.assertEquals(linkedList.size(), 1); + Assert.assertEquals(linkedList.get(0).intValue(), 0); + } + + @Test + public void removeFirstHalf() throws Exception { + linkedList.removeFirstHalf(); + Assert.assertEquals(linkedList.size(), 3); + for (int i = 0; i < 3; i++) { + Assert.assertEquals(linkedList.get(i).intValue(), i + 2); + } + + linkedList = new KLinkedList<>(); + linkedList.removeFirstHalf(); + Assert.assertEquals(linkedList.size(), 0); + } + + @Test + public void remove() throws Exception { + // 娴嬭瘯鍒犻櫎寮濮嬭妭鐐 + { + linkedList.remove(0, 2); + Assert.assertEquals(linkedList.size(), 3); + for (int i = 0; i < 3; i++) { + Assert.assertEquals(linkedList.get(i).intValue(), i + 2); + } + } + + // 娴嬭瘯鍒犻櫎涓棿鑺傜偣 + { + init(); + linkedList.remove(1, 2); + Assert.assertEquals(linkedList.size(), 3); + Assert.assertEquals(linkedList.get(0).intValue(), 0); + Assert.assertEquals(linkedList.get(1).intValue(), 3); + Assert.assertEquals(linkedList.get(2).intValue(), 4); + } + + // 娴嬭瘯鍒犻櫎鏈熬鑺傜偣 + { + init(); + linkedList.remove(3, 2); + Assert.assertEquals(linkedList.size(), 3); + Assert.assertEquals(linkedList.get(0).intValue(), 0); + Assert.assertEquals(linkedList.get(1).intValue(), 1); + Assert.assertEquals(linkedList.get(2).intValue(), 2); + } + + // 娴嬭瘯鍒犻櫎鍏ㄩ儴 + { + init(); + linkedList.remove(0, 5); + Assert.assertEquals(linkedList.size(), 0); + } + } + + @Test + public void getElements() throws Exception { + KLinkedList list = new KLinkedList<>(); + list.add(2); + list.add(4); + + int[] elements = linkedList.getElements(list); + Assert.assertEquals(elements.length, 2); + Assert.assertEquals(elements[0], linkedList.get(2).intValue()); + Assert.assertEquals(elements[1], linkedList.get(4).intValue()); + } + + @Test + public void subtract() throws Exception { + KLinkedList list = new KLinkedList<>(); + list.add(2); + list.add(4); + + linkedList.subtract(list); + Assert.assertEquals(linkedList.size(), 3); + Assert.assertEquals(linkedList.get(0).intValue(), 0); + Assert.assertEquals(linkedList.get(1).intValue(), 1); + Assert.assertEquals(linkedList.get(2).intValue(), 3); + } + + @Test + public void removeDuplicateValues() throws Exception { + linkedList = new KLinkedList<>(); + for (int i = 0; i < 10; i++) { + linkedList.add(i / 2); + } + + linkedList.removeDuplicateValues(); + Assert.assertEquals(linkedList.size(), 5); + for (int i = 0; i < 5; i++) { + Assert.assertEquals(linkedList.get(i).intValue(), i); + } + } + + @Test + public void removeRange() throws Exception { + linkedList.removeRange(2, 4); + Assert.assertEquals(linkedList.size(), 2); + Assert.assertEquals(linkedList.get(0).intValue(), 0); + Assert.assertEquals(linkedList.get(1).intValue(), 1); + } + + @Test + public void intersection() throws Exception { + KLinkedList insertList = new KLinkedList(); + for (int i = 3; i < 8; i++) { + insertList.add(i); + } + + KLinkedList intersection = linkedList.intersection(insertList); + Assert.assertEquals(intersection.size(), 8); + for (int i = 0; i < intersection.size(); i++) { + Assert.assertEquals(intersection.get(i), i); + } + } +} \ No newline at end of file From 50d2f775ea3dea5819a21a6782f156cd85cc7d18 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 9 Mar 2017 18:06:31 +0800 Subject: [PATCH 080/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 106 ++++++++++++++---- .../coderising/download/FileDownloader.java | 30 ++--- .../com/coderising/download/NotifyCaller.java | 73 ++++++------ .../coderising/download/api/Connection.java | 7 ++ .../download/api/DownloadListener.java | 2 +- .../download/impl/ConnectionImpl.java | 16 ++- .../download/FileDownloaderTest.java | 18 ++- 7 files changed, 160 insertions(+), 92 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java index 5f8f34a638..3325381c6c 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java @@ -1,54 +1,112 @@ package com.coderising.download; +import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.RandomAccessFile; import com.coderising.download.api.Connection; -public class DownloadThread extends Thread{ +public class DownloadThread extends Thread { - /*榛樿涓嬭浇浣嶇疆*/ - String downloadPath = "C:/Users/ZJ/Desktop"; Connection conn; int startPos; int endPos; + /* 鏂囦欢璺緞 */ + String downloadPath; + /*涓存椂鏂囦欢*/ + File tempFile; + /*鏂囦欢鍚庣紑鍚嶇О*/ + String sufferName; + /*褰撳墠绾跨▼涓嬭浇閲*/ + volatile int downloadSize; - public DownloadThread( String downloadPath,Connection conn, int startPos, int endPos){ - - if(downloadPath!=null&&!downloadPath.isEmpty()){ - this.downloadPath = downloadPath; - } - this.conn = conn; + public DownloadThread(String downloadPath, Connection conn, int startPos, + int endPos) { + + this.downloadPath = downloadPath; + this.conn = conn; this.startPos = startPos; this.endPos = endPos; } - public void run(){ - - try { - - //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 璇诲彇鎸囧畾浣嶇疆鐨勫瓧鑺 + + /** + * 杩欑鎿嶄綔瀛樺湪寮婄锛 + * 鑻ユ枃浠惰繃澶э紝璋冪敤conn.read璇诲彇杩囩▼涓▼搴忎腑鏂 + * 灏嗘棤娉曠紦瀛樹换浣曟暟鎹 + */ + /*public void run() { + + try { + + //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 璇诲彇鎸囧畾浣嶅瓙鐨勫瓧鑺 byte[] buffer = conn.read(startPos, endPos); //闅忔満璁块棶鏂囦欢娴 - RandomAccessFile raf = new RandomAccessFile(downloadPath+"/"+conn.getDownloadName(), "rw"); + RandomAccessFile raf = new RandomAccessFile(tempFile, "rwd"); //闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 raf.seek(startPos);//瀹氫綅鏂囦欢 - //鍐欐枃浠 + //鍐欐枃浠 raf.write(buffer); - raf.close(); + raf.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (conn != null) { + conn.close(); + } + } + }*/ + + public void run() { + + try { + + //淇敼鍚庣紑鍚嶇О,骞朵繚瀛樻纭悗缂鍚 + String name = reSufferNameAndStore(conn.getDownloadName()); + //鍒涘缓涓存椂鏂囦欢 + File file = new File(downloadPath+"/"+name); + if(!file.exists()){ + file.createNewFile(); + } + //鍒濆鍖栧睘鎬 + tempFile = file; + //鑾峰彇鎸囧畾鏂囦欢娈电殑涓嬭浇娴 + InputStream in = conn.getDownloadStream(startPos, endPos); + //闅忔満璁块棶鏂囦欢娴 + RandomAccessFile raf = new RandomAccessFile(tempFile, "rwd"); + //闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 + raf.seek(startPos);//瀹氫綅鏂囦欢 + //寮濮嬪啓鍏 + byte[] buffer = new byte[1024]; + int length = -1; + while ((length = in.read(buffer)) != -1) { + raf.write(buffer, 0, length); + downloadSize += length; + } + raf.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - }finally{ - conn.close(); + } finally { + if (conn != null) { + conn.close(); + } } } - public String getDownloadPath() { - return downloadPath; + /** + * 淇敼鍚庣紑鍚嶇О,骞朵繚瀛樻纭悗缂鍚 + * @param name + * @return + */ + private String reSufferNameAndStore(String name){ + + sufferName = name.substring(name.lastIndexOf(".")); + name = name.substring(0,name.lastIndexOf("."))+".zj鈾y"; + return name; } - public void setDownloadPath(String downloadPath) { - this.downloadPath = downloadPath; - } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java index b5fe9afa3f..289695cf40 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java @@ -16,7 +16,7 @@ public class FileDownloader { ConnectionManager cm; /*绾跨▼鏁扮洰*/ - private final int threadNum = 10; + private final int threadNum = 8; public FileDownloader(String _url) { this.url = _url; @@ -24,41 +24,27 @@ public FileDownloader(String _url) { } public void execute(){ - // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 - // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 - // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 - // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 - // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 - // 鍏蜂綋鐨勫疄鐜版濊矾锛 - // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 - // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 - // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 - // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 - // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 - - // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 - - + Connection conn = null; try { conn = cm.open(this.url); - int length = conn.getContentLength(); - //瀛樻斁涓嬭浇绾跨▼鍚嶇О + int length = conn.getContentLength(); + //鍒嗛厤涓嬭浇鍧 + int blockSize = length / threadNum; DownloadThread[] threads = new DownloadThread[threadNum]; - int blockSize = length / threadNum; for (int thread = 1; thread <= threadNum; thread++) { int startIndex = (thread - 1) * blockSize; int endIndex = thread * blockSize-1; if (thread == threadNum) {//鏈鍚庝竴涓嚎绋嬩笅杞界殑闀垮害 endIndex = length; - } - DownloadThread thr= new DownloadThread(downloadPath,cm.open(this.url),startIndex,endIndex); + } + DownloadThread thr = new DownloadThread(downloadPath,cm.open(this.url),startIndex,endIndex); threads[thread-1] = thr; thr.start(); } //鍒ゆ柇鎵鏈夌嚎绋嬫槸鍚︿笅杞藉畬鎴 - new NotifyCaller(listener,threads).start(); + new NotifyCaller(listener,threads,length).start(); } catch (ConnectionException e) { e.printStackTrace(); diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java index dbfa170423..3d680df4d8 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java @@ -1,7 +1,6 @@ package com.coderising.download; -import java.util.Map; -import java.util.Set; +import java.io.File; import com.coderising.download.api.DownloadListener; @@ -10,54 +9,60 @@ public class NotifyCaller extends Thread{ /*鐩戝惉鍣*/ private DownloadListener listener; - /*涓嬭浇绾跨▼*/ - private DownloadThread[] downloadThreads; + /*鍐呭瓨鏂囦欢*/ + DownloadThread[] downloadThreads; + /*鏂囦欢鎬婚暱搴*/ + private int fileLength; - public NotifyCaller(DownloadListener listener,DownloadThread[] downloadThreads){ + private static final int HUNDRED = 100; + + public NotifyCaller(DownloadListener listener,DownloadThread[] downloadThreads,int fileLength){ this.listener = listener; this.downloadThreads = downloadThreads; + this.fileLength = fileLength; } @Override public void run() { - while(true){ - if(DownloadThreadsIsComplete(downloadThreads)){ - listener.notifyFinished(); - } - } - } - - /** - * 鏍规嵁鍚嶇О鍒ゆ柇杩欎簺绾跨▼鏄惁鎵ц瀹屾瘯 - * @param threadNames - * @return - */ - private boolean DownloadThreadsIsComplete(DownloadThread[] downloadThreads){ - - Map threadMaps=Thread.getAllStackTraces(); - Set keySet = threadMaps.keySet(); - for (int i = 0; i < downloadThreads.length; i++) { - if(keySet.contains(downloadThreads[i])){ - return false; + while(true){ + if(HUNDRED == getPercentOfDownload()){ + rename(); } + listener.notifyFinished(getPercentOfDownload()); } - return true; } - + + /** + * 鑾峰彇涓嬭浇鐧惧垎姣 + * @return + */ + private int getPercentOfDownload(){ + + int sum = 0; + for (int i = 0; i < downloadThreads.length; i++) { + sum += downloadThreads[i].downloadSize; + } + return (sum)/(fileLength/HUNDRED); + } + + /** + * 閲嶅懡鍚 + */ + private void rename(){ + + File tempFile = downloadThreads[0].tempFile; + String name = tempFile.getName(); + name = name.substring(0,name.lastIndexOf("."))+downloadThreads[0].sufferName; + File file = new File(tempFile.getPath()+"/"+name); + tempFile.renameTo(file); + } + public DownloadListener getListener() { return listener; } public void setListener(DownloadListener listener) { this.listener = listener; } - - public DownloadThread[] getDownloadThreads() { - return downloadThreads; - } - - public void setDownloadThreads(DownloadThread[] downloadThreads) { - this.downloadThreads = downloadThreads; - } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java index 0301fe58d6..8ccb6a11bf 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/Connection.java @@ -1,6 +1,7 @@ package com.coderising.download.api; import java.io.IOException; +import java.io.InputStream; public interface Connection { /** @@ -26,4 +27,10 @@ public interface Connection { * @return */ public String getDownloadName(); + + /** + * 鑾峰彇涓嬭浇娴 + * @return + */ + public InputStream getDownloadStream(int startPos, int endPos)throws IOException; } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java index 4cd0b3eab1..fc81f6c6f4 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java @@ -1,5 +1,5 @@ package com.coderising.download.api; public interface DownloadListener { - public void notifyFinished(); + public void notifyFinished(int percet); } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java index 3f0586dae1..fcf0cf7ae9 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java @@ -17,10 +17,8 @@ public class ConnectionImpl implements Connection{ @Override public byte[] read(int startPos, int endPos) throws IOException { - //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 - httpConnection.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); - httpConnection.connect(); - InputStream is = httpConnection.getInputStream(); + + InputStream is = getDownloadStream(startPos,endPos); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = -1; @@ -32,6 +30,13 @@ public byte[] read(int startPos, int endPos) throws IOException { return data; } + @Override + public InputStream getDownloadStream(int startPos, int endPos) throws IOException { + //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 + httpConnection.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); + httpConnection.connect(); + return httpConnection.getInputStream(); + } @Override public int getContentLength() { return httpConnection.getContentLength(); @@ -53,5 +58,6 @@ public void setFileName(String fileName) { @Override public String getDownloadName() { return fileName; - } + } + } diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java index 737cde42ab..5d386ddb6b 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java @@ -11,7 +11,7 @@ public class FileDownloaderTest { - boolean downloadFinished = false; + int persent = 0; @Before public void setUp() throws Exception { @@ -35,8 +35,8 @@ public void testDownload() { downloader.setDownloadPath("C:/Users/ZJ/Desktop"); downloader.setListener(new DownloadListener() { @Override - public void notifyFinished() { - downloadFinished = true; + public void notifyFinished(int percent) { + persent = percent; } }); @@ -44,9 +44,16 @@ public void notifyFinished() { downloader.execute(); // 绛夊緟澶氱嚎绋嬩笅杞界▼搴忔墽琛屽畬姣 - while (!downloadFinished) { + int temp = -1; + while (true) { try { - System.out.println("杩樻病鏈変笅杞藉畬鎴愶紝浼戠湢浜旂"); + if(temp!=persent){ + temp = persent; + System.out.println("宸蹭笅杞"+persent+"%"); + } + if(persent == 100){ + break; + } //浼戠湢5绉 Thread.sleep(5000); } catch (InterruptedException e) { @@ -56,5 +63,4 @@ public void notifyFinished() { System.out.println("涓嬭浇瀹屾垚锛"); } - } From 07d64da88238bd6bdc346c6252bf2f3b32aeaf2a Mon Sep 17 00:00:00 2001 From: lingchen1dian21fen <2474600377@qq.com> Date: Thu, 9 Mar 2017 22:25:05 +0800 Subject: [PATCH 081/177] =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=8A=A0=E8=BE=B9=E7=95=8C=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/array/ArrayUtil.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/group10/904627477/src/com/coding/array/ArrayUtil.java b/group10/904627477/src/com/coding/array/ArrayUtil.java index 37f230812a..dc3a7a7254 100644 --- a/group10/904627477/src/com/coding/array/ArrayUtil.java +++ b/group10/904627477/src/com/coding/array/ArrayUtil.java @@ -10,6 +10,9 @@ public class ArrayUtil { * @return */ public void reverseArray(int[] origin){ + if(origin==null){ + return ; + } int len = origin.length; for (int i = 0; i < len/2 ; i++) { int temp = origin[len-1-i]; @@ -27,6 +30,9 @@ public void reverseArray(int[] origin){ */ public int[] removeZero(int[] oldArray){ + if(oldArray==null){ + return new int[0]; + } int[] tempArr = new int[oldArray.length]; int size = 0; for (int i = 0; i < oldArray.length; i++) { @@ -49,6 +55,11 @@ public int[] removeZero(int[] oldArray){ */ public int[] merge(int[] array1, int[] array2){ + if(array1==null&&array2==null){ + return new int[0]; + }else if(array1==null||array2==null){ + return array1==null?array2:array1; + } int[] arr3 = new int[array1.length+array2.length]; int len1 = array1.length; int len2 = array2.length; @@ -85,6 +96,9 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ + if(oldArray==null){ + return new int[0]; + } if(size<0){ throw new IllegalArgumentException(); } @@ -202,13 +216,28 @@ public boolean isPerfectNumber(int n){ * @param s * @return */ - public String join(int[] array, String seperator){ + /*My + 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); + }*/ + + public String join(int[] array, String seperator){ + if(array==null){ + return ""; + } + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if(i Date: Thu, 9 Mar 2017 22:26:01 +0800 Subject: [PATCH 082/177] Signed-off-by: lingchen1dian21fen <2474600377@qq.com> --- group10/904627477/.settings/org.eclipse.core.resources.prefs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 group10/904627477/.settings/org.eclipse.core.resources.prefs diff --git a/group10/904627477/.settings/org.eclipse.core.resources.prefs b/group10/904627477/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group10/904627477/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 From fe00bef2c76e861011212a667a36e0146884c9db Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 9 Mar 2017 23:37:16 +0800 Subject: [PATCH 083/177] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 3 ++ .../coderising/download/FileDownloader.java | 2 +- .../com/coderising/download/NotifyCaller.java | 52 +++++++++++++++---- .../download/api/DownloadListener.java | 7 ++- .../download/impl/ConnectionImpl.java | 29 +++++++---- .../download/impl/ConnectionManagerImpl.java | 3 ++ .../download/FileDownloaderTest.java | 7 ++- 7 files changed, 78 insertions(+), 25 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java index 3325381c6c..b4d218399f 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/DownloadThread.java @@ -75,6 +75,9 @@ public void run() { tempFile = file; //鑾峰彇鎸囧畾鏂囦欢娈电殑涓嬭浇娴 InputStream in = conn.getDownloadStream(startPos, endPos); + if(in == null){ + return; + } //闅忔満璁块棶鏂囦欢娴 RandomAccessFile raf = new RandomAccessFile(tempFile, "rwd"); //闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java index 289695cf40..cb84d148c7 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/FileDownloader.java @@ -16,7 +16,7 @@ public class FileDownloader { ConnectionManager cm; /*绾跨▼鏁扮洰*/ - private final int threadNum = 8; + private final int threadNum = 5; public FileDownloader(String _url) { this.url = _url; diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java index 3d680df4d8..03f4149688 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/NotifyCaller.java @@ -1,6 +1,7 @@ package com.coderising.download; import java.io.File; +import java.text.DecimalFormat; import com.coderising.download.api.DownloadListener; @@ -25,12 +26,20 @@ public NotifyCaller(DownloadListener listener,DownloadThread[] downloadThreads,i } @Override - public void run() { - while(true){ - if(HUNDRED == getPercentOfDownload()){ - rename(); + public void run() { + + int i =1; + while(true){ + try { + Thread.sleep(5000); + if(HUNDRED == getPercentOfDownload()){ + rename(); + } + listener.notifyFinished(getPercentOfDownload(),getDownloadSpeed(5*i)); + i++; + } catch (InterruptedException e) { + e.printStackTrace(); } - listener.notifyFinished(getPercentOfDownload()); } } @@ -40,23 +49,46 @@ public void run() { */ private int getPercentOfDownload(){ + int sum = calculateDownloadSize(); + return (sum)/(fileLength/HUNDRED); + } + + /** + * 鑾峰彇涓嬭浇閫熷害 + * @return + */ + private String getDownloadSpeed(int timeDiff){ + + float sum = calculateDownloadSize(); + DecimalFormat df = new DecimalFormat("0.000");//鏍煎紡鍖栧皬鏁 + String num = df.format((sum/((float)(1024*1024)*timeDiff)));//杩斿洖鐨勬槸String绫诲瀷 + if(num==null||num.isEmpty()){ + num = "0"; + } + return num+"M/s"; + } + + /** + * 璁$畻宸蹭笅杞芥枃浠跺ぇ灏 + */ + private int calculateDownloadSize(){ int sum = 0; for (int i = 0; i < downloadThreads.length; i++) { sum += downloadThreads[i].downloadSize; } - return (sum)/(fileLength/HUNDRED); + return sum; } - /** * 閲嶅懡鍚 */ private void rename(){ File tempFile = downloadThreads[0].tempFile; - String name = tempFile.getName(); - name = name.substring(0,name.lastIndexOf("."))+downloadThreads[0].sufferName; - File file = new File(tempFile.getPath()+"/"+name); + String path = tempFile.getPath(); + String name = path.substring(0,path.lastIndexOf("."))+downloadThreads[0].sufferName; + File file = new File(name); tempFile.renameTo(file); + } public DownloadListener getListener() { diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java b/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java index fc81f6c6f4..82694051bd 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/api/DownloadListener.java @@ -1,5 +1,10 @@ package com.coderising.download.api; public interface DownloadListener { - public void notifyFinished(int percet); + + /** + * @param percent 涓嬭浇鐧惧垎姣 + * @param downloadSpeed 涓嬭浇閫熷害锛屽崟浣峂/s + */ + public void notifyFinished(int percent,String downloadSpeed); } diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java index fcf0cf7ae9..fbf8de35ae 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java @@ -18,15 +18,19 @@ public class ConnectionImpl implements Connection{ @Override public byte[] read(int startPos, int endPos) throws IOException { - InputStream is = getDownloadStream(startPos,endPos); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int length = -1; - while ((length = is.read(buffer)) != -1) { - baos.write(buffer, 0, length); - } - baos.flush(); - byte[] data = baos.toByteArray(); + byte[] data = null; + InputStream is = getDownloadStream(startPos,endPos); + if(is !=null){ + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length = -1; + while ((length = is.read(buffer)) != -1) { + baos.write(buffer, 0, length); + } + baos.flush(); + data = baos.toByteArray(); + return data; + } return data; } @@ -34,8 +38,11 @@ public byte[] read(int startPos, int endPos) throws IOException { public InputStream getDownloadStream(int startPos, int endPos) throws IOException { //璇锋眰鏈嶅姟鍣ㄤ笅杞介儴鍒嗘枃浠 鎸囧畾鏂囦欢鐨勪綅缃 httpConnection.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); - httpConnection.connect(); - return httpConnection.getInputStream(); + httpConnection.connect(); + if(httpConnection.getResponseCode()/100 == 2){ + return httpConnection.getInputStream(); + } + return null; } @Override public int getContentLength() { diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java index df1ea5a686..4996c21cc0 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -22,7 +22,10 @@ public Connection open(String url) throws ConnectionException { httpCon = (HttpURLConnection)remotUrl.openConnection(); httpCon.setRequestMethod("GET"); httpCon.setConnectTimeout(6000); + httpCon.setReadTimeout(6000); httpCon.setDoInput(true); + httpCon.setRequestProperty("connection", "keep-alive"); + httpCon.setRequestProperty("accept", "*/*"); //璁剧疆Connection灞炴 conn.setHttpConnection(httpCon); conn.setFileName(getFileName(url)); diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java index 5d386ddb6b..80e2d5f356 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/download/FileDownloaderTest.java @@ -13,6 +13,8 @@ public class FileDownloaderTest { int persent = 0; + String downloadSpeed ="0"; + @Before public void setUp() throws Exception { } @@ -35,8 +37,9 @@ public void testDownload() { downloader.setDownloadPath("C:/Users/ZJ/Desktop"); downloader.setListener(new DownloadListener() { @Override - public void notifyFinished(int percent) { + public void notifyFinished(int percent,String speed) { persent = percent; + downloadSpeed = speed; } }); @@ -49,7 +52,7 @@ public void notifyFinished(int percent) { try { if(temp!=persent){ temp = persent; - System.out.println("宸蹭笅杞"+persent+"%"); + System.out.println("宸蹭笅杞"+persent+"%锛屼笅杞介熷害涓猴細"+downloadSpeed+"銆"); } if(persent == 100){ break; From e2a07b91ee17fdde11022d67d68adcfc9901b3d3 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Fri, 10 Mar 2017 07:38:07 +0800 Subject: [PATCH 084/177] 2 --- group12/382266293/.classpath | 10 +- .../coderising/download/DownloadThread.java | 4 +- .../coderising/download/FileDownloader.java | 239 ++++++++++-------- .../download/FileDownloaderTest.java | 4 +- .../download/api/ConnectionManager.java | 2 +- .../download/impl/ConnectionImpl.java | 7 +- .../src/litestruts/Configuration.java | 104 ++++++++ .../src/litestruts/ConfigurationTest.java | 36 +++ 8 files changed, 292 insertions(+), 114 deletions(-) create mode 100644 group12/382266293/src/litestruts/Configuration.java create mode 100644 group12/382266293/src/litestruts/ConfigurationTest.java diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath index 300ed0c62f..83faa48c0d 100644 --- a/group12/382266293/.classpath +++ b/group12/382266293/.classpath @@ -4,7 +4,15 @@ - + + + + + + + + + diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 0e5568ad5b..0001e0e628 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -47,12 +47,14 @@ public void run(){ } finally { conn.close(); System.out.println(this.getName()+" finished"); - notifyFinished(); + try { if (raf != null) raf.close(); } catch (IOException e) { e.printStackTrace(); + } finally { + notifyFinished(); } } } diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index ff90959a07..6e8d10e726 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -8,33 +8,30 @@ import com.coderising.download.api.ConnectionException; import com.coderising.download.api.ConnectionManager; import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.DownloadThreadListener; public class FileDownloader { - String url; - - DownloadListener listener; - - ConnectionManager cm; - - public String downloadLocation = "C:\\"; + private final static String EXT = "lyj"; - private static int buffer_size = 1024; - + private static final int MIN_CONNECTIONS = 3; + private static final int MAX_CONNECTIONS = 10; + private static DownloadThread[] threadPool; private int finishedCount; - public void setFinished() { - finishedCount++; - } - - private static final int MIN_CONNECTIONS = 2; - private static final int MAX_CONNECTIONS = 4; + public String downloadLocation = "C:\\"; + + String url; + ConnectionManager cm; + DownloadListener listener; + private static boolean finished; + private static String fileName; + private static String tempName; public FileDownloader(String _url) { this.url = _url; this.finishedCount = 0; } + public void execute() { // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 @@ -51,11 +48,12 @@ public void execute() { // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 - Connection conn = null; - DownloadThread[] threadPool = null; + + int length = 0; + long start = getCurrentTime(); try { - conn = cm.open(this.url); - int length = conn.getContentLength(); + Connection conn = cm.open(this.url); + length = conn.getContentLength(); if (length <= 0) { try { throw new ConnectionException("file does not exist"); @@ -66,64 +64,67 @@ public void execute() { conn.close(); } } - System.out.println("length:"+length); - String fileName = conn.getFileName(); - String tempName = createTempName(downloadLocation+fileName); + + System.out.println("file length:" + length); + + fileName = conn.getFileName(); + setTempName(downloadLocation + fileName); createTempFile(tempName, length); - int connNum = calculateConnects(length); - System.out.println(connNum + " Threads will be created."); - threadPool = new DownloadThread[connNum]; - System.out.println(connNum); - int batch_size = length / connNum; - int beginPos = 0; - int endPos = batch_size; - threadPool[0] = new DownloadThread(conn, beginPos, endPos); - threadPool[0].setDest(tempName); - threadPool[0].setFileDownloader(this); - threadPool[0].start(); - for (int i = 1; i < connNum; i++) { - beginPos = endPos + 1; - endPos = beginPos + batch_size; - if (i == connNum - 1) { - endPos = length - 1; - } - Connection con = cm.open(this.url); - DownloadThread dt = new DownloadThread(con, beginPos, endPos); - dt.setDest(tempName); - dt.setFileDownloader(this); - threadPool[i] = dt; - dt.start(); - } - checkFinish(threadPool.length); + + int connNumbers = calculateConnects(length); + System.out.println(connNumbers + " Threads will be created."); + + threadPool = new DownloadThread[connNumbers]; + setAndStartThreadPool(conn, threadPool, length); + + finished = checkFinish(threadPool.length); listener.notifyFinished(); - changeName(tempName, fileName); + } catch (ConnectionException e) { e.printStackTrace(); } finally { - if (threadPool != null) { - for (int i = 0; i < threadPool.length; i++) { - if (threadPool[i] != null) - threadPool[i].close(); - } + freeDownloadThread(); + if (finished) { + changeName(tempName, fileName); + long end = getCurrentTime(); + printDownloadReport(length, start, end); } } - } - private void checkFinish(int links) { - while(finishedCount != links) { + private static void createTempFile(String dest, int len) { + File file = new File(dest); + if (file.exists()) { + System.out.println("tempfile already created"); + return; + } + FileOutputStream temp = null; + try { + temp = new FileOutputStream(dest); + int length = len; + byte[] buffer = new byte[1024]; + long times = length / 1024; + int left = (int) (length % 1024); + for (int i = 0; i < times; i++) { + temp.write(buffer); + } + temp.write(buffer, 0, left); + System.out.println("tempFile " + dest + " created"); + + } catch (Exception e) { + e.printStackTrace(); + } finally { try { - System.out.println( "Unfinshed threads number: " + (links - finishedCount)); - Thread.sleep(5000); - - } catch (InterruptedException e) { + temp.flush(); + temp.close(); + } catch (IOException e) { e.printStackTrace(); } - } + } } - private static String createTempName(String fileName) { - return fileName.substring(0, fileName.lastIndexOf('.') + 1) + EXT; + private static void setTempName(String fileName) { + tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + EXT; } private int calculateConnects(int length) { @@ -141,68 +142,96 @@ private void changeName(String from, String to) { rename(from, downloadLocation + to); } + private boolean checkFinish(int links) { + + while (finishedCount != links) { + try { + + Thread.sleep(5000); + System.out.println("Unfinshed threads number: " + (links - finishedCount)); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + return true; + } + + private void freeDownloadThread() { + if (threadPool != null) { + for (int i = 0; i < threadPool.length; i++) { + if (threadPool[i] != null) + threadPool[i].close(); + } + } + } + + private long getCurrentTime() { + return System.currentTimeMillis(); + } + + public String getDownloadLocation() { + return downloadLocation; + } + + public DownloadListener getListener() { + return this.listener; + } + + private void printDownloadReport(int length, long start, long end) { + int time = (int) ((end - start) / 1000); + float speed = length / 1024 / 1024 / time; + System.out.println("鍏辫楁椂锛" + time + "s锛屼笅杞介熷害锛 " + speed + "Mb/s"); + } + public boolean rename(String from, String to) { System.out.println(from); System.out.println(to); File file = new File(from); if (file.exists()) { - file.renameTo(new File(to)); - System.out.println("rename success"); - return true; + return file.renameTo(new File(to)); } System.out.println("rename failed"); return false; } - private static void createTempFile(String dest, int len) { - File file = new File(dest); - if (file.exists()) { - System.out.println("tempfile already created"); - return; - } - FileOutputStream temp = null; - try { - temp = new FileOutputStream(dest); - int length = len; - byte[] buffer = new byte[1024]; - long times = length / 1024; - int left = (int) (length % 1024); - for (int i = 0; i < times; i++) { - temp.write(buffer); - } - temp.write(buffer, 0, left); - System.out.println("tempFile "+ dest + " created"); - - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - temp.flush(); - temp.flush(); - } catch (IOException e) { - e.printStackTrace(); + private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, int length) + throws ConnectionException { + int connectionNumbers = threadPool.length; + int batch_size = length / connectionNumbers; + int beginPos = 0; + int endPos = batch_size; + threadPool[0] = new DownloadThread(conn, beginPos, endPos); + setAndStartThread(threadPool[0], tempName); + for (int i = 1; i < connectionNumbers; i++) { + Connection con = cm.open(this.url); + beginPos = endPos + 1; + endPos = beginPos + batch_size; + if (i == connectionNumbers - 1) { + endPos = length - 1; } + threadPool[i] = new DownloadThread(con, beginPos, endPos); + setAndStartThread(threadPool[i], tempName); } } - - public void setListener(DownloadListener listener) { - this.listener = listener; + + private void setAndStartThread(DownloadThread downloadThread, String dest) { + downloadThread.setDest(dest); + downloadThread.setFileDownloader(this); + downloadThread.start(); } public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - public DownloadListener getListener() { - return this.listener; - } - - public String getDownloadLocation() { - return downloadLocation; + public void setFinished() { + finishedCount++; } - public void setDownloadLocation(String downloadLocation) { - this.downloadLocation = downloadLocation; + public void setListener(DownloadListener listener) { + this.listener = listener; } } diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index d83cf1b4e1..022b6945d2 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -20,7 +20,7 @@ public void tearDown() throws Exception { public static String url1 = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; public static String url2 = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; - public static String url3 = "http://dlsw.baidu.com/sw-search-sp/soft/de/26290/WPIconMaker_1.0.1398047889.exe"; + public static String url3 = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; @Test public void testDownload() { @@ -49,7 +49,7 @@ public void notifyFinished() { try { System.out.println("杩樻病鏈変笅杞藉畬鎴愶紝浼戠湢浜旂"); //浼戠湢5绉 - Thread.sleep(5000); + Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/group12/382266293/src/com/coderising/download/api/ConnectionManager.java b/group12/382266293/src/com/coderising/download/api/ConnectionManager.java index c732657bcb..17f1e544b1 100644 --- a/group12/382266293/src/com/coderising/download/api/ConnectionManager.java +++ b/group12/382266293/src/com/coderising/download/api/ConnectionManager.java @@ -7,7 +7,7 @@ public interface ConnectionManager { * @return */ - final int MAX_CONNECTION_SIZE = 10; + final int MAX_CONNECTION_SIZE = 100; public Connection open(String url) throws ConnectionException; } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index 7dae156533..f34abb3b05 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -44,11 +44,10 @@ public byte[] read(int startPos, int endPos) throws IOException { in.skip(startPos); byte[] buffer = new byte[endPos-startPos + 1]; int len = 0; - //byte[] b = new byte[1024]; - while((len = in.read(buffer)) != -1) { - out.write(buffer); + byte[] b = new byte[1024]; + while((len = in.read(b)) != -1) { + out.write(b, 0, len); } - System.out.println(out.toByteArray().length); return out.toByteArray(); } catch (IOException e) { e.printStackTrace(); diff --git a/group12/382266293/src/litestruts/Configuration.java b/group12/382266293/src/litestruts/Configuration.java new file mode 100644 index 0000000000..90eac0be64 --- /dev/null +++ b/group12/382266293/src/litestruts/Configuration.java @@ -0,0 +1,104 @@ +package litestruts; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; +import static util.Print.*; +public class Configuration { + + + ActionCfg actionCfg = new ActionCfg(); + + private static Configuration cfg = new Configuration(); + + private Configuration() { + + } + + public static Configuration getNewInstance() { + + if (cfg == null) { + cfg = new Configuration(); + } + return cfg; + } + + private String getFile(String fileName) { + + String src = this.getClass().getPackage().getName(); + return "file://" + src + "\\" + fileName + ".xml"; + } + + public void parseAction(String src) { + + String fileName = getFile(src); + SAXBuilder reader = new SAXBuilder(); + try { + Document doc = reader.build("C:\\struts.xml"); + Element root = doc.getRootElement(); + + for(Element element : root.getChildren("action")) { + + String name = element.getAttributeValue("name"); + String clz = element.getAttributeValue("class"); + actionCfg.actionInfo.put(name, clz); + + for(Element e : element.getChildren("result")) { + + String result = e.getAttributeValue("name"); + String jsp = e.getText().trim(); + println("result:" + result + "jsp:" + jsp); + Map res = new HashMap<>(); + res.put(result, jsp); + actionCfg.resultInfo.put(name, res); + } + } + + } catch (JDOMException | IOException e) { + e.printStackTrace(); + } + + } + + public static void main(String[] args) { + Configuration cfg = new Configuration(); + cfg.parseAction("struts"); + Map info = cfg.getActionInfo(); + Map result = cfg.getResultInfo(); + println(info); + println(result); + } + + + private static class ActionCfg { + + private Map actionInfo; + private Map> resultInfo; + public ActionCfg() { + this.actionInfo = new HashMap(); + this.resultInfo = new HashMap>(); + } + + } + + + public Map> getResultInfo() { + + return actionCfg.resultInfo; + } + + public Map getActionInfo() { + + return actionCfg.actionInfo; + } + + + + + +} diff --git a/group12/382266293/src/litestruts/ConfigurationTest.java b/group12/382266293/src/litestruts/ConfigurationTest.java new file mode 100644 index 0000000000..ac86e30695 --- /dev/null +++ b/group12/382266293/src/litestruts/ConfigurationTest.java @@ -0,0 +1,36 @@ +package litestruts; + +import static org.junit.Assert.*; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ConfigurationTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetGetterMethods() { + Configuration cfg = Configuration.getNewInstance(); + Map actionName = new HashMap<>(); + actionName.put("login","com.coderising.action.LoginAction"); + actionName.put("logout","com.coderising.action.LogoutAction"); + + //Assert.assertTrue(cfg.getActionName().containsKey(actionName)); + + + + } + +} From dd9a1b84a17aa87004a14e41bdf859f9bc5cbac2 Mon Sep 17 00:00:00 2001 From: felixCJF Date: Fri, 10 Mar 2017 08:51:36 +0800 Subject: [PATCH 085/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E8=A1=A5=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/litestruts/LoginAction.java | 43 ++++++++++ .../coderising/litestruts/Struts.java | 84 +++++++++++++++++++ .../coderising/litestruts/StrutsTest.java | 43 ++++++++++ .../coderising/litestruts/View.java | 23 +++++ .../coderising/litestruts/struts.xml | 11 +++ 5 files changed, 204 insertions(+) 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 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..b803afb24d --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/LoginAction.java @@ -0,0 +1,43 @@ +package com.github.FelixCJF.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 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; + } +} \ No newline at end of file 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..32852a36dd --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/Struts.java @@ -0,0 +1,84 @@ +package com.github.FelixCJF.coding2017.coderising.litestruts; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +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) { + + View view = new View(); + + try { + // 0. 璇诲彇閰嶇疆鏂囦欢struts.xml + //0.1灏唜ml鍔犺浇杩涘唴瀛樹腑 + SAXReader reader = new SAXReader(); + Document document = null; + try{ + document = reader.read("src/com/github/FelixCJF/coding2017/coderising/litestruts/struts.xml"); + }catch (Exception e) { + e.printStackTrace(); + } + //0.2璇诲彇鏍瑰厓绱 + Element rootElement = document.getRootElement(); + //0.3鏍规嵁鏍瑰厓绱犺幏鍙栧叾瀛愬厓绱 + List actionElements = rootElement.elements("action"); + for (int i = 0; i < actionElements.size(); i++) { + Element actionElement = actionElements.get(i); + if (actionName.equals(actionElement.attributeValue("name"))) { + // 1. 鏍规嵁actionName鎵惧埌鐩稿搴旂殑class 锛 渚嬪LoginAction, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + String className = actionElement.attributeValue("class"); + Class clazz = Class.forName(className); + Object object = clazz.newInstance(); + // 鎹畃arameters涓殑鏁版嵁锛岃皟鐢ㄥ璞$殑setter鏂规硶锛 渚嬪parameters涓殑鏁版嵁鏄 + // ("name"="test" , "password"="1234") , + // 閭e氨搴旇璋冪敤 setName鍜宻etPassword鏂规硶 + for (Map.Entry entry : parameters.entrySet()) { + PropertyDescriptor descriptor = new PropertyDescriptor(entry.getKey(), clazz); + Method method = descriptor.getWriteMethod(); + method.invoke(object, entry.getValue()); + } + // 2. 閫氳繃鍙嶅皠璋冪敤瀵硅薄鐨別xectue 鏂规硶锛 骞惰幏寰楄繑鍥炲硷紝渚嬪"success" + Method execute = clazz.getMethod("execute"); + String result = (String) execute.invoke(object); + // 3. 閫氳繃鍙嶅皠鎵惧埌瀵硅薄鐨勬墍鏈塯etter鏂规硶锛堜緥濡 getMessage锛, + // 閫氳繃鍙嶅皠鏉ヨ皟鐢紝 鎶婂煎拰灞炴у舰鎴愪竴涓狧ashMap , 渚嬪 {"message": "鐧诲綍鎴愬姛"} , + Field[] fields = clazz.getDeclaredFields(); + HashMap map = new HashMap<>(); + 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瀵硅薄鐨刾arameters + view.setParameters(map); + // 4. 鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲硷紝 纭畾鍝竴涓猨sp锛 + // 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 + List resultElements = actionElement.elements("result"); + for (int j = 0; j < resultElements.size(); j++) { + Element resultElement = resultElements.get(j); + if (result.equals(resultElement.attributeValue("name"))) { + view.setJsp(resultElement.getText()); + return view; + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} \ No newline at end of file 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..1157313180 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.github.FelixCJF.coding2017.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/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..6d74cb6843 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.github.FelixCJF.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; + } +} \ No newline at end of file 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..8a5fe95942 --- /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 From 0a0e7aeed25eea941c9ae3e741f23deac702e38b Mon Sep 17 00:00:00 2001 From: "2474600377@qq.com" <2474600377@qq.com> Date: Fri, 10 Mar 2017 11:34:44 +0800 Subject: [PATCH 086/177] Merge remote-tracking branch 'origin/master' # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit. --- .../org.eclipse.core.resources.prefs | 2 ++ .../src/com/coding/array/ArrayUtil.java | 31 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 group10/904627477/.settings/org.eclipse.core.resources.prefs diff --git a/group10/904627477/.settings/org.eclipse.core.resources.prefs b/group10/904627477/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group10/904627477/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group10/904627477/src/com/coding/array/ArrayUtil.java b/group10/904627477/src/com/coding/array/ArrayUtil.java index 37f230812a..dc3a7a7254 100644 --- a/group10/904627477/src/com/coding/array/ArrayUtil.java +++ b/group10/904627477/src/com/coding/array/ArrayUtil.java @@ -10,6 +10,9 @@ public class ArrayUtil { * @return */ public void reverseArray(int[] origin){ + if(origin==null){ + return ; + } int len = origin.length; for (int i = 0; i < len/2 ; i++) { int temp = origin[len-1-i]; @@ -27,6 +30,9 @@ public void reverseArray(int[] origin){ */ public int[] removeZero(int[] oldArray){ + if(oldArray==null){ + return new int[0]; + } int[] tempArr = new int[oldArray.length]; int size = 0; for (int i = 0; i < oldArray.length; i++) { @@ -49,6 +55,11 @@ public int[] removeZero(int[] oldArray){ */ public int[] merge(int[] array1, int[] array2){ + if(array1==null&&array2==null){ + return new int[0]; + }else if(array1==null||array2==null){ + return array1==null?array2:array1; + } int[] arr3 = new int[array1.length+array2.length]; int len1 = array1.length; int len2 = array2.length; @@ -85,6 +96,9 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ + if(oldArray==null){ + return new int[0]; + } if(size<0){ throw new IllegalArgumentException(); } @@ -202,13 +216,28 @@ public boolean isPerfectNumber(int n){ * @param s * @return */ - public String join(int[] array, String seperator){ + /*My + 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); + }*/ + + public String join(int[] array, String seperator){ + if(array==null){ + return ""; + } + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if(i Date: Fri, 10 Mar 2017 11:37:42 +0800 Subject: [PATCH 087/177] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../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/test/ArrayListTest.java | 4 +- .../src/com/coding/test/LinkedListTest.java | 4 +- .../src/com/coding/test/QueueTest.java | 3 +- .../src/com/coding/test/StackTest.java | 3 +- .../904627477/src/com/coding/test/Test.java | 27 +-- 12 files changed, 18 insertions(+), 417 deletions(-) delete mode 100644 group10/904627477/src/com/coding/ArrayList.java delete mode 100644 group10/904627477/src/com/coding/BinaryTreeNode.java delete mode 100644 group10/904627477/src/com/coding/Iterator.java delete mode 100644 group10/904627477/src/com/coding/LinkedList.java delete mode 100644 group10/904627477/src/com/coding/List.java delete mode 100644 group10/904627477/src/com/coding/Queue.java delete mode 100644 group10/904627477/src/com/coding/Stack.java diff --git a/group10/904627477/src/com/coding/ArrayList.java b/group10/904627477/src/com/coding/ArrayList.java deleted file mode 100644 index 3053e54114..0000000000 --- a/group10/904627477/src/com/coding/ArrayList.java +++ /dev/null @@ -1,107 +0,0 @@ -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 deleted file mode 100644 index fe50e3d1ae..0000000000 --- a/group10/904627477/src/com/coding/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index d2c1b79572..0000000000 --- a/group10/904627477/src/com/coding/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index f878f75820..0000000000 --- a/group10/904627477/src/com/coding/LinkedList.java +++ /dev/null @@ -1,175 +0,0 @@ -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 deleted file mode 100644 index 5e78eced11..0000000000 --- a/group10/904627477/src/com/coding/List.java +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 8fd01bef96..0000000000 --- a/group10/904627477/src/com/coding/Queue.java +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index 3f8b319607..0000000000 --- a/group10/904627477/src/com/coding/Stack.java +++ /dev/null @@ -1,36 +0,0 @@ -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/test/ArrayListTest.java b/group10/904627477/src/com/coding/test/ArrayListTest.java index d65a692351..fc711a315a 100644 --- a/group10/904627477/src/com/coding/test/ArrayListTest.java +++ b/group10/904627477/src/com/coding/test/ArrayListTest.java @@ -6,8 +6,8 @@ import org.junit.Before; import org.junit.Test; -import com.coding.ArrayList; -import com.coding.Iterator; +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; public class ArrayListTest { diff --git a/group10/904627477/src/com/coding/test/LinkedListTest.java b/group10/904627477/src/com/coding/test/LinkedListTest.java index af48a6fb0b..174fdeb583 100644 --- a/group10/904627477/src/com/coding/test/LinkedListTest.java +++ b/group10/904627477/src/com/coding/test/LinkedListTest.java @@ -6,8 +6,8 @@ import org.junit.Before; import org.junit.Test; -import com.coding.Iterator; -import com.coding.LinkedList; +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; public class LinkedListTest { diff --git a/group10/904627477/src/com/coding/test/QueueTest.java b/group10/904627477/src/com/coding/test/QueueTest.java index 779120c0fb..5434522f14 100644 --- a/group10/904627477/src/com/coding/test/QueueTest.java +++ b/group10/904627477/src/com/coding/test/QueueTest.java @@ -6,7 +6,8 @@ import org.junit.Before; import org.junit.Test; -import com.coding.Queue; +import com.coding.basic.Queue; + public class QueueTest { diff --git a/group10/904627477/src/com/coding/test/StackTest.java b/group10/904627477/src/com/coding/test/StackTest.java index 38de36c9d9..ec96c6adcb 100644 --- a/group10/904627477/src/com/coding/test/StackTest.java +++ b/group10/904627477/src/com/coding/test/StackTest.java @@ -6,7 +6,8 @@ import org.junit.Before; import org.junit.Test; -import com.coding.Stack; +import com.coding.basic.Stack; + public class StackTest { diff --git a/group10/904627477/src/com/coding/test/Test.java b/group10/904627477/src/com/coding/test/Test.java index c8024a8c97..475c213362 100644 --- a/group10/904627477/src/com/coding/test/Test.java +++ b/group10/904627477/src/com/coding/test/Test.java @@ -1,5 +1,7 @@ package com.coding.test; +import com.coding.basic.LinkedList; + @@ -7,23 +9,14 @@ 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()); + LinkedList link = new LinkedList(); + link.add("aaa"); + link.add("bbb"); + link.add("ccc"); + link.reverse(); + System.out.println(link.get(0)); + System.out.println(link.get(1)); + System.out.println(link.get(2)); } } From b33ac60b8672c9999bc03f428ffeb1b031138072 Mon Sep 17 00:00:00 2001 From: "2474600377@qq.com" <2474600377@qq.com> Date: Fri, 10 Mar 2017 11:39:08 +0800 Subject: [PATCH 088/177] Signed-off-by: 2474600377@qq.com <2474600377@qq.com> --- .../src/com/coding/basic/ArrayList.java | 107 +++++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 266 ++++++++++++++++++ .../904627477/src/com/coding/basic/List.java | 9 + .../904627477/src/com/coding/basic/Queue.java | 28 ++ .../904627477/src/com/coding/basic/Stack.java | 36 +++ .../com/coding/download/DownloadThread.java | 21 ++ .../com/coding/download/FileDownloader.java | 75 +++++ .../coding/download/FileDownloaderTest.java | 60 ++++ .../com/coding/download/api/Connection.java | 23 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../coding/download/api/DownloadListener.java | 5 + .../coding/download/impl/ConnectionImpl.java | 28 ++ .../download/impl/ConnectionManagerImpl.java | 15 + 16 files changed, 727 insertions(+) create mode 100644 group10/904627477/src/com/coding/basic/ArrayList.java create mode 100644 group10/904627477/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group10/904627477/src/com/coding/basic/Iterator.java create mode 100644 group10/904627477/src/com/coding/basic/LinkedList.java create mode 100644 group10/904627477/src/com/coding/basic/List.java create mode 100644 group10/904627477/src/com/coding/basic/Queue.java create mode 100644 group10/904627477/src/com/coding/basic/Stack.java create mode 100644 group10/904627477/src/com/coding/download/DownloadThread.java create mode 100644 group10/904627477/src/com/coding/download/FileDownloader.java create mode 100644 group10/904627477/src/com/coding/download/FileDownloaderTest.java create mode 100644 group10/904627477/src/com/coding/download/api/Connection.java create mode 100644 group10/904627477/src/com/coding/download/api/ConnectionException.java create mode 100644 group10/904627477/src/com/coding/download/api/ConnectionManager.java create mode 100644 group10/904627477/src/com/coding/download/api/DownloadListener.java create mode 100644 group10/904627477/src/com/coding/download/impl/ConnectionImpl.java create mode 100644 group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java diff --git a/group10/904627477/src/com/coding/basic/ArrayList.java b/group10/904627477/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..515d3f6030 --- /dev/null +++ b/group10/904627477/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[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/basic/BinaryTreeNode.java b/group10/904627477/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group10/904627477/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/group10/904627477/src/com/coding/basic/Iterator.java b/group10/904627477/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group10/904627477/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/904627477/src/com/coding/basic/LinkedList.java b/group10/904627477/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..5758a12d8c --- /dev/null +++ b/group10/904627477/src/com/coding/basic/LinkedList.java @@ -0,0 +1,266 @@ +package com.coding.basic; + +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; + } + } + + } + + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + if(head==null||head.next==null){ + return ; + } + Node temp = head.next; + Node newHead = this.head; + newHead.next = null; + while(temp!=null){ + Node next = temp.next; + temp.next = newHead; + newHead = temp; + temp = next; + } + this.head = newHead; + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 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){ + + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭istB鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺listB鎵鎸囧畾鐨勫厓绱 + * 渚嬪褰撳墠閾捐〃 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪listB涓嚭鐜扮殑鍏冪礌 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group10/904627477/src/com/coding/basic/List.java b/group10/904627477/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group10/904627477/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/904627477/src/com/coding/basic/Queue.java b/group10/904627477/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..e54df70c96 --- /dev/null +++ b/group10/904627477/src/com/coding/basic/Queue.java @@ -0,0 +1,28 @@ +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){ + 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/basic/Stack.java b/group10/904627477/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..fc06fb3ce8 --- /dev/null +++ b/group10/904627477/src/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(); + + 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/download/DownloadThread.java b/group10/904627477/src/com/coding/download/DownloadThread.java new file mode 100644 index 0000000000..525080110a --- /dev/null +++ b/group10/904627477/src/com/coding/download/DownloadThread.java @@ -0,0 +1,21 @@ +package com.coding.download; + +import com.coding.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/group10/904627477/src/com/coding/download/FileDownloader.java b/group10/904627477/src/com/coding/download/FileDownloader.java new file mode 100644 index 0000000000..d165f6ee18 --- /dev/null +++ b/group10/904627477/src/com/coding/download/FileDownloader.java @@ -0,0 +1,75 @@ +package com.coding.download; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; + + + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group10/904627477/src/com/coding/download/FileDownloaderTest.java b/group10/904627477/src/com/coding/download/FileDownloaderTest.java new file mode 100644 index 0000000000..f6d871a126 --- /dev/null +++ b/group10/904627477/src/com/coding/download/FileDownloaderTest.java @@ -0,0 +1,60 @@ +package com.coding.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; +import com.coding.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/group10/904627477/src/com/coding/download/api/Connection.java b/group10/904627477/src/com/coding/download/api/Connection.java new file mode 100644 index 0000000000..65f3dae9c5 --- /dev/null +++ b/group10/904627477/src/com/coding/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coding.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/group10/904627477/src/com/coding/download/api/ConnectionException.java b/group10/904627477/src/com/coding/download/api/ConnectionException.java new file mode 100644 index 0000000000..1db8b093ec --- /dev/null +++ b/group10/904627477/src/com/coding/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coding.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group10/904627477/src/com/coding/download/api/ConnectionManager.java b/group10/904627477/src/com/coding/download/api/ConnectionManager.java new file mode 100644 index 0000000000..1d1a83caf2 --- /dev/null +++ b/group10/904627477/src/com/coding/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coding.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group10/904627477/src/com/coding/download/api/DownloadListener.java b/group10/904627477/src/com/coding/download/api/DownloadListener.java new file mode 100644 index 0000000000..c41045b0e8 --- /dev/null +++ b/group10/904627477/src/com/coding/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coding.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java b/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..0b5f61fdda --- /dev/null +++ b/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java @@ -0,0 +1,28 @@ +package com.coding.download.impl; + +import java.io.IOException; + +import com.coding.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/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java b/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..15dc2f0b07 --- /dev/null +++ b/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coding.download.impl; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} From d4c6bf674f0dca65f6a4401ebe44f8c1c08feff7 Mon Sep 17 00:00:00 2001 From: Korben_CHY Date: Fri, 10 Mar 2017 14:51:56 +0800 Subject: [PATCH 089/177] implement FileDownloader by Korben --- .../coderising/download/DownloadThread.java | 79 ++++++++++++++++ .../coderising/download/FileDownloader.java | 81 ++++++++++++++++ .../download/FileDownloaderTest.java | 54 +++++++++++ .../coderising/download/api/Connection.java | 33 +++++++ .../download/api/ConnectionException.java | 11 +++ .../download/api/ConnectionManager.java | 21 +++++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 93 +++++++++++++++++++ .../download/impl/ConnectionManagerImpl.java | 60 ++++++++++++ 9 files changed, 437 insertions(+) create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/DownloadThread.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloader.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloaderTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/Connection.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionException.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionManager.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/DownloadListener.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionImpl.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/DownloadThread.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..52a5fd20a9 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/DownloadThread.java @@ -0,0 +1,79 @@ +package org.korben.coderising.download; + +import java.io.IOException; +import java.io.RandomAccessFile; +import org.korben.coderising.download.api.Connection; +import org.korben.coderising.download.api.ConnectionException; +import org.korben.coderising.download.api.ConnectionManager; +import org.korben.coderising.download.api.DownloadListener; + +public class DownloadThread extends Thread { + + private int endPos; + private int startPos; + private String url; + private String destFilePath; + private ConnectionManager connManager; + private DownloadListener downloadListener; + + public DownloadThread(ConnectionManager connManager, String url, int startPos, int endPos, String destFilePath, + DownloadListener downloadListener) { + + this.url = url; + this.endPos = endPos; + this.startPos = startPos; + this.connManager = connManager; + this.destFilePath = destFilePath; + this.downloadListener = downloadListener; + } + + @Override + public void run() { + Connection conn = null; + RandomAccessFile randomAccessFile = null; + try { + doLog("BIN"); + conn = connManager.open(url, startPos, endPos); + byte[] read = conn.read(startPos, endPos); + String _filePath = destFilePath; + if (_filePath == null || _filePath.length() == 0) { + _filePath = conn.getFileName(); + } + randomAccessFile = new RandomAccessFile(_filePath, "rw"); + randomAccessFile.seek(startPos); + randomAccessFile.write(read); + doLog("END"); + } catch (IOException e) { + doLog("EXP"); + e.printStackTrace(); + } catch (ConnectionException e) { + doLog("EXP"); + e.printStackTrace(); + } finally { + if (randomAccessFile != null) { + try { + randomAccessFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (conn != null) { + conn.close(); + } + if (downloadListener != null) { + downloadListener.notifyFinished(); + } + } + } + + private void doLog(String action) { + System.out.println( + "*********** " + action + + " [" + + startPos + + "-" + + endPos + + "]" + + " ***********"); + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloader.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..43fde0b69e --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloader.java @@ -0,0 +1,81 @@ +package org.korben.coderising.download; + +import java.util.concurrent.atomic.AtomicInteger; +import org.korben.coderising.download.api.ConnectionException; +import org.korben.coderising.download.api.ConnectionManager; +import org.korben.coderising.download.api.DownloadListener; + +public class FileDownloader { + + private String url; + + private DownloadListener listener; + + private ConnectionManager cm; + + private AtomicInteger atomicInteger; + + public FileDownloader(String _url) { + this.url = _url; + atomicInteger = new AtomicInteger(); + } + + /** + * 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + * 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + * (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + * (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + * 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + * 鍏蜂綋鐨勫疄鐜版濊矾锛 + * 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + * 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + * 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + * 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + * 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + * + * 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + */ + public void execute() { + try { + + int threadCount = 5; + int length = this.cm.getContentLength(this.url); + for (int i = 0; i < threadCount; i++) { + + int threadLoadLength = length / threadCount; + int startPos = threadLoadLength * i; + int endPos; + if (i != threadCount - 1) { + endPos = threadLoadLength * (i + 1) - 1; + } else { + endPos = length - 1; + } + atomicInteger.getAndIncrement(); + new DownloadThread(cm, this.url, startPos, endPos, null, new DownloadListener() { + @Override + public void notifyFinished() { + if (atomicInteger.decrementAndGet() == 0) { + if (FileDownloader.this.listener != null) { + FileDownloader.this.listener.notifyFinished(); + } + } + } + }).start(); + } + } catch (ConnectionException e) { + e.printStackTrace(); + } + } + + public void setConnectionManager(ConnectionManager ucm) { + this.cm = ucm; + } + + public DownloadListener getListener() { + return this.listener; + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloaderTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..53b6b6e45e --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/FileDownloaderTest.java @@ -0,0 +1,54 @@ +package org.korben.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.korben.coderising.download.api.ConnectionManager; +import org.korben.coderising.download.api.DownloadListener; +import org.korben.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=1489721424&di=1fda6467501ab1d5e5bff43e801d14ee&imgtype=jpg&er=1&src=http%3A%2F%2Fimg4.duitang.com%2Fuploads%2Fitem%2F201507%2F30%2F20150730163204_A24MX.thumb.700_0.jpeg"; + //String url = "http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz"; + + 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("涓嬭浇瀹屾垚锛"); + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/Connection.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/Connection.java new file mode 100644 index 0000000000..6f58852d56 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/Connection.java @@ -0,0 +1,33 @@ +package org.korben.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(); + + /** + * 鑾峰彇涓嬭浇鏂囦欢鐨勬枃浠跺悕 + * + * @return 鏂囦欢鍚 + */ + String getFileName(); +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionException.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..d74b432783 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionException.java @@ -0,0 +1,11 @@ +package org.korben.coderising.download.api; + +public class ConnectionException extends Exception { + public ConnectionException(Exception e) { + super(e); + } + + public ConnectionException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionManager.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..5e0d4afe3f --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/ConnectionManager.java @@ -0,0 +1,21 @@ +package org.korben.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * + * @param url 杩炴帴鍦板潃 + * @param startPos 璇诲彇鏂囦欢鐨勮捣濮嬩綅缃 + * @param endPos 璇诲彇鏂囦欢鐨勭粨鏉熶綅缃 + * @return 杩炴帴 + */ + Connection open(String url, int startPos, int endPos) throws ConnectionException; + + /** + * 鑾峰彇鏂囦欢闀垮害 + * + * @param url 杩炴帴鍦板潃 + * @return 鏂囦欢闀垮害 + */ + int getContentLength(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/DownloadListener.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..e2685665b7 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package org.korben.coderising.download.api; + +public interface DownloadListener { + void notifyFinished(); +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionImpl.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..cce16fafbe --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,93 @@ +package org.korben.coderising.download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import org.korben.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection { + + private static final int BUFFER_SIZE = 4096; + private HttpURLConnection httpConn; + private String fileUrl; + private InputStream inputStream; + + public ConnectionImpl(HttpURLConnection httpConn, String fileUrl) { + this.httpConn = httpConn; + this.fileUrl = fileUrl; + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + if (endPos < startPos) { + throw new IllegalArgumentException("argument endPos[" + endPos + "] less than startPos[" + startPos + "]"); + } + int bytesNeed2Read = endPos - startPos + 1; + if (bytesNeed2Read > getContentLength()) { + throw new IllegalArgumentException( + "endPos[" + endPos + "] is bigger than content length[" + getContentLength() + "]"); + } + + inputStream = httpConn.getInputStream(); + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[Math.min(bytesNeed2Read, BUFFER_SIZE)]; + int read; + + long startTime = System.currentTimeMillis(); + final long progressInterval = 2000; + while ((read = inputStream.read(buffer)) != -1) { + byteArrayOutputStream.write(buffer, 0, read); + + if (System.currentTimeMillis() - startTime > progressInterval) { + startTime = System.currentTimeMillis(); + System.out.println(String.format(Thread.currentThread().getName() + + " [%.2f%%]", byteArrayOutputStream.size() * 100.0 / bytesNeed2Read) + ); + } + } + System.out.println(String.format(Thread.currentThread().getName() + " [%.2f%%]", 100.0)); + System.out.println("bytes read: " + byteArrayOutputStream.size()); + + return byteArrayOutputStream.toByteArray(); + } + + @Override + public int getContentLength() { + if (httpConn != null) { + return httpConn.getContentLength(); + } + return 0; + } + + @Override + public void close() { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (httpConn != null) { + httpConn.disconnect(); + } + } + + @Override + public String getFileName() { + String disposition = httpConn.getHeaderField("Content-Disposition"); + if (disposition != null) { + // extracts file name from header field + int index = disposition.indexOf("filename="); + if (index > 0) { + return disposition.substring(index + 10, + disposition.length() - 1); + } + } + // extracts file name from URL + return fileUrl.substring(fileUrl.lastIndexOf("/") + 1, + fileUrl.length()); + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionManagerImpl.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..16d8df8f7c --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,60 @@ +package org.korben.coderising.download.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import org.korben.coderising.download.api.Connection; +import org.korben.coderising.download.api.ConnectionException; +import org.korben.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String fileURL, int startPos, int endPos) throws ConnectionException { + try { + System.out.println("try to open file url: " + fileURL); + + URL url = new URL(fileURL); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + + // 璁惧畾璇诲彇range + httpConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + System.out.println("Range: bytes=" + startPos + "-" + endPos); + + int responseCode = httpConn.getResponseCode(); + + System.out.println("server replied HTTP code: " + responseCode); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_PARTIAL) { + System.out.println("return new ConnectionImpl"); + return new ConnectionImpl(httpConn, fileURL); + } else { + throw new ConnectionException("server replied HTTP code: " + responseCode); + } + } catch (IOException e) { + throw new ConnectionException(e); + } + } + + @Override + public int getContentLength(String fileURL) throws ConnectionException { + try { + System.out.println("try to open file url: " + fileURL); + + URL url = new URL(fileURL); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + int responseCode = httpConn.getResponseCode(); + + System.out.println("server replied HTTP code: " + responseCode); + if (responseCode == HttpURLConnection.HTTP_OK) { + System.out.println("return contentLength: " + httpConn.getContentLength()); + int contentLength = httpConn.getContentLength(); + httpConn.disconnect(); + return contentLength; + } else { + throw new ConnectionException("server replied HTTP code: " + responseCode); + } + } catch (IOException e) { + throw new ConnectionException(e); + } + } +} \ No newline at end of file From 4f9682a6c00fd76663bb9b17fe081991514b2171 Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 10 Mar 2017 00:32:36 -0800 Subject: [PATCH 090/177] Homework 3rd --- .../coderising/download/DownloadThread.java | 9 ++++- .../coderising/download/FileDownloader.java | 28 ++++++++++----- .../download/FileDownloaderTest.java | 12 ++++--- .../coderising/download/api/Connection.java | 10 +++--- .../download/api/ConnectionException.java | 2 +- .../download/api/ConnectionManager.java | 9 ++--- .../download/api/DownloadListener.java | 2 +- .../download/impl/ConnectionImpl.java | 36 ++++++++++++++----- .../download/impl/ConnectionManagerImpl.java | 19 ++-------- .../download/utils/FileDownloadUtil.java | 20 +++++++++++ 10 files changed, 93 insertions(+), 54 deletions(-) create mode 100644 group20/404130810/src/com/coderising/download/utils/FileDownloadUtil.java diff --git a/group20/404130810/src/com/coderising/download/DownloadThread.java b/group20/404130810/src/com/coderising/download/DownloadThread.java index d71540b497..1bbba90c30 100644 --- a/group20/404130810/src/com/coderising/download/DownloadThread.java +++ b/group20/404130810/src/com/coderising/download/DownloadThread.java @@ -1,5 +1,7 @@ package com.coderising.download; +import java.io.IOException; + import com.coderising.download.api.Connection; public class DownloadThread extends Thread{ @@ -15,6 +17,11 @@ public DownloadThread( Connection conn, int startPos, int endPos){ this.endPos = endPos; } public void run(){ - + try { + conn.read(startPos, endPos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/FileDownloader.java b/group20/404130810/src/com/coderising/download/FileDownloader.java index 3a4bcd8d9e..5193eaba99 100644 --- a/group20/404130810/src/com/coderising/download/FileDownloader.java +++ b/group20/404130810/src/com/coderising/download/FileDownloader.java @@ -1,13 +1,17 @@ package com.coderising.download; +import java.io.IOException; + 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 com.coderising.download.impl.ConnectionManagerImpl; +import com.coderising.download.utils.FileDownloadUtil; public class FileDownloader { - String url; + String url = "http://localhost:8080/MyServer/test.exe"; DownloadListener listener; @@ -15,10 +19,10 @@ public class FileDownloader { public FileDownloader(String _url) { this.url = _url; - + cm = new ConnectionManagerImpl(); } - public void execute() { + public void execute() throws IOException { // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, @@ -36,12 +40,16 @@ public void execute() { // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 Connection conn = null; try { - - conn = cm.open(this.url); - + conn = cm.open(url); int length = conn.getContentLength(); - - new DownloadThread(conn, 0, length - 1).start(); + int[] posArr = FileDownloadUtil.generateDownloadPosArr(length); + for (int i = 0; i < posArr.length; i++) { + if(i == posArr.length - 1){ + new DownloadThread(cm.open(url), posArr[i], length).start(); + }else{ + new DownloadThread(cm.open(url), posArr[i], posArr[i + 1] - 1).start(); + } + } } catch (ConnectionException e) { e.printStackTrace(); @@ -65,4 +73,8 @@ public DownloadListener getListener() { return this.listener; } + public static void main(String[] args) throws IOException { + new FileDownloader("http://localhost:8080/MyServer/Test.mp3").execute(); + } + } \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/FileDownloaderTest.java b/group20/404130810/src/com/coderising/download/FileDownloaderTest.java index 4a781d87c3..46444c9710 100644 --- a/group20/404130810/src/com/coderising/download/FileDownloaderTest.java +++ b/group20/404130810/src/com/coderising/download/FileDownloaderTest.java @@ -1,5 +1,7 @@ package com.coderising.download; +import java.io.IOException; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -19,7 +21,7 @@ public void tearDown() throws Exception { } @Test - public void testDownload() { + public void testDownload() throws IOException { String url = "http://localhost:8080/test.jpg"; @@ -40,17 +42,17 @@ public void notifyFinished() { downloader.execute(); - // 等待多线程下载程序执行完毕 + // 绛夊緟澶氱嚎绋嬩笅杞界▼搴忔墽琛屽畬姣 while (!downloadFinished) { try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 + System.out.println("杩樻病鏈変笅杞藉畬鎴愶紝浼戠湢浜旂"); + //浼戠湢5绉 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } - System.out.println("下载完成!"); + System.out.println("涓嬭浇瀹屾垚锛"); diff --git a/group20/404130810/src/com/coderising/download/api/Connection.java b/group20/404130810/src/com/coderising/download/api/Connection.java index 911ee46891..249da5d667 100644 --- a/group20/404130810/src/com/coderising/download/api/Connection.java +++ b/group20/404130810/src/com/coderising/download/api/Connection.java @@ -4,20 +4,20 @@ public interface Connection { /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 + * 缁欏畾寮濮嬪拰缁撴潫浣嶇疆锛 璇诲彇鏁版嵁锛 杩斿洖鍊兼槸瀛楄妭鏁扮粍 + * @param startPos 寮濮嬩綅缃紝 浠0寮濮 + * @param endPos 缁撴潫浣嶇疆 * @return */ public byte[] read(int startPos,int endPos) throws IOException; /** - * 得到数据内容的长度 + * 寰楀埌鏁版嵁鍐呭鐨勯暱搴 * @return */ public int getContentLength(); /** - * 关闭连接 + * 鍏抽棴杩炴帴 */ public void close(); } \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/api/ConnectionException.java b/group20/404130810/src/com/coderising/download/api/ConnectionException.java index 7e13414c73..8dbfe95dda 100644 --- a/group20/404130810/src/com/coderising/download/api/ConnectionException.java +++ b/group20/404130810/src/com/coderising/download/api/ConnectionException.java @@ -2,4 +2,4 @@ public class ConnectionException extends Exception { -} \ No newline at end of file +} diff --git a/group20/404130810/src/com/coderising/download/api/ConnectionManager.java b/group20/404130810/src/com/coderising/download/api/ConnectionManager.java index e274234679..aba5b931e4 100644 --- a/group20/404130810/src/com/coderising/download/api/ConnectionManager.java +++ b/group20/404130810/src/com/coderising/download/api/ConnectionManager.java @@ -1,10 +1,5 @@ package com.coderising.download.api; public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} \ No newline at end of file + public Connection open(String url) throws ConnectionException; +} diff --git a/group20/404130810/src/com/coderising/download/api/DownloadListener.java b/group20/404130810/src/com/coderising/download/api/DownloadListener.java index a6589e52f5..4cd0b3eab1 100644 --- a/group20/404130810/src/com/coderising/download/api/DownloadListener.java +++ b/group20/404130810/src/com/coderising/download/api/DownloadListener.java @@ -2,4 +2,4 @@ public interface DownloadListener { public void notifyFinished(); -} \ No newline at end of file +} diff --git a/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java b/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java index 0c62ee1711..33f693bc96 100644 --- a/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,31 +1,49 @@ package com.coderising.download.impl; import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.net.HttpURLConnection; +import java.net.URL; import com.coderising.download.api.Connection; -public class ConnectionImpl implements Connection{ +public class ConnectionImpl implements Connection { - private byte[] fileContent; + private HttpURLConnection httpConn; + + public ConnectionImpl(String urlStr) { + URL url; + try { + url = new URL(urlStr); + httpConn = (HttpURLConnection) url.openConnection(); + } catch (IOException e) { + e.printStackTrace(); + } + } @Override public byte[] read(int startPos, int endPos) throws IOException { + int length = endPos - startPos; + byte[] rtnByte = new byte[length]; - return null; + RandomAccessFile raf = new RandomAccessFile("test.mp3", "rw"); + raf.seek(startPos); + InputStream is = httpConn.getInputStream(); + while ((length = is.read(rtnByte)) != -1) { + raf.write(rtnByte, 0, length); + } + return rtnByte; } @Override public int getContentLength() { - return fileContent.length; + return httpConn.getContentLength(); } @Override public void close() { - - } - - public void setFileContent(byte[] fileContent) { - this.fileContent = fileContent; + httpConn.disconnect(); } } \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java index b92d7d6c8f..9b9a93a9ea 100644 --- a/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group20/404130810/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -1,28 +1,13 @@ package com.coderising.download.impl; -import java.io.IOException; -import java.net.HttpURLConnection; -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 urlStr) throws ConnectionException { - URL url; - try { - url = new URL(urlStr); - HttpURLConnection conn = (HttpURLConnection)url.openConnection(); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; + Connection conn = new ConnectionImpl(urlStr); + return conn; } - } \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/utils/FileDownloadUtil.java b/group20/404130810/src/com/coderising/download/utils/FileDownloadUtil.java new file mode 100644 index 0000000000..3f8d727d59 --- /dev/null +++ b/group20/404130810/src/com/coderising/download/utils/FileDownloadUtil.java @@ -0,0 +1,20 @@ +package com.coderising.download.utils; + +public class FileDownloadUtil { + + public static int[] generateDownloadPosArr(int length){ + int[] posArr = new int[3]; + int firstPos = length/3; + int secondPos = length/3 * 2; + + posArr[0] = 0; + posArr[1] = firstPos; + posArr[2] = secondPos; + + return posArr; + } + public static void main(String[] args) { + FileDownloadUtil.generateDownloadPosArr(1000); + } + +} From 0c25128fb487b3fdaae904b504f724dc03b39dda Mon Sep 17 00:00:00 2001 From: "2474600377@qq.com" <2474600377@qq.com> Date: Fri, 10 Mar 2017 19:35:22 +0800 Subject: [PATCH 091/177] =?UTF-8?q?linked=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/LinkedList.java | 673 +++++++++++------- .../src/com/coding/test/LinkedListTest.java | 147 ++++ .../904627477/src/com/coding/test/Test.java | 2 +- 3 files changed, 555 insertions(+), 267 deletions(-) diff --git a/group10/904627477/src/com/coding/basic/LinkedList.java b/group10/904627477/src/com/coding/basic/LinkedList.java index 5758a12d8c..9cef8d05b7 100644 --- a/group10/904627477/src/com/coding/basic/LinkedList.java +++ b/group10/904627477/src/com/coding/basic/LinkedList.java @@ -1,266 +1,407 @@ -package com.coding.basic; - -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; - } - } - - } - - - /** - * 鎶婅閾捐〃閫嗙疆 - * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 - */ - public void reverse(){ - if(head==null||head.next==null){ - return ; - } - Node temp = head.next; - Node newHead = this.head; - newHead.next = null; - while(temp!=null){ - Node next = temp.next; - temp.next = newHead; - newHead = temp; - temp = next; - } - this.head = newHead; - } - - /** - * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 - * 渚嬪锛歭ist = 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){ - - } - /** - * 鍋囧畾褰撳墠閾捐〃鍜宭istB鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 - * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺listB鎵鎸囧畾鐨勫厓绱 - * 渚嬪褰撳墠閾捐〃 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 - * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪listB涓嚭鐜扮殑鍏冪礌 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 - * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 - */ - public void removeDuplicateValues(){ - - } - - /** - * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 - * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 - * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} +package com.coding.basic; + +import java.util.NoSuchElementException; + +import com.coding.array.ArrayUtil; + +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; + } + } + + } + + /** + * 鎶婅閾捐〃閫嗙疆 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse() { + if (head == null || head.next == null) { + return; + } + Node temp = head.next; + Node newHead = this.head; + newHead.next = null; + while (temp != null) { + Node next = temp.next; + temp.next = newHead; + newHead = temp; + temp = next; + } + this.head = newHead; + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 濡傛灉list = 2->5->7->8->10 + * ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf() { + if (head == null || head.next == null) { + return; + } + int len = size(); + for (int i = 0; i < len / 2; i++) { + head = head.next; + } + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + if (i < 0 || i >= size()) { + throw new IndexOutOfBoundsException(); + } + if(head==null){ + return; + } + Node ni = head; + Node temp = head; + for (int j = 0; j < i + length; j++) { + if (temp == null) { + break; + } + if (j + 1 == i) { + ni = temp; + } + temp = temp.next; + } + ni.next = temp; + if (i == 0) { + head = temp; + } + } + + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭istB鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺listB鎵鎸囧畾鐨勫厓绱 渚嬪褰撳墠閾捐〃 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] + * + * @param list + */ + public int[] getElements(LinkedList list) { + if(list==null||head==null||list.head==null){ + return new int[0]; + } + int[] arr = new int[0]; + Node tempA = head; + Node tempB = list.head; + int index=0; + while(tempA!=null&&tempB!=null){ + int len = (int)tempB.data - index; + int i = 0; + for(i=0;i=max){ + return ; + } + Node temp = new Node(); + temp.next = head; + while(temp.next!=null){ + if(temp.next.data==null){ + temp = temp.next; + continue; + } + int d = (int) temp.next.data; + if(d>min&&d=max){ + break; + } + } + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList link = new LinkedList(); + if(list==null||head==null||list.head==null){ + return link; + } + Node tempA = new Node(); + tempA.next = head; + Node tempB = new Node(); + tempB.next = list.head; + while(tempA.next!=null&&tempB.next!=null){ + if(tempA.next.data==null){ + tempA = tempA.next; + continue; + } + if(tempB.next.data==null){ + tempB = tempB.next; + continue; + } + int a = (int)tempA.next.data; + int b = (int)tempB.next.data; + if(ab){ + tempB = tempB.next; + }else{ + link.add(tempA.next.data); + tempA = tempA.next; + tempB = tempB.next; + } + } + return link; + } +} diff --git a/group10/904627477/src/com/coding/test/LinkedListTest.java b/group10/904627477/src/com/coding/test/LinkedListTest.java index 174fdeb583..81d8632cfe 100644 --- a/group10/904627477/src/com/coding/test/LinkedListTest.java +++ b/group10/904627477/src/com/coding/test/LinkedListTest.java @@ -114,5 +114,152 @@ public void testIterator() { assertEquals("333", it.next()); assertEquals(false, it.hasNext()); } + + @Test + public void testReverse(){ + link.reverse(); + assertEquals(3, link.size()); + assertEquals("333", link.get(0)); + assertEquals("222", link.get(1)); + assertEquals("111", link.get(2)); + } + + @Test + public void testRemoveFirstHalf(){ + link.add("444"); + link.add("555"); + link.removeFirstHalf(); + assertEquals(3, link.size()); + assertEquals("333", link.get(0)); + link.add("666"); + link.removeFirstHalf(); + assertEquals(2, link.size()); + assertEquals("555", link.get(0)); + } + + @Test + public void testRemoveForIndex(){ + link.add("444"); + link.add("555"); + link.remove(1, 2); + assertEquals(3, link.size()); + assertEquals("444", link.get(1)); + + link.remove(2, 5); + assertEquals(2, link.size()); + + link.remove(0,1); + assertEquals(1, link.size()); + assertEquals("444", link.get(0)); + } + + @Test + //11->101->201->301->401->501->601->701 listB = 1->3->4->6 [101,301,401,601] + public void testGetElements(){ + link = new LinkedList(); + link.add(11); + link.add(101); + link.add(201); + link.add(301); + link.add(401); + link.add(501); + link.add(601); + link.add(701); + LinkedList linkB = new LinkedList(); + linkB.add(1); + linkB.add(3); + linkB.add(4); + linkB.add(6); + int[] eles = link.getElements(linkB); + assertEquals(4, eles.length); + assertEquals(101, eles[0]); + assertEquals(301, eles[1]); + assertEquals(401, eles[2]); + assertEquals(601, eles[3]); + } + + @Test + public void testSubtract(){ + link = new LinkedList(); + link.add(11); + link.add(101); + link.add(201); + link.add(301); + link.add(401); + link.add(501); + link.add(601); + link.add(701); + LinkedList linkB = new LinkedList(); + linkB.add(401); + linkB.add(201); + linkB.add(601); + link.subtract(linkB); + assertEquals(5, link.size()); + assertEquals(11, link.get(0)); + assertEquals(101, link.get(1)); + assertEquals(301, link.get(2)); + assertEquals(501, link.get(3)); + assertEquals(701, link.get(4)); + } + @Test + public void testRemoveDuplicateValues(){ + link = new LinkedList(); + link.add(11); + link.add(101); + link.add(101); + link.add(301); + link.add(401); + link.add(401); + link.removeDuplicateValues(); + assertEquals(4, link.size()); + assertEquals(11, link.get(0)); + assertEquals(101, link.get(1)); + assertEquals(301, link.get(2)); + assertEquals(401, link.get(3)); + } + + @Test + public void testRemoveRange(){ + link = new LinkedList(); + link.add(11); + link.add(101); + link.add(201); + link.add(301); + link.add(401); + link.add(501); + link.add(601); + link.add(701); + link.removeRange(200, 600); + assertEquals(4, link.size()); + assertEquals(11, link.get(0)); + assertEquals(101, link.get(1)); + assertEquals(601, link.get(2)); + assertEquals(701, link.get(3)); + } + + @Test + public void testIntersection(){ + link = new LinkedList(); + link.add(11); + link.add(101); + link.add(201); + link.add(301); + link.add(401); + link.add(501); + link.add(601); + link.add(701); + LinkedList linkB = new LinkedList(); + linkB.add(201); + linkB.add(305); + linkB.add(401); + linkB.add(504); + linkB.add(601); + LinkedList linkC = link.intersection(linkB); + assertEquals(3, linkC.size()); + assertEquals(201, linkC.get(0)); + assertEquals(401, linkC.get(1)); + assertEquals(601, linkC.get(2)); + } + } diff --git a/group10/904627477/src/com/coding/test/Test.java b/group10/904627477/src/com/coding/test/Test.java index 475c213362..bebef536da 100644 --- a/group10/904627477/src/com/coding/test/Test.java +++ b/group10/904627477/src/com/coding/test/Test.java @@ -10,7 +10,7 @@ public class Test { public static void main(String[] args) { LinkedList link = new LinkedList(); - link.add("aaa"); + link.add(1); link.add("bbb"); link.add("ccc"); link.reverse(); From 3baca63d2f32edab36935766f32bca7d4e568524 Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Sat, 11 Mar 2017 00:01:16 +0800 Subject: [PATCH 092/177] record01 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 閲嶅啓List ArrayList Iterator锛 鏈畬鎴怉rrayList --- .../Exercise/src/lesson01/ArrayList.java | 112 ++++++++++++++++++ .../Exercise/src/lesson01/Iterator.java | 11 ++ .../Exercise/src/lesson01/List.java | 48 ++++++++ 3 files changed, 171 insertions(+) create mode 100644 group13/1274639949/Exercise/src/lesson01/ArrayList.java create mode 100644 group13/1274639949/Exercise/src/lesson01/Iterator.java create mode 100644 group13/1274639949/Exercise/src/lesson01/List.java diff --git a/group13/1274639949/Exercise/src/lesson01/ArrayList.java b/group13/1274639949/Exercise/src/lesson01/ArrayList.java new file mode 100644 index 0000000000..c7c17f2c0f --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson01/ArrayList.java @@ -0,0 +1,112 @@ +package lesson01; + +import java.util.Arrays; + +public class ArrayList implements List { + + private static final int DEFAULT_CAPACITY = 20; + private static final int DEFAULT_INCREMENT = 20; + + private int size; + + private Object[] elementData; + + public ArrayList() { + this(DEFAULT_CAPACITY); + } + + public ArrayList(int capacity) { + size = 0; + elementData = new Object[capacity]; + } + + + @Override + public boolean add(E e) { + ensureCapacity(); + elementData[size] = e; + size++; + return true; + } + + private void ensureCapacity() { + if(size == elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length + DEFAULT_INCREMENT); + } + } + + @Override + public void add(int index, E element) { + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("Error index :" + index); + } + ensureCapacity(); + System.arraycopy(element, index, element, index + 1, size - index); + elementData[index] = element; + size++; + } + + @Override + + public void clear() { + elementData = new Object[DEFAULT_CAPACITY]; + size = 0; + } + + @Override + public boolean contains(Object o) { + for(int i = 0; i < size; i++){ + + } + return false; + } + + @Override + public int indexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public E get(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public E remove(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean remove(Object o) { + // TODO Auto-generated method stub + return false; + } + + @Override + public E set(int index, E element) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public Object[] toArray() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Iterator iterator() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/group13/1274639949/Exercise/src/lesson01/Iterator.java b/group13/1274639949/Exercise/src/lesson01/Iterator.java new file mode 100644 index 0000000000..58a50847ac --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson01/Iterator.java @@ -0,0 +1,11 @@ +package lesson01; + +public interface Iterator { + + public boolean hasNext(); + + public E next(); + + public void remove(); + +} diff --git a/group13/1274639949/Exercise/src/lesson01/List.java b/group13/1274639949/Exercise/src/lesson01/List.java new file mode 100644 index 0000000000..a477383b82 --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson01/List.java @@ -0,0 +1,48 @@ +package lesson01; + +public interface List { + /** + * 鍦↙ist鐨勬渶鍚庝竴涓厓绱犲悗娣诲姞涓涓厓绱 + * @param e 娣诲姞鐨勫厓绱 + */ + public boolean add(E e); + /** + * 鍦↙ist鐨刬ndex浣嶇疆鍔犲叆鍏冪礌element + * @param index + * @param element + */ + public void add(int index, E element); + /** + * 娓呯┖璇ist + */ + public void clear(); + /** + * 鍒ゆ柇List涓槸鍚﹀惈鏈夊璞 + * @param o + * @return 濡傛灉o瀛樺湪浜庤List涓垯杩斿洖true锛 鍚﹀垯杩斿洖false + */ + public boolean contains(Object o); + /** + * 濡傛灉o瀛樺湪浜庤List涓紝鍒欒繑鍥炲畠绗竴娆″嚭鐜扮殑浣嶇疆 + * 绗竴涓厓绱犵殑浣嶇疆涓0 + * 涓嶅瓨鍦ㄦ椂杩斿洖-1 + * @param o + * @return 杩斿洖o鍦↙ist涓殑浣嶇疆鎴-1 + */ + public int indexOf(Object o); + + public E get(int index); + + public E remove(int index); + + public boolean remove(Object o); + + public E set(int index, E element); + + public int size(); + + public Object[] toArray(); + + public Iterator iterator(); + +} From 06a03dae118a7610fd67d978369855001e0d0a83 Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Sat, 11 Mar 2017 07:33:55 +0800 Subject: [PATCH 093/177] 3 --- .../coderising/download/DownloadThread.java | 27 ++-- .../com/coderising/download/DownloadUtil.java | 73 +++++++++++ .../coderising/download/FileDownloader.java | 119 +++++------------- .../download/FileDownloaderTest.java | 9 +- .../download/impl/DownloadThreadListener.java | 23 ---- .../download/impl/DownloadUtil.java | 47 +++++++ 6 files changed, 171 insertions(+), 127 deletions(-) create mode 100644 group12/382266293/src/com/coderising/download/DownloadUtil.java delete mode 100644 group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java create mode 100644 group12/382266293/src/com/coderising/download/impl/DownloadUtil.java diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 0001e0e628..4731b2f7c8 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -2,13 +2,11 @@ import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; + import java.io.RandomAccessFile; import com.coderising.download.api.Connection; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.DownloadThreadListener; + public class DownloadThread extends Thread{ @@ -17,14 +15,6 @@ public class DownloadThread extends Thread{ int endPos; private String dest; private FileDownloader fileDownloader; - - public void setFileDownloader(FileDownloader fileDownloader) { - this.fileDownloader = fileDownloader; - } - - public void notifyFinished() { - fileDownloader.setFinished(); - } public DownloadThread( Connection conn, int startPos, int endPos){ @@ -37,7 +27,6 @@ public void run(){ RandomAccessFile raf = null; try { byte[] buffer = conn.read(startPos, endPos); - System.out.println("buffer length: " + buffer.length); raf = new RandomAccessFile(new File(dest), "rws"); raf.seek(startPos); raf.write(buffer); @@ -47,7 +36,7 @@ public void run(){ } finally { conn.close(); System.out.println(this.getName()+" finished"); - + try { if (raf != null) raf.close(); @@ -58,9 +47,19 @@ public void run(){ } } } + + public void setFileDownloader(FileDownloader fileDownloader) { + this.fileDownloader = fileDownloader; + } + + public void notifyFinished() { + fileDownloader.setThreadFinished(); + } + public void setDest(String dest) { this.dest = dest; } + public void close() { this.conn.close(); diff --git a/group12/382266293/src/com/coderising/download/DownloadUtil.java b/group12/382266293/src/com/coderising/download/DownloadUtil.java new file mode 100644 index 0000000000..11e7c50904 --- /dev/null +++ b/group12/382266293/src/com/coderising/download/DownloadUtil.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class DownloadUtil { + + private static final int MIN_CONNECTIONS = 3; + private static final int MAX_CONNECTIONS = 10; + + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + + public static void createTempFile(String tempName, int len) { + File file = new File(tempName); + if (file.exists()) { + System.out.println("tempfile already created"); + return; + } + FileOutputStream temp = null; + try { + temp = new FileOutputStream(tempName); + int length = len; + byte[] buffer = new byte[1024]; + long times = length / 1024; + int left = (int) (length % 1024); + for (int i = 0; i < times; i++) { + temp.write(buffer); + } + temp.write(buffer, 0, left); + System.out.println("tempFile " + tempName + " created"); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + temp.flush(); + temp.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static int calculateConnects(int length) { + int conns = length / 1024 / 1024 / 25; + if (conns < MIN_CONNECTIONS) { + return MIN_CONNECTIONS; + } else if (conns > MAX_CONNECTIONS) { + return MAX_CONNECTIONS; + } else { + return conns; + } + } + + public static boolean rename(String from, String to) { + File file = new File(from); + if (file.exists()) { + return file.renameTo(new File(to)); + } + System.out.println("rename failed"); + return false; + } + + public static void printDownloadReport(int length, long start, long end) { + int time = (int) ((end - start) / 1000); + float speed = (float)length / 1024 / 1024 / time; + System.out.println("鍏辫楁椂锛" + time + "s锛屼笅杞介熷害锛 " + (float)(Math.round(speed*1000))/1000 + "Mb/s"); + } + +} \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index 6e8d10e726..882305bdb4 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -9,21 +9,20 @@ import com.coderising.download.api.ConnectionManager; import com.coderising.download.api.DownloadListener; + public class FileDownloader { + private final static String EXT = "lyj"; - private static final int MIN_CONNECTIONS = 3; - private static final int MAX_CONNECTIONS = 10; private static DownloadThread[] threadPool; private int finishedCount; - public String downloadLocation = "C:\\"; + public String downloadLocation; String url; ConnectionManager cm; DownloadListener listener; - private static boolean finished; private static String fileName; private static String tempName; @@ -49,112 +48,76 @@ public void execute() { // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 - int length = 0; long start = getCurrentTime(); try { Connection conn = cm.open(this.url); - length = conn.getContentLength(); - if (length <= 0) { - try { - throw new ConnectionException("file does not exist"); - } catch (ConnectionException e) { - e.printStackTrace(); - return; - } finally { - conn.close(); - } - } + int length = conn.getContentLength(); + checkLength(length, conn); System.out.println("file length:" + length); - - fileName = conn.getFileName(); - setTempName(downloadLocation + fileName); - createTempFile(tempName, length); - - int connNumbers = calculateConnects(length); + setLocation("C:\\"); + + String name = conn.getFileName(); + setFileName(name); + setTempName(name); + + DownloadUtil.createTempFile(tempName,length); + + int connNumbers = DownloadUtil.calculateConnects(length); System.out.println(connNumbers + " Threads will be created."); threadPool = new DownloadThread[connNumbers]; setAndStartThreadPool(conn, threadPool, length); - finished = checkFinish(threadPool.length); + checkFinish(threadPool.length); + listener.notifyFinished(); + DownloadUtil.rename(tempName, fileName); + long end = getCurrentTime(); + DownloadUtil.printDownloadReport(length, start, end); } catch (ConnectionException e) { e.printStackTrace(); } finally { freeDownloadThread(); - if (finished) { - changeName(tempName, fileName); - long end = getCurrentTime(); - printDownloadReport(length, start, end); - } } } - private static void createTempFile(String dest, int len) { - File file = new File(dest); - if (file.exists()) { - System.out.println("tempfile already created"); - return; - } - FileOutputStream temp = null; - try { - temp = new FileOutputStream(dest); - int length = len; - byte[] buffer = new byte[1024]; - long times = length / 1024; - int left = (int) (length % 1024); - for (int i = 0; i < times; i++) { - temp.write(buffer); - } - temp.write(buffer, 0, left); - System.out.println("tempFile " + dest + " created"); - - } catch (Exception e) { - e.printStackTrace(); - } finally { + private void checkLength(int length, Connection conn) { + if (length <= 0) { try { - temp.flush(); - temp.close(); - } catch (IOException e) { + throw new ConnectionException("file does not exist"); + } catch (ConnectionException e) { e.printStackTrace(); + } finally { + conn.close(); } } } - private static void setTempName(String fileName) { - tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + EXT; + private void setTempName(String name) { + String temp = name.substring(0,name.lastIndexOf(".")+1) + EXT; + this.tempName = downloadLocation + temp; } - private int calculateConnects(int length) { - int conns = length / 1024 / 1024; - if (conns < MIN_CONNECTIONS) { - return MIN_CONNECTIONS; - } else if (conns > MAX_CONNECTIONS) { - return MAX_CONNECTIONS; - } else { - return conns; - } + private void setFileName(String name) { + this.fileName = downloadLocation + name; } - private void changeName(String from, String to) { - rename(from, downloadLocation + to); + private void setLocation(String downloadLocation) { + this.downloadLocation = downloadLocation; } private boolean checkFinish(int links) { while (finishedCount != links) { try { - Thread.sleep(5000); System.out.println("Unfinshed threads number: " + (links - finishedCount)); - } catch (InterruptedException e) { e.printStackTrace(); } } - return true; } @@ -179,22 +142,6 @@ public DownloadListener getListener() { return this.listener; } - private void printDownloadReport(int length, long start, long end) { - int time = (int) ((end - start) / 1000); - float speed = length / 1024 / 1024 / time; - System.out.println("鍏辫楁椂锛" + time + "s锛屼笅杞介熷害锛 " + speed + "Mb/s"); - } - - public boolean rename(String from, String to) { - System.out.println(from); - System.out.println(to); - File file = new File(from); - if (file.exists()) { - return file.renameTo(new File(to)); - } - System.out.println("rename failed"); - return false; - } private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, int length) throws ConnectionException { @@ -226,7 +173,7 @@ public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - public void setFinished() { + public void setThreadFinished() { finishedCount++; } diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index 022b6945d2..1dcd26a807 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -18,16 +18,17 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } - public static String url1 = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; - public static String url2 = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; - public static String url3 = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; + public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; + public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; + public static String office2013 = "http://soft1.xitongzhijia.net:808/201407/Office2013_32_XiTongZhiJia.rar"; @Test public void testDownload() { String url = "http://localhost:8080/test.jpg"; - FileDownloader downloader = new FileDownloader(url2); + FileDownloader downloader = new FileDownloader(office2013); ConnectionManager cm = new ConnectionManagerImpl(); diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java b/group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java deleted file mode 100644 index b5ae0e5afa..0000000000 --- a/group12/382266293/src/com/coderising/download/impl/DownloadThreadListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.download.impl; - -import com.coderising.download.FileDownloader; -import com.coderising.download.api.DownloadListener; - -public class DownloadThreadListener implements DownloadListener { - - - public DownloadThreadListener() { - } - - private FileDownloader fileDownloader; - public DownloadThreadListener(FileDownloader fileDownloader) { - this.fileDownloader = fileDownloader; - } - - @Override - public void notifyFinished() { - System.out.println("noted"); - fileDownloader.setFinished(); - } - -} diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java new file mode 100644 index 0000000000..ca598f8f03 --- /dev/null +++ b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java @@ -0,0 +1,47 @@ +package com.coderising.download.impl; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class DownloadUtil { + + + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + + + public static void createTempFile(String tempName, int len) { + File file = new File(tempName); + if (file.exists()) { + System.out.println("tempfile already created"); + return; + } + FileOutputStream temp = null; + try { + temp = new FileOutputStream(tempName); + int length = len; + byte[] buffer = new byte[1024]; + long times = length / 1024; + int left = (int) (length % 1024); + for (int i = 0; i < times; i++) { + temp.write(buffer); + } + temp.write(buffer, 0, left); + System.out.println("tempFile " + tempName + " created"); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + temp.flush(); + temp.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + +} From 46cda8d6d6e67b1c8d1f4d9d8b584e40ef4f5aec Mon Sep 17 00:00:00 2001 From: OnlyLYJ <382266293@qq.com> Date: Sat, 11 Mar 2017 09:33:57 +0800 Subject: [PATCH 094/177] Week3 Exs done --- .../coding/basic/collection/AbstractList.java | 21 +- .../coding/basic/collection/Iterator.java | 1 + .../coding/basic/collection/List.java | 11 +- .../basic/collection/concrete/ArrayList.java | 42 +- .../collection/concrete/BinaryTreeNode.java | 113 +++--- .../basic/collection/concrete/LinkedList.java | 378 +++++++++--------- .../basic/collection/concrete/Queue.java | 23 +- .../basic/collection/concrete/Stack.java | 23 +- .../basic/test/collection/ArrayListTest.java | 115 +++--- .../test/collection/BinaryTreeNodeTest.java | 24 +- .../basic/test/collection/LinkedListTest.java | 166 ++++---- .../test/collection/LinkedListTest2.java | 163 +++++--- .../basic/test/collection/QueueTest.java | 26 +- .../basic/test/collection/StackTest.java | 31 +- .../coding/basic/util/ActionXMLreader.java | 51 ++- .../382266293/coding/basic/util/Print.java | 13 +- .../382266293/coding/basic/util/TestUtil.java | 47 +-- group12/382266293/src/array/ArrayUtil.java | 1 - .../382266293/src/array/ArrayUtilTest.java | 1 - .../coderising/download/DownloadThread.java | 1 + .../com/coderising/download/DownloadUtil.java | 4 +- .../coderising/download/FileDownloader.java | 27 +- .../download/FileDownloaderTest.java | 21 +- .../download/impl/ConnectionImpl.java | 5 - .../download/impl/ConnectionManagerImpl.java | 2 - .../download/impl/DownloadUtil.java | 11 +- .../src/litestruts/ConfigurationTest.java | 3 - group12/382266293/src/litestruts/Struts.java | 3 +- group12/382266293/src/test.java | 9 - 29 files changed, 673 insertions(+), 663 deletions(-) diff --git a/group12/382266293/coding/basic/collection/AbstractList.java b/group12/382266293/coding/basic/collection/AbstractList.java index 93da57e1bd..80bdb5329f 100644 --- a/group12/382266293/coding/basic/collection/AbstractList.java +++ b/group12/382266293/coding/basic/collection/AbstractList.java @@ -5,20 +5,21 @@ 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 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); + if (i < 0 || i > Math.min(size(), MAX_SIZE)) + throw new IndexOutOfBoundsException("Size :" + size() + ", Index: " + i); } - + + @Override public boolean isEmpty() { return size() == 0; } - + @Override public int indexOf(E e) { - for (int i = 0; i < size()-1; i++) { + for (int i = 0; i < size() - 1; i++) { if (get(i).equals(e)) return i; } @@ -26,18 +27,18 @@ public int indexOf(E e) { } 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) + if (i < size() - 1) sb.append(SEPERATOR); } sb.append(SUFFIX); return sb.toString(); } - + } diff --git a/group12/382266293/coding/basic/collection/Iterator.java b/group12/382266293/coding/basic/collection/Iterator.java index 79955745cd..01d805b630 100644 --- a/group12/382266293/coding/basic/collection/Iterator.java +++ b/group12/382266293/coding/basic/collection/Iterator.java @@ -3,5 +3,6 @@ public interface Iterator { public boolean hasNext(); + public E next(); } diff --git a/group12/382266293/coding/basic/collection/List.java b/group12/382266293/coding/basic/collection/List.java index 5fdc0de9ab..a1652bddd8 100644 --- a/group12/382266293/coding/basic/collection/List.java +++ b/group12/382266293/coding/basic/collection/List.java @@ -1,16 +1,15 @@ 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/coding/basic/collection/concrete/ArrayList.java b/group12/382266293/coding/basic/collection/concrete/ArrayList.java index 449cdf4e1a..3eeca56fee 100644 --- a/group12/382266293/coding/basic/collection/concrete/ArrayList.java +++ b/group12/382266293/coding/basic/collection/concrete/ArrayList.java @@ -12,12 +12,11 @@ public class ArrayList extends AbstractList { 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(); @@ -27,21 +26,21 @@ public void add(E 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) { @@ -50,46 +49,44 @@ public void add(int index, E e) { } checkIndex(index); synchronized (this) { - System.arraycopy(elements, index, elements, index+1, size-index+1); + 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]; + return elements[index]; } - public E getLast() { - return get(size-1); + return get(size - 1); } - + public void addLast(E e) { - add(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); + 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() { @@ -116,15 +113,16 @@ public boolean equals(Object obj) { return true; } - public Iterator iterator(){ + @Override + 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; @@ -143,6 +141,4 @@ public E next() { } } - - } diff --git a/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java b/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java index 442b06b1c9..3957711eb1 100644 --- a/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java +++ b/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java @@ -1,77 +1,73 @@ 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; - } + + 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() { @@ -82,18 +78,23 @@ public String 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; } @@ -105,7 +106,7 @@ public int hashCode() { result = prime * result + ((data == null) ? 0 : data.hashCode()); return result; } - + @Override public boolean equals(Object obj) { if (this == obj) diff --git a/group12/382266293/coding/basic/collection/concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java index 8b14bedf57..341149e0f8 100644 --- a/group12/382266293/coding/basic/collection/concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -1,6 +1,5 @@ package collection.concrete; -import java.util.Arrays; import java.util.NoSuchElementException; import java.util.Objects; @@ -9,114 +8,118 @@ 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; } - - + /** - * 鎶婅閾捐〃閫嗙疆 - * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + * 鎶婅閾捐〃閫嗙疆 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 */ @SuppressWarnings("unchecked") - public void reverse(){ - if(head == null){ - return; - } - Node pre = head; - Node cur = head.next; - Node next; - while (cur != null) { - next = cur.next; - cur.next = pre; - pre = cur; - cur = next; - } - head.next = null; - head = pre; - - } + public void reverse() { + if (head == null) { + return; + } + Node pre = head; + Node cur = head.next; + Node next; + while (cur != null) { + next = cur.next; + cur.next = pre; + pre = cur; + cur = next; + } + head.next = null; + head = pre; - /** - * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 - * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 - * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + } + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 濡傛灉list = 2->5->7->8->10 + * ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + * */ - public void removeFirstHalf(){ - int deleteLength = size/2; - remove(0,deleteLength); + public void removeFirstHalf() { + int deleteLength = size / 2; + remove(0, deleteLength); } - + private void clearAndSetNewHead(int deleteIndex) { Node x = head; for (int i = 0; i < deleteIndex; i++) { - Node next = x.next; - x.data = null; - x.next = null; - x = next; - size--; - if (i == deleteIndex-1) - head = next; + Node next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + if (i == deleteIndex - 1) + head = next; } } - - private void clearAndSetNewHead(Node node,int deleteLength) { + + private void clearAndSetNewHead(Node node, int deleteLength) { Node x = node; for (int i = 0; i < deleteLength; i++) { - Node next = x.next; - x.data = null; - x.next = null; - x = next; - size--; - if (i == deleteLength-1) - node = next; + Node next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + if (i == deleteLength - 1) + node = next; } } /** * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * * @param i * @param length */ - public void remove(int i, int length){ + public void remove(int i, int length) { + checkIndex(i); + checkIndex(i + length); + if (i == 0) { clearAndSetNewHead(length); return; } - Node pre = getNode(i-1); + Node pre = getNode(i - 1); Node x = pre.next; checkIndex(length + i); for (int j = 0; j < length; j++) { - Node next = x.next; - x.data = null; - x.next = null; - x = next; - size--; - if (i == length-1) - pre.next = next; + Node next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + if (i == length - 1) + pre.next = next; } } /** - * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 - * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺list鎵鎸囧畾鐨勫厓绱 - * 渚嬪褰撳墠閾捐〃 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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){ + public int[] getElements(LinkedList list) { + + if (size() == 0 || list.size() == 0) { + return new int[0]; + } + Iterator it2 = list.iterator(); - int size = list.size(); + int size = list.size(); int[] result = new int[size]; int curr = (int) it2.next(); Node start = getNode(curr); @@ -127,8 +130,8 @@ public int[] getElements(LinkedList list){ next = (int) it2.next(); batch = next - curr; Node p = start; - for(int j = 0; j < batch; j++){ - p = p.next; + for (int j = 0; j < batch; j++) { + p = p.next; } result[i] = (int) p.data; start = p; @@ -137,35 +140,33 @@ public int[] getElements(LinkedList list){ return result; } - /** - * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 - * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 - + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + * * @param list */ - - public void subtract(LinkedList list){ + + public void subtract(LinkedList list) { Node n1 = list.getNode(0); Node n2 = head; int count = list.size(); int index = 0; int iR = 0; while (count != 0 && n1 != null && n2 != null) { - - while(count > 1 && Objects.equals(n1.data, n1.next.data)) { + + while (count > 1 && Objects.equals(n1.data, n1.next.data)) { n1 = n1.next; count--; } - - while(Objects.equals(n1.data, n2.data) == false) { + + while (Objects.equals(n1.data, n2.data) == false) { index++; if (index > size() - 1) return; n2 = n2.next; } iR = index; - + while (n2 != null && Objects.equals(n1.data, n2.data)) { remove(iR); count--; @@ -177,122 +178,112 @@ public void subtract(LinkedList list){ } - - /** - * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 - * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 */ - public void removeDuplicateValues(){ + public void removeDuplicateValues() { Node n1 = head; - //Node next; int count = size(); int index = 0; int iR = 0; while (count > 1 && n1 != null) { - while(count > 1 && Objects.equals(n1.data, n1.next.data) == false) { + while (count > 1 && Objects.equals(n1.data, n1.next.data) == false) { n1 = n1.next; index++; count--; } iR = index; - //next = n1.next.next; - - while(count > 1 && Objects.equals(n1.data, n1.next.data)) { + + while (count > 1 && Objects.equals(n1.data, n1.next.data)) { remove(iR); - //n1 = n1.next; - //n1.next = next; - n1 = n1.next; - count--; - } - index = iR; - } - } - - - - public void removeDuplicateValues2(){ - Node n1 = head; - int count = size(); - int index = 0; - int iR = 0; - while (count > 1 && n1 != null) { - while(count > 1 && Objects.equals(n1.data, n1.next.data) == false) { n1 = n1.next; - index++; - count--; - } - iR = index; - - while(count > 1 && Objects.equals(n1.data, n1.next.data)) { - Node next = n1.next.next; - n1.next.data = null; - n1.next = null; - n1 = n1.next; - n1.next = next; count--; } index = iR; - } } - + /** - * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 - * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * * @param min * @param max */ - public void removeRange(int min, int max){ - + public void removeRange(int min, int max) { + if (min >= max) { + throw new IllegalArgumentException(min + " is greater than " + max); + } + + if (size() == 0) { + return; + } + + Node curr = head; + if ((int) head.data > min) { + curr = curr.next; + } + + Node p = head; + while ((int) curr.data <= min) { + p = curr; + curr = curr.next; + } + + Node next = curr; + for (Node x = curr; (int) x.data < max;) { + next = x.next; + x.data = null; + x.next = null; + x = next; + size--; + } + + if ((int) p.data > min) { + head = next; + size--; + } else { + p.next = next; + } } - + public static void main(String args[]) { LinkedList myLL = new LinkedList(); myLL.add(0); - addIntWithNatureOrder(myLL,10); + addIntWithNatureOrder(myLL, 10); myLL.add(10); - myLL.add(12); - myLL.add(13); - myLL.add(24); + myLL.add(89); + println(myLL); + myLL.removeRange(2, 10); println(myLL); - LinkedList list = new LinkedList(); - list.add(0); - list.add(5); - list.add(10); - - LinkedList result = myLL.intersection(list); - println(result); } - - - - - + /** * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * * @param list */ - public LinkedList intersection(LinkedList list){ + public LinkedList intersection(LinkedList list) { + + LinkedList result = new LinkedList(); Node n1 = list.getNode(0); Node n2 = head; - LinkedList result = new LinkedList(); + int count = list.size(); int index = 0; int iR = 0; while (count != 0 && n1 != null && n2 != null) { - while(Objects.equals(n1.data, n2.data) == false) { + while (Objects.equals(n1.data, n2.data) == false) { index++; if (index > size() - 1) return result; n2 = n2.next; } iR = index; - + if (n2 != null && Objects.equals(n1.data, n2.data)) { result.add(n1.data); count--; @@ -301,55 +292,78 @@ public LinkedList intersection(LinkedList list){ index = iR; n1 = n1.next; } - + return result; } - - + + public void removeDuplicateValues2() { + Node n1 = head; + int count = size(); + int index = 0; + int iR = 0; + while (count > 1 && n1 != null) { + while (count > 1 && Objects.equals(n1.data, n1.next.data) == false) { + n1 = n1.next; + index++; + count--; + } + iR = index; + + while (count > 1 && Objects.equals(n1.data, n1.next.data)) { + Node next = n1.next.next; + n1.next.data = null; + n1.next = null; + n1 = n1.next; + n1.next = next; + count--; + } + index = iR; + + } + } + @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); + return get(size - 1); } - - - public void add(int index, E e) { + + 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; + getNode(index - 1).next = pNode; pNode.next = p; size++; } } - public void addFirst(E e){ + public void addFirst(E e) { checkCapacity(); Node pNode = new Node(e); Node oldHead = head; @@ -358,25 +372,26 @@ public void addFirst(E e){ size++; return; } - - public void addLast(E e){ + + public void addLast(E e) { if (size == 0) { addFirst(e); return; } - + checkCapacity(); Node res = new Node(e); setLastNode(res); size++; return; } - - public E removeFirst(){ + + public E removeFirst() { return remove(0); } - public E removeLast(){ - return remove(size-1); + + public E removeLast() { + return remove(size - 1); } @SuppressWarnings("unchecked") @@ -386,18 +401,18 @@ public E remove(int index) { E data = null; if (index == 0) { data = (E) head.data; - head = head.next; - } else if (index == size-1) { + head = head.next; + } else if (index == size - 1) { pNode = getNode(index - 1); data = (E) pNode.next.data; pNode.next = null; } else { pNode = head; - for ( int i = 0; i < index - 1 ; i++) { + for (int i = 0; i < index - 1; i++) { pNode = pNode.next; } data = (E) pNode.next.data; - pNode.next =pNode.next.next; + pNode.next = pNode.next.next; } size--; return data; @@ -407,35 +422,36 @@ public E remove(int index) { public int size() { return size; } - - public Iterator iterator(){ + + @Override + public Iterator iterator() { return new LinkedListIterator(this); } private void checkCapacity() { if (size > MAX_SIZE) - throw new IndexOutOfBoundsException("Reached max capacity: "+ 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++) { + for (int i = 0; i < index; i++) { pNode = pNode.next; } return pNode; } - + private void setLastNode(Node res) { - getNode(size-1).next = res; + getNode(size - 1).next = res; } private static class Node { E data; Node next; - + public Node(E data) { this.data = data; this.next = null; @@ -471,13 +487,13 @@ public boolean equals(Object obj) { return true; } } - + @SuppressWarnings("hiding") private class LinkedListIterator implements Iterator { private LinkedList myLinkedList; private int pos; - + public LinkedListIterator(LinkedList linkedList) { myLinkedList = linkedList; pos = 0; diff --git a/group12/382266293/coding/basic/collection/concrete/Queue.java b/group12/382266293/coding/basic/collection/concrete/Queue.java index 0875d8286a..d9313b1c6e 100644 --- a/group12/382266293/coding/basic/collection/concrete/Queue.java +++ b/group12/382266293/coding/basic/collection/concrete/Queue.java @@ -1,22 +1,21 @@ 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){ + + public void enQueue(E e) { myList.addLast(e); } - - public E deQueue(){ + + public E deQueue() { if (0 == size()) return null; return myList.removeFirst(); @@ -26,26 +25,25 @@ public E deQueue(){ 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(); @@ -76,9 +74,4 @@ public boolean equals(Object obj) { return true; } - - - - - } diff --git a/group12/382266293/coding/basic/collection/concrete/Stack.java b/group12/382266293/coding/basic/collection/concrete/Stack.java index ecc0994273..6fe1e20d47 100644 --- a/group12/382266293/coding/basic/collection/concrete/Stack.java +++ b/group12/382266293/coding/basic/collection/concrete/Stack.java @@ -7,33 +7,34 @@ import collection.Iterator; public class Stack extends AbstractList { - + private ArrayList myList; public Stack() { this.myList = new ArrayList(); } - public void push(E e){ + public void push(E e) { myList.addLast(e); } - - public E pop(){ + + public E pop() { checkEmpty(); return myList.removeLast(); } - + private void checkEmpty() { if (0 == size()) throw new EmptyStackException(); } - public E peek(){ + public E peek() { checkEmpty(); return myList.getLast(); } - public int size(){ + @Override + public int size() { return myList.size(); } @@ -47,7 +48,7 @@ public E get(int index) { checkEmpty(); return myList.get(size() - index - 1); } - + @Override protected Iterator iterator() { return new StackIterator(myList); @@ -77,12 +78,12 @@ public boolean equals(Object obj) { return false; return true; } - + private class StackIterator implements Iterator { private ArrayList myArrayList; private int pos; - + public StackIterator(ArrayList myList) { myArrayList = myList; pos = 0; @@ -101,6 +102,4 @@ public E next() { } } - - } diff --git a/group12/382266293/coding/basic/test/collection/ArrayListTest.java b/group12/382266293/coding/basic/test/collection/ArrayListTest.java index 74a3a14212..f57167bbd3 100644 --- a/group12/382266293/coding/basic/test/collection/ArrayListTest.java +++ b/group12/382266293/coding/basic/test/collection/ArrayListTest.java @@ -1,6 +1,5 @@ package test.collection; -import static util.Print.*; import static util.TestUtil.*; import java.util.Date; import java.util.NoSuchElementException; @@ -17,18 +16,19 @@ public class ArrayListTest extends TestCase { - private ArrayList myAL; private static Random rnd = new Random(); - + + @Override @Before public void setUp() throws Exception { - + myAL = new ArrayList(); - assertEquals(true,myAL.isEmpty()); - + assertEquals(true, myAL.isEmpty()); + } + @Override @After public void tearDown() throws Exception { myAL = null; @@ -36,7 +36,7 @@ public void tearDown() throws Exception { @Test public void testRawTypeArrayList() { - + List rawList = new ArrayList(); assertEquals(rawList.size(), 0); rawList.add(new Date()); @@ -45,49 +45,49 @@ public void testRawTypeArrayList() { @Test public void testEmpty() { - - assertEquals(true,myAL.isEmpty()); - + + assertEquals(true, myAL.isEmpty()); + myAL.add(5); - assertEquals(false,myAL.isEmpty()); - + assertEquals(false, myAL.isEmpty()); + int num = getRandomNumber(); addIntWithNatureOrder(myAL, num); - assertEquals(false,myAL.isEmpty()); - + assertEquals(false, myAL.isEmpty()); + } @Test public void testAddIntAutoBoxing() { - + myAL.add(5); myAL.add(5); myAL.add(5); - myAL.add(1,10); + myAL.add(1, 10); int c = myAL.get(1); - assertEquals(10,c); - - assertEquals(4,myAL.size()); - myAL.add(4,15); + 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); + 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); + 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; - + + int actual, expected; + for (int i = 0; i < result.length; i++) { actual = myAL.get(i); expected = result[i]; @@ -100,7 +100,7 @@ public void testGet() { public void testRemove() { addIntWithNatureOrder(myAL, 100); - + testRemoveAndGetFromTail(myAL); try { myAL.remove(10); @@ -113,59 +113,56 @@ public void testRemove() { @Test public void testSize() { - - assertEquals(0,myAL.size()); + + assertEquals(0, myAL.size()); int num = getRandomNumber(); addIntWithNatureOrder(myAL, num); - assertEquals(num,myAL.size()); + assertEquals(num, myAL.size()); } - - @Test public void testGrow() { - + int actualSize = 12345; - + addIntWithNatureOrder(myAL, actualSize); - - assertEquals(actualSize,myAL.size()); + + assertEquals(actualSize, myAL.size()); } - @Test public void testIterator() { - - addIntWithNatureOrder(myAL,100); - + + addIntWithNatureOrder(myAL, 100); + Iterator it = myAL.iterator(); - for(int i = 0; it.hasNext(); i++){ + for (int i = 0; it.hasNext(); i++) { int actual = it.next(); - assertEquals(i,actual); + assertEquals(i, actual); } - - try { + + try { it.next(); - } catch (NoSuchElementException ex) { - assertEquals(ex.getClass(),NoSuchElementException.class); - } + } catch (NoSuchElementException ex) { + assertEquals(ex.getClass(), NoSuchElementException.class); + } } - + @Test public void testIndexOf() { - + int num = 200; - addIntWithNatureOrder(myAL,num); + addIntWithNatureOrder(myAL, num); - int expected,actual; - for (int i = 0; i < num-1; i++) { + 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())); + + assertEquals(-1, myAL.indexOf(-1 * getRandomNumber())); } diff --git a/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java b/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java index 161d29298a..0aeda8dc03 100644 --- a/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java +++ b/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java @@ -1,7 +1,5 @@ package test.collection; -import static util.Print.*; -import java.util.Random; import java.util.Set; import java.util.TreeSet; import static util.TestUtil.*; @@ -15,13 +13,15 @@ public class BinaryTreeNodeTest extends TestCase { private BinaryTreeNode myTree; - + + @Override @Before public void setUp() throws Exception { myTree = new BinaryTreeNode(); assertEquals(0, myTree.size()); } + @Override @After public void tearDown() throws Exception { myTree = null; @@ -29,26 +29,26 @@ public void tearDown() throws Exception { @Test public void testInsert() { - Set expected = new TreeSet(); + Set expected = new TreeSet(); int size = getRandomNumber(); - int j = 0 ; + int j = 0; while (expected.size() != size) { j = getRandomNumber(); expected.add(j); myTree.insert(j); } - - assertEquals(size,myTree.size()); - assertEquals(expected.toString(),myTree.toString()); + + 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()); - } + assertEquals(3, myTree.size()); + } } } \ No newline at end of file diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest.java b/group12/382266293/coding/basic/test/collection/LinkedListTest.java index 2613aed28f..779216d810 100644 --- a/group12/382266293/coding/basic/test/collection/LinkedListTest.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest.java @@ -1,7 +1,6 @@ package test.collection; -import static util.Print.*; -import static util.TestUtil.*; +import static util.TestUtil.*; import java.util.Date; import java.util.NoSuchElementException; import org.junit.After; @@ -13,24 +12,22 @@ import collection.concrete.LinkedList; import junit.framework.TestCase; - public class LinkedListTest extends TestCase { LinkedList myLL; - + + @Override @Before public void setUp() throws Exception { myLL = new LinkedList(); - assertEquals(0,myLL.size()); + assertEquals(0, myLL.size()); } + @Override @After public void tearDown() throws Exception { myLL = null; } - - - @Test public void testLinkedList() { @@ -38,197 +35,192 @@ public void testLinkedList() { assertEquals(rawList.size(), 0); rawList.add(new Date()); assertEquals(1, rawList.size()); - + } - @Test public void testReverse() { - addString(myLL,5); + addString(myLL, 5); myLL.reverse(); } - - + @Test public void testRemoveFirstHalf() { - addString(myLL,5); + addString(myLL, 5); myLL.removeFirstHalf(); - assertEquals(3,myLL.size()); - assertEquals("2",myLL.get(0)); - assertEquals("3",myLL.get(1)); - assertEquals("4",myLL.get(2)); + assertEquals(3, myLL.size()); + assertEquals("2", myLL.get(0)); + assertEquals("3", myLL.get(1)); + assertEquals("4", myLL.get(2)); } - + @Test public void testAddE() { myLL.add("s"); - assertEquals(1,myLL.size()); - assertEquals(false,myLL.isEmpty()); + assertEquals(1, myLL.size()); + assertEquals(false, myLL.isEmpty()); } @Test public void testAddStringE() { String a; - - addString(myLL,30); -// for (int i = 0 ; i < 29; i++) { -// a = "" + i; -// assertEquals(myLL.get(i),a); -// } + addString(myLL, 30); + + // 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++) { + for (int i = 0; i < 30; i++) { a = "" + i; myLL.add(a); } - + String ss = "ss"; - myLL.add(3,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++) { + for (int i = 0; i < 20; i++) { a = "" + i; myLL.add(a); } - + String ss = "bba"; myLL.addFirst(ss); - assertEquals(ss,myLL.get(0)); + assertEquals(ss, myLL.get(0)); assertEquals(21, myLL.size()); - + ; - for (int i = 1 ; i < myLL.size(); i++) { - a = (i-1) + ""; + 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++) { + 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++) { + 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+""); + 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 + ""; + 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 +""; + 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+""); + for (int i = 0; i < 10; i++) { + myLL.add(i + ""); } - + myLL.removeLast(); assertEquals(9, myLL.size()); - for(int i = 0; i < myLL.size(); i++) { + 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 +""; + 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 = 0; i < 10; i++) { + myLL.add(i + ""); } - for(int i = myLL.size()-1; i >= 0; 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); + assertEquals(a, res); } - + } - @Test public void testSize() { - assertEquals(0,myLL.size()); + assertEquals(0, myLL.size()); } @Test public void testIterator() { - for(int i = 0; i<10; i++) { - myLL.add(i+""); + for (int i = 0; i < 10; i++) { + myLL.add(i + ""); } Iterator it = myLL.iterator(); - - for(int i = 0; it.hasNext(); i++){ + + for (int i = 0; it.hasNext(); i++) { String res = it.next(); - assertEquals(i+"",res); + assertEquals(i + "", res); } - - try { + + try { it.next(); - } catch (NoSuchElementException ex) { - assertEquals(ex.getClass(),NoSuchElementException.class); - } + } catch (NoSuchElementException ex) { + assertEquals(ex.getClass(), NoSuchElementException.class); + } } - } diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java index 2dfbdb9ea8..c24c93be14 100644 --- a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java @@ -3,122 +3,151 @@ import static util.Print.*; import static util.TestUtil.*; -import java.util.Arrays; -import java.util.Date; -import java.util.NoSuchElementException; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import collection.Iterator; -import collection.List; import collection.concrete.LinkedList; import junit.framework.TestCase; - public class LinkedListTest2 extends TestCase { LinkedList myLL; - + + @Override @Before public void setUp() throws Exception { myLL = new LinkedList(); - assertEquals(0,myLL.size()); + assertEquals(0, myLL.size()); } + @Override @After public void tearDown() throws Exception { myLL = null; } - - @Test public void testReverse() { - addIntWithNatureOrder(myLL,5); + addIntWithNatureOrder(myLL, 5); myLL.reverse(); for (int i = 0; i < 5; i++) { int acutal = myLL.get(i); - assertEquals(4-i,acutal); + assertEquals(4 - i, acutal); } } - - + @Test public void testRemoveFirstHalf() { - addIntWithNatureOrder(myLL,5); + myLL = new LinkedList(); + addIntWithNatureOrder(myLL, 5); + myLL.removeFirstHalf(); + assertEquals(3, myLL.size()); + assertEquals(2, (int) myLL.get(0)); + assertEquals(3, (int) myLL.get(1)); + assertEquals(4, (int) myLL.get(2)); + + myLL = new LinkedList(); myLL.removeFirstHalf(); - assertEquals(3,myLL.size()); - assertEquals(2,(int)myLL.get(0)); - assertEquals(3,(int)myLL.get(1)); - assertEquals(4,(int)myLL.get(2)); + println(myLL); + assertEquals(0, myLL.size()); + } - + @Test public void testRemove2() { - addIntWithNatureOrder(myLL,5); - myLL.remove(1,2); - assertEquals(3,myLL.size()); - assertEquals(0,(int)myLL.get(0)); - assertEquals(3,(int)myLL.get(1)); - assertEquals(4,(int)myLL.get(2)); + addIntWithNatureOrder(myLL, 5); + myLL.remove(1, 2); + assertEquals(3, myLL.size()); + assertEquals(0, (int) myLL.get(0)); + assertEquals(3, (int) myLL.get(1)); + assertEquals(4, (int) myLL.get(2)); + + myLL = new LinkedList(); + try { + myLL.remove(1, 2); + } catch (IndexOutOfBoundsException e) { + + } + + println(myLL); + assertEquals(0, myLL.size()); + } - + @Test public void testGetElements() { - addIntWithNatureOrder(myLL,10); + addIntWithNatureOrder(myLL, 10); LinkedList list = new LinkedList(); list.add(0); list.add(2); list.add(7); - int[] result = myLL.getElements(list); + int[] result = myLL.getElements(list); for (int i = 0; i < result.length; i++) { int expected = list.get(i); int actual = result[i]; - assertEquals(expected,actual); + assertEquals(expected, actual); } + myLL = new LinkedList(); + result = myLL.getElements(list); + println(myLL); + assertEquals(0, myLL.size()); + } - + @Test public void testSubstract() { LinkedList myLL = new LinkedList(); - addIntWithNatureOrder(myLL,10); + addIntWithNatureOrder(myLL, 10); myLL.add(10); myLL.add(10); myLL.add(12); LinkedList list = new LinkedList(); list.add(0); list.add(0); - addIntWithNatureOrder(list,10); + addIntWithNatureOrder(list, 10); list.add(10); list.add(12); list.add(22); myLL.subtract(list); - assertEquals(0,myLL.size()); + assertEquals(0, myLL.size()); + + myLL = new LinkedList(); + list = new LinkedList(); + myLL.subtract(list); + assertEquals(0, myLL.size()); + } - + @Test public void testIntersection() { - addIntWithNatureOrder(myLL,10); + LinkedList list = new LinkedList(); + LinkedList result = myLL.intersection(list); + assertEquals(0, result.size()); + + addIntWithNatureOrder(myLL, 10); myLL.add(10); myLL.add(12); myLL.add(13); myLL.add(24); - LinkedList list = new LinkedList(); + list.add(0); list.add(5); list.add(10); - LinkedList result = myLL.intersection(list); - assertEquals(0,(int)result.get(0)); - assertEquals(5,(int)result.get(1)); - assertEquals(10,(int)result.get(2)); + result = myLL.intersection(list); + assertEquals(0, (int) result.get(0)); + assertEquals(5, (int) result.get(1)); + assertEquals(10, (int) result.get(2)); + + myLL = new LinkedList(); + result = new LinkedList(); + myLL.intersection(list); + assertEquals(0, result.size()); } - - + @Test public void testRemoveDuplicateValues() { @@ -128,13 +157,45 @@ public void testRemoveDuplicateValues() { myLL.add(1); myLL.add(10); myLL.removeDuplicateValues(); - assertEquals(3,myLL.size()); - assertEquals(0,(int)myLL.get(0)); - assertEquals(1,(int)myLL.get(1)); - assertEquals(10,(int)myLL.get(2)); + assertEquals(3, myLL.size()); + assertEquals(0, (int) myLL.get(0)); + assertEquals(1, (int) myLL.get(1)); + assertEquals(10, (int) myLL.get(2)); + + myLL = new LinkedList(); + myLL.removeDuplicateValues(); + assertEquals(0, myLL.size()); + + } + + @Test + public void testRemoveRange() { + + myLL.add(0); + addIntWithNatureOrder(myLL, 10); + myLL.add(9); + myLL.add(10); + myLL.add(12); + myLL.add(13); + myLL.add(24); + + myLL.removeRange(-5, 3); + assertEquals(3, (int) myLL.get(0)); + + myLL.removeRange(3, 4); + assertEquals(3, (int) myLL.get(0)); + + myLL.removeRange(3, 5); + assertEquals(3, (int) myLL.get(0)); + assertEquals(5, (int) myLL.get(1)); + + myLL.removeRange(-3, 11); + assertEquals(12, (int) myLL.get(0)); + + myLL = new LinkedList(); + myLL.removeRange(-1, 10); + assertEquals(0, myLL.size()); + } - - - } diff --git a/group12/382266293/coding/basic/test/collection/QueueTest.java b/group12/382266293/coding/basic/test/collection/QueueTest.java index bbbd076f7d..f52c0d1563 100644 --- a/group12/382266293/coding/basic/test/collection/QueueTest.java +++ b/group12/382266293/coding/basic/test/collection/QueueTest.java @@ -1,6 +1,5 @@ package test.collection; -import static util.Print.*; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -14,12 +13,14 @@ public class QueueTest extends TestCase { private Queue myQueue; - + + @Override @Before public void setUp() throws Exception { - myQueue= new Queue(); + myQueue = new Queue(); } + @Override @After public void tearDown() throws Exception { myQueue = null; @@ -36,20 +37,20 @@ public void testIsEmpty() { 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()); + 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)); @@ -58,25 +59,25 @@ public void testDeQueue() { @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 @@ -97,5 +98,4 @@ public void testAdd() { } } - } diff --git a/group12/382266293/coding/basic/test/collection/StackTest.java b/group12/382266293/coding/basic/test/collection/StackTest.java index d64b3e60f3..75b3732511 100644 --- a/group12/382266293/coding/basic/test/collection/StackTest.java +++ b/group12/382266293/coding/basic/test/collection/StackTest.java @@ -1,7 +1,5 @@ package test.collection; -import static util.Print.*; - import java.util.EmptyStackException; import static util.TestUtil.*; import org.junit.After; @@ -14,12 +12,14 @@ public class StackTest extends TestCase { Stack myStack; - + + @Override @Before public void setUp() throws Exception { - myStack= new Stack(); + myStack = new Stack(); } + @Override @After public void tearDown() throws Exception { myStack = null; @@ -46,12 +46,12 @@ public void testPop() { int size = myStack.size(); for (int i = size; i > 0; i--) { assertEquals(i, myStack.size()); - int expect = i-1; + int expect = i - 1; assertEquals(i, myStack.size()); int actual = myStack.pop(); assertEquals(expect, actual); } - + try { myStack.pop(); fail("no exception throw"); @@ -62,36 +62,35 @@ public void testPop() { @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 @@ -113,7 +112,7 @@ public void testAdd() { expected[i] = actual; myStack.add(actual); } - + int expectedInt; for (int i = 0; i < size; i++) { expectedInt = expected[size - i - 1]; diff --git a/group12/382266293/coding/basic/util/ActionXMLreader.java b/group12/382266293/coding/basic/util/ActionXMLreader.java index 8f6e0eb497..23e024c088 100644 --- a/group12/382266293/coding/basic/util/ActionXMLreader.java +++ b/group12/382266293/coding/basic/util/ActionXMLreader.java @@ -7,14 +7,12 @@ import org.dom4j.Node; import org.dom4j.io.SAXReader; -import static util.Print.*; - public class ActionXMLreader { - public Node getRootNode(String add) { - SAXReader reader = new SAXReader(); - Document document = null; - Node root = null; + public Node getRootNode(String add) { + SAXReader reader = new SAXReader(); + Document document = null; + Node root = null; try { document = reader.read(add); root = document.getRootElement(); @@ -22,32 +20,31 @@ public Node getRootNode(String add) { e.printStackTrace(); } return root; - } + } - public String parseClass(Node root, String attr) { + public String parseClass(Node root, String attr) { - @SuppressWarnings("rawtypes") + @SuppressWarnings("rawtypes") List list = root.selectNodes("action[@name='" + attr + "']"); - String clazz = null; - for(Object o:list){ - Element e = (Element) o; - clazz = e.attributeValue("class"); - } + String clazz = null; + for (Object o : list) { + Element e = (Element) o; + clazz = e.attributeValue("class"); + } return clazz; - } - - public String parseResult(Node root, String attr, String result) { + } + + public String parseResult(Node root, String attr, String result) { - @SuppressWarnings("rawtypes") + @SuppressWarnings("rawtypes") List list = root.selectNodes("action[@name='" + attr + "']/result[@name='" + result + "']"); - - String jsp = null; - for(Object o:list){ - Element e = (Element) o; - jsp = e.getTextTrim(); - } + + String jsp = null; + for (Object o : list) { + Element e = (Element) o; + jsp = e.getTextTrim(); + } return jsp; - } - - + } + } diff --git a/group12/382266293/coding/basic/util/Print.java b/group12/382266293/coding/basic/util/Print.java index 403339f9aa..db18c2a019 100644 --- a/group12/382266293/coding/basic/util/Print.java +++ b/group12/382266293/coding/basic/util/Print.java @@ -3,18 +3,17 @@ import java.util.Arrays; public class Print { - - public static void print(Object o){ + + public static void print(Object o) { System.out.print(o); } - - public static void println(Object o){ + + public static void println(Object o) { System.out.println(o); } - - public static void printArr(Object[] arr) { + + public static void printArr(Object[] arr) { println(Arrays.toString(arr)); } - } diff --git a/group12/382266293/coding/basic/util/TestUtil.java b/group12/382266293/coding/basic/util/TestUtil.java index 009e67ca26..3b607378b5 100644 --- a/group12/382266293/coding/basic/util/TestUtil.java +++ b/group12/382266293/coding/basic/util/TestUtil.java @@ -1,6 +1,5 @@ package util; -import java.util.Arrays; import java.util.Random; import collection.List; @@ -9,16 +8,12 @@ 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_BOUND = 2 << 15; private static final int RANDOM_SIZE = 500; - - - public static int[] getRandomIntArray(int number) { int[] arr = new int[number]; for (int i = 0; i < arr.length; i++) { @@ -26,27 +21,27 @@ public static int[] getRandomIntArray(int number) { } return arr; } - + public static int getRandomNumber() { return random.nextInt(RANDOM_SIZE); } - + public static int getRandomNumber(int bound) { return random.nextInt(bound); } - + public static void addIntWithNatureOrder(List myList, int numbers) { - - for (int acutal = 0; acutal < numbers ; acutal++) { + + 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++) { + for (int i = 0; i < numbers; i++) { actual = random.nextInt(RANDOM_BOUND); result[i] = actual; myList.add(actual); @@ -55,39 +50,39 @@ public static int[] addRandomInt(List myList, int numbers) { } public static void addString(List myList, int num) { - + String actual; - for (int index = 0; index < num ; index++) { + 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--) { + for (int i = myList.size() - 1; i >= 0; i--) { get = myList.get(i); remove = myList.remove(i); - assertEquals(get,remove); + assertEquals(get, remove); } } - + public static void testRemoveAndGetFromTail(LinkedList myList) { E get; E remove; - for(int i = myList.size()-1; i >= 0; i--) { + for (int i = myList.size() - 1; i >= 0; i--) { get = myList.get(i); remove = myList.remove(i); - assertEquals(get,remove); + assertEquals(get, remove); } } public static void enQueueIntWithNatureOrder(Queue myQueue, int numbers) { - - for (int acutal = 0; acutal < numbers ; acutal++) { + + for (int acutal = 0; acutal < numbers; acutal++) { myQueue.enQueue(acutal); } } - + } diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index 85df44e987..8412a68f48 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -1,6 +1,5 @@ package array; -import static util.Print.*; import java.util.Arrays; import java.util.BitSet; diff --git a/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java index 22a3250613..42085c1e25 100644 --- a/group12/382266293/src/array/ArrayUtilTest.java +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -5,7 +5,6 @@ import java.util.Arrays; import java.util.Iterator; import java.util.TreeSet; -import static util.Print.*; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 4731b2f7c8..d1e1f04c47 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -22,6 +22,7 @@ public DownloadThread( Connection conn, int startPos, int endPos){ this.startPos = startPos; this.endPos = endPos; } + @Override public void run(){ System.out.println(this.getName()+" is running"); RandomAccessFile raf = null; diff --git a/group12/382266293/src/com/coderising/download/DownloadUtil.java b/group12/382266293/src/com/coderising/download/DownloadUtil.java index 11e7c50904..8e8f2de727 100644 --- a/group12/382266293/src/com/coderising/download/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/DownloadUtil.java @@ -25,7 +25,7 @@ public static void createTempFile(String tempName, int len) { int length = len; byte[] buffer = new byte[1024]; long times = length / 1024; - int left = (int) (length % 1024); + int left = length % 1024; for (int i = 0; i < times; i++) { temp.write(buffer); } @@ -67,7 +67,7 @@ public static boolean rename(String from, String to) { public static void printDownloadReport(int length, long start, long end) { int time = (int) ((end - start) / 1000); float speed = (float)length / 1024 / 1024 / time; - System.out.println("鍏辫楁椂锛" + time + "s锛屼笅杞介熷害锛 " + (float)(Math.round(speed*1000))/1000 + "Mb/s"); + System.out.println("鍏辫楁椂锛" + time + "s锛屼笅杞介熷害锛 " + (float)(Math.round(speed*100))/100 + "Mb/s"); } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index 882305bdb4..cc77b380a9 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -1,25 +1,17 @@ package com.coderising.download; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - 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 { - - - private final static String EXT = "lyj"; private static DownloadThread[] threadPool; private int finishedCount; public String downloadLocation; - + String url; ConnectionManager cm; DownloadListener listener; @@ -56,12 +48,12 @@ public void execute() { System.out.println("file length:" + length); setLocation("C:\\"); - + String name = conn.getFileName(); setFileName(name); setTempName(name); - - DownloadUtil.createTempFile(tempName,length); + + DownloadUtil.createTempFile(tempName, length); int connNumbers = DownloadUtil.calculateConnects(length); System.out.println(connNumbers + " Threads will be created."); @@ -96,16 +88,16 @@ private void checkLength(int length, Connection conn) { } private void setTempName(String name) { - String temp = name.substring(0,name.lastIndexOf(".")+1) + EXT; - this.tempName = downloadLocation + temp; + String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; + FileDownloader.tempName = downloadLocation + temp; } private void setFileName(String name) { - this.fileName = downloadLocation + name; + FileDownloader.fileName = downloadLocation + name; } private void setLocation(String downloadLocation) { - this.downloadLocation = downloadLocation; + this.downloadLocation = downloadLocation; } private boolean checkFinish(int links) { @@ -142,7 +134,6 @@ public DownloadListener getListener() { return this.listener; } - private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, int length) throws ConnectionException { int connectionNumbers = threadPool.length; @@ -162,7 +153,7 @@ private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, setAndStartThread(threadPool[i], tempName); } } - + private void setAndStartThread(DownloadThread downloadThread, String dest) { downloadThread.setDest(dest); downloadThread.setFileDownloader(this); diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index 1dcd26a807..ae24faa19f 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -10,6 +10,7 @@ public class FileDownloaderTest { boolean downloadFinished = false; + @Before public void setUp() throws Exception { } @@ -18,22 +19,21 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } - public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; - public static String office2013 = "http://soft1.xitongzhijia.net:808/201407/Office2013_32_XiTongZhiJia.rar"; + @Test public void testDownload() { - + String url = "http://localhost:8080/test.jpg"; - FileDownloader downloader = new FileDownloader(office2013); + FileDownloader downloader = new FileDownloader(foxmail); - ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); - + downloader.setListener(new DownloadListener() { @Override public void notifyFinished() { @@ -42,22 +42,19 @@ public void notifyFinished() { }); - downloader.execute(); - + // 绛夊緟澶氱嚎绋嬩笅杞界▼搴忔墽琛屽畬姣 while (!downloadFinished) { try { System.out.println("杩樻病鏈変笅杞藉畬鎴愶紝浼戠湢浜旂"); - //浼戠湢5绉 + // 浼戠湢5绉 Thread.sleep(15000); - } catch (InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("涓嬭浇瀹屾垚锛"); - - } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index f34abb3b05..05f31103de 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,16 +1,11 @@ package com.coderising.download.impl; -import static util.Print.println; - import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -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; import sun.net.www.protocol.http.HttpURLConnection; diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java index a50884c256..4d44301b0d 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -7,8 +7,6 @@ import com.coderising.download.api.ConnectionException; import com.coderising.download.api.ConnectionManager; -import sun.net.www.protocol.http.HttpURLConnection; - public class ConnectionManagerImpl implements ConnectionManager { private int connections = 0; diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java index ca598f8f03..834a68d702 100644 --- a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java @@ -5,13 +5,11 @@ import java.io.IOException; public class DownloadUtil { - - + public static long getCurrentTime() { return System.currentTimeMillis(); } - - + public static void createTempFile(String tempName, int len) { File file = new File(tempName); if (file.exists()) { @@ -24,7 +22,7 @@ public static void createTempFile(String tempName, int len) { int length = len; byte[] buffer = new byte[1024]; long times = length / 1024; - int left = (int) (length % 1024); + int left = length % 1024; for (int i = 0; i < times; i++) { temp.write(buffer); } @@ -42,6 +40,5 @@ public static void createTempFile(String tempName, int len) { } } } - - + } diff --git a/group12/382266293/src/litestruts/ConfigurationTest.java b/group12/382266293/src/litestruts/ConfigurationTest.java index ac86e30695..1b5d2f43e1 100644 --- a/group12/382266293/src/litestruts/ConfigurationTest.java +++ b/group12/382266293/src/litestruts/ConfigurationTest.java @@ -1,12 +1,9 @@ package litestruts; -import static org.junit.Assert.*; - import java.util.HashMap; import java.util.Map; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index cb7593c657..df9c4ed535 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -10,7 +10,6 @@ import java.util.HashMap; import java.util.Map; import org.dom4j.Node; -import static util.Print.*; public class Struts { @@ -28,7 +27,7 @@ public static View runAction(String actionName, Map parameters){ PropertyDescriptor[] pd = bi.getPropertyDescriptors(); setParameters(actionObj, pd, parameters); - String executeResult = (String) getResult(actionObj, bi, "execute"); + String executeResult = getResult(actionObj, bi, "execute"); String jsp = reader.parseResult(root, actionName, executeResult); Map readParamters = getReadParameters(actionObj, pd); diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java index ea1c6646cd..a705772df2 100644 --- a/group12/382266293/src/test.java +++ b/group12/382266293/src/test.java @@ -1,20 +1,11 @@ import static util.Print.println; -import java.io.BufferedInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.FileNameMap; import java.net.URL; -import java.net.URLDecoder; import java.util.LinkedList; -import java.util.List; -import java.util.Map; - import sun.net.www.protocol.http.HttpURLConnection; public class test { From aca0e519c326e036b9b2f1d84ba2ef9f5865e9e7 Mon Sep 17 00:00:00 2001 From: BlindingDark Date: Fri, 10 Mar 2017 18:56:23 +0800 Subject: [PATCH 095/177] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ajie9608 <1778842360@qq.com> --- group26/1778842360/first heomework/.classpath | 6 + group26/1778842360/first heomework/.project | 17 ++ .../.settings/org.eclipse.jdt.core.prefs | 11 + .../first heomework/src/ArrayList.java | 149 +++++++++++++ .../first heomework/src/ArrayTest.java | 27 +++ .../first heomework/src/BinaryTreeNode.java | 34 +++ .../first heomework/src/Iterator.java | 7 + .../first heomework/src/LinkedList.java | 209 ++++++++++++++++++ .../first heomework/src/LinkedTest.java | 34 +++ .../1778842360/first heomework/src/List.java | 8 + .../1778842360/first heomework/src/Queue.java | 28 +++ .../first heomework/src/QueueTest.java | 21 ++ .../1778842360/first heomework/src/Stack.java | 35 +++ .../first heomework/src/StackTest.java | 24 ++ 14 files changed, 610 insertions(+) create mode 100644 group26/1778842360/first heomework/.classpath create mode 100644 group26/1778842360/first heomework/.project create mode 100644 group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs create mode 100644 group26/1778842360/first heomework/src/ArrayList.java create mode 100644 group26/1778842360/first heomework/src/ArrayTest.java create mode 100644 group26/1778842360/first heomework/src/BinaryTreeNode.java create mode 100644 group26/1778842360/first heomework/src/Iterator.java create mode 100644 group26/1778842360/first heomework/src/LinkedList.java create mode 100644 group26/1778842360/first heomework/src/LinkedTest.java create mode 100644 group26/1778842360/first heomework/src/List.java create mode 100644 group26/1778842360/first heomework/src/Queue.java create mode 100644 group26/1778842360/first heomework/src/QueueTest.java create mode 100644 group26/1778842360/first heomework/src/Stack.java create mode 100644 group26/1778842360/first heomework/src/StackTest.java diff --git a/group26/1778842360/first heomework/.classpath b/group26/1778842360/first heomework/.classpath new file mode 100644 index 0000000000..fb565a588d --- /dev/null +++ b/group26/1778842360/first heomework/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group26/1778842360/first heomework/.project b/group26/1778842360/first heomework/.project new file mode 100644 index 0000000000..88536f7819 --- /dev/null +++ b/group26/1778842360/first heomework/.project @@ -0,0 +1,17 @@ + + + first heomework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs b/group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group26/1778842360/first heomework/.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/group26/1778842360/first heomework/src/ArrayList.java b/group26/1778842360/first heomework/src/ArrayList.java new file mode 100644 index 0000000000..79c83046be --- /dev/null +++ b/group26/1778842360/first heomework/src/ArrayList.java @@ -0,0 +1,149 @@ + +//package javaTest; + +import java.util.Arrays; + +public class ArrayList { + + private Object[] elementData=new Object[2]; + int size; + //添加元素 + public void add(Object o) + { + if(sizei;x--) + { + if(x==index+1) + { + elementData[x]=t; + } + else + { + elementData[x]=elementData[x-1]; + } + + } + } + } + } + public Iterator iterator() + { + return new ArrayListIterator(this); + } + private class ArrayListIterator implements Iterator + { + ArrayList l=null; + int pos=0; + private ArrayListIterator(ArrayList l) + { + this.l=l; + } + public boolean hasNext() { + // TODO Auto-generated method stub + boolean flag=true; + pos++; + if(pos>size) + { + flag=false; + } + return flag; + } + + public Object next() { + // TODO Auto-generated method stub + + return elementData[pos-1]; + } + } + + + + +} + diff --git a/group26/1778842360/first heomework/src/ArrayTest.java b/group26/1778842360/first heomework/src/ArrayTest.java new file mode 100644 index 0000000000..4a5a9eabe5 --- /dev/null +++ b/group26/1778842360/first heomework/src/ArrayTest.java @@ -0,0 +1,27 @@ + +//package javaTest; + +public class ArrayTest { + + /** + * @param args + * 模拟ArrayList实现对元素的增删查找 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + ArrayList a=new ArrayList(); + a.add("hello"); + a.add("java"); + a.add("world"); + a.add("hello"); + // a.add(2,"hello"); + Iterator it=a.iterator(); + while(it.hasNext()) + { + System.out.print(it.next()+" "); + } + System.out.println(a.size()); + } + +} + diff --git a/group26/1778842360/first heomework/src/BinaryTreeNode.java b/group26/1778842360/first heomework/src/BinaryTreeNode.java new file mode 100644 index 0000000000..b5e788838e --- /dev/null +++ b/group26/1778842360/first heomework/src/BinaryTreeNode.java @@ -0,0 +1,34 @@ + +//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/group26/1778842360/first heomework/src/Iterator.java b/group26/1778842360/first heomework/src/Iterator.java new file mode 100644 index 0000000000..dbb092f46e --- /dev/null +++ b/group26/1778842360/first heomework/src/Iterator.java @@ -0,0 +1,7 @@ + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group26/1778842360/first heomework/src/LinkedList.java b/group26/1778842360/first heomework/src/LinkedList.java new file mode 100644 index 0000000000..0f63676418 --- /dev/null +++ b/group26/1778842360/first heomework/src/LinkedList.java @@ -0,0 +1,209 @@ +//package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + int size; + public void add(Object o){ + if(head==null) + { + head=new Node(o); + head.next=null; + head.data=o; + } + else{ + Node p=head; + { + while(p.next!=null) + { + p=p.next; + } + Node n=new Node(o); + p.next=n; + n.data=o; + n.next=null; + } + } + size++; + } + public void add(int index , Object o){ + int i=1; + Node p=head; + while(iindex) {return null;} + return p.data; + } + public Object remove(int index){ + int i=1; + Node p=head; + Object o=null; + if(index==1) + { + o=head.data; + if(head.next!=null) + { + p=head.next; + head.data=p.data; + p=head; + } + else{ + head=null; + } + } + else{ + while(i0) + { + flag=false; + } + return flag; + } + + public int size(){ + return l.size; + } +} + diff --git a/group26/1778842360/first heomework/src/QueueTest.java b/group26/1778842360/first heomework/src/QueueTest.java new file mode 100644 index 0000000000..81131511c9 --- /dev/null +++ b/group26/1778842360/first heomework/src/QueueTest.java @@ -0,0 +1,21 @@ + +//package com.coding.basic; + +public class QueueTest { + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + Queue q=new Queue(); + q.enQueue("add"); + q.enQueue("world"); + int length=q.size(); + System.out.println(length); + System.out.println(q.deQueue()); + System.out.println(q.isEmpty()); + } + +} + diff --git a/group26/1778842360/first heomework/src/Stack.java b/group26/1778842360/first heomework/src/Stack.java new file mode 100644 index 0000000000..20cdba1c4b --- /dev/null +++ b/group26/1778842360/first heomework/src/Stack.java @@ -0,0 +1,35 @@ + +//package javaTest; + +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(){ + boolean flag=true; + if(elementData.size>0) + { + flag=false; + } + return flag; + } + //获取栈的大小 + public int size(){ + return elementData.size; + } +} + diff --git a/group26/1778842360/first heomework/src/StackTest.java b/group26/1778842360/first heomework/src/StackTest.java new file mode 100644 index 0000000000..271ba04daf --- /dev/null +++ b/group26/1778842360/first heomework/src/StackTest.java @@ -0,0 +1,24 @@ +//package javaTest; + +public class StackTest { + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + Stack s=new Stack(); + s.push("world"); + s.push("java"); + s.push("world"); + Object o1=s.peek(); + System.out.println(o1); + Object o=s.pop(); + System.out.println(o); + int size=s.size(); + System.out.println(size); + System.out.println(s.isEmpty()); + } + +} + From 1e1f7ded7ecc5d2e1bf5910f5655bc93d6ec9149 Mon Sep 17 00:00:00 2001 From: BlindingDark Date: Fri, 10 Mar 2017 18:56:23 +0800 Subject: [PATCH 096/177] =?UTF-8?q?.gitignore=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group26/1778842360/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 group26/1778842360/.gitignore diff --git a/group26/1778842360/.gitignore b/group26/1778842360/.gitignore new file mode 100644 index 0000000000..4f4c622218 --- /dev/null +++ b/group26/1778842360/.gitignore @@ -0,0 +1,2 @@ +/bin +/.project/.classpath \ No newline at end of file From 94489fc4fdd80ce334aa3fb69e42d5b08a58a617 Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Sat, 11 Mar 2017 23:12:51 +0800 Subject: [PATCH 097/177] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4=EF=BC=8C=E4=BD=9C=E4=B8=9A=E5=BE=85?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group12/247565311/week2/ArrayUtil.java | 1 + group12/247565311/week3/DownloadThread.java | 53 ++++ group12/247565311/week3/FileDownloader.java | 74 +++++ .../247565311/week3/FileDownloaderTest.java | 45 ++++ group12/247565311/week3/LinkedList.java | 252 ++++++++++++++++++ group12/247565311/week3/LinkedListTest.java | 244 +++++++++++++++++ group12/247565311/week3/api/Connection.java | 24 ++ .../week3/api/ConnectionException.java | 5 + .../week3/api/ConnectionManager.java | 10 + .../247565311/week3/api/DownloadListener.java | 5 + .../247565311/week3/impl/ConnectionImpl.java | 43 +++ .../week3/impl/ConnectionManagerImpl.java | 28 ++ 12 files changed, 784 insertions(+) create mode 100644 group12/247565311/week3/DownloadThread.java create mode 100644 group12/247565311/week3/FileDownloader.java create mode 100644 group12/247565311/week3/FileDownloaderTest.java create mode 100644 group12/247565311/week3/LinkedList.java create mode 100644 group12/247565311/week3/LinkedListTest.java create mode 100644 group12/247565311/week3/api/Connection.java create mode 100644 group12/247565311/week3/api/ConnectionException.java create mode 100644 group12/247565311/week3/api/ConnectionManager.java create mode 100644 group12/247565311/week3/api/DownloadListener.java create mode 100644 group12/247565311/week3/impl/ConnectionImpl.java create mode 100644 group12/247565311/week3/impl/ConnectionManagerImpl.java diff --git a/group12/247565311/week2/ArrayUtil.java b/group12/247565311/week2/ArrayUtil.java index b76726b7b5..00bab36625 100644 --- a/group12/247565311/week2/ArrayUtil.java +++ b/group12/247565311/week2/ArrayUtil.java @@ -195,6 +195,7 @@ public String join(int[] array, String seperator){ if(array == null) return ""; int lena = array.length; String res = ""; + for(int i=0;i endPos) + curEndPos = endPos; + try { + byte[] data = conn.read(startPos, curEndPos); + FileChannel channel = FileChannel.open(filepath,StandardOpenOption.WRITE); + // System.out.println("startPos"+startPos + ", length:"+data.length); + buffer.put(data); + channel.write(buffer); + } catch (IOException e) { + //e.printStackTrace(); + System.out.println("写文件错误"); + } + // } + conn.close(); + } +} diff --git a/group12/247565311/week3/FileDownloader.java b/group12/247565311/week3/FileDownloader.java new file mode 100644 index 0000000000..c5ab5fb5d0 --- /dev/null +++ b/group12/247565311/week3/FileDownloader.java @@ -0,0 +1,74 @@ +package week3; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import week3.api.Connection; +import week3.api.ConnectionException; +import week3.api.ConnectionManager; +import week3.api.DownloadListener; +import week3.impl.ConnectionManagerImpl; + +public class FileDownloader { + private String url = null,path=null; + DownloadListener listener = null; + private ConnectionManager cm = new ConnectionManagerImpl(); + + public FileDownloader(String weburl,String localpath) { + this.url = weburl; + this.path = localpath; + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + Connection conn = null; + try { + conn = cm.open(this.url); + int length = conn.getContentLength(); + // 鍦ㄨ繖閲屽垱寤哄嚭涓涓悓鏍峰ぇ灏忕殑绌烘枃浠讹紝 璺緞鏄痯ath + RandomAccessFile tarfile = new RandomAccessFile(path,"rw"); + tarfile.setLength(length); + tarfile.close(); + Thread[] threads = new Thread[4]; + threads[0] = new DownloadThread(cm.open(this.url),0,length/4,path); + threads[1] = new DownloadThread(cm.open(this.url),length/4,length/2,path); + threads[2] = new DownloadThread(cm.open(this.url),length/2,3*length/4,path); + threads[3] = new DownloadThread(cm.open(this.url),3*length/4,length,path); + for(int i=0;i<4;i++) + threads[i].start(); + threads[0].join(); + threads[1].join(); + threads[2].join(); + threads[3].join(); + this.getListener().notifyFinished(); + } catch (ConnectionException | IOException | InterruptedException 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/group12/247565311/week3/FileDownloaderTest.java b/group12/247565311/week3/FileDownloaderTest.java new file mode 100644 index 0000000000..96893b71e9 --- /dev/null +++ b/group12/247565311/week3/FileDownloaderTest.java @@ -0,0 +1,45 @@ +package week3; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import week3.api.ConnectionManager; +import week3.api.DownloadListener; +import week3.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://edmullen.net/test/rc.jpg"; + String path = "D:\\hellp.jpg"; + FileDownloader downloader = new FileDownloader(url,path); + 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("杩樻病鏈変笅杞藉畬鎴愶紝浼戠湢浜旂"); + Thread.sleep(5000);//浼戠湢5绉 + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("涓嬭浇瀹屾垚锛"); + } +} diff --git a/group12/247565311/week3/LinkedList.java b/group12/247565311/week3/LinkedList.java new file mode 100644 index 0000000000..dbf9465386 --- /dev/null +++ b/group12/247565311/week3/LinkedList.java @@ -0,0 +1,252 @@ +package week3; + + +import java.util.NoSuchElementException; + +import week1.Iterator; +import week1.List; + +public class LinkedList implements List { + private Node head = new Node(); + private int size = 0; + private void checkAddIndex(int index){ + if(index > size || index<0) throw new IndexOutOfBoundsException("Index:"+index+", Size:"+size); + } + private void checkGetIndex(int index){ + if(index >= size || index<0) throw new IndexOutOfBoundsException("Index:"+index+", Size:"+size); + } + public void add(Object o){ + Node newNode = new Node(o),p = head; + while(p.next!=null) + p = p.next; + p.next = newNode; + size += 1; + } + /** + * + * */ + public void add(int index , Object o){ + checkAddIndex(index); + Node p = head; + for(int i=0;i7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + Node rhead = new Node(),p=head; + for(int i=0;i5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + int numToRemove = size/2; + for(int i=0;i101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + int []res = new int[list.size()]; + Node p = head.next,q = list.head.next; + int lenl = list.size(),index=0; + for(int i=0;imax) return; // 目标区间 (min,max) + Node p = head; + while(p.next != null && ((Integer)p.next.data).intValue()<=min) // 跳过不相干的元素 + p = p.next; + while(p.next != null && ((Integer)p.next.data).intValue()=endPos) return null; + byte[]res = null; + conn.setRequestProperty("Range","bytes="+startPos+"-"+endPos); + int responcode = conn.getResponseCode(); + if(200 < responcode && responcode < 300){ + InputStream input = conn.getInputStream(); + res = new byte[endPos-startPos]; + input.read(res); + input.close(); + } + conn.disconnect(); + return res; + } + + @Override + public int getContentLength() { + if(conn == null) return 0; + return conn.getContentLength(); + } + + @Override + public void close() { + if(conn == null) return; + conn.disconnect(); + } + public void setConn(HttpURLConnection urlconn) { + conn = urlconn; + } +} diff --git a/group12/247565311/week3/impl/ConnectionManagerImpl.java b/group12/247565311/week3/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..68e458b1ca --- /dev/null +++ b/group12/247565311/week3/impl/ConnectionManagerImpl.java @@ -0,0 +1,28 @@ +package week3.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +import week3.api.Connection; +import week3.api.ConnectionException; +import week3.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + URL urllink = null; + ConnectionImpl conImpl = null; + @Override + public Connection open(String url) throws ConnectionException { + try { + URL urllink = new URL(url); + conImpl = new ConnectionImpl(); + HttpURLConnection httpconn = (HttpURLConnection)urllink.openConnection(); + httpconn.setConnectTimeout(5*1000); + httpconn.setRequestProperty("User-Agent","Mozilla/4.0 (compatiable; MSIE 5.0; Windows NT; DigExt)"); // 模拟浏览器 + conImpl.setConn(httpconn); + } catch (Exception e) { + throw (ConnectionException)e; + } + return conImpl; + } +} From c8c48b0f07e376e679eb88bd00f191c630be4bfd Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Sun, 12 Mar 2017 10:07:08 +0800 Subject: [PATCH 098/177] record01 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 瀹屾垚 ArrayList鐨勫疄鐜帮紝鍙傝冧簡jdk婧愮爜涓鍐呴儴绫籌ter鐨勫疄鐜版柟寮 --- .../Exercise/src/lesson01/ArrayList.java | 124 +++++++++++++++--- .../Exercise/src/lesson01/List.java | 13 +- 2 files changed, 117 insertions(+), 20 deletions(-) diff --git a/group13/1274639949/Exercise/src/lesson01/ArrayList.java b/group13/1274639949/Exercise/src/lesson01/ArrayList.java index c7c17f2c0f..45fbd42c1a 100644 --- a/group13/1274639949/Exercise/src/lesson01/ArrayList.java +++ b/group13/1274639949/Exercise/src/lesson01/ArrayList.java @@ -1,6 +1,7 @@ package lesson01; import java.util.Arrays; +import java.util.NoSuchElementException; public class ArrayList implements List { @@ -49,64 +50,149 @@ public void add(int index, E element) { @Override public void clear() { - elementData = new Object[DEFAULT_CAPACITY]; + elementData = new Object[elementData.length]; size = 0; } @Override public boolean contains(Object o) { - for(int i = 0; i < size; i++){ - + if(o == null){ + for(int i = 0; i < size; i++){ + if(elementData[i] == null){ + return true; + } + } + }else{ + for(int i = 0; i < size; i++){ + if(o.equals(elementData[i])){ + return true; + } + } } return false; } @Override public int indexOf(Object o) { - // TODO Auto-generated method stub - return 0; + 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; } + @SuppressWarnings("unchecked") @Override public E get(int index) { - // TODO Auto-generated method stub - return null; + checkIndex(index); + return (E) elementData[index]; } + private void checkIndex(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("Illegal index:" + index); + } + } + + @SuppressWarnings("unchecked") @Override public E remove(int index) { - // TODO Auto-generated method stub - return null; + checkIndex(index); + + E e = (E) elementData[index]; + //姝ゅ搴旀敞鎰忚鍒ゆ柇index鏄惁涓篹lementData鏈鍚庝竴涓厓绱犵殑涓嬫爣锛屽洜涓哄湪涓嬮潰鐨刟rrayCopy鏂规硶涓璁块棶index+1鐨勪綅缃紝姝ゆ椂鏈夊彲鑳藉彂鐢熸暟缁勮秺鐣屻 + if(index == size -1){ + size --; + }else{ + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + } + return e; } @Override public boolean remove(Object o) { - // TODO Auto-generated method stub - return false; + int index = indexOf(o); + if(index >= 0){ + remove(index); + return true; + }else{ + return false; + } } + @SuppressWarnings("unchecked") @Override public E set(int index, E element) { - // TODO Auto-generated method stub - return null; + checkIndex(index); + E e = (E)elementData[index]; + elementData[index] = element; + return e; } @Override public int size() { - // TODO Auto-generated method stub - return 0; + return size; } @Override public Object[] toArray() { - // TODO Auto-generated method stub - return null; + return Arrays.copyOf(elementData, size); + } + + /** + * 灏咥rrayList涓叏閮ㄥ厓绱犲瓨鍏ヤ竴涓繍琛屾椂纭畾绫诲瀷鐨勬暟缁勪腑 + * @param t + * @return + */ + @SuppressWarnings("unchecked") + public T[] toArray(T[] t){ + if(t.length < size){ + t = (T[]) Arrays.copyOf(elementData, size, t.getClass()); + }else{ + System.arraycopy(elementData, 0, t, 0, size); + } + return t; } @Override public Iterator iterator() { - // TODO Auto-generated method stub - return null; + return new Iter(); } + + private final class Iter implements Iterator{ + + int pos = 0; + int lastRet = -1; + + @Override + public boolean hasNext() { + return pos < size; + } + @Override + public E next() { + if(!hasNext()){ + throw new NoSuchElementException(); + } + lastRet = pos++; + return get(lastRet); + } + + @Override + public void remove() { + if(lastRet < 0){ + throw new IllegalStateException(); + } + ArrayList.this.remove(lastRet); + } + } } diff --git a/group13/1274639949/Exercise/src/lesson01/List.java b/group13/1274639949/Exercise/src/lesson01/List.java index a477383b82..b6b2d7c554 100644 --- a/group13/1274639949/Exercise/src/lesson01/List.java +++ b/group13/1274639949/Exercise/src/lesson01/List.java @@ -1,27 +1,32 @@ package lesson01; public interface List { + /** * 鍦↙ist鐨勬渶鍚庝竴涓厓绱犲悗娣诲姞涓涓厓绱 * @param e 娣诲姞鐨勫厓绱 */ public boolean add(E e); + /** * 鍦↙ist鐨刬ndex浣嶇疆鍔犲叆鍏冪礌element * @param index * @param element */ public void add(int index, E element); + /** * 娓呯┖璇ist */ public void clear(); + /** * 鍒ゆ柇List涓槸鍚﹀惈鏈夊璞 * @param o * @return 濡傛灉o瀛樺湪浜庤List涓垯杩斿洖true锛 鍚﹀垯杩斿洖false */ public boolean contains(Object o); + /** * 濡傛灉o瀛樺湪浜庤List涓紝鍒欒繑鍥炲畠绗竴娆″嚭鐜扮殑浣嶇疆 * 绗竴涓厓绱犵殑浣嶇疆涓0 @@ -31,18 +36,24 @@ public interface List { */ public int indexOf(Object o); + public E get(int index); + public E remove(int index); + public boolean remove(Object o); + public E set(int index, E element); + public int size(); + public Object[] toArray(); + public Iterator iterator(); - } From 7197e7be95c51b4ebd7d35652cb4c8df4ad272f1 Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Sun, 12 Mar 2017 10:11:56 +0800 Subject: [PATCH 099/177] Revert "record01" This reverts commit c8c48b0f07e376e679eb88bd00f191c630be4bfd. --- .../Exercise/src/lesson01/ArrayList.java | 124 +++--------------- .../Exercise/src/lesson01/List.java | 13 +- 2 files changed, 20 insertions(+), 117 deletions(-) diff --git a/group13/1274639949/Exercise/src/lesson01/ArrayList.java b/group13/1274639949/Exercise/src/lesson01/ArrayList.java index 45fbd42c1a..c7c17f2c0f 100644 --- a/group13/1274639949/Exercise/src/lesson01/ArrayList.java +++ b/group13/1274639949/Exercise/src/lesson01/ArrayList.java @@ -1,7 +1,6 @@ package lesson01; import java.util.Arrays; -import java.util.NoSuchElementException; public class ArrayList implements List { @@ -50,149 +49,64 @@ public void add(int index, E element) { @Override public void clear() { - elementData = new Object[elementData.length]; + elementData = new Object[DEFAULT_CAPACITY]; size = 0; } @Override public boolean contains(Object o) { - if(o == null){ - for(int i = 0; i < size; i++){ - if(elementData[i] == null){ - return true; - } - } - }else{ - for(int i = 0; i < size; i++){ - if(o.equals(elementData[i])){ - return true; - } - } + for(int i = 0; i < size; i++){ + } 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(o.equals(elementData[i])){ - return i; - } - } - } - return -1; + // TODO Auto-generated method stub + return 0; } - @SuppressWarnings("unchecked") @Override public E get(int index) { - checkIndex(index); - return (E) elementData[index]; + // TODO Auto-generated method stub + return null; } - private void checkIndex(int index) { - if(index < 0 || index >= size){ - throw new IndexOutOfBoundsException("Illegal index:" + index); - } - } - - @SuppressWarnings("unchecked") @Override public E remove(int index) { - checkIndex(index); - - E e = (E) elementData[index]; - //姝ゅ搴旀敞鎰忚鍒ゆ柇index鏄惁涓篹lementData鏈鍚庝竴涓厓绱犵殑涓嬫爣锛屽洜涓哄湪涓嬮潰鐨刟rrayCopy鏂规硶涓璁块棶index+1鐨勪綅缃紝姝ゆ椂鏈夊彲鑳藉彂鐢熸暟缁勮秺鐣屻 - if(index == size -1){ - size --; - }else{ - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - } - return e; + // TODO Auto-generated method stub + return null; } @Override public boolean remove(Object o) { - int index = indexOf(o); - if(index >= 0){ - remove(index); - return true; - }else{ - return false; - } + // TODO Auto-generated method stub + return false; } - @SuppressWarnings("unchecked") @Override public E set(int index, E element) { - checkIndex(index); - E e = (E)elementData[index]; - elementData[index] = element; - return e; + // TODO Auto-generated method stub + return null; } @Override public int size() { - return size; + // TODO Auto-generated method stub + return 0; } @Override public Object[] toArray() { - return Arrays.copyOf(elementData, size); - } - - /** - * 灏咥rrayList涓叏閮ㄥ厓绱犲瓨鍏ヤ竴涓繍琛屾椂纭畾绫诲瀷鐨勬暟缁勪腑 - * @param t - * @return - */ - @SuppressWarnings("unchecked") - public T[] toArray(T[] t){ - if(t.length < size){ - t = (T[]) Arrays.copyOf(elementData, size, t.getClass()); - }else{ - System.arraycopy(elementData, 0, t, 0, size); - } - return t; + // TODO Auto-generated method stub + return null; } @Override public Iterator iterator() { - return new Iter(); + // TODO Auto-generated method stub + return null; } - - private final class Iter implements Iterator{ - - int pos = 0; - int lastRet = -1; - - @Override - public boolean hasNext() { - return pos < size; - } - @Override - public E next() { - if(!hasNext()){ - throw new NoSuchElementException(); - } - lastRet = pos++; - return get(lastRet); - } - - @Override - public void remove() { - if(lastRet < 0){ - throw new IllegalStateException(); - } - ArrayList.this.remove(lastRet); - } - } } diff --git a/group13/1274639949/Exercise/src/lesson01/List.java b/group13/1274639949/Exercise/src/lesson01/List.java index b6b2d7c554..a477383b82 100644 --- a/group13/1274639949/Exercise/src/lesson01/List.java +++ b/group13/1274639949/Exercise/src/lesson01/List.java @@ -1,32 +1,27 @@ package lesson01; public interface List { - /** * 鍦↙ist鐨勬渶鍚庝竴涓厓绱犲悗娣诲姞涓涓厓绱 * @param e 娣诲姞鐨勫厓绱 */ public boolean add(E e); - /** * 鍦↙ist鐨刬ndex浣嶇疆鍔犲叆鍏冪礌element * @param index * @param element */ public void add(int index, E element); - /** * 娓呯┖璇ist */ public void clear(); - /** * 鍒ゆ柇List涓槸鍚﹀惈鏈夊璞 * @param o * @return 濡傛灉o瀛樺湪浜庤List涓垯杩斿洖true锛 鍚﹀垯杩斿洖false */ public boolean contains(Object o); - /** * 濡傛灉o瀛樺湪浜庤List涓紝鍒欒繑鍥炲畠绗竴娆″嚭鐜扮殑浣嶇疆 * 绗竴涓厓绱犵殑浣嶇疆涓0 @@ -36,24 +31,18 @@ public interface List { */ public int indexOf(Object o); - public E get(int index); - public E remove(int index); - public boolean remove(Object o); - public E set(int index, E element); - public int size(); - public Object[] toArray(); - public Iterator iterator(); + } From 468d93e9433eaba6a8371e02ba5941a7bfb016ed Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Sun, 12 Mar 2017 10:23:25 +0800 Subject: [PATCH 100/177] record02 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 鍐嶄篃涓嶆暍涔辩偣浜 --- .../Exercise/src/lesson01/ArrayList.java | 124 +++++++++++++++--- .../Exercise/src/lesson01/List.java | 13 +- 2 files changed, 117 insertions(+), 20 deletions(-) diff --git a/group13/1274639949/Exercise/src/lesson01/ArrayList.java b/group13/1274639949/Exercise/src/lesson01/ArrayList.java index c7c17f2c0f..45fbd42c1a 100644 --- a/group13/1274639949/Exercise/src/lesson01/ArrayList.java +++ b/group13/1274639949/Exercise/src/lesson01/ArrayList.java @@ -1,6 +1,7 @@ package lesson01; import java.util.Arrays; +import java.util.NoSuchElementException; public class ArrayList implements List { @@ -49,64 +50,149 @@ public void add(int index, E element) { @Override public void clear() { - elementData = new Object[DEFAULT_CAPACITY]; + elementData = new Object[elementData.length]; size = 0; } @Override public boolean contains(Object o) { - for(int i = 0; i < size; i++){ - + if(o == null){ + for(int i = 0; i < size; i++){ + if(elementData[i] == null){ + return true; + } + } + }else{ + for(int i = 0; i < size; i++){ + if(o.equals(elementData[i])){ + return true; + } + } } return false; } @Override public int indexOf(Object o) { - // TODO Auto-generated method stub - return 0; + 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; } + @SuppressWarnings("unchecked") @Override public E get(int index) { - // TODO Auto-generated method stub - return null; + checkIndex(index); + return (E) elementData[index]; } + private void checkIndex(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("Illegal index:" + index); + } + } + + @SuppressWarnings("unchecked") @Override public E remove(int index) { - // TODO Auto-generated method stub - return null; + checkIndex(index); + + E e = (E) elementData[index]; + //姝ゅ搴旀敞鎰忚鍒ゆ柇index鏄惁涓篹lementData鏈鍚庝竴涓厓绱犵殑涓嬫爣锛屽洜涓哄湪涓嬮潰鐨刟rrayCopy鏂规硶涓璁块棶index+1鐨勪綅缃紝姝ゆ椂鏈夊彲鑳藉彂鐢熸暟缁勮秺鐣屻 + if(index == size -1){ + size --; + }else{ + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + } + return e; } @Override public boolean remove(Object o) { - // TODO Auto-generated method stub - return false; + int index = indexOf(o); + if(index >= 0){ + remove(index); + return true; + }else{ + return false; + } } + @SuppressWarnings("unchecked") @Override public E set(int index, E element) { - // TODO Auto-generated method stub - return null; + checkIndex(index); + E e = (E)elementData[index]; + elementData[index] = element; + return e; } @Override public int size() { - // TODO Auto-generated method stub - return 0; + return size; } @Override public Object[] toArray() { - // TODO Auto-generated method stub - return null; + return Arrays.copyOf(elementData, size); + } + + /** + * 灏咥rrayList涓叏閮ㄥ厓绱犲瓨鍏ヤ竴涓繍琛屾椂纭畾绫诲瀷鐨勬暟缁勪腑 + * @param t + * @return + */ + @SuppressWarnings("unchecked") + public T[] toArray(T[] t){ + if(t.length < size){ + t = (T[]) Arrays.copyOf(elementData, size, t.getClass()); + }else{ + System.arraycopy(elementData, 0, t, 0, size); + } + return t; } @Override public Iterator iterator() { - // TODO Auto-generated method stub - return null; + return new Iter(); } + + private final class Iter implements Iterator{ + + int pos = 0; + int lastRet = -1; + + @Override + public boolean hasNext() { + return pos < size; + } + @Override + public E next() { + if(!hasNext()){ + throw new NoSuchElementException(); + } + lastRet = pos++; + return get(lastRet); + } + + @Override + public void remove() { + if(lastRet < 0){ + throw new IllegalStateException(); + } + ArrayList.this.remove(lastRet); + } + } } diff --git a/group13/1274639949/Exercise/src/lesson01/List.java b/group13/1274639949/Exercise/src/lesson01/List.java index a477383b82..b6b2d7c554 100644 --- a/group13/1274639949/Exercise/src/lesson01/List.java +++ b/group13/1274639949/Exercise/src/lesson01/List.java @@ -1,27 +1,32 @@ package lesson01; public interface List { + /** * 鍦↙ist鐨勬渶鍚庝竴涓厓绱犲悗娣诲姞涓涓厓绱 * @param e 娣诲姞鐨勫厓绱 */ public boolean add(E e); + /** * 鍦↙ist鐨刬ndex浣嶇疆鍔犲叆鍏冪礌element * @param index * @param element */ public void add(int index, E element); + /** * 娓呯┖璇ist */ public void clear(); + /** * 鍒ゆ柇List涓槸鍚﹀惈鏈夊璞 * @param o * @return 濡傛灉o瀛樺湪浜庤List涓垯杩斿洖true锛 鍚﹀垯杩斿洖false */ public boolean contains(Object o); + /** * 濡傛灉o瀛樺湪浜庤List涓紝鍒欒繑鍥炲畠绗竴娆″嚭鐜扮殑浣嶇疆 * 绗竴涓厓绱犵殑浣嶇疆涓0 @@ -31,18 +36,24 @@ public interface List { */ public int indexOf(Object o); + public E get(int index); + public E remove(int index); + public boolean remove(Object o); + public E set(int index, E element); + public int size(); + public Object[] toArray(); + public Iterator iterator(); - } From 1c68a382095ef4570ec4a75d7fd5e360cda5a004 Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Sun, 12 Mar 2017 14:48:03 +0800 Subject: [PATCH 101/177] =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=B7=B2=E5=81=9A?= =?UTF-8?q?=EF=BC=8C=E7=BA=BF=E7=A8=8B=E6=9C=AA=E5=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 绠楁硶宸插仛锛岀嚎绋嬫湭鍋 --- .../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 ++ .../src/com/coding/basic/ArrayList.java | 68 +++++--- .../src/com/coding/basic/LinkedList.java | 145 ++++++++++++++++++ 11 files changed, 426 insertions(+), 24 deletions(-) create mode 100644 group12/446031103/src/com/coderising/download/DownloadThread.java create mode 100644 group12/446031103/src/com/coderising/download/FileDownloader.java create mode 100644 group12/446031103/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group12/446031103/src/com/coderising/download/api/Connection.java create mode 100644 group12/446031103/src/com/coderising/download/api/ConnectionException.java create mode 100644 group12/446031103/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group12/446031103/src/com/coderising/download/api/DownloadListener.java create mode 100644 group12/446031103/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group12/446031103/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group12/446031103/src/com/coderising/download/DownloadThread.java b/group12/446031103/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/download/FileDownloader.java b/group12/446031103/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group12/446031103/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(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group12/446031103/src/com/coderising/download/FileDownloaderTest.java b/group12/446031103/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/download/api/Connection.java b/group12/446031103/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/download/api/ConnectionException.java b/group12/446031103/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group12/446031103/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group12/446031103/src/com/coderising/download/api/ConnectionManager.java b/group12/446031103/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group12/446031103/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group12/446031103/src/com/coderising/download/api/DownloadListener.java b/group12/446031103/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/download/impl/ConnectionImpl.java b/group12/446031103/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group12/446031103/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/group12/446031103/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/446031103/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group12/446031103/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; + } + +} diff --git a/group12/446031103/src/com/coding/basic/ArrayList.java b/group12/446031103/src/com/coding/basic/ArrayList.java index c627a7d2fa..bc3d75c3f6 100644 --- a/group12/446031103/src/com/coding/basic/ArrayList.java +++ b/group12/446031103/src/com/coding/basic/ArrayList.java @@ -2,6 +2,8 @@ import java.util.Arrays; + + /** * * arrayList闆嗗悎-鏁扮粍 @@ -11,10 +13,8 @@ * @date 2017骞2鏈21鏃 涓嬪崍3:49:24 */ public class ArrayList implements List { - // 璁板綍ArrayList闆嗗悎澶у皬 private int size = 0; - // 鍒濆鍖栧瓨鍌ㄦ暟缁 - private Object[] elementData = new Object[100]; + private Object[] elementData = new Object[0]; /** * * 鍚戞渶鍚庢彃鍏ュ厓绱 @@ -24,10 +24,9 @@ public class ArrayList implements List { * @see com.coding.basic.List#add(java.lang.Object) */ public void add(Object o){ - // 鏁扮粍涓嶅鏃跺闀 - growOrNot(size + 1); + ensureCapacity(size + 1); elementData[size] = o; - ++size; + size++; } /** * @@ -40,10 +39,10 @@ public void add(Object o){ */ public void add(int index, Object o){ validate(index); - growOrNot(size + 1); + ensureCapacity(size + 1); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; - ++size; + size++; } /** * @@ -67,12 +66,12 @@ public Object get(int index){ * @return 鍒犻櫎鐨勫厓绱 * @see com.coding.basic.List#remove(int) */ - public Object remove(int index){ - Object oldValue = elementData[index]; + public Object remove(int index){ validate(index); + Object oldValue = elementData[index]; System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); elementData[size] = null; - --size; + size--; return oldValue; } /** @@ -84,25 +83,24 @@ public Object remove(int index){ * @see com.coding.basic.List#size() */ public int size(){ - return size; + return this.size; } - + /** + * 杩唬 + * @return + */ public Iterator iterator(){ - return null; + return new ArrayListIterator(); } /** - * - * 鍒ゆ柇鏄惁闇瑕佸闀挎暟缁 - * - * @MethodName growOrNot - * @author msh - * @date 2017骞2鏈21鏃 涓嬪崍3:53:29 + * 鍒ゆ柇鏄惁闇瑕佹暟缁勫闀 * @param minCapacity */ - private void growOrNot(int minCapacity) { - // 褰撳鍔犻暱搴﹀ぇ浜庢暟缁勯暱搴︽椂锛屽闀 - if (minCapacity > elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 2); + private void ensureCapacity(int minCapacity) { + if(minCapacity>elementData.length){ + int newCapacity = Math.max(minCapacity, elementData.length*2); + Object[] newElementData = new Object[newCapacity]; + System.arraycopy(elementData, 0, newElementData, 0, elementData.length); } } /** @@ -118,4 +116,26 @@ private void validate(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } + /** + * + * @author Administrator + * + */ + private class ArrayListIterator implements Iterator{ + private int position; + private ArrayList list; + @Override + public boolean hasNext() { + return position < list.size(); + } + + @Override + public Object next() { + if (hasNext()) { + return list.get(position++); + } + return null; + } + + } } diff --git a/group12/446031103/src/com/coding/basic/LinkedList.java b/group12/446031103/src/com/coding/basic/LinkedList.java index de508694a0..33f6d79e65 100644 --- a/group12/446031103/src/com/coding/basic/LinkedList.java +++ b/group12/446031103/src/com/coding/basic/LinkedList.java @@ -1,5 +1,12 @@ package com.coding.basic; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.junit.experimental.theories.Theories; + +import sun.reflect.Reflection; + /** * * LinkedList闆嗗悎-閾 @@ -222,4 +229,142 @@ public Node(Object data, Node next) { this.next = next; } } + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + for (int i = size; i <0; i--) { + Node last=(Node) get(i); + if(0==i) + last.next = null; + else + last.next = (Node) get(i-1); + } + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf(){ + + for (int i = 0; i < size%2; i++) { + remove(i); + } + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * @param i + * @param length + */ + public void remove(int i, int length){ + for (int a = i; a < i+length; a++) { + remove(a); + } + + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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){ + int [] result =new int[list.size]; + Class callClass=Reflection.getCallerClass(); + for (int i = 0; i < list.size; i++) { + Node node=(Node) list.get(i); + try { + Method method=callClass.getDeclaredMethod("get", new Class[]{int.class}); + result[i]=(int) method.invoke(callClass, new Object[]{node.data}); + } catch (NoSuchMethodException | 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(); + } + } + return null; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + + * @param list + */ + + public void subtract(LinkedList list){ + for (int i = 0; i < list.size; i++) { + Node node=(Node) list.get(i); + for (int j = 0; j < size; j++) { + Node orgNode=(Node) get(i); + if (node.data.equals(orgNode.data)) { + remove(j); + } + } + } + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues(){ + for (int i = 0; i < size; i++) { + Node node=(Node) get(i); + for (int j = i+1; j < size; j++) { + Node newNode=(Node) get(j); + if(newNode.data.equals(node.data)) + remove(j); + } + } + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + for (int i = 0; i < size; i++) { + Node node=(Node) get(i); + if((int)node.data>min && (int)node.data Date: Sun, 12 Mar 2017 00:10:31 -0800 Subject: [PATCH 102/177] Homework 3rd --- .../coderising/download/DownloadThread.java | 26 ++++++++++++--- .../coderising/download/FileDownloader.java | 17 ++++++---- .../download/FileDownloaderTest.java | 3 +- .../download/impl/ConnectionImpl.java | 33 ++++++++++++++----- 4 files changed, 58 insertions(+), 21 deletions(-) diff --git a/group20/404130810/src/com/coderising/download/DownloadThread.java b/group20/404130810/src/com/coderising/download/DownloadThread.java index 1bbba90c30..02e36f5d10 100644 --- a/group20/404130810/src/com/coderising/download/DownloadThread.java +++ b/group20/404130810/src/com/coderising/download/DownloadThread.java @@ -1,6 +1,9 @@ package com.coderising.download; +import java.io.File; import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CountDownLatch; import com.coderising.download.api.Connection; @@ -9,19 +12,34 @@ public class DownloadThread extends Thread{ Connection conn; int startPos; int endPos; + CountDownLatch latch; + + File file = new File("C://download.mp3"); - public DownloadThread( Connection conn, int startPos, int endPos){ - + public DownloadThread( Connection conn, int startPos, int endPos, CountDownLatch latch){ this.conn = conn; this.startPos = startPos; this.endPos = endPos; + this.latch = latch; } public void run(){ + RandomAccessFile raf = null; try { - conn.read(startPos, endPos); + byte[] byteRead = conn.read(startPos, endPos); + raf = new RandomAccessFile(file, "rw");; + raf.seek(startPos); + raf.write(byteRead); + } catch (IOException e) { - // TODO Auto-generated catch block e.printStackTrace(); + }finally{ + latch.countDown(); + try { + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + conn.close(); } } } \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/download/FileDownloader.java b/group20/404130810/src/com/coderising/download/FileDownloader.java index 5193eaba99..0619cdbc32 100644 --- a/group20/404130810/src/com/coderising/download/FileDownloader.java +++ b/group20/404130810/src/com/coderising/download/FileDownloader.java @@ -1,6 +1,8 @@ package com.coderising.download; import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; import com.coderising.download.api.Connection; import com.coderising.download.api.ConnectionException; @@ -43,22 +45,25 @@ public void execute() throws IOException { conn = cm.open(url); int length = conn.getContentLength(); int[] posArr = FileDownloadUtil.generateDownloadPosArr(length); + CountDownLatch latch = new CountDownLatch(3); for (int i = 0; i < posArr.length; i++) { - if(i == posArr.length - 1){ - new DownloadThread(cm.open(url), posArr[i], length).start(); - }else{ - new DownloadThread(cm.open(url), posArr[i], posArr[i + 1] - 1).start(); + if (i == posArr.length - 1) { + new DownloadThread(cm.open(url), posArr[i], length, latch).start(); + } else { + new DownloadThread(cm.open(url), posArr[i], posArr[i + 1] - 1, latch).start(); } } - + latch.await(); + System.out.println("Download Finished"); } catch (ConnectionException e) { e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); } finally { if (conn != null) { conn.close(); } } - } public void setListener(DownloadListener listener) { diff --git a/group20/404130810/src/com/coderising/download/FileDownloaderTest.java b/group20/404130810/src/com/coderising/download/FileDownloaderTest.java index 46444c9710..784ec00c8a 100644 --- a/group20/404130810/src/com/coderising/download/FileDownloaderTest.java +++ b/group20/404130810/src/com/coderising/download/FileDownloaderTest.java @@ -23,7 +23,7 @@ public void tearDown() throws Exception { @Test public void testDownload() throws IOException { - String url = "http://localhost:8080/test.jpg"; + String url = "http://localhost:8080/MyServer/Test.mp3"; FileDownloader downloader = new FileDownloader(url); @@ -38,7 +38,6 @@ public void notifyFinished() { } }); - downloader.execute(); diff --git a/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java b/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java index 33f693bc96..0970d41749 100644 --- a/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group20/404130810/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,5 +1,7 @@ package com.coderising.download.impl; +import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; @@ -24,16 +26,29 @@ public ConnectionImpl(String urlStr) { @Override public byte[] read(int startPos, int endPos) throws IOException { - int length = endPos - startPos; - byte[] rtnByte = new byte[length]; - - RandomAccessFile raf = new RandomAccessFile("test.mp3", "rw"); - raf.seek(startPos); + System.out.println("Start Reading"); + System.out.println("StartPos: " + startPos); + System.out.println("EndPos: " + endPos); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream is = httpConn.getInputStream(); - while ((length = is.read(rtnByte)) != -1) { - raf.write(rtnByte, 0, length); - } - return rtnByte; + is.skip(startPos); + + int downloadLengh = endPos - startPos; + + byte[] b = new byte[1024]; + int total = 0; + int len = -1; + while ((len = is.read(b)) != -1) { + baos.write(b, 0, len); + total = total + len; + if (total == downloadLengh) { + break; + } + } + is.close(); + baos.close(); + System.out.println("End Reading"); + return baos.toByteArray(); } @Override From e86803d6f051b643a6d368c9a1925491c7f6fb79 Mon Sep 17 00:00:00 2001 From: RalfNick Date: Sun, 12 Mar 2017 16:19:14 +0800 Subject: [PATCH 103/177] Ralf --- .../coderising/download/DownloadThread.java" | 85 +++ .../coderising/download/FileDownloader.java" | 76 +++ .../download/FileDownloaderTest.java" | 58 ++ .../coderising/download/api/Connection.java" | 23 + .../download/api/ConnectionException.java" | 17 + .../download/api/ConnectionManager.java" | 15 + .../download/api/DownloadListener.java" | 5 + .../download/impl/ConnectionImpl.java" | 64 +++ .../download/impl/ConnectionManagerImpl.java" | 56 ++ .../linkedlist/LinkedListTest.java" | 46 ++ .../linkedlist/MyLinkedList.java" | 528 ++++++++++++++++++ ...7\347\253\240\351\223\276\346\216\245.txt" | 1 + 12 files changed, 974 insertions(+) create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/DownloadThread.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloader.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloaderTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/Connection.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionException.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionManager.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/DownloadListener.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionImpl.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionManagerImpl.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedList.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/DownloadThread.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/DownloadThread.java" new file mode 100644 index 0000000000..80ec43e852 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/DownloadThread.java" @@ -0,0 +1,85 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +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 DownloadThread extends Thread { + + + ConnectionManager cm; + int startPos; + int endPos; + String url; + DownloadListener downloadListener; + + public DownloadThread(ConnectionManager cm, String url, int startPos, int endPos, DownloadListener listener) { + + this.cm = cm; + this.startPos = startPos; + this.endPos = endPos; + this.url = url; + this.downloadListener = listener; + } + + @Override + public void run() { + + Connection conn = null; + RandomAccessFile raf = null; + // 闅忔満鍐欐枃浠剁殑鏃跺欎粠鍝釜浣嶇疆寮濮嬪啓 + try { + conn = cm.open(url,startPos,endPos); + } catch (ConnectionException e3) { + // TODO Auto-generated catch block + e3.printStackTrace(); + } + + try { + + byte[] byeArr = conn.read(startPos, endPos); + System.out.println("----::" + byeArr.length); + File file = new File("D:\\111.jpg"); + synchronized (file) { + if (!file.exists()) { + file.createNewFile(); + } + raf = new RandomAccessFile(file, "rw"); + } + //raf.setLength(34134); + raf.seek(startPos);// 瀹氫綅鏂囦欢 + raf.write(byeArr); + + System.out.println("-------"); + + } catch (FileNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (raf != null) { + raf.close(); + } + + } catch (Exception e2) { + // TODO: handle exception + e2.printStackTrace(); + } + if (conn != null) { + conn.close(); + } + if (downloadListener != null) { + downloadListener.notifyFinished(); + } + + } + } +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloader.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloader.java" new file mode 100644 index 0000000000..e97c0a711e --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloader.java" @@ -0,0 +1,76 @@ +package com.coderising.download; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + +public class FileDownloader { + + String url; + DownloadListener listener; + ConnectionManager cm; + int threadSum = 0; + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute() { + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, + // endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 + // 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + // Connection conn = null; + + int threadNum = 3; + + int length = cm.getContentLength(url); + for (int i = 0; i < threadNum; i++) { + + int threadLoadLength = length / threadNum; + int startPos = threadLoadLength * i; + int endPos; + if (i != threadNum - 1) { + endPos = threadLoadLength * (i + 1) - 1; + } else { + endPos = length - 1; + } + threadSum++; + new DownloadThread(cm, this.url, startPos, endPos, new DownloadListener() { + @Override + public void notifyFinished() { + if ((threadSum--) == 0) { + if (listener != null) { + listener.notifyFinished(); + } + } + } + }).start(); + + } + } + + 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/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloaderTest.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloaderTest.java" new file mode 100644 index 0000000000..293e9e00e4 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/FileDownloaderTest.java" @@ -0,0 +1,58 @@ +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://img002.21cnimg.com/photos/album/20160326/m600/B920004B5414AE4C7D6F2BAB2966491E.jpeg"; + + 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/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/Connection.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/Connection.java" new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/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/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionException.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionException.java" new file mode 100644 index 0000000000..1737339909 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionException.java" @@ -0,0 +1,17 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 4776347926322882920L; + + /** + * + */ + public ConnectionException(){ + super(); + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionManager.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionManager.java" new file mode 100644 index 0000000000..3fa8460afb --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/ConnectionManager.java" @@ -0,0 +1,15 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + //public Connection open(String url) throws ConnectionException; + + public int getContentLength(String url); + + Connection open(String url, int startPos, int endPos) + throws ConnectionException; +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/DownloadListener.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/DownloadListener.java" new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/api/DownloadListener.java" @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionImpl.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionImpl.java" new file mode 100644 index 0000000000..b3c26416be --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionImpl.java" @@ -0,0 +1,64 @@ +package com.coderising.download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private HttpURLConnection httpConn; + private InputStream inputStream; + + public ConnectionImpl(HttpURLConnection httpconn) { + // TODO Auto-generated constructor stub + this.httpConn = httpconn; + } + + + //read() 鏂规硶鏈夐棶棰 + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + inputStream = httpConn.getInputStream(); + + System.out.println(startPos + "----" + endPos); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + int len = 0; + byte[] by = new byte[1024]; + + while((len = inputStream.read(by))!= -1){ + byteArrayOutputStream.write(by, 0, len); + } + System.out.println(byteArrayOutputStream.toByteArray().length); + return byteArrayOutputStream.toByteArray(); + + } + + @Override + public int getContentLength() { + if (httpConn != null) { + return httpConn.getContentLength(); + } + return 0; + } + + @Override + public void close() { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if (httpConn != null) { + httpConn.disconnect(); + } + + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionManagerImpl.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionManagerImpl.java" new file mode 100644 index 0000000000..2928fb247f --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/com/coderising/download/impl/ConnectionManagerImpl.java" @@ -0,0 +1,56 @@ +package com.coderising.download.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +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 { + + private HttpURLConnection httpConnection; + + @Override + public Connection open(String url,int startPos,int endPos) throws ConnectionException { + + if (url != null && !("".equals(url))) { + try { + URL urlconn = new URL(url); + httpConnection = (HttpURLConnection) urlconn.openConnection(); + httpConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + return new ConnectionImpl(httpConnection); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return null; + } + + @Override + public int getContentLength(String url) { + // TODO Auto-generated method stub + if (url != null && !("".equals(url))) { + try { + URL urlconn = new URL(url); + httpConnection = (HttpURLConnection) urlconn.openConnection(); + httpConnection.disconnect(); + return httpConnection.getContentLength(); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return 0; + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" new file mode 100644 index 0000000000..4a800335e5 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" @@ -0,0 +1,46 @@ +package com.ralf.linkedlist; + +import BasicData.MyIterator; + +public class LinkedListTest { + + /** + * @param args + */ + @SuppressWarnings("unchecked") + public static void main(String[] args) { + // TODO Auto-generated method stub + MyLinkedList list = new MyLinkedList<>(); + + MyLinkedList listB = new MyLinkedList<>(); + MyLinkedList listC = new MyLinkedList<>(); + list.add(11); + list.add(12); + list.add(13); + list.add(14); + list.add(15); + list.add(17); + list.add(18); + + listB.add(10); + listB.add(12); + listB.add(14); + listB.add(15); + listB.add(18); + + + listC = (MyLinkedList) list.intersection(listB); + + + System.out.println(listC.size()); + + MyIterator iterator = listC.iterator(); + while(iterator.hasNext()){ + Integer integer = iterator.Next(); + System.out.println(integer); + } + + + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedList.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedList.java" new file mode 100644 index 0000000000..7ae0787ed0 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedList.java" @@ -0,0 +1,528 @@ +package com.ralf.linkedlist; + +import java.util.Arrays; +import java.util.Objects; +import java.util.TreeSet; + +import BasicData.MyArrayList; +import BasicData.MyIterator; +import BasicData.MyList; + +public class MyLinkedList> implements MyList { + + private Node head;// 指向头部,始终设置为空 + // private Node tail;// 指向尾部的节点 + private int size; + + public MyLinkedList() { + this.head = new Node(null); + this.size = 0; + } + + private static class Node { + Node next = null; + T item = null; + + public Node(T t) { + item = t; + } + + } + + @Override + public boolean add(T t) { + // TODO Auto-generated method stub + return addLast(t); + } + + @Override + public void add(int index, T t) { + // TODO Auto-generated method stub + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + Node newNode = new Node(t); + if (index == 0) { + Node oldNode = head.next; + head.next = newNode; + newNode.next = oldNode; + size++; + } + + else { + Node current = getNode(index - 1); + newNode.next = current.next; + current.next = newNode; + size++; + } + + } + + @Override + public int size() { + // TODO Auto-generated method stub + return size; + } + + @Override + public T remove(int index) { + // TODO Auto-generated method stub + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } else if (index == 0) { + return removeFirst(); + } else if (index == size - 1) { + return removeLast(); + } else { + Node current = getNode(index - 1); + T data = current.next.item; + current.next.item = null; + current.next = current.next.next; + size--; + return data; + } + } + + @Override + public T set(int index, T t) { + // TODO Auto-generated method stub + Node current = getNode(index); + T data = current.item; + current.item = t; + return data; + } + + @Override + public T get(int index) { + // TODO Auto-generated method stub + T data = getNode(index).item; + return data; + } + + public int indexOf(T t) { + Node current = this.head; + int index = 0; + while (current.next != null) { + current = current.next; + if (Objects.equals(current.item, t)) { + return index; + } + index++; + } + return -1; + } + + private Node getNode(int index) { + + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + Node current = this.head; + int m_size = 0; + while (current.next != null && m_size <= index) { + current = current.next; + m_size++; + } + return current; + } + + public boolean addFirst(T t) { + + if (head.next == null) { + Node current = new Node(t); + head.next = current; + current = null; + size++; + return true; + } else { + Node current = new Node(t); + current.next = head.next; + head.next = current; + size++; + return true; + } + } + + public boolean addLast(T t) { + + if (head.next == null) { + Node current = new Node(t); + head.next = current; + current.next = null; + size++; + return true; + } else { + Node current = new Node(t); + Node oldNode = getNode(size - 1); + oldNode.next = current; + current.next = null; + size++; + return true; + } + + } + + public T removeFirst() { + if (head.next == null) { + return null; + } else if (head.next.next == null) { + T data = head.next.item; + head.next.item = null; + head = null; + size--; + return data; + } else { + T data = head.next.item; + Node current = head.next.next; + head.next.item = null; + head.next = current; + size--; + return data; + } + } + + public T removeLast() { + if (head.next == null) { + return null; + } else if (head.next.next == null) { + T data = head.next.item; + head.next.item = null; + size--; + return data; + } else { + Node current = getNode(size - 2); + T data = current.next.item; + current.next.item = null; + current.next = null; + size--; + return data; + } + } + + public boolean isContain(T t){ + + if (head.next == null) { + return false; + } + Node current = head; + while(current.next != null){ + current = current.next; + if (Objects.equals(t, current.item)) { + return true; + } + } + return false; + } + + /** + * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + this.head.next = reverseList(head.next); + } + + private Node reverseList(Node mhead) { + + if (mhead == null || mhead.next == null) { + return mhead; + } + Node reHead = reverseList(mhead.next); + mhead.next.next = mhead; + mhead.next = null; + return reHead; + } + + /** + * 删除一个单链表的后半部分 例如:list = 2->5->7->8 , 删除以后的值为 2->5 如果list = 2->5->7->8->10 + * ,删除以后的值为2,5,7 + */ + public void removeLastHalf() { + + if (size < 2) { + return; + } + int index = (size - 1) / 2 + 1; + Node current = getNode(index - 1); + Node temp = current; + while (index < size) { + temp = temp.next; + temp.item = null; + index++; + } + size = (size - 1) / 2 + 1; + current.next = null; + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + */ + public void removeFirstHalf() { + + if (size < 2) { + return; + } + int maxIndex = size/ 2; + int index = 0; + Node current = head; + while (index < maxIndex) { + current = current.next; + current.item = null; + index++; + size--; + } + //size = (size - 1) / 2 + 1; + head.next = current.next; + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + + if (i < 0 || i >= size || (i + length - 1) > size) { + throw new IndexOutOfBoundsException(); + } + int index = 0; + Node current; + if (i == 0) { + current = head; + } else { + current = getNode(i - 1); + } + Node temp = current; + while (index < length) { + current = current.next; + current.item = null; + index++; + } + if (current.next == null) { + if (i == 0) { + head.next = null; + } else { + temp.next = null; + } + } else { + if (i == 0) { + head.next = current.next; + } else { + temp.next = current.next; + } + } + size = size - length; + + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + @SuppressWarnings("unchecked") + public int[] getElements(MyLinkedList list) { + int[] elements = new int[list.size]; + int i = 0; + MyIterator iterator = (MyIterator) list.iterator(); + while (iterator.hasNext()) { + int index = iterator.Next(); + if (index < this.size) { + Node current = getNode(index); + elements[i++] = (Integer) current.item; + } else { + elements[i++] = 0;// 没有该元素时值为零,由于是int类型,引用类型时为null + } + } + return Arrays.copyOf(elements, i); + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + + public void subtract(MyLinkedList list) { + + if (list.size == 0) { + return; + } + MyIterator iterator = list.iterator(); + + while (iterator.hasNext()) { + T element = iterator.Next(); + int index = indexOf(element);// 当前链表的索引 + if (index != -1) { + remove(index); + } + } + } + + /** + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeRepeatValues() { + if (head.next == null || head.next.next == null) { + return; + } + // 利用自己的MyArrayList + MyArrayList list = new MyArrayList<>(); + // 遍历链表 + Node current = head; + T obj = null; + while (current.next != null) { + current = current.next; + obj = current.item; + if (list.isContain(obj)) { + // int index = indexOf(obj); + remove(indexOf(obj)); // 可以增加remove(T t)方法,供调用 + + } else { + list.add(obj); + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + + if (head.next == null || head.next.next == null) { + return; + } + Node current = head; + T obj = null; + while (current.next != null) { + current = current.next; + obj = current.item; + if (current.next != null && Objects.equals(obj, current.next.item)) { + // int index = indexOf(obj); + remove(indexOf(obj)); // 可以增加remove(T t)方法,供调用 + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + + if (head.next == null) { + return; + } + Node current = head; + Integer integer;// 目前只比较数据类型的,若是应用类型,需要实现Comparable接口 + while (current.next != null) { + current = current.next; + integer = (Integer) current.item; + if (integer.intValue() > min && integer.intValue() < max) { + remove(indexOf(current.item)); + } + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public MyLinkedList intersection(MyLinkedList list) { + + if (list.size == 0 || head.next == null) { + return null; + } + MyLinkedList newLinked = new MyLinkedList(); + MyIterator iterator = list.iterator(); + //MyArrayList arrayList = new MyArrayList<>();//没增加排序功能 + //ArrayList arrayList = new ArrayList<>(); + TreeSet treeSet = new TreeSet<>(); + + while (iterator.hasNext()) { + T element = iterator.Next(); + if (isContain(element)) { + treeSet.add(element); + } + } + + for(T t : treeSet){ + newLinked.add(t); + } + return newLinked; + + } + /* + @SuppressWarnings("unchecked") + public MyLinkedList union(MyLinkedList list) { + + if (head.next == null) { + + if (list.size == 0) { + return null; + } else { + return list; + } + } else { + if (list.size == 0) { + return this; + } else { + + MyLinkedList newList = new MyLinkedList(); + TreeSet treeSet = new TreeSet<>();// 可用MyArrayList装所有不同元素,并排序添加到linkedlist中 + + Node current = head; + while (current.next != null) { + current = current.next; + treeSet.add(current.item); + } + MyIterator iterator = (MyIterator) list.iterator(); + while (iterator.hasNext()) { + treeSet.add(iterator.Next()); + } + for (T t : treeSet) { + newList.add(t); + } + return newList; + } + } + + } + + */ + public MyIterator iterator() { + + return new LinkedListIterator(); + } + + private class LinkedListIterator implements MyIterator { + + private int current = 0; + T data = null; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return (current < size); + } + + @Override + public T Next() { + // TODO Auto-generated method stub + if (hasNext()) { + data = getNode(current).item; + current++; + return data; + } + return null; + } + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\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..a200b0a2fc --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" @@ -0,0 +1 @@ +csdn在审核,稍后给出 \ No newline at end of file From bcec4f888b22c94ba1fb65616ed8275020046505 Mon Sep 17 00:00:00 2001 From: RalfNick Date: Sun, 12 Mar 2017 16:25:28 +0800 Subject: [PATCH 104/177] Ralf --- .../linkedlist/LinkedListTest.java" | 46 --- .../linkedlist/MyLinkedListTest.java" | 276 ++++++++++++++++++ ...7\347\253\240\351\223\276\346\216\245.txt" | 2 +- 3 files changed, 277 insertions(+), 47 deletions(-) delete mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedListTest.java" diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" deleted file mode 100644 index 4a800335e5..0000000000 --- "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/LinkedListTest.java" +++ /dev/null @@ -1,46 +0,0 @@ -package com.ralf.linkedlist; - -import BasicData.MyIterator; - -public class LinkedListTest { - - /** - * @param args - */ - @SuppressWarnings("unchecked") - public static void main(String[] args) { - // TODO Auto-generated method stub - MyLinkedList list = new MyLinkedList<>(); - - MyLinkedList listB = new MyLinkedList<>(); - MyLinkedList listC = new MyLinkedList<>(); - list.add(11); - list.add(12); - list.add(13); - list.add(14); - list.add(15); - list.add(17); - list.add(18); - - listB.add(10); - listB.add(12); - listB.add(14); - listB.add(15); - listB.add(18); - - - listC = (MyLinkedList) list.intersection(listB); - - - System.out.println(listC.size()); - - MyIterator iterator = listC.iterator(); - while(iterator.hasNext()){ - Integer integer = iterator.Next(); - System.out.println(integer); - } - - - } - -} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedListTest.java" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedListTest.java" new file mode 100644 index 0000000000..8c3085962a --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\225\260\346\215\256\347\273\223\346\236\204\347\273\203\344\271\240/linkedlist/MyLinkedListTest.java" @@ -0,0 +1,276 @@ +package MyLinkedListTest; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.ralf.linkedlist.MyLinkedList; + +public class MyLinkedListTest { + + private MyLinkedList list = new MyLinkedList<>(); + @Before + public void setUp() throws Exception { + + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + + } + + @Test + public void reverse() { + + list.reverse(); + Assert.assertEquals(5, list.size()); + for(int i=0; i listA = new MyLinkedList<>(); + listA.add(2); + listA.add(5); + listA.add(7); + listA.add(8); + listA.removeFirstHalf(); + + Assert.assertEquals(2, listA.size()); + Assert.assertEquals(7, listA.get(0).intValue()); + Assert.assertEquals(8, listA.get(1).intValue()); + + } + + @Test + public void removeLastHalf(){ + + list.removeLastHalf(); + Assert.assertEquals(3, list.size()); + + for(int i=0; i listA = new MyLinkedList<>(); + listA.add(2); + listA.add(5); + listA.add(7); + listA.add(8); + listA.removeLastHalf(); + + Assert.assertEquals(2, listA.size()); + Assert.assertEquals(2, listA.get(0).intValue()); + Assert.assertEquals(5, listA.get(1).intValue()); + } + + //remove(int i, int length) + @Test + public void remove(){ + + list.remove(0, 5); + Assert.assertEquals(0, list.size()); + + MyLinkedList listA = new MyLinkedList<>(); + listA.add(2); + listA.add(5); + listA.add(7); + listA.add(8); + listA.add(9); + listA.add(10); + + listA.remove(1, 3); + Assert.assertEquals(3, listA.size()); + Assert.assertEquals(2, listA.get(0).intValue()); + Assert.assertEquals(9, listA.get(1).intValue()); + Assert.assertEquals(10, listA.get(2).intValue()); + } + + + //int[] getElements(MyLinkedList list) + @Test + public void getElements(){ + + MyLinkedList listA = new MyLinkedList<>(); + listA.add(11); + listA.add(101); + listA.add(201); + listA.add(301); + listA.add(401); + listA.add(501); + listA.add(601); + listA.add(701); + + MyLinkedList listB = new MyLinkedList<>(); + listB.add(1); + listB.add(3); + listB.add(4); + listB.add(6); + + int[] aar; + aar = listA.getElements(listB); + Assert.assertEquals(4, aar.length); + + Assert.assertEquals(101, aar[0]); + Assert.assertEquals(301, aar[1]); + Assert.assertEquals(401, aar[2]); + Assert.assertEquals(601, aar[3]); + + } + + + //subtract(MyLinkedList list) + @Test + public void subtract(){ + + MyLinkedList listA = new MyLinkedList<>(); + listA.add(11); + listA.add(101); + listA.add(201); + listA.add(301); + listA.add(401); + listA.add(501); + listA.add(601); + listA.add(701); + + MyLinkedList listB = new MyLinkedList<>(); + listB.add(201); + listB.add(301); + listB.add(501); + listB.add(801); + + listA.subtract(listB); + Assert.assertEquals(5, listA.size()); + + Assert.assertEquals(11, listA.get(0).intValue()); + Assert.assertEquals(101, listA.get(1).intValue()); + Assert.assertEquals(401, listA.get(2).intValue()); + Assert.assertEquals(601, listA.get(3).intValue()); + Assert.assertEquals(701, listA.get(4).intValue()); + } + + @Test + public void removeRepeatValues(){ + //自己的方法,但是是无序的,删除时是删除前面的相同元素 + MyLinkedList listA = new MyLinkedList<>(); + listA.add(11);// + listA.add(101);// + listA.add(101); + listA.add(301);// + listA.add(11); + listA.add(301); + listA.add(201);// + listA.add(701);// + + listA.removeRepeatValues(); + Assert.assertEquals(5, listA.size()); + + Assert.assertEquals(101, listA.get(0).intValue()); + Assert.assertEquals(11, listA.get(1).intValue()); + Assert.assertEquals(301, listA.get(2).intValue()); + Assert.assertEquals(201, listA.get(3).intValue()); + Assert.assertEquals(701, listA.get(4).intValue()); + } + + @Test + public void removeDuplicateValues(){ + + MyLinkedList listA = new MyLinkedList<>(); + + listA.add(11); + listA.add(11); + listA.add(12); + listA.add(13); + listA.add(14); + listA.add(14); + listA.add(15); + listA.add(16); + listA.add(16); + + listA.removeDuplicateValues(); + Assert.assertEquals(6, listA.size()); + + Assert.assertEquals(11, listA.get(0).intValue()); + Assert.assertEquals(12, listA.get(1).intValue()); + Assert.assertEquals(13, listA.get(2).intValue()); + Assert.assertEquals(14, listA.get(3).intValue()); + Assert.assertEquals(15, listA.get(4).intValue()); + Assert.assertEquals(16, listA.get(5).intValue()); + + } + + + //removeRange(int min, int max) + @Test + public void removeRange(){ + + MyLinkedList listA = new MyLinkedList<>(); + + listA.add(11); + listA.add(11); + listA.add(12); + listA.add(13); + listA.add(14); + listA.add(14); + listA.add(15); + listA.add(16); + listA.add(16); + + listA.removeRange(12, 16); + + Assert.assertEquals(5, listA.size()); + Assert.assertEquals(11, listA.get(0).intValue()); + Assert.assertEquals(11, listA.get(1).intValue()); + Assert.assertEquals(12, listA.get(2).intValue()); + Assert.assertEquals(16, listA.get(3).intValue()); + Assert.assertEquals(16, listA.get(4).intValue()); + + } + + @Test + public void intersection(){ + + MyLinkedList list = new MyLinkedList<>(); + MyLinkedList listB = new MyLinkedList<>(); + MyLinkedList listC = new MyLinkedList<>(); + + list.add(11); + list.add(12); + list.add(13); + list.add(14); + list.add(15); + list.add(17); + list.add(18); + + listB.add(10); + listB.add(12); + listB.add(14); + listB.add(15); + listB.add(18); + + + listC = (MyLinkedList) list.intersection(listB); + + Assert.assertEquals(4, listC.size()); + Assert.assertEquals(12, listC.get(0).intValue()); + Assert.assertEquals(14, listC.get(1).intValue()); + Assert.assertEquals(15, listC.get(2).intValue()); + Assert.assertEquals(18, listC.get(3).intValue()); + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" index a200b0a2fc..b765c9b696 100644 --- "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" @@ -1 +1 @@ -csdn在审核,稍后给出 \ No newline at end of file +锘縞sdn鍦ㄥ鏍镐腑锛岀◢鍚庤ˉ涓 \ No newline at end of file From 8d4190b7e007490b935776df04641d49b89b269b Mon Sep 17 00:00:00 2001 From: RalfNick Date: Sun, 12 Mar 2017 16:30:40 +0800 Subject: [PATCH 105/177] Ralf --- .../\346\226\207\347\253\240\351\223\276\346\216\245.txt" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" index b765c9b696..d3f65d64ee 100644 --- "a/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" +++ "b/group20/925290009/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" @@ -1 +1 @@ -锘縞sdn鍦ㄥ鏍镐腑锛岀◢鍚庤ˉ涓 \ No newline at end of file +锘縣ttp://blog.csdn.net/u011371324/article/details/61618954 \ No newline at end of file From 63baa65db94958b318422b9fef9ef0079d4e658f Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Sun, 12 Mar 2017 16:39:28 +0800 Subject: [PATCH 106/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/array/ArrayUtil.java | 96 +++++ .../coderising/download/DownloadThread.java | 35 ++ .../coderising/download/FileDownloader.java | 73 ++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 27 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 65 ++++ .../download/impl/ConnectionManagerImpl.java | 21 ++ .../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 ++ .../week3/src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../week3/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 345 ++++++++++++++++++ .../week3/src/com/coding/basic/List.java | 9 + .../week3/src/com/coding/basic/Queue.java | 19 + .../week3/src/com/coding/basic/Stack.java | 22 ++ .../test/com/coding/basic/LinkedListTest.java | 297 +++++++++++++++ 22 files changed, 1298 insertions(+) create mode 100644 group12/563253496/week3/src/com/coderising/array/ArrayUtil.java create mode 100644 group12/563253496/week3/src/com/coderising/download/DownloadThread.java create mode 100644 group12/563253496/week3/src/com/coderising/download/FileDownloader.java create mode 100644 group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group12/563253496/week3/src/com/coderising/download/api/Connection.java create mode 100644 group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java create mode 100644 group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java create mode 100644 group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group12/563253496/week3/src/com/coderising/litestruts/LoginAction.java create mode 100644 group12/563253496/week3/src/com/coderising/litestruts/Struts.java create mode 100644 group12/563253496/week3/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group12/563253496/week3/src/com/coderising/litestruts/View.java create mode 100644 group12/563253496/week3/src/com/coding/basic/ArrayList.java create mode 100644 group12/563253496/week3/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group12/563253496/week3/src/com/coding/basic/Iterator.java create mode 100644 group12/563253496/week3/src/com/coding/basic/LinkedList.java create mode 100644 group12/563253496/week3/src/com/coding/basic/List.java create mode 100644 group12/563253496/week3/src/com/coding/basic/Queue.java create mode 100644 group12/563253496/week3/src/com/coding/basic/Stack.java create mode 100644 group12/563253496/week3/src/test/com/coding/basic/LinkedListTest.java diff --git a/group12/563253496/week3/src/com/coderising/array/ArrayUtil.java b/group12/563253496/week3/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..e5ddb476a6 --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/group12/563253496/week3/src/com/coderising/download/DownloadThread.java b/group12/563253496/week3/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..f72faffa7f --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,35 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.RandomAccessFile; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + private String position; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + + RandomAccessFile raf = new RandomAccessFile(new File(position),"rws") + byte[] + + + + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/group12/563253496/week3/src/com/coderising/download/FileDownloader.java b/group12/563253496/week3/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..f3a5eeb960 --- /dev/null +++ b/group12/563253496/week3/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(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java b/group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group12/563253496/week3/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/group12/563253496/week3/src/com/coderising/download/api/Connection.java b/group12/563253496/week3/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..d111b71664 --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/download/api/Connection.java @@ -0,0 +1,27 @@ +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(); + public String getName(); +} diff --git a/group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java b/group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java b/group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java b/group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group12/563253496/week3/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/group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java b/group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..1fbf06b16f --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,65 @@ +package com.coderising.download.impl; + +import java.io.ByteArrayOutputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection { + + private static int bufferSize = 1024; + private URL url; + private HttpURLConnection huc; + boolean finished = false; + + public ConnectionImpl(String url) { + try { + this.url = new URL(url); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + InputStream input; + ByteArrayOutputStream output = new ByteArrayOutputStream(endPos - startPos + 1); + + byte[] buffer = new byte[bufferSize]; + + input = huc.getInputStream(); + input.skip(startPos); + int len = input.read(buffer); + while (len != -1) { + output.write(buffer, 0, len); + } + this.finished=true; + return output.toByteArray(); + } + + @Override + public int getContentLength() { + + return huc.getContentLength(); + } + + @Override + public void close() { + huc.disconnect(); + + } + + @Override + public String getName() { + String fileName = huc.getURL().getFile(); + return fileName.substring(fileName.lastIndexOf("\\") + 1); + } + public boolean isFinished(){ + return this.finished; + } +} diff --git a/group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..7d3c6ec6bb --- /dev/null +++ b/group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,21 @@ +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 { + + + private String url; + @Override + public Connection open(String url) throws ConnectionException { + this.url=url; + + Connection conn = new ConnectionImpl(url); + + + return conn; + } + +} diff --git a/group12/563253496/week3/src/com/coderising/litestruts/LoginAction.java b/group12/563253496/week3/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group12/563253496/week3/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/group12/563253496/week3/src/com/coderising/litestruts/Struts.java b/group12/563253496/week3/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group12/563253496/week3/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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + 鎹畃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/group12/563253496/week3/src/com/coderising/litestruts/StrutsTest.java b/group12/563253496/week3/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group12/563253496/week3/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/group12/563253496/week3/src/com/coderising/litestruts/View.java b/group12/563253496/week3/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group12/563253496/week3/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/group12/563253496/week3/src/com/coding/basic/ArrayList.java b/group12/563253496/week3/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group12/563253496/week3/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/week3/src/com/coding/basic/BinaryTreeNode.java b/group12/563253496/week3/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group12/563253496/week3/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/week3/src/com/coding/basic/Iterator.java b/group12/563253496/week3/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group12/563253496/week3/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/week3/src/com/coding/basic/LinkedList.java b/group12/563253496/week3/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..f50db4c7a1 --- /dev/null +++ b/group12/563253496/week3/src/com/coding/basic/LinkedList.java @@ -0,0 +1,345 @@ +package com.coding.basic; + + +import javax.management.ListenerNotFoundException; + +public class LinkedList implements List { + + private Node head = new Node(-1); + + private int size = 0; + + public void add(Object o) { + Node addNode = new Node(o); + if (size == 0) { + head.next = addNode; + size++; + } else { + /*Node n = getNode(size); + n.next = temp; + size++;*/ + Node temp = head; + for (int i = 0; i < size; i++) { + temp = temp.next; + } + temp.next = addNode; + size++; + } + + } + + + public String toString() { + Node temp = head; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < size; i++) { + + temp = temp.next; + sb.append(temp.data); + sb.append("->"); + + } + sb.deleteCharAt((sb.length() - 1)); + sb.deleteCharAt((sb.length() - 1)); + String result = sb.toString(); + return result; + } + + public void add(int index, Object o) { + /*if (index <= 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + Node addNode = new Node(o); + Node temp = head; + for (int i = 1; i <= index; i++) { + temp = temp.next; + }*/ + } + + public Object get(int index) { + if (index <= 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + Node temp = head; + for (int i = 1; i <= index; i++) { + temp = temp.next; + + } + return temp.data; + } + + public Object remove(int index) { + return null; + } + +/* public Node getNode(int index) { + Node temp = head; + for (int i = 1; i <= index; i++) { + temp = head.next; + } + return temp; + }*/ + + public int size() { + return this.size; + } + + public void addFirst(Object o) { + Node addNode = new Node(o); + addNode.next = head.next; + head.next = addNode; + size++; + + } + + 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() { + this.data = null; + this.next = null; + } + + Node(Object o) { + this.data = o; + this.next = null; + } + + Node(Node n) { + this.data = n.data; + this.next = n.next; + } + + public boolean hasNext() { + if (this.next == null) { + return false; + } else { + return true; + } + } + + } + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse() { + /*LinkedList ll = new LinkedList(); + ll.add(3); + ll.add(7); + ll.add(8); + ll.add(9); + ll.add(10); + System.out.println(ll);*/ + //System.out.println(this); + LinkedList result = new LinkedList(); + Node temp = this.head; + for (int i = 0; i < this.size(); i++) { + temp = temp.next; + result.addFirst(temp.data); + } + this.head = result.head; + //System.out.println(this); + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf() { + Node temp = this.head; + for (int i = 0; i < (int) (this.size / 2); i++) { + temp = temp.next; + + } + this.size = this.size - this.size / 2; + this.head.next = temp.next; + + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + Node startNode = this.head; + + for (int j = 0; j < i; j++) { + startNode = startNode.next; + + } + Node endNode = startNode; + for (int j = 0; j < length; j++) { + endNode = endNode.next; + } + startNode.next = endNode.next; + size = size - length; + + } + + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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[] result = new int[list.size()]; + Node node = list.head; + + for (int i = 0; i < result.length; i++) { + node = node.next; + result[i] = (int) (this.get(((int) (node.data)) + 1)); + } + return result; + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + * + * @param list + */ + + public void subtract(LinkedList list) { + Node posNode = this.head; + Node listNode = list.head.next; + + for (int i = 0; i < list.size(); i++) { + while (posNode.next.data != listNode.data) { + posNode = posNode.next; + } + posNode.next = posNode.next.next; + listNode = listNode.next; + } + this.size = size - list.size(); + + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues() { + Node posnode = this.head; + //Node temp; + while(posnode.hasNext()){ + if(posnode.data==posnode.next.data){ + posnode.next=posnode.next.next; + this.size--; + continue; + } + posnode=posnode.next; + } + + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + Node startPos = this.head; + Node endPos; + int count1 = 0; + int count2 = 1; + for (int i = 0; i < this.size(); i++) { + if ((int) startPos.next.data > min) { + break; + } + startPos = startPos.next; + count1++; + } + endPos = startPos.next; + for (int i = count1; i < this.size(); i++) { + if ((int) endPos.data > max) { + break; + } + endPos = endPos.next; + count2++; + } + size = size - count2; + startPos.next = endPos; + } + + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList result = new LinkedList(); + Node a = this.head.next; + Node b = list.head.next; + + while (a.hasNext() && b.hasNext()) { + if ((int) a.data == (int) b.data) { + result.add(a.data); + a = a.next; + b = b.next; + } else if ((int) a.data > (int) b.data) { + b = b.next; + } else if ((int) a.data < (int) b.data) { + a = a.next; + } + + + } + if (a.hasNext() == false) { + while (b.hasNext() == true) { + if ((int) a.data == (int) b.data) { + result.add(a.data); + break; + } else { + b = b.next; + } + } + } else if (b.hasNext() == false) { + while (a.hasNext() == true) { + if ((int) a.data == (int) b.data) { + result.add(a.data); + break; + } else { + a = a.next; + } + } + } + return result; + + + } + + +} diff --git a/group12/563253496/week3/src/com/coding/basic/List.java b/group12/563253496/week3/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group12/563253496/week3/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/week3/src/com/coding/basic/Queue.java b/group12/563253496/week3/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group12/563253496/week3/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/week3/src/com/coding/basic/Stack.java b/group12/563253496/week3/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group12/563253496/week3/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/563253496/week3/src/test/com/coding/basic/LinkedListTest.java b/group12/563253496/week3/src/test/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..d00b12ea3e --- /dev/null +++ b/group12/563253496/week3/src/test/com/coding/basic/LinkedListTest.java @@ -0,0 +1,297 @@ +package test.com.coding.basic; + +import com.coding.basic.LinkedList; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import sun.awt.image.ImageWatched; + +/** + * LinkedList Tester. + * + * @author + * @version 1.0 + * @since

三月 9, 2017
+ */ +public class LinkedListTest { + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + /** + * Method: add(Object o) + */ + @Test + public void testAddO() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: toString() + */ + @Test + public void testToString() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: add(int index, Object o) + */ + @Test + public void testAddForIndexO() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemoveIndex() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: getNode(int index) + */ + @Test + public void testGetNode() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: addFirst(Object o) + */ + @Test + public void testAddFirst() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: addLast(Object o) + */ + @Test + public void testAddLast() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: removeFirst() + */ + @Test + public void testRemoveFirst() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: removeLast() + */ + @Test + public void testRemoveLast() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { +//TODO: Test goes here... + } + + /** + * Method: reverse() + */ + @Test + public void testReverse() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(3); + ll.add(7); + ll.add(10); + ll.reverse(); + Assert.assertEquals("10->7->3", ll.toString()); + + } + + /** + * Method: removeFirstHalf() + */ + @Test + public void testRemoveFirstHalf() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(2); + ll.add(5); + ll.add(7); + ll.add(8); + ll.add(10); + ll.removeFirstHalf(); + Assert.assertEquals("7->8->10", ll.toString()); + } + + /** + * Method: remove(int i, int length) + */ + @Test + public void testRemoveForILength() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(4); + ll.add(5); + ll.add(6); + ll.add(7); + ll.remove(2, 2); + Assert.assertEquals("1->2->5->6->7", ll.toString()); + + } + + /** + * Method: getElements(LinkedList list) + */ + @Test + public void testGetElements() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(11); + ll.add(101); + ll.add(201); + ll.add(301); + ll.add(401); + ll.add(501); + ll.add(601); + ll.add(701); + LinkedList listB = new LinkedList(); + listB.add(1); + listB.add(3); + listB.add(4); + listB.add(6); + int[] result = ll.getElements(listB); + int[] exresult = {101, 301, 401, 601}; + for (int i = 0; i < result.length; i++) { + Assert.assertEquals(exresult[i], result[i]); + } + //Assert.assertEquals("[101,301,401,601]",result.toString()); + } + + /** + * Method: subtract(LinkedList list) + */ + @Test + public void testSubtract() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(4); + ll.add(5); + ll.add(6); + LinkedList listB = new LinkedList(); + listB.add(1); + listB.add(3); + listB.add(5); + ll.subtract(listB); + Assert.assertEquals("2->4->6", ll.toString()); + + } + + /** + * Method: removeDuplicateValues() + */ + @Test + public void testRemoveDuplicateValues() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(2); + ll.add(2); + ll.add(3); + ll.add(4); + ll.add(4); + ll.add(4); + ll.add(4); + ll.removeDuplicateValues(); + Assert.assertEquals("1->2->3->4",ll.toString()); + + } + + /** + * Method: removeRange(int min, int max) + */ + @Test + public void testRemoveRange() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(4); + ll.add(5); + ll.add(6); + ll.add(7); + ll.add(8); + ll.removeRange(3,8); + Assert.assertEquals("1->2",ll.toString()); + + } + + /** + * Method: intersection(LinkedList list) + */ + @Test + public void testIntersection() throws Exception { +//TODO: Test goes here... + LinkedList ll = new LinkedList(); + LinkedList l = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(4); + ll.add(5); + ll.add(6); + l.add(2); + l.add(4); + l.add(6); + l.add(7); + l.add(8); + l.add(9); + LinkedList re = ll.intersection(l); + Assert.assertEquals("2->4->6",re.toString()); + } + + /** + * Method: main(String[] args) + */ + @Test + public void testMain() throws Exception { +//TODO: Test goes here... + } + + +} From 0033e864ebe7dd12be85db6156c4581c7cb59b6b Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Sun, 12 Mar 2017 16:49:24 +0800 Subject: [PATCH 107/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 35 --------- .../coderising/download/FileDownloader.java | 73 ------------------- .../download/FileDownloaderTest.java | 59 --------------- .../coderising/download/api/Connection.java | 27 ------- .../download/api/ConnectionException.java | 5 -- .../download/api/ConnectionManager.java | 10 --- .../download/api/DownloadListener.java | 5 -- .../download/impl/ConnectionImpl.java | 65 ----------------- .../download/impl/ConnectionManagerImpl.java | 21 ------ 9 files changed, 300 deletions(-) delete mode 100644 group12/563253496/week3/src/com/coderising/download/DownloadThread.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/FileDownloader.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/api/Connection.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group12/563253496/week3/src/com/coderising/download/DownloadThread.java b/group12/563253496/week3/src/com/coderising/download/DownloadThread.java deleted file mode 100644 index f72faffa7f..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/DownloadThread.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.RandomAccessFile; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - private String position; - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - try { - - RandomAccessFile raf = new RandomAccessFile(new File(position),"rws") - byte[] - - - - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } -} diff --git a/group12/563253496/week3/src/com/coderising/download/FileDownloader.java b/group12/563253496/week3/src/com/coderising/download/FileDownloader.java deleted file mode 100644 index f3a5eeb960..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/FileDownloader.java +++ /dev/null @@ -1,73 +0,0 @@ -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(){ - // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 - // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 - // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 - // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 - // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 - // 鍏蜂綋鐨勫疄鐜版濊矾锛 - // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 - // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 - // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 - // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 - // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 - - // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 - 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/group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java b/group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java deleted file mode 100644 index 4ff7f46ae0..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/FileDownloaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -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/group12/563253496/week3/src/com/coderising/download/api/Connection.java b/group12/563253496/week3/src/com/coderising/download/api/Connection.java deleted file mode 100644 index d111b71664..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/api/Connection.java +++ /dev/null @@ -1,27 +0,0 @@ -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(); - public String getName(); -} diff --git a/group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java b/group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java deleted file mode 100644 index 1551a80b3d..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java b/group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java deleted file mode 100644 index ce045393b1..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.download.api; - -public interface ConnectionManager { - /** - * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java b/group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java deleted file mode 100644 index bf9807b307..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java b/group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java deleted file mode 100644 index 1fbf06b16f..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coderising.download.impl; - -import java.io.ByteArrayOutputStream; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -import com.coderising.download.api.Connection; - -public class ConnectionImpl implements Connection { - - private static int bufferSize = 1024; - private URL url; - private HttpURLConnection huc; - boolean finished = false; - - public ConnectionImpl(String url) { - try { - this.url = new URL(url); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - InputStream input; - ByteArrayOutputStream output = new ByteArrayOutputStream(endPos - startPos + 1); - - byte[] buffer = new byte[bufferSize]; - - input = huc.getInputStream(); - input.skip(startPos); - int len = input.read(buffer); - while (len != -1) { - output.write(buffer, 0, len); - } - this.finished=true; - return output.toByteArray(); - } - - @Override - public int getContentLength() { - - return huc.getContentLength(); - } - - @Override - public void close() { - huc.disconnect(); - - } - - @Override - public String getName() { - String fileName = huc.getURL().getFile(); - return fileName.substring(fileName.lastIndexOf("\\") + 1); - } - public boolean isFinished(){ - return this.finished; - } -} diff --git a/group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 7d3c6ec6bb..0000000000 --- a/group12/563253496/week3/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -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 { - - - private String url; - @Override - public Connection open(String url) throws ConnectionException { - this.url=url; - - Connection conn = new ConnectionImpl(url); - - - return conn; - } - -} From ab015765c5d7a1a1053d708aceab1d81275f6e6a Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Sun, 12 Mar 2017 17:17:20 +0800 Subject: [PATCH 108/177] record03 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 瀹屾垚浜哃inkedList锛屾湭娴嬭瘯銆 --- .../Exercise/src/lesson01/LinkedList.java | 242 ++++++++++++++++++ .../Exercise/src/lesson01/List.java | 40 ++- 2 files changed, 275 insertions(+), 7 deletions(-) create mode 100644 group13/1274639949/Exercise/src/lesson01/LinkedList.java diff --git a/group13/1274639949/Exercise/src/lesson01/LinkedList.java b/group13/1274639949/Exercise/src/lesson01/LinkedList.java new file mode 100644 index 0000000000..0c30737c8b --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson01/LinkedList.java @@ -0,0 +1,242 @@ +package lesson01; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size; + private Node head; + private Node last; + private Node temp; + + public LinkedList() { + head = new Node(); + } + + + @Override + public boolean add(E e) { + add(size, e); + return true; + } + + @Override + public void add(int index, E element) { + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("Error index:" + index); + } + temp = new Node(); + temp.data = element; + if(last == null){ + //閾捐〃涓繕娌℃湁鍏冪礌 + head.next = temp; + temp.pre = head; + }else{ + //閾捐〃涓凡缁忔湁鍏冪礌 + last.next = temp; + temp.pre = last; + } + last = temp; + size++; + temp = null; + } + + @Override + public void clear() { + while(size > 0){ + temp = last.pre; + last.pre = null; + temp.next = null; + + if(temp == head){ + last = null; + }else{ + last = temp; + } + size--; + } + temp = null; + } + + @Override + public boolean contains(Object o) { + temp = head.next; + if(o == null){ + while(temp != null){ + if(temp.data == null){ + return true; + } + temp = temp.next; + } + } + return false; + } + + @Override + public int indexOf(Object o) { + temp = head.next; + if(o == null){ + for(int i = 0; i < size; i++){ + if(temp.data == null){ + temp = null; + return i; + } + temp = temp.next; + } + }else{ + for(int i = 0; i < size; i++){ + if(o.equals(temp.data)){ + temp = null; + return i; + } + temp = temp.next; + } + } + return -1; + } + + @Override + public E get(int index) { + checkIndex(index); + + temp = head.next; + for(int i = 0; i < index; i++){ + temp = temp.next; + } + E obj = temp.data; + temp = null; + return obj; + } + + private void checkIndex(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("Error index: " + index); + } + } + + @Override + public E remove(int index) { + checkIndex(index); + E obj = null; + if(size == 1){ + //閾捐〃涓彧鏈変竴涓厓绱 + obj = last.data; + head.next = null; + last.pre = null; + last = null; + }else if(index == 0){ + //閾捐〃涓湁涓や釜鎴栨洿澶氱殑鍏冪礌锛屼絾鏄Щ闄や笅鏍囦负0鐨勫厓绱 + temp = head.next; + obj = temp.data; + + head.next = temp.next; + temp.next.pre = head; + temp.pre = null; + temp.next = null; + temp = null; + }else if(index == size - 1){ + //閾捐〃涓湁涓や釜鎴栨洿澶氱殑鍏冪礌锛屼絾鏄Щ闄や笅鏍囦负size()-1鐨勫厓绱 + obj = head.data; + + last = last.pre; + last.next.pre = null; + last.next = null; + }else{ + temp = head.next; + for(int i = 0; i < index; i++){ + temp = temp.next; + } + obj = temp.data; + + temp.pre.next = temp.next; + temp.next.pre = temp.pre; + temp.pre = null; + temp.next = null; + temp = null; + } + return obj; + } + + @Override + public boolean remove(Object o) { + int index = indexOf(o); + if(index >= 0){ + remove(index); + return true; + } + return false; + } + + @Override + public E set(int index, E element) { + checkIndex(index); + + temp = head.next; + for(int i = 0; i < index; i++){ + temp = temp.next; + } + E obj = temp.data; + temp.data = element; + temp = null; + return obj; + } + + @Override + public int size() { + return size; + } + + @Override + public Object[] toArray() { + Object[] arr = new Object[size]; + temp = head.next; + for(int i = 0; i < size; i++){ + arr[i] = temp.data; + temp = temp.next; + } + return arr; + } + + @Override + public Iterator iterator() { + return new Ite(); + } + + private class Ite implements Iterator{ + int pos; + int lastRet = -1; + + @Override + public boolean hasNext() { + return pos < size; + } + + @Override + public E next() { + if(pos == size){ + throw new NoSuchElementException(); + } + E element = get(pos); + lastRet = pos; + pos++; + return element; + } + + @Override + public void remove() { + if(lastRet == -1){ + throw new RuntimeException(); + } + LinkedList.this.remove(lastRet); + lastRet = -1; + } + + } + + private static final class Node{ + E data; + Node next; + Node pre; + } + +} diff --git a/group13/1274639949/Exercise/src/lesson01/List.java b/group13/1274639949/Exercise/src/lesson01/List.java index b6b2d7c554..d350a6e75f 100644 --- a/group13/1274639949/Exercise/src/lesson01/List.java +++ b/group13/1274639949/Exercise/src/lesson01/List.java @@ -36,24 +36,50 @@ public interface List { */ public int indexOf(Object o); - + /** + * 鑾峰彇鎸囧畾浣嶇疆涓婄殑鍏冪礌 + * @param index + * @return List涓笅鏍囦负index鐨勫厓绱 + */ public E get(int index); - + /** + * 绉婚櫎鎸囧畾浣嶇疆涓婄殑鍏冪礌 + * @param index + * @return 琚Щ闄ょ殑鍏冪礌銆 + */ public E remove(int index); - + /** + * 鍦↙ist涓Щ闄ゆ寚瀹氱殑鍏冪礌锛屽鏋滃瓨鍦ㄥ涓紝鍒欏彧绉婚櫎涓嬫爣鏈灏忕殑閭d釜 + * @param o + * @return 鑻ユ寚瀹氬厓绱犺绉婚櫎鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse + */ public boolean remove(Object o); - + /** + * 浣跨敤鎸囧畾鐨勫厓绱犳浛鎹㈡寚瀹氫綅缃笂鐨勫厓绱犮 + * @param index + * @param element + * @return 琚浛鎹㈡帀鐨勫厓绱 + */ public E set(int index, E element); - + /** + * 杩斿洖List涓厓绱犵殑涓暟 + * @return + */ public int size(); - + /** + * 灏哃ist涓殑鍏ㄩ儴鍏冪礌瀛樻斁浜庝竴涓暟缁勪腑骞惰繑鍥炶鏁扮粍 + * @return + */ public Object[] toArray(); - + /** + * 杩斿洖璇ist涓婄殑杩唬鍣 + * @return + */ public Iterator iterator(); } From b8119e10303ca2283b5b554d3a5729d8f2dc822c Mon Sep 17 00:00:00 2001 From: 592146505 <592146505@qq.com> Date: Sun, 12 Mar 2017 19:26:34 +0800 Subject: [PATCH 109/177] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E4=B8=8B=E8=BD=BD=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 45 ++++++++-- .../coderising/download/FileDownloader.java | 42 +++++---- .../download/FileDownloaderTest.java | 4 +- .../coderising/download/api/Connection.java | 10 ++- .../download/api/ConnectionException.java | 10 +-- .../download/api/ConnectionManager.java | 13 ++- .../download/impl/ConnectionImpl.java | 90 +++++++++++++++++-- .../download/impl/ConnectionManagerImpl.java | 59 ++++++++++-- .../org/wsc/coding/basic/list/ArrayList.java | 2 - 9 files changed, 228 insertions(+), 47 deletions(-) diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java index 1a39d7d741..d6b8a4abf0 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/DownloadThread.java @@ -1,9 +1,14 @@ package org.wsc.coderising.download; +import java.io.IOException; +import java.io.RandomAccessFile; + import org.wsc.coderising.download.api.Connection; +import org.wsc.coderising.download.api.ConnectionException; +import org.wsc.coderising.download.api.DownloadListener; /** - * 涓嬭浇杩涚▼ + * 涓嬭浇绾跨▼ * * @author Administrator * @date 2017骞3鏈6鏃ヤ笅鍗7:03:41 @@ -12,19 +17,45 @@ */ public class DownloadThread extends Thread{ + private RandomAccessFile accessFile; /** 杩炴帴 */ - Connection conn; + private Connection conn; /** 寮濮嬪 */ - int startPos; + private int startPos; /** 缁撴潫澶 */ - int endPos; - - public DownloadThread( Connection conn, int startPos, int endPos){ + private int endPos; + /** 鍥炶皟鍑芥暟 */ + private DownloadListener listener; + + public DownloadThread( Connection conn, int startPos, int endPos,DownloadListener listener){ this.conn = conn; this.startPos = startPos; this.endPos = endPos; + this.listener = listener; } - public void run(){ + public void run(){ + try { + byte[] bt = conn.read(startPos, endPos); + accessFile = new RandomAccessFile("./"+conn.getFileName(), "rw"); + accessFile.seek(startPos); + accessFile.write(bt); + } catch (IOException e) { + e.printStackTrace(); + } catch (ConnectionException e) { + e.printStackTrace(); + }finally { + if(accessFile != null){ + try { + accessFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (conn != null) + conn.close(); + if(listener!=null) + listener.notifyFinished(); + } } } diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java index 99c6097409..f9c3afd9e2 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloader.java @@ -1,5 +1,7 @@ package org.wsc.coderising.download; +import java.util.concurrent.atomic.AtomicInteger; + import org.wsc.coderising.download.api.Connection; import org.wsc.coderising.download.api.ConnectionException; import org.wsc.coderising.download.api.ConnectionManager; @@ -14,13 +16,15 @@ * */ public class FileDownloader { + private final static int THREAD_NUM = 10; - String url; + private String url; - DownloadListener listener; + private DownloadListener listener; - ConnectionManager cm; + private ConnectionManager cm; + private AtomicInteger atomicInteger = new AtomicInteger(); public FileDownloader(String _url) { this.url = _url; @@ -41,26 +45,30 @@ public void execute(){ // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 - Connection conn = null; try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); + int length = cm.getContentLength(url); + int perThred_length = length/THREAD_NUM; + int redundant = length%THREAD_NUM; + for (int i = 0; i < THREAD_NUM; i++) { + int startPos = i*perThred_length; + int endPos = (i+1)*perThred_length-1; + if(i == THREAD_NUM -1)//鏈鍚庝竴涓嚎绋 + endPos+=redundant; + Connection conn = cm.open(this.url); + atomicInteger.getAndIncrement(); + new DownloadThread(conn,startPos,endPos,new DownloadListener() { + @Override + public void notifyFinished() { + if(atomicInteger.decrementAndGet()==0) + listener.notifyFinished(); + } + }).start(); + } } catch (ConnectionException e) { e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } } - - - } public void setListener(DownloadListener listener) { diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java index 3815c9698b..cca38600df 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/FileDownloaderTest.java @@ -21,7 +21,7 @@ public void tearDown() throws Exception { @Test public void testDownload() { // 璧勬簮浣嶇疆 - String url = "http://localhost:8080/test.jpg"; + String url = "http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg"; // 鍒涘缓璧勬簮涓嬭浇鍣ㄥ疄渚 FileDownloader downloader = new FileDownloader(url); // 鍒涘缓杩炴帴绠$悊瀹炰緥 @@ -47,7 +47,7 @@ public void notifyFinished() { e.printStackTrace(); } } - System.out.println("涓嬭浇瀹屾垚锛"); + System.out.println("涓嬭浇瀹屾垚锛佽鍒锋柊椤圭洰鏍圭洰褰"); } } diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java index 5c7c3bf6b5..12318aa441 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/Connection.java @@ -19,8 +19,10 @@ public interface Connection { * @param endPos * 缁撴潫浣嶇疆 * @return + * @throws IOException + * @throws ConnectionException */ - public byte[] read(int startPos, int endPos) throws IOException; + public byte[] read(int startPos, int endPos) throws IOException, ConnectionException; /** * 寰楀埌鏁版嵁鍐呭鐨勯暱搴 @@ -28,6 +30,12 @@ public interface Connection { * @return */ public int getContentLength(); + + /** + * 鑾峰彇鏂囦欢鍚嶇О + * @return + */ + public String getFileName(); /** * 鍏抽棴杩炴帴 diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java index a3c794ef97..da1ff9c2d5 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionException.java @@ -13,24 +13,24 @@ public class ConnectionException extends Exception { private static final long serialVersionUID = -249834831447340792L; - private ConnectionException() { + public ConnectionException() { super(); } - private ConnectionException(String message, Throwable cause, boolean enableSuppression, + public ConnectionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } - private ConnectionException(String message, Throwable cause) { + public ConnectionException(String message, Throwable cause) { super(message, cause); } - private ConnectionException(String message) { + public ConnectionException(String message) { super(message); } - private ConnectionException(Throwable cause) { + public ConnectionException(Throwable cause) { super(cause); } diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java index 8d9eea4cc2..16ad03ca28 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/api/ConnectionManager.java @@ -2,7 +2,7 @@ /** * - * 绠$悊杩炴帴鎺ュ彛 + * 杩炴帴姹犳帴鍙 * * @author Administrator * @date 2017骞3鏈6鏃ヤ笅鍗7:02:30 @@ -15,6 +15,15 @@ public interface ConnectionManager { * * @param url * @return + * @throws ConnectionException */ - public Connection open(String url) throws ConnectionException; + Connection open(String url) throws ConnectionException; + + /** + * 鑾峰彇闀垮害 + * @param urlStr + * @return + * @throws ConnectionException + */ + int getContentLength(String urlStr) throws ConnectionException; } diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java index 6b52b77f5d..befa4cf0e8 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionImpl.java @@ -1,8 +1,13 @@ package org.wsc.coderising.download.impl; +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; import org.wsc.coderising.download.api.Connection; +import org.wsc.coderising.download.api.ConnectionException; /** * @@ -14,22 +19,97 @@ * */ public class ConnectionImpl implements Connection { + + /** 榛樿缂撳啿澶у皬 */ + private final static int DEFAULT_SIZE = 1024; - @Override - public byte[] read(int startPos, int endPos) throws IOException { + private HttpURLConnection conn; + + private InputStream is; + + private ByteArrayOutputStream bos; - return null; + @SuppressWarnings("static-access") + @Override + public byte[] read(int startPos, int endPos) throws IOException, ConnectionException { + // 璁剧疆璇诲彇鑼冨洿 + conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + conn.setFollowRedirects(true);//鑷姩鎵ц閲嶅畾鍚 + conn.setConnectTimeout(30000);//绛夊緟鍝嶅簲鏃堕棿 + checkStatus(); + byte[] buf = new byte[Math.min(getContentLength(), DEFAULT_SIZE)]; + is = new BufferedInputStream(conn.getInputStream()); + bos = new ByteArrayOutputStream(); + int lenth;//瀹為檯璇诲彇闀垮害 + //璇诲彇 + while ((lenth = is.read(buf))!= -1) + bos.write(buf, 0, lenth); + return bos.toByteArray(); } @Override public int getContentLength() { - - return 0; + return conn.getContentLength(); } @Override public void close() { + if (bos != null) + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + if (is != null) + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + if(conn != null) + conn.disconnect(); + } + + @Override + public String getFileName() { + String fileName = null; + String field = conn.getHeaderField("Content-Disposition"); + if(field == null ){ + String urlStr = conn.getURL().toString(); + fileName = urlStr.substring(urlStr.lastIndexOf("/")+1); + }else{ + fileName=field.substring(field.indexOf("filename")+10, field.length()-1); + } + System.out.println(fileName); + return fileName; + } + + /** + * 妫鏌ヨ繛鎺ョ姸鎬 + * @throws ConnectionException + */ + private void checkStatus() throws ConnectionException { + try { + int responseCode = conn.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK && responseCode != HttpURLConnection.HTTP_PARTIAL) { + throw new ConnectionException("server response code: " + responseCode); + } + } catch (IOException e) { + throw new ConnectionException(e); + } + } + public HttpURLConnection getConn() { + return conn; } + public void setConn(HttpURLConnection conn) { + this.conn = conn; + } + + public ConnectionImpl(HttpURLConnection conn) { + super(); + this.conn = conn; + } + } diff --git a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java index cf516fa0e7..35be908776 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coderising/download/impl/ConnectionManagerImpl.java @@ -1,23 +1,70 @@ package org.wsc.coderising.download.impl; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + import org.wsc.coderising.download.api.Connection; import org.wsc.coderising.download.api.ConnectionException; import org.wsc.coderising.download.api.ConnectionManager; /** - * 杩炴帴绠$悊绫 - * + * 杩炴帴姹犵被 + * * @author Administrator * @date 2017骞3鏈6鏃ヤ笅鍗7:11:50 * @version v1.0 * */ public class ConnectionManagerImpl implements ConnectionManager { - + @Override - public Connection open(String url) throws ConnectionException { - - return null; + public Connection open(String _url) throws ConnectionException { + HttpURLConnection connection = getConnection(_url); + return new ConnectionImpl(connection); + } + + @Override + public int getContentLength(String _url) throws ConnectionException { + HttpURLConnection connection = getConnection(_url); + int length = 0; + try { + checkStatus(connection); + length = connection.getContentLength(); + } catch (IOException e) { + new ConnectionException(e); + }finally { + connection.disconnect(); + } + return length; + } + + private HttpURLConnection getConnection(String _url) throws ConnectionException{ + URL url = null; + HttpURLConnection connection = null; + try { + url = new URL(_url); + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + return connection; + } catch (IOException e) { + new ConnectionException(e); + } + return null; + } + + /** + * 妫鏌ヨ繛鎺ョ姸鎬 + * @param connection + * @throws IOException + * @throws ConnectionException + */ + private void checkStatus(HttpURLConnection connection) throws IOException, ConnectionException { + int responseCode = connection.getResponseCode(); + System.out.println("server response code: " + responseCode); + if (responseCode != HttpURLConnection.HTTP_OK && responseCode != HttpURLConnection.HTTP_PARTIAL) { + throw new ConnectionException("server response code: " + responseCode); + } } } diff --git a/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java index 761b3aac59..f12160e752 100644 --- a/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java +++ b/group20/592146505/592146505Learning/src/org/wsc/coding/basic/list/ArrayList.java @@ -4,8 +4,6 @@ import java.util.ConcurrentModificationException; import java.util.NoSuchElementException; -import javafx.stage.StageStyle; - /** * ArrayList绫 * From 96719c09e840d3431969089c53204e92fcd3022c Mon Sep 17 00:00:00 2001 From: Korben_CHY Date: Sun, 12 Mar 2017 23:48:49 +0800 Subject: [PATCH 110/177] update Korben's blog --- group20/1107837739/korben.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/group20/1107837739/korben.md b/group20/1107837739/korben.md index 91ee50808b..1259561cb0 100644 --- a/group20/1107837739/korben.md +++ b/group20/1107837739/korben.md @@ -5,5 +5,5 @@ | 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 | +| [绋嬪簭鍦ㄨ绠楁満涓殑杩愯杩囩▼绠鏋怾(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 | +| [骞跺彂缂栫▼涔-Volatile娴呮瀽](http://korben-chy.github.io/2017/03/12/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E4%B9%8B-Volatile%E6%B5%85%E6%9E%90) | 2017/03/12 | From b48d6be2adfd53b834a4cfb414cc7ba300b3338a Mon Sep 17 00:00:00 2001 From: yc <755659358@qq.com> Date: Sun, 12 Mar 2017 23:58:46 +0800 Subject: [PATCH 111/177] =?UTF-8?q?week03=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blogs/blog\345\234\260\345\235\200.txt" | 1 + .../src/com/coderising/array/ArrayUtil.java | 96 ++++++ .../coderising/download/DownloadThread.java | 40 +++ .../coderising/download/FileDownloader.java | 89 +++++ .../download/FileDownloaderTest.java | 59 ++++ .../src/com/coderising/download/TestDown.java | 20 ++ .../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 | 79 +++++ .../download/impl/ConnectionManagerImpl.java | 15 + .../coderising/litestruts/LoginAction.java | 39 +++ .../src/com/coderising/litestruts/Struts.java | 37 ++ .../com/coderising/litestruts/StrutsTest.java | 43 +++ .../src/com/coderising/litestruts/View.java | 23 ++ .../src/com/coderising/litestruts/struts.xml | 11 + .../week03/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 318 ++++++++++++++++++ .../src/com/coding/basic/LinkedListTest.java | 151 +++++++++ .../week03/src/com/coding/basic/List.java | 9 + 21 files changed, 1080 insertions(+) create mode 100644 group20/755659358/week03/src/com/coderising/array/ArrayUtil.java create mode 100644 group20/755659358/week03/src/com/coderising/download/DownloadThread.java create mode 100644 group20/755659358/week03/src/com/coderising/download/FileDownloader.java create mode 100644 group20/755659358/week03/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group20/755659358/week03/src/com/coderising/download/TestDown.java create mode 100644 group20/755659358/week03/src/com/coderising/download/api/Connection.java create mode 100644 group20/755659358/week03/src/com/coderising/download/api/ConnectionException.java create mode 100644 group20/755659358/week03/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group20/755659358/week03/src/com/coderising/download/api/DownloadListener.java create mode 100644 group20/755659358/week03/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group20/755659358/week03/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group20/755659358/week03/src/com/coderising/litestruts/LoginAction.java create mode 100644 group20/755659358/week03/src/com/coderising/litestruts/Struts.java create mode 100644 group20/755659358/week03/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group20/755659358/week03/src/com/coderising/litestruts/View.java create mode 100644 group20/755659358/week03/src/com/coderising/litestruts/struts.xml create mode 100644 group20/755659358/week03/src/com/coding/basic/Iterator.java create mode 100644 group20/755659358/week03/src/com/coding/basic/LinkedList.java create mode 100644 group20/755659358/week03/src/com/coding/basic/LinkedListTest.java create mode 100644 group20/755659358/week03/src/com/coding/basic/List.java 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" index 82dd8add37..5b1436ee57 100644 --- "a/group20/755659358/blogs/blog\345\234\260\345\235\200.txt" +++ "b/group20/755659358/blogs/blog\345\234\260\345\235\200.txt" @@ -1 +1,2 @@ week02:http://www.jianshu.com/p/22d2cbefdaa1 +week03:http://www.jianshu.com/p/8d1b6373c178 diff --git a/group20/755659358/week03/src/com/coderising/array/ArrayUtil.java b/group20/755659358/week03/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..78845d06d0 --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/group20/755659358/week03/src/com/coderising/download/DownloadThread.java b/group20/755659358/week03/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..4744709756 --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,40 @@ +package com.coderising.download; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread { + + Connection conn; + int startPos; + int endPos; + File file; + + public DownloadThread(Connection conn, int startPos, int endPos, File file) { + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.file = file; + } + + public void run() { + RandomAccessFile raf=null; + try { + raf=new RandomAccessFile(file, "rw"); + raf.seek(startPos); + raf.write(conn.read(startPos, endPos),0,endPos-startPos+1); + } catch (IOException e) { + e.printStackTrace(); + }finally { + try { + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/group20/755659358/week03/src/com/coderising/download/FileDownloader.java b/group20/755659358/week03/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..771506f322 --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,89 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +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() { + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, + // endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 + // 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + Connection conn = null; + + try { + + conn = cm.open(this.url); + File file = new File(getFileName(url)); + if (!file.exists()) { + file.createNewFile(); + } + int length = conn.getContentLength(); + RandomAccessFile raf = new RandomAccessFile(file, "rw"); + raf.setLength(length); + raf.close(); + int block=length/3; + new DownloadThread(conn, 0, block, file).start(); + new DownloadThread(conn, block, 2*block, file).start(); + new DownloadThread(conn, 2*block, length-1,file).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (conn != null) { + conn.close(); + } + } + } + + private String getFileName(String filePath) { + return filePath.substring(filePath.lastIndexOf('/') + 1); + } + + 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/group20/755659358/week03/src/com/coderising/download/FileDownloaderTest.java b/group20/755659358/week03/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..c6be1cea43 --- /dev/null +++ b/group20/755659358/week03/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://a.zdmimg.com/201703/11/58c3ff6f422a38093.jpg_c350.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/group20/755659358/week03/src/com/coderising/download/TestDown.java b/group20/755659358/week03/src/com/coderising/download/TestDown.java new file mode 100644 index 0000000000..31bd0afd96 --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/download/TestDown.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class TestDown { + + public static void main(String[] args) { + String url = "http://a.zdmimg.com/201703/11/58c3ff6f422a38093.jpg_c350.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.execute(); + + } + +} diff --git a/group20/755659358/week03/src/com/coderising/download/api/Connection.java b/group20/755659358/week03/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..9710e270e1 --- /dev/null +++ b/group20/755659358/week03/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/group20/755659358/week03/src/com/coderising/download/api/ConnectionException.java b/group20/755659358/week03/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..8dbfe95dda --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group20/755659358/week03/src/com/coderising/download/api/ConnectionManager.java b/group20/755659358/week03/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..fb44ede457 --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group20/755659358/week03/src/com/coderising/download/api/DownloadListener.java b/group20/755659358/week03/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..4cd0b3eab1 --- /dev/null +++ b/group20/755659358/week03/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/group20/755659358/week03/src/com/coderising/download/impl/ConnectionImpl.java b/group20/755659358/week03/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..347c785ea2 --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,79 @@ +package com.coderising.download.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import com.coderising.download.api.Connection; +import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; + +public class ConnectionImpl implements Connection { + + private URL httpUrl; + + public ConnectionImpl(String url) { + try { + httpUrl = new URL(url); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + @Override + public byte[] read(int startPos, int endPos) { + byte[] result = null; + HttpURLConnection conn = null; + ByteOutputStream outByte=null; + try { + conn = (HttpURLConnection) httpUrl.openConnection(); + conn.setRequestMethod("GET"); + conn.setReadTimeout(5000); + conn.addRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + int code = conn.getResponseCode(); + System.out.println("code:" + code); + if (code == 206) { + InputStream in = conn.getInputStream(); + outByte = new ByteOutputStream(); + outByte.write(in); + result=outByte.getBytes(); + } + System.out.println("result:" + result.length); + } catch (IOException e1) { + e1.printStackTrace(); + } finally { + outByte.close(); + conn.disconnect(); + } + + System.out.println(result.length + "resultsize"); + return result; + } + + @Override + public int getContentLength() { + int fileSize = 0; + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) httpUrl.openConnection(); + conn.setRequestMethod("HEAD"); + conn.setReadTimeout(5000); + if (conn.getResponseCode() == 200) { + fileSize = conn.getContentLength(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + + return fileSize; + } + + @Override + public void close() { + + } + +} diff --git a/group20/755659358/week03/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group20/755659358/week03/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..f1db9d72a9 --- /dev/null +++ b/group20/755659358/week03/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 new ConnectionImpl(url); + } + +} diff --git a/group20/755659358/week03/src/com/coderising/litestruts/LoginAction.java b/group20/755659358/week03/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..1005f35a29 --- /dev/null +++ b/group20/755659358/week03/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/group20/755659358/week03/src/com/coderising/litestruts/Struts.java b/group20/755659358/week03/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..9761246bed --- /dev/null +++ b/group20/755659358/week03/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,37 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +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/group20/755659358/week03/src/com/coderising/litestruts/StrutsTest.java b/group20/755659358/week03/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a44c1878ac --- /dev/null +++ b/group20/755659358/week03/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/group20/755659358/week03/src/com/coderising/litestruts/View.java b/group20/755659358/week03/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..0194c681f6 --- /dev/null +++ b/group20/755659358/week03/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/group20/755659358/week03/src/com/coderising/litestruts/struts.xml b/group20/755659358/week03/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..4c6eeabbd4 --- /dev/null +++ b/group20/755659358/week03/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/755659358/week03/src/com/coding/basic/Iterator.java b/group20/755659358/week03/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..dbe8b9afb2 --- /dev/null +++ b/group20/755659358/week03/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/755659358/week03/src/com/coding/basic/LinkedList.java b/group20/755659358/week03/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..fe6ba359cd --- /dev/null +++ b/group20/755659358/week03/src/com/coding/basic/LinkedList.java @@ -0,0 +1,318 @@ +package com.coding.basic; + +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; + size--; + 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; + } + + public LinkedListIterator iterate() { + return new LinkedListIterator(); + } + + public class LinkedListIterator implements Iterator { + + private int position; + + @Override + public boolean hasNext() { + return position < size(); + } + + @Override + public Object next() { + return get(position++); + } + + } + + private static class Node { + + Object data; + Node next; + + } + + /** + * 鎶婅閾捐〃閫嗙疆 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse() { + Node newHead = getNode(size - 1); + for (int i = size - 1; i > 0; i--) { + getNode(i).next = getNode(i - 1); + } + head = newHead; + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 濡傛灉list = 2->5->7->8->10 + * ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + * + */ + public void removeFirstHalf() { + int half = size / 2; + Node newHead = getNode(half); + for (int i = 0; i < half - 1; i++) { + Node node = getNode(i); + node = null; + } + size -= half; + head = getNode(half); + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + int p = i; + if (i == 0) { + Node newHead = getNode(length); + do { + Node node = getNode(p); + node = null; + p++; + } while (p < length); + head = newHead; + size -= length; + return; + } + + getNode(i - 1).next = getNode(i + length); + size -= length; + for (; p < i + length; p++) { + Node node = getNode(p); + node = null; + } + } + + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭istB鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺listB鎵鎸囧畾鐨勫厓绱 渚嬪褰撳墠閾捐〃 = + * 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[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + int index = (int) list.get(i); + result[i] = (int) get(index); + } + return result; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪listB涓嚭鐜扮殑鍏冪礌 + * + * @param list + */ + + public void subtract(LinkedList list) { + + for (int i = 0; i < list.size(); i++) { + int dataB = (int) list.get(i); + for (int j = size - 1; j > 0; j--) { + int data = (int) get(j); + if (data == dataB) { + remove(j); + } + } + } + + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues() { + int i = size - 2; + int right = (int) get(i + 1); + int left = (int) get(i); + + do { + if (right == left) { + remove(i); + } else { + right = (int) get(i); + } + i--; + left = (int) get(i); + } while (i > 0); + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + int indexMin=0; + int i = 0; + while (imin) { + indexMin=i; + break; + }else { + i++; + } + } + if (i==size) { + return; + } + + int indexMax=0; + int j=size-1; + while (j>=0) { + int dataMax=(int) get(j); + if (dataMax Date: Mon, 13 Mar 2017 07:28:17 +0800 Subject: [PATCH 112/177] 2 --- group12/382266293/.classpath | 9 +--- .../basic/collection/concrete/LinkedList.java | 50 ++++++++++++++++--- .../test/collection/LinkedListTest2.java | 48 ++++++++++++++++-- .../src/litestruts/ActionXMLreader.java | 50 +++++++++++++++++++ .../src/litestruts/Configuration.java | 2 +- 5 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 group12/382266293/src/litestruts/ActionXMLreader.java diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath index 83faa48c0d..248236a6c0 100644 --- a/group12/382266293/.classpath +++ b/group12/382266293/.classpath @@ -4,15 +4,8 @@ - - - - - - - - + diff --git a/group12/382266293/coding/basic/collection/concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java index 341149e0f8..f5ce66247e 100644 --- a/group12/382266293/coding/basic/collection/concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -1,5 +1,6 @@ package collection.concrete; +import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; @@ -145,8 +146,49 @@ public int[] getElements(LinkedList list) { * * @param list */ + + public void subtract2(LinkedList list) { + LinkedList result = new LinkedList<>(); + + if (list.size == 0 || this.size == 0) { + return; + } + + Node n1 = this.head; + Node n2 = list.head; + Node curr_list = list.head; + for (int i = 0; i < this.size; i++, n1 = n1.next) { + boolean equals = false; + curr_list = list.head; + while(curr_list != null && !equals) { + if (Objects.equals(n1.data, curr_list.data)) { + equals = true; + } + curr_list = curr_list.next; + } + + if (!equals) { + result.add(n1.data); + } + + } + + clearAndSetNewHead(this.size); + Node p2 = result.head; + while(p2.next != null) { + add(p2.data); + p2 = p2.next; + } + add(p2.data); + this.size = result.size; + + } + + + public void subtract(LinkedList list) { + Node n1 = list.getNode(0); Node n2 = head; int count = list.size(); @@ -247,14 +289,6 @@ public void removeRange(int min, int max) { } public static void main(String args[]) { - LinkedList myLL = new LinkedList(); - myLL.add(0); - addIntWithNatureOrder(myLL, 10); - myLL.add(10); - myLL.add(89); - println(myLL); - myLL.removeRange(2, 10); - println(myLL); } diff --git a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java index c24c93be14..490da017d6 100644 --- a/group12/382266293/coding/basic/test/collection/LinkedListTest2.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest2.java @@ -49,7 +49,6 @@ public void testRemoveFirstHalf() { myLL = new LinkedList(); myLL.removeFirstHalf(); - println(myLL); assertEquals(0, myLL.size()); } @@ -70,7 +69,6 @@ public void testRemove2() { } - println(myLL); assertEquals(0, myLL.size()); } @@ -91,7 +89,6 @@ public void testGetElements() { myLL = new LinkedList(); result = myLL.getElements(list); - println(myLL); assertEquals(0, myLL.size()); } @@ -119,6 +116,48 @@ public void testSubstract() { assertEquals(0, myLL.size()); } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Test + public void testSubstract2() { + LinkedList myLL = new LinkedList(); + addIntWithNatureOrder(myLL, 10); + myLL.add(10); + myLL.add(10); + myLL.add(12); + LinkedList list = new LinkedList(); + list.add(0); + list.add(0); + addIntWithNatureOrder(list, 10); + list.add(10); + list.add(12); + list.add(22); + + myLL.subtract2(list); + assertEquals(0, myLL.size()); + + myLL = new LinkedList(); + LinkedList list1 = new LinkedList(); + myLL.subtract2(list); + assertEquals(0, myLL.size()); + + addIntWithNatureOrder(myLL, 10); + myLL.add(-3); + println(myLL); + list1.add(10); + list1.add(3); + list1.add("dd"); + list1.add(null); + list1.add(-3); + list1.add(9); + list1.add(0); + myLL.subtract2(list1); + + assertEquals("[1, 2, 4, 5, 6, 7, 8]",myLL.toString()); + + } + + @Test public void testIntersection() { @@ -197,5 +236,8 @@ public void testRemoveRange() { assertEquals(0, myLL.size()); } + + + } diff --git a/group12/382266293/src/litestruts/ActionXMLreader.java b/group12/382266293/src/litestruts/ActionXMLreader.java new file mode 100644 index 0000000000..92e700edc4 --- /dev/null +++ b/group12/382266293/src/litestruts/ActionXMLreader.java @@ -0,0 +1,50 @@ +package litestruts; + +import java.util.List; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; + +public class ActionXMLreader { + + public Node getRootNode(String add) { + SAXReader reader = new SAXReader(); + Document document = null; + Node root = null; + try { + document = reader.read(add); + root = document.getRootElement(); + } catch (DocumentException e) { + e.printStackTrace(); + } + return root; + } + + public String parseClass(Node root, String attr) { + + @SuppressWarnings("rawtypes") + List list = root.selectNodes("action[@name='" + attr + "']"); + String clazz = null; + for (Object o : list) { + Element e = (Element) o; + clazz = e.attributeValue("class"); + } + return clazz; + } + + public String parseResult(Node root, String attr, String result) { + + @SuppressWarnings("rawtypes") + List list = root.selectNodes("action[@name='" + attr + "']/result[@name='" + result + "']"); + + String jsp = null; + for (Object o : list) { + Element e = (Element) o; + jsp = e.getTextTrim(); + } + return jsp; + } + +} diff --git a/group12/382266293/src/litestruts/Configuration.java b/group12/382266293/src/litestruts/Configuration.java index 90eac0be64..9b7d4e8466 100644 --- a/group12/382266293/src/litestruts/Configuration.java +++ b/group12/382266293/src/litestruts/Configuration.java @@ -69,7 +69,7 @@ public static void main(String[] args) { Configuration cfg = new Configuration(); cfg.parseAction("struts"); Map info = cfg.getActionInfo(); - Map result = cfg.getResultInfo(); + Map result = cfg.getResultInfo().get("login"); println(info); println(result); } From f20c3ea87422ab4e02c06e805ef9b6a829a3d6b8 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 13 Mar 2017 10:32:29 +0800 Subject: [PATCH 113/177] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zj-2017/src/com/coderising/download/impl/ConnectionImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java index fbf8de35ae..ec8e503fe9 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/2258659044/zj-2017/src/com/coderising/download/impl/ConnectionImpl.java @@ -29,7 +29,6 @@ public byte[] read(int startPos, int endPos) throws IOException { } baos.flush(); data = baos.toByteArray(); - return data; } return data; } From 8f9a9d09c59fb01ad7a1851757f3b93e3b188669 Mon Sep 17 00:00:00 2001 From: zj Date: Mon, 13 Mar 2017 10:41:39 +0800 Subject: [PATCH 114/177] Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 鍒犻櫎鏃犵敤杩斿洖 From 1abd5de6f6d7a39756a50e05c010b8871deecbe5 Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Mon, 13 Mar 2017 16:33:24 +0800 Subject: [PATCH 115/177] record04 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 瀹屾垚Stack銆 Queue锛屽LinkedList鐨勬柟娉曡繘琛屼慨鏀瑰拰鎵╁厖 --- .../Exercise/src/lesson01/LinkedList.java | 116 +++++++++++++----- .../Exercise/src/lesson01/Queue.java | 31 +++++ .../Exercise/src/lesson01/Stack.java | 37 ++++++ 3 files changed, 156 insertions(+), 28 deletions(-) create mode 100644 group13/1274639949/Exercise/src/lesson01/Queue.java create mode 100644 group13/1274639949/Exercise/src/lesson01/Stack.java diff --git a/group13/1274639949/Exercise/src/lesson01/LinkedList.java b/group13/1274639949/Exercise/src/lesson01/LinkedList.java index 0c30737c8b..6e2689e21f 100644 --- a/group13/1274639949/Exercise/src/lesson01/LinkedList.java +++ b/group13/1274639949/Exercise/src/lesson01/LinkedList.java @@ -31,45 +31,35 @@ public void add(int index, E element) { //閾捐〃涓繕娌℃湁鍏冪礌 head.next = temp; temp.pre = head; - }else{ - //閾捐〃涓凡缁忔湁鍏冪礌 + last = temp; + }else if(index == size){ + //閾捐〃涓凡缁忔湁鍏冪礌锛屽湪鏈鍚庝竴涓厓绱犲悗闈㈡坊鍔犲厓绱 last.next = temp; temp.pre = last; + last = temp; + }else{ + Node pos = head.next; + for(int i = 0; i < index; i++){ + pos = pos.next; + } + temp.pre = pos.pre; + temp.next = pos; + pos.pre.next = temp; + pos.pre = temp; } - last = temp; size++; temp = null; } @Override public void clear() { - while(size > 0){ - temp = last.pre; - last.pre = null; - temp.next = null; - - if(temp == head){ - last = null; - }else{ - last = temp; - } - size--; + while(pollFirst() != null){ } - temp = null; } @Override public boolean contains(Object o) { - temp = head.next; - if(o == null){ - while(temp != null){ - if(temp.data == null){ - return true; - } - temp = temp.next; - } - } - return false; + return indexOf(o) >= 0; } @Override @@ -124,7 +114,7 @@ public E remove(int index) { head.next = null; last.pre = null; last = null; - }else if(index == 0){ + }/*else if(index == 0){ //閾捐〃涓湁涓や釜鎴栨洿澶氱殑鍏冪礌锛屼絾鏄Щ闄や笅鏍囦负0鐨勫厓绱 temp = head.next; obj = temp.data; @@ -134,9 +124,9 @@ public E remove(int index) { temp.pre = null; temp.next = null; temp = null; - }else if(index == size - 1){ + }*/else if(index == size - 1){ //閾捐〃涓湁涓や釜鎴栨洿澶氱殑鍏冪礌锛屼絾鏄Щ闄や笅鏍囦负size()-1鐨勫厓绱 - obj = head.data; + obj = last.data; last = last.pre; last.next.pre = null; @@ -154,6 +144,7 @@ public E remove(int index) { temp.next = null; temp = null; } + size--; return obj; } @@ -219,6 +210,7 @@ public E next() { E element = get(pos); lastRet = pos; pos++; +// E element = get(lastRet = pos++); return element; } @@ -238,5 +230,73 @@ private static final class Node{ Node next; Node pre; } + + public void addFirst(E e){ + add(0, e); + } + + public void addLast(E e){ + add(size, e); + } + + public E removeFirst(){ + ensureElementExists(); + return remove(0); + + } + + + private void ensureElementExists() { + if(size == 0){ + throw new NoSuchElementException(); + } + } + + public E removeLast(){ + ensureElementExists(); + return remove(size - 1); + + } + + public E getFirst(){ + ensureElementExists(); + return get(0); + } + + public E getLast(){ + ensureElementExists(); + return get(size - 1); + + } + + public E pollFirst(){ + if(size == 0){ + return null; + } + return remove(0); + } + + public E pollLast(){ + if(size == 0){ + return null; + } + return remove(size - 1); + } + + public E peekFirst(){ + if(size == 0){ + return null; + } + return get(0); + } + + public E peekLast(){ + if(size == 0){ + return null; + } + return get(size - 1); + } + + } diff --git a/group13/1274639949/Exercise/src/lesson01/Queue.java b/group13/1274639949/Exercise/src/lesson01/Queue.java new file mode 100644 index 0000000000..bfc51a417f --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson01/Queue.java @@ -0,0 +1,31 @@ +package lesson01; + +public class Queue { + + private LinkedList queue = new LinkedList(); + + /** + * 鍏ュ垪 + * @param e + */ + public void enQueue(E e){ + queue.addLast(e); + } + + /** + * 鍑哄垪 + * @return + */ + public E deQueue(){ + return queue.pollFirst(); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return queue.size(); + } + +} diff --git a/group13/1274639949/Exercise/src/lesson01/Stack.java b/group13/1274639949/Exercise/src/lesson01/Stack.java new file mode 100644 index 0000000000..d820773f5f --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson01/Stack.java @@ -0,0 +1,37 @@ +package lesson01; + +import java.util.EmptyStackException; + +public class Stack{ + + private ArrayList stack = new ArrayList(); + + boolean isEmpty(){ + return size() == 0; + } + + E peek(){ + checkEmpty(); + return stack.get(size() - 1); + } + + E pop(){ + checkEmpty(); + return stack.remove(size() - 1); + } + + private void checkEmpty() { + if(isEmpty()){ + throw new EmptyStackException(); + } + } + + void push(E e){ + stack.add(e); + } + + public int size(){ + return stack.size(); + } + +} From 1f95d75bf66da29e7c2953d4b5f80cf5009b85fb Mon Sep 17 00:00:00 2001 From: felixCJF Date: Mon, 13 Mar 2017 18:46:30 +0800 Subject: [PATCH 116/177] download --- .../coderising/download/DownloadThread.java | 37 ++++++++ .../coderising/download/FileDownloader.java | 87 +++++++++++++++++++ .../download/FileDownloaderTest.java | 60 +++++++++++++ .../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 | 54 ++++++++++++ .../download/impl/ConnectionManagerImpl.java | 25 ++++++ 9 files changed, 306 insertions(+) create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/DownloadThread.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloader.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloaderTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/Connection.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionException.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionManager.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/DownloadListener.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionImpl.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/DownloadThread.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..79cb9d5246 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/DownloadThread.java @@ -0,0 +1,37 @@ +package com.github.FelixCJF.coding2017.coderising.download; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.github.FelixCJF.coding2017.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(){ + System.out.println("涓嬭浇寮濮"); + try { + byte[] buff = conn.read(startPos, endPos); + //鍒涘缓涓涓彲闅忔満鍐欏叆鏂囦欢 + RandomAccessFile randomAccessFile = new RandomAccessFile(new File("G:/"), "rwd"); + randomAccessFile.seek(startPos); + randomAccessFile.write(buff, 0, buff.length); + randomAccessFile.close(); + + System.out.println("涓嬭浇缁撴潫"); + } catch (IOException e) { + e.printStackTrace(); + } + + } +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloader.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..f9d79fcae4 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloader.java @@ -0,0 +1,87 @@ +package com.github.FelixCJF.coding2017.coderising.download; + +import com.github.FelixCJF.coding2017.coderising.download.api.Connection; +import com.github.FelixCJF.coding2017.coderising.download.api.ConnectionException; +import com.github.FelixCJF.coding2017.coderising.download.api.ConnectionManager; +import com.github.FelixCJF.coding2017.coderising.download.api.DownloadListener; + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + Connection conn = null; + try { + + conn = cm.open(this.url); + int length = conn.getContentLength(); + //鑷畾涔夌嚎绋嬫暟閲 + int threadCount = 3; + //璁$畻姣忔潯绾跨▼涓嬭浇鏁版嵁鐨勫ぇ灏 + int blockSize = length/threadCount; + + for (int threadId = 0; threadId <= threadCount; threadCount++) { + + //瀹氫箟姣忎釜绾跨▼寮濮嬩互鍙婄粨鏉熺殑涓嬭浇浣嶇疆 + // 寮濮嬩笅杞界殑浣嶇疆 + int startPos = (threadId - 1) * blockSize; + // 缁撴潫涓嬭浇鐨勪綅缃紙涓嶅寘鍚渶鍚庝竴鍧楋級 + int endPos = (threadId * blockSize) - 1; + if (threadCount == threadId) { + endPos = length; + } + 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/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloaderTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4e96a56459 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/FileDownloaderTest.java @@ -0,0 +1,60 @@ +package com.github.FelixCJF.coding2017.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.FelixCJF.coding2017.coderising.download.api.ConnectionManager; +import com.github.FelixCJF.coding2017.coderising.download.api.DownloadListener; +import com.github.FelixCJF.coding2017.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://www.baidu.com/img/bd_logo.png"; + + 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/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/Connection.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/Connection.java new file mode 100644 index 0000000000..e4469d666f --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.github.FelixCJF.coding2017.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/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionException.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..657ba9543e --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.github.FelixCJF.coding2017.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionManager.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..f131cb622b --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.github.FelixCJF.coding2017.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/DownloadListener.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..a14e84acb4 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.github.FelixCJF.coding2017.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionImpl.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..b56384022e --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,54 @@ +package com.github.FelixCJF.coding2017.coderising.download.impl; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URLConnection; + +import com.github.FelixCJF.coding2017.coderising.download.api.Connection; + + +public class ConnectionImpl implements Connection{ + + + public URLConnection urlConnection; + + public ConnectionImpl(URLConnection urlConnection) { + this.urlConnection = urlConnection; + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + //璁剧疆杩炴帴瓒呮椂灞炴 + urlConnection.setReadTimeout(5000); + + urlConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + + BufferedInputStream inputStream= new BufferedInputStream(urlConnection.getInputStream()); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + byte[] buff = new byte[1024]; + int len = 0; + + while ((len = inputStream.read(buff)) != -1) { + outputStream.write(buff,0,len); + } + byte[] temp = outputStream.toByteArray(); + + inputStream.close(); + outputStream.close(); + + return temp; + } + + @Override + public int getContentLength() { + return urlConnection.getContentLength(); + } + + @Override + public void close() { + urlConnection = null; + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionManagerImpl.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..771dd30b36 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,25 @@ +package com.github.FelixCJF.coding2017.coderising.download.impl; + + +import java.net.URL; + +import com.github.FelixCJF.coding2017.coderising.download.api.Connection; +import com.github.FelixCJF.coding2017.coderising.download.api.ConnectionException; +import com.github.FelixCJF.coding2017.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + Connection connection = null; + try { + + connection = new ConnectionImpl(new URL(url).openConnection()); + + } catch (Exception e) { + e.printStackTrace(); + } + return connection; + } + +} From 1e3002705d624bb8199fdfa83cde570de1e3f2b3 Mon Sep 17 00:00:00 2001 From: Hipple <1159828430@qq.com> Date: Mon, 13 Mar 2017 21:19:45 +0800 Subject: [PATCH 117/177] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group18/1159828430/20160305/.classpath | 7 + group18/1159828430/20160305/.gitignore | 1 + group18/1159828430/20160305/.project | 17 + .../src/com/coding/basic/LinkedList.java | 373 ++++++++++++++++++ .../20160305/src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/TestLinkedList.java | 143 +++++++ .../com/coding/download/DownloadThread.java | 36 ++ .../com/coding/download/FileDownloader.java | 87 ++++ .../coding/download/FileDownloaderTest.java | 61 +++ .../com/coding/download/api/Connection.java | 21 + .../download/api/ConnectionException.java | 11 + .../download/api/ConnectionManager.java | 10 + .../coding/download/api/DownloadListener.java | 5 + .../coding/download/impl/ConnectionImpl.java | 79 ++++ .../download/impl/ConnectionManagerImpl.java | 15 + .../com/coding/download/impl/FileUtil.java | 59 +++ .../src/com/coding/litestruts/Struts.java | 2 +- 17 files changed, 939 insertions(+), 1 deletion(-) create mode 100644 group18/1159828430/20160305/.classpath create mode 100644 group18/1159828430/20160305/.gitignore create mode 100644 group18/1159828430/20160305/.project create mode 100644 group18/1159828430/20160305/src/com/coding/basic/LinkedList.java create mode 100644 group18/1159828430/20160305/src/com/coding/basic/List.java create mode 100644 group18/1159828430/20160305/src/com/coding/basic/TestLinkedList.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/DownloadThread.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/FileDownloader.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/FileDownloaderTest.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/api/Connection.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/api/ConnectionException.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/api/ConnectionManager.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/api/DownloadListener.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/impl/ConnectionImpl.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/impl/ConnectionManagerImpl.java create mode 100644 group18/1159828430/20160305/src/com/coding/download/impl/FileUtil.java diff --git a/group18/1159828430/20160305/.classpath b/group18/1159828430/20160305/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group18/1159828430/20160305/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group18/1159828430/20160305/.gitignore b/group18/1159828430/20160305/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group18/1159828430/20160305/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group18/1159828430/20160305/.project b/group18/1159828430/20160305/.project new file mode 100644 index 0000000000..343a59edbc --- /dev/null +++ b/group18/1159828430/20160305/.project @@ -0,0 +1,17 @@ + + + 20160305 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/1159828430/20160305/src/com/coding/basic/LinkedList.java b/group18/1159828430/20160305/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..ef3f794cd5 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/basic/LinkedList.java @@ -0,0 +1,373 @@ +package com.coding.basic; + +import java.util.Iterator; + +/** + * @author Scholar + * @Time锛2017骞3鏈6鏃 涓嬪崍9:45:54 + * @version 1.0 + */ +public class LinkedList implements List { + + private Node head; + private int size; + + public boolean add(Object o){ + addLast(o); + return true; + + } + public void add(int index , Object o){ + checkPositionIndex(index); + if (index == 0) { + addFirst(o); + } else if (index == size) { + addLast(o); + } else { + Node x = head; + for (int i = 0; i < index - 2; i++) { + x = x.next; + } + Node temp = new Node(o,x.next); + x.next = temp; + } + size++; + } + public Object get(int index){ + checkElementIndex(index); + Node x = head; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x.data; + } + @SuppressWarnings("unused") + public Object remove(int index){ + checkElementIndex(index); + Object element = null; + if (index == 0) { + Node removeNode = head; + head = head.next; + element = removeNode.data; + removeNode = null; + } else { + checkElementIndex(index - 1); + Node x = head; + for (int i = 0; i < index - 1; i++) { + x = x.next; + } + Node removeNode = x.next; + x.next = removeNode.next; + element = removeNode.data; + removeNode = null; + } + size--; + return element; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node temp = head; + Node newNode = new Node(o,temp); + head = newNode; + size++; + } + public void addLast(Object o){ + Node temp = new Node(o, null); + if (size == 0) { + head = temp; + } else { + Node x = head; + while (x.next != null) { + x = x.next; + } + x.next = temp; + } + size++; + } + public Object removeFirst(){ + Object element = null; + if (size != 0) { + element = head.data; + head.data = null; + + Node next = head.next; + head.next = null; + head = next; + size--; + } + return element; + } + public Object removeLast(){ + Object element = null; + if (size != 0) { + if (head.next == null) { + element = head.data; + head.data = null; + } else { + Node x = head; + for (int i = 0; i < size - 2; i++) { + x = x.next; + } + Node removeNode = x.next; + x.next = null; + element = removeNode.data; + removeNode = null; + } + size--; + } + return element; + } + public Iterator iterator(){ + return new LinkedListIterator(); + } + + //妫鏌ヤ笅鏍囨槸鍚﹀悎娉 + private void checkElementIndex(int index){ + if (!isElementIndex(index)) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } + } + + @SuppressWarnings("unused") + 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; + } + + @SuppressWarnings("unused") + 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 Node currentNode = head; + private int nextIndex = 0;//鍙傝冩簮鐮佷腑鐨勫啓娉 + + @Override + public Object next() { + + Object data = currentNode.data; + currentNode = currentNode.next; + nextIndex ++; + return data; + } + + @Override + public boolean hasNext() { + return nextIndex != size; + } + + } + + + + + + + + + + + + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + if (head!=null) { + //涓婁竴缁撶偣 + Node pre=head; + + //褰撳墠缁撶偣 + Node cur=head.next; + + //鐢ㄤ簬瀛樺偍涓嬩竴鑺傜偣 + Node tem; + + //cur==null 鍗冲熬缁撶偣 + while(cur!=null){ + + //涓嬩竴鑺傜偣瀛樺叆涓存椂缁撶偣 + tem=cur.next; + + //灏嗗綋鍓嶇粨鐐规寚閽堟寚鍚戜笂涓鑺傜偣 + cur.next = pre; + + //绉诲姩鎸囬拡 + pre=cur; + cur=tem; + } + head.next = null; + } + + + //reverse(head); + } + private Node reverse(Node first) { + // first鐪嬩綔鏄墠涓缁撶偣锛宖irst.next鏄綋鍓嶇粨鐐癸紝reHead鏄弽杞悗鏂伴摼琛ㄧ殑澶寸粨鐐 + if (first == null || first.next == null) { + return head;// 鑻ヤ负绌洪摼鎴栬呭綋鍓嶇粨鐐瑰湪灏剧粨鐐癸紝鍒欑洿鎺ヨ繕鍥 + } + Node reHead = reverse(first.next);// 鍏堝弽杞悗缁妭鐐筯ead.getNext() + first.next.next = first;// 灏嗗綋鍓嶇粨鐐圭殑鎸囬拡鍩熸寚鍚戝墠涓缁撶偣 + first.next = null;// 鍓嶄竴缁撶偣鐨勬寚閽堝煙浠や负null; + return reHead;// 鍙嶈浆鍚庢柊閾捐〃鐨勫ご缁撶偣 + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf(){ + int removeLength = size()/2; + for (int i = 0; i < removeLength; i++) { + removeFirst(); + } + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * @param i + * @param length + */ + public void remove(int index, int length){ + for (int i = 0; i < length; i++) { + this.remove(index); + } + + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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[] result = new int[list.size()]; + Iterator iterator = list.iterator(); + int offset = 0; + while (iterator.hasNext()) { + int temp = (int) this.get((int)iterator.next()); + result[offset++] = temp; + } + return result; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + * @param list + */ + + public void subtract(LinkedList list){ + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + int temp = (int) iterator.next(); + Node x = head; + Node p = null; + while (x.next != null) { + if ((int)x.data > temp) { + break; + } + if((int)x.data == temp){ + if (p == null) { + removeFirst(); + x = head; + } else { + p.next = x.next; + } + } + p = x; + x = x.next; + } + } + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues(){ + Node p = head; + while(p.next != null){ + Node x = p; + while (x.next != null) { + if(x.next.data == p.data){ + x.next=x.next.next; + } + x=x.next; + } + p = p.next; + } + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + Node p = head; + int i = (int)p.data; + if (i > min && i < max) { + while ((int)p.data > min) { + if ((int)p.data >= max) { + break; + } + removeFirst(); + p = head; + } + } else { + while (p.next != null) { + int temp = (int) p.next.data; + if (temp >= max) { + break; + } + if (temp > min) { + p.next=p.next.next; + } + p = p.next; + } + } + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + + + + + + return null; + } +} \ No newline at end of file diff --git a/group18/1159828430/20160305/src/com/coding/basic/List.java b/group18/1159828430/20160305/src/com/coding/basic/List.java new file mode 100644 index 0000000000..bf225b281f --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; +/** + * @author Scholar + * @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/20160305/src/com/coding/basic/TestLinkedList.java b/group18/1159828430/20160305/src/com/coding/basic/TestLinkedList.java new file mode 100644 index 0000000000..d78a3437fc --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/basic/TestLinkedList.java @@ -0,0 +1,143 @@ +package com.coding.basic; + +import org.junit.Before; +import org.junit.Test; + +/** + * @author 鏉庡叺鍏 + * @Time锛2017骞3鏈12鏃 涓婂崍11:02:54 + * @version 1.0 + */ +public class TestLinkedList { + private LinkedList list; + @Before + public void beforeTest() { + list = new LinkedList(); + list.add(5); + list.add(6); + list.add(7); + list.add(8); + list.add(9); + list.add(10); + list.add(11); + //list.add(5); + + } + + @Test + public void testAddObject() { + list.add(5); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testAddInt() { + list.add(5); + list.add(2, 9); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testRemoveInt() { + Object o = list.remove(0); + System.out.println(o); + System.out.println(list.size()); + } + + + @Test + public void testAddFirst() { + list.addFirst(5); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testAddLast() { + list.addLast(5); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testRemoveFirst() { + list.addFirst(8); + Object o = list.removeFirst(); + System.out.println(o); + } + + @Test + public void testRemoveLast() { + Object o = list.removeLast(); + System.out.println(o); + } + + + @Test + public void testRemoveDuplicateValues() { + list.removeDuplicateValues(); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testRemoveRange() { + list.removeRange(2,5); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testGetElements() { + LinkedList list1 = new LinkedList(); + list1.add(2); + list1.add(5); + int[] a = list.getElements(list1); + for (int i = 0; i < a.length; i++) { + System.out.println(a[i]); + } + } + + @Test + public void testRemove() { + list.remove(2,2); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testRemoveFirstHalf() { + list.removeFirstHalf(); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testSubtract() { + LinkedList list1 = new LinkedList(); + list1.add(8); + list1.add(5); + list.subtract(list1); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void testReverse() { + list.reverse(); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } +} diff --git a/group18/1159828430/20160305/src/com/coding/download/DownloadThread.java b/group18/1159828430/20160305/src/com/coding/download/DownloadThread.java new file mode 100644 index 0000000000..f7148fe73d --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/DownloadThread.java @@ -0,0 +1,36 @@ +package com.coding.download; + +import com.coding.download.api.Connection; +import com.coding.download.impl.FileUtil; + +public class DownloadThread extends Thread{ + + Connection conn; + FileUtil file; + int startPos; + int endPos; + + public DownloadThread(Connection conn, FileUtil file, int startPos, int endPos) { + + this.conn = conn; + this.file = file; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + + byte[] data = conn.read(startPos, endPos); + int length = endPos - startPos; + file.writeFile(data, startPos, length); + + } catch (Exception e) { + //System.out.println("绾跨▼鎵ц鍑洪敊"+e.getLocalizedMessage()); + e.printStackTrace(); + } finally { + conn.close(); + file.close(); + } + } + +} diff --git a/group18/1159828430/20160305/src/com/coding/download/FileDownloader.java b/group18/1159828430/20160305/src/com/coding/download/FileDownloader.java new file mode 100644 index 0000000000..20c3ae60d0 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/FileDownloader.java @@ -0,0 +1,87 @@ +package com.coding.download; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; +import com.coding.download.impl.FileUtil; + + +public class FileDownloader { + + private String url; + + private DownloadListener listener; + + private ConnectionManager cm; + + private FileUtil file; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + Connection conn = null; + try { + + conn = cm.open(this.url); + + long length = conn.getContentLength(); + + file.setSize((long)length); + + long sublen = length/3; + + for(int i=0; i<3; i++){ + conn = cm.open(this.url); + int starPos = (int) (sublen * i); + int endPos = (int) (sublen *(i + 1) -1); + new DownloadThread(conn, file, starPos, endPos).run(); + + } + listener.notifyFinished(); + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + conn.close(); + file.close(); + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public void setFile(FileUtil file) { + this.file = file; + } + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group18/1159828430/20160305/src/com/coding/download/FileDownloaderTest.java b/group18/1159828430/20160305/src/com/coding/download/FileDownloaderTest.java new file mode 100644 index 0000000000..8c4a56cad7 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/FileDownloaderTest.java @@ -0,0 +1,61 @@ +package com.coding.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; +import com.coding.download.impl.ConnectionManagerImpl; +import com.coding.download.impl.FileUtil; + +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://gss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/5ab5c9ea15ce36d33274da5e3cf33a87e950b168.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + FileUtil file = new FileUtil("F:\\test.jpg"); + downloader.setFile(file); + + 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/group18/1159828430/20160305/src/com/coding/download/api/Connection.java b/group18/1159828430/20160305/src/com/coding/download/api/Connection.java new file mode 100644 index 0000000000..160c318382 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/api/Connection.java @@ -0,0 +1,21 @@ +package com.coding.download.api; + +public interface Connection{ + /** + * 缁欏畾寮濮嬪拰缁撴潫浣嶇疆锛 璇诲彇鏁版嵁锛 杩斿洖鍊兼槸瀛楄妭鏁扮粍 + * @param startPos 寮濮嬩綅缃紝 浠0寮濮 + * @param endPos 缁撴潫浣嶇疆 + * @return + */ + public byte[] read(int startPos,int endPos) throws ConnectionException; + /** + * 寰楀埌鏁版嵁鍐呭鐨勯暱搴 + * @return + */ + public int getContentLength(); + + /** + * 鍏抽棴杩炴帴 + */ + public void close(); +} diff --git a/group18/1159828430/20160305/src/com/coding/download/api/ConnectionException.java b/group18/1159828430/20160305/src/com/coding/download/api/ConnectionException.java new file mode 100644 index 0000000000..70d419d5c7 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/api/ConnectionException.java @@ -0,0 +1,11 @@ +package com.coding.download.api; + +public class ConnectionException extends Exception { + public ConnectionException() { + System.out.println("鏈煡閿欒"); + } + + public ConnectionException(String msg) { + System.out.println(msg); + } +} diff --git a/group18/1159828430/20160305/src/com/coding/download/api/ConnectionManager.java b/group18/1159828430/20160305/src/com/coding/download/api/ConnectionManager.java new file mode 100644 index 0000000000..1d1a83caf2 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coding.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group18/1159828430/20160305/src/com/coding/download/api/DownloadListener.java b/group18/1159828430/20160305/src/com/coding/download/api/DownloadListener.java new file mode 100644 index 0000000000..c41045b0e8 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coding.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group18/1159828430/20160305/src/com/coding/download/impl/ConnectionImpl.java b/group18/1159828430/20160305/src/com/coding/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..f40d99011c --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/impl/ConnectionImpl.java @@ -0,0 +1,79 @@ +package com.coding.download.impl; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; + +public class ConnectionImpl implements Connection { + + private HttpURLConnection conn; + + private BufferedInputStream inputStream; + + public ConnectionImpl (String urlLocation) throws ConnectionException { + + URL url = null; + + try{ + if (urlLocation != null && !"".equals(urlLocation)) { + url = new URL(urlLocation); + } + + conn = (HttpURLConnection) url.openConnection(); + conn.setReadTimeout(10000); + conn.setRequestMethod("GET"); + conn.setAllowUserInteraction(true); + } catch(Exception e) { + throw new ConnectionException("鍒涘缓Connection瀵硅薄澶辫触"); + } + + + } + + @Override + public byte[] read(int startPos, int endPos) throws ConnectionException { + int readBytes = 0; + int length = endPos - startPos + 1; + byte[] buf = new byte[length]; + conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + try { + inputStream = new BufferedInputStream(conn.getInputStream()); + while (readBytes < length) { + int read = inputStream.read(buf, readBytes, length - readBytes); + if (read == -1) { + break; + } + readBytes += read; + } + + } catch (Exception e) { + + throw new ConnectionException("璇诲彇澶辫触"+e.getMessage()); + } + + return buf; + } + + @Override + public int getContentLength() { + + return conn.getContentLength(); + } + + + @Override + public void close() { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + System.out.println("鍏抽棴澶辫触"); + } + } + } + +} diff --git a/group18/1159828430/20160305/src/com/coding/download/impl/ConnectionManagerImpl.java b/group18/1159828430/20160305/src/com/coding/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..4f9e732b9b --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coding.download.impl; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String urlLocation) throws ConnectionException { + Connection conn = new ConnectionImpl(urlLocation); + return conn; + } + +} diff --git a/group18/1159828430/20160305/src/com/coding/download/impl/FileUtil.java b/group18/1159828430/20160305/src/com/coding/download/impl/FileUtil.java new file mode 100644 index 0000000000..67b6fac7c9 --- /dev/null +++ b/group18/1159828430/20160305/src/com/coding/download/impl/FileUtil.java @@ -0,0 +1,59 @@ +package com.coding.download.impl; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * @author Scholar + * @Time锛2017骞3鏈11鏃 涓婂崍12:32:15 + * @version 1.0 + */ +public class FileUtil { + + private File file; + + private RandomAccessFile itemFile; + + public FileUtil(String fileLocation) { + if (fileLocation != null && !"".equals(fileLocation)) { + file = new File(fileLocation); + } + + try { + itemFile = new RandomAccessFile(file, "rw"); + + } catch (IOException e) { + System.out.println("鍒涘缓闅忔満璇诲啓瀹炰緥澶辫触"); + } + + } + + public void writeFile(byte[] data, int startPos, int length) { + try { + itemFile = new RandomAccessFile(file, "rw"); + itemFile.seek(startPos); + itemFile.write(data, 0, length); + } catch (IOException e) { + System.out.println("鏂囦欢鍐欏叆澶辫触"); + } + } + + public void close() { + if (itemFile != null) { + try { + itemFile.close(); + } catch (IOException e) { + System.out.println("鏂囦欢娴佸叧闂け璐"); + } + } + } + + public void setSize(long size) { + try { + itemFile.setLength(size); + } catch (IOException e) { + System.out.println("鍒涘缓鎸囧畾鏂囦欢澶辫触"); + } + } +} diff --git a/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java b/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java index 92a485db1b..6cab5bb017 100644 --- a/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java +++ b/group18/1159828430/20170226/src/com/coding/litestruts/Struts.java @@ -35,7 +35,7 @@ public static View runAction(String actionName, Map parameters) { Method executeMethod = actionClass.getMethod("execute"); //Type returnType = m.getGenericReturnType();//鑾峰彇杩斿洖鍊肩被鍨 String returnValue = (String)executeMethod.invoke(actionObj);//杩欓噷濡備綍鏍规嵁杩斿洖绫诲瀷鏉ュ姩鎬佹帴鏀舵柟娉曠殑杩斿洖鍊硷紵 - + //selenium //鑾峰彇杩斿洖鍊兼斁鍒皏iew Map params = new HashMap(); Field[] fields = actionClass.getDeclaredFields(); From d6c75243f00f1076735b45b7932d1463a4c8040b Mon Sep 17 00:00:00 2001 From: BlindingDark Date: Mon, 13 Mar 2017 22:18:19 +0800 Subject: [PATCH 118/177] Delete .project --- group26/1778842360/first heomework/.project | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 group26/1778842360/first heomework/.project diff --git a/group26/1778842360/first heomework/.project b/group26/1778842360/first heomework/.project deleted file mode 100644 index 88536f7819..0000000000 --- a/group26/1778842360/first heomework/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - first heomework - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - From 813df4978c30addf0c9b155f38f4186e50d04c4f Mon Sep 17 00:00:00 2001 From: BlindingDark Date: Mon, 13 Mar 2017 22:18:28 +0800 Subject: [PATCH 119/177] Delete .classpath --- group26/1778842360/first heomework/.classpath | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 group26/1778842360/first heomework/.classpath diff --git a/group26/1778842360/first heomework/.classpath b/group26/1778842360/first heomework/.classpath deleted file mode 100644 index fb565a588d..0000000000 --- a/group26/1778842360/first heomework/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - From ff697c00748848b0d5b52d2037d4e682a2d989d7 Mon Sep 17 00:00:00 2001 From: BlindingDark Date: Mon, 13 Mar 2017 22:18:38 +0800 Subject: [PATCH 120/177] Delete org.eclipse.jdt.core.prefs --- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs diff --git a/group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs b/group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab1683..0000000000 --- a/group26/1778842360/first heomework/.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 From bc2955ec56f0b8954643bb932b4b5b770f04bd45 Mon Sep 17 00:00:00 2001 From: Korben_CHY Date: Mon, 13 Mar 2017 22:22:43 +0800 Subject: [PATCH 121/177] bug fix for ArrayList --- .../korben/coding/basic/list/KArrayList.java | 18 +- .../coding/basic/list/KDoubleLinkedList.java | 175 ------------------ .../korben/coding/basic/list/KLinkedList.java | 6 +- 3 files changed, 11 insertions(+), 188 deletions(-) delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java 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 index 0f443462ed..5df5408e67 100644 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java @@ -74,7 +74,7 @@ public void clear() { @Override @SuppressWarnings("unchecked") public T get(int index) { - if (index < -1 || index >= size) { + if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } @@ -83,7 +83,7 @@ public T get(int index) { @Override public T set(int index, T element) { - if (index < -1 || index >= size) { + if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } @@ -94,7 +94,7 @@ public T set(int index, T element) { @Override public void add(int index, T element) { - if (index < -1 || index > size) { + if (index < 0 || index > size) { throw new IndexOutOfBoundsException(); } @@ -109,7 +109,7 @@ public void add(int index, T element) { @Override @SuppressWarnings("unchecked") public T remove(int index) { - if (index < -1 || index >= size) { + if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } @@ -132,7 +132,7 @@ public int indexOf(T o) { @Override public KIterator iterator() { - return new ArrayListIterator(this); + return new ArrayListIterator(); } private void ensureCapacity(int minCapacity) { @@ -147,21 +147,19 @@ private void ensureCapacity(int minCapacity) { private class ArrayListIterator implements KIterator { private int position; - private KArrayList list; - ArrayListIterator(KArrayList list) { - this.list = list; + ArrayListIterator() { } @Override public boolean hasNext() { - return position < list.size(); + return position < size(); } @Override public T next() { if (hasNext()) { - return list.get(position++); + return get(position++); } return null; } diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java deleted file mode 100644 index 575e537da9..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KDoubleLinkedList.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.korben.coding.basic.list; - -import java.util.Objects; - -/** - * Korben's LinkedList - * - * Created by Korben on 18/02/2017. - */ -public class KDoubleLinkedList implements KList { - - private int size; - - private Node head; - - private Node last; - - public KDoubleLinkedList() { - 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) { - if (index <= 0 || index >= this.size) { - throw new IndexOutOfBoundsException(); - } - 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 UnsupportedOperationException("鏂规硶鏈疄鐜"); - } - - 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/KLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java index 719881cf91..5f0975d3fb 100644 --- a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java @@ -150,7 +150,7 @@ public int indexOf(T o) { @Override public KIterator iterator() { - return new Iterator(this); + return new Iterator(); } private Node getNode(int index) { @@ -474,8 +474,8 @@ private static class Node { private class Iterator implements KIterator { private Node node; - Iterator(KLinkedList list) { - this.node = list.head; + Iterator() { + this.node = head; } @Override From b716f833b51fea076f73095fe74675999a3ee0b7 Mon Sep 17 00:00:00 2001 From: millionkn Date: Mon, 13 Mar 2017 23:37:08 +0900 Subject: [PATCH 122/177] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E8=B0=83=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lessones01/LinkedList$Iter.class | Bin 0 -> 971 bytes group13/453070251/lessones01/LinkedList.class | Bin 3077 -> 5208 bytes group13/453070251/lessones01/LinkedList.java | 244 ++++++++++++------ group13/453070251/lessones02/ArrayUtil.class | Bin 2840 -> 2835 bytes group13/453070251/lessones02/ArrayUtil.java | 4 +- .../lessones03/LinkedListNoPrior.class | Bin 2444 -> 0 bytes .../lessones03/LinkedListNoPrior.java | 74 ------ ...ist(\351\207\215\346\236\204\344\272\206)" | 0 .../others/LinkedListWithFloat.class | Bin 2329 -> 0 bytes .../453070251/others/LinkedListWithFloat.java | 94 ------- group13/453070251/others/PrimeGetter.class | Bin 1235 -> 1220 bytes group13/453070251/others/PrimeGetter.java | 3 +- 12 files changed, 169 insertions(+), 250 deletions(-) create mode 100644 group13/453070251/lessones01/LinkedList$Iter.class delete mode 100644 group13/453070251/lessones03/LinkedListNoPrior.class delete mode 100644 group13/453070251/lessones03/LinkedListNoPrior.java create mode 100644 "group13/453070251/lessones03/\347\254\254\344\270\211\346\254\241\344\275\234\344\270\232\346\230\257lessones01.LinkedList(\351\207\215\346\236\204\344\272\206)" delete mode 100644 group13/453070251/others/LinkedListWithFloat.class delete mode 100644 group13/453070251/others/LinkedListWithFloat.java diff --git a/group13/453070251/lessones01/LinkedList$Iter.class b/group13/453070251/lessones01/LinkedList$Iter.class new file mode 100644 index 0000000000000000000000000000000000000000..e23fa5e756717c2f64c116ea1fc5519304759364 GIT binary patch literal 971 zcmZuvO>fgc6r6ROm^f~dre9DBl(sZa z1{wl-Fglb1vmIYX(I}A7_7kT|Xh)#f^M-*Nk3;f{SNYb#-cFlIy6;7?z*3g)c)^K0 z?2ur>%Js~}{X)wNytpmUtY;IG7P3G_v+<5)cayd&gk^X9p)bP&x9_vj=TkCirR%j) zP6--EZq${ZXeC!~ycd}1#qQwbjr(z;s|N`=UvG4d-BZ``-C*dv?H|j5GMTS8I1hnW zt-Tl1e0v&7k#X$#&VDRIHy(u-6ESn+KtI1u=x^erUsYUe!9Dj6>=Kx O;1O3ff&w=15awTxeABf6 literal 0 HcmV?d00001 diff --git a/group13/453070251/lessones01/LinkedList.class b/group13/453070251/lessones01/LinkedList.class index bc2967d2b802c4a36f3aa25ab2710a8b6e83af19..dac217bee772caaacd6991cbe2b18c41da0b20b3 100644 GIT binary patch literal 5208 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 diff --git a/group13/453070251/lessones01/LinkedList.java b/group13/453070251/lessones01/LinkedList.java index 5c85dba646..b979d17bfc 100644 --- a/group13/453070251/lessones01/LinkedList.java +++ b/group13/453070251/lessones01/LinkedList.java @@ -1,6 +1,23 @@ package lessones01; import lessones01.Node; -public class LinkedList{ +import others.Range; +import java.util.Iterator; +public class LinkedList implements Iterable{ + private static class Iter implements Iterator{ + private Node node; + private LinkedList list; + public Iter(Node arg_nullNode,LinkedList arg_list){ + node = arg_nullNode; + list = arg_list; + } + public boolean hasNext(){ + return node.right!=null; + } + public E next(){ + node = node.right; + return node.value; + } + } public static void main(String[] args){ LinkedList arr = new LinkedList(); arr.add("0"); @@ -17,111 +34,180 @@ public static void main(String[] args){ arr.add("before 2",2); System.out.println(arr.get(2)); System.out.println(arr.get(4)); - arr.set(4,"4"); + arr.set("4",4); System.out.println(arr.get(4)); - arr.set(8,"8"); + arr.set("8",8); System.out.println(arr.get(8)); + arr.remove(5); + arr.remove(6); + for(String x:arr){ + System.out.print(x); + System.out.print(","); + } } - protected Node first; - protected Node lastest; + protected Node nullNode; + protected Node point; + protected int pointNum; protected int size; public LinkedList(){ - lastest = first = new Node(null); + nullNode = point = new Node(null); + pointNum = -1; size = 0; } - public T get(int arg_num){ - //throw Error if arg_num<0,unfinished - return _get(arg_num); + private void setPoint(int n){ + while(size<=n){add(null);} + if(n<0){ + point = nullNode; + pointNum = -1; + }else{ + if((n<<1) < pointNum){ + point = nullNode; + pointNum = -1; + } + while(pointNumn){ + point = point.left; + pointNum--; + } + } } - public void set(int arg_num,T arg_value){ - //throw Error if arg_num<0,unfinished - _set(arg_num,arg_value); + public int size(){ + return size; } - public T remove(int arg_num){ - //throw Error if arg_num<0,unfinished - return _remove(arg_num).value; + public void add(T arg_value){ + setPoint(size-1); + point.setRight(new Node(arg_value)); + size++; } public void add(T arg_value,int arg_num){ - //throw Error if arg_num<0,unfinished - _add(arg_value,arg_num); + if(arg_num<0){return;} + setPoint(arg_num-1); + Node temp = point.right; + point.setRight(new Node(arg_value)); + point.right.setRight(temp); + size++; } - public void add(T arg_value){ - _add(arg_value,size); + public void set(T arg_value,int arg_num){ + if(arg_num<0){return;} + setPoint(arg_num); + point.value = arg_value; } - 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; + public T get(int arg_num){ + if(size>arg_num&&arg_num>=0){ + setPoint(arg_num); + return point.value; }else{ return null; } } - protected Node _getNode(int arg_num){ - Node node = first; - for(int num = 0;num=size){return null;} + setPoint(arg_num-1); + T temp = point.right.value; + point.setRight(point.right.right); + size--; + return temp; } - protected T _get(int arg_num){ - if(arg_num>=size){return null;} - return _getNode(arg_num).value; + public void remove(int arg_num,int arg_length){ + Range r = new Range(0,size-1); + r.and(new Range(arg_num,arg_num+arg_length)); + setPoint(r.max()); + Node temp = point; + setPoint(r.min()-1); + point.setRight(temp); + size-=r.max()- r.min(); } - protected void _set(int arg_num,T arg_value){ - if(arg_num>=size){ - _add(arg_value,arg_num); + public Integer index(T arg_value){ + setPoint(-1); + if(arg_value == null){ + while(point.right != null){ + point = point.right; + pointNum++; + if(point.value == null){return pointNum;} + } }else{ - _getNode(arg_num).value = arg_value; + while(point.right != null){ + point = point.right; + pointNum++; + if(arg_value.equals(point.value)){return pointNum;} + } } + return null; } - 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; + public void reverse(){ + if(size<2){return;} + setPoint(-1); + _reverse(); + pointNum = size - pointNum; + } + public void removeFirstHalf(){ + setPoint(size>>1); + nullNode.setRight(point); + size -= pointNum; + pointNum = 0; + } + public Iterator iterator(){ + return new Iter(nullNode,this); + } + public LinkedList getElements(LinkedList arg_list){ + LinkedList ret = new LinkedList(); + for(Integer x:arg_list){ret.add(get(x));} + return ret; + } + public void subtract(LinkedList arg_list){ + for(T x:arg_list){ + Integer i; + while((i = index(x))!=null){this.remove(i);} + } + } + public void removeDuplicateValues(){ + setPoint(0); + while(point.right != null){ + if(point.value.equals(point.right.value)){ + remove(pointNum+1); }else{ - lastest.setRight(new Node(arg_value)); - lastest = lastest.right; + setPoint(pointNum+1); } - 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++; } - } - protected Integer index(T o){ - Node n = _getNode(0); - if(o == null){ - for(int i=0;(n = n.right)!=null;i++){if(n.value == null){return i;}} - }else{ - for(int i=0;(n = n.right)!=null;i++){if(o.equals(n.value)){return i;}} + public > void removeRange(E min,E max){ + int length = 0; + int i = 0; + while(i=0; + if(bigThenMin&&lessThenMax){length++;} + if(bigThenMin&&!lessThenMax){break;} + i++; } - return null; + remove(i,length); + } + public > LinkedList intersection(LinkedList arg_list){ + LinkedList ret = new LinkedList(); + int x=0;int y = 0; + while(x0){ + x++; + }else{ + y++; + } + } + ret.removeDuplicateValues(); + return ret; + } + private void _reverse(){ + Node temp = point; + Node temp2 = (point = point.right); + if(temp == null){return;} + _reverse(); + temp2.setRight(temp); } } \ No newline at end of file diff --git a/group13/453070251/lessones02/ArrayUtil.class b/group13/453070251/lessones02/ArrayUtil.class index 9a7ca7bab04f38bbf4d0af6425d2e07b24076c85..13e31a165479a58ca47e4a529dff25687a5ceede 100644 GIT binary patch delta 34 pcmbOsHd$=LLq<{2oYdmt{Jhj+14DhE%)IQ>6rarE&A%CCIRV?A3}gTR delta 39 ucmbO%HbZQ~Lq;j7{F02+qGElY%)IQ>6rarElJLxu47Z&8#LeFrWjO&TWe&pt diff --git a/group13/453070251/lessones02/ArrayUtil.java b/group13/453070251/lessones02/ArrayUtil.java index f68830444b..c801fcf274 100644 --- a/group13/453070251/lessones02/ArrayUtil.java +++ b/group13/453070251/lessones02/ArrayUtil.java @@ -1,6 +1,6 @@ package lessones02; import others.PrimeGetter; -import others.LinkedListWithFloat; +import lessones01.LinkedList; public class ArrayUtil{ public static void reverseArray(int[] arg_arr){ for(int i = arg_arr.length/2;i>0;i--){ @@ -79,7 +79,7 @@ public static int[] getPrimes(int max){ } private static int[] two_s_TimesEnd = {8,6,2,4}; public static int[] getPerfectNumbers(int arg_num){ - LinkedListWithFloat arr = new LinkedListWithFloat(); + LinkedList arr = new LinkedList(); for(int i=2;;i++){ int z = (int)Math.pow(2,i) - 1; int zz = z*two_s_TimesEnd[i&3]; diff --git a/group13/453070251/lessones03/LinkedListNoPrior.class b/group13/453070251/lessones03/LinkedListNoPrior.class deleted file mode 100644 index 2c2e51d41966b95bf7ec088aec31b423a1396f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2444 zcmZ`)O;b~66ng-b0t|(oU<}Z3VKzg z;EzsD_FiET3dY>B?VQQjD|Xf?DD*{>8M{!(W$nV?&;S$OwilD>f|KaIp1ftPSpyj> zyF74l{+7MqBwV;Ut||nl(#u)PDdq`f_$@KUJP{_dj=gN>6XOg#J)KZ!oGTRPoxHW+ z%oTEZ$6i$EcuSmwKu;;`dy9RH0U4LXbyX`qU0lti7c9rVVr7bUVJpM%*mT?js#@0g z&J?&|6+%y3S)kTv@S^b8fPo1D8p%ZNSEo1X?z56KMmt#QC;3XRxBMd%GW1HVtGYVNR@# z+g7(Mh2|YvXkZn04CEzr0gi#9h->&lA+j|HBc4I1R;du)GJEHQQ|i&DDs!t9()UOe zXL(YgB|6#bBg6$;j zC0bivnVbp)iKB>5uK>BofRVy#YG2wCcXeF@E$`b$HXwuu? zMDMF2b7!oAV+;IRLcN?`zR9g`C7o5+6ZK;8gr{#h>s01ie671&$p-uLD*Wnflj*!0 z*PqTV+Vt-6R#Wxz=Gv}1;NB>_p6okCE5q9&ywkh0*v|`XAFozGhmw=PwVP5GpNdbv z`55W}Hwp*11}aJ&nw$>q#dQik)bQDDmQbT@Kzm?Tc8ewW9zsh}@S8DT2?2>yQ;E|G zKled?LTKZ?+X;j5>hK=5KByoQ9NbDUK}oP2Fx|lSO3-H?p;na;G-nVh#o{;#A=jvNd7;6!mb(L4=@BTACFO&>K9!nh0e$gS5-oNT$2=$ z4Ro5^)G~R4dIV7lh{jEZaT=Uo@?1mKPd0!)O ze4~N31~>Y_H_WfaCx!|Uk(V5}EXPsLDx3Lffr&7N`Nwsfe4oc2USjRMpgMSebmB`y z@GV>Z9Y^6e(*6f~B%P>-_MiMe_VODW>L!OKV(g%F{W1B~`J9WD5I!aZ{*2ZqXiND< zHEH%9xA;-N8TPZDc%VJ-6eD3Rav%L+|GHnr!lbC`wSk8Iu(qzL_5delO4jyxV6*&t z|MyJc7ITop0;cz)k1g$IQHMCM18nLbMli%N9Oi9(xB|QbzA_EEjy@gzN=KXGatJVk zd_y7*vX~*h;TDtQQwCzdcPt|H+(%C=LUbv!zl4sNxb~C;ON*LI=)AgF{&&4bZI=If zeV&hSnvW7(oVkxM-B<-o6SU{3QO{AQW8@jyo-vgR;xIwHzcuDxkx`8x22IizNowO= z!s>l=$ILD&W-gS_^)+Xef?)V(-KYAJo8`Z^QFNo0?~il3PjGjVNKWy1PjK?juybdb ob+UrUgzp7vi3X}n2dzTW2xXqKGP_z;R1RHD73(M~65@{j50n}f4gdfE diff --git a/group13/453070251/lessones03/LinkedListNoPrior.java b/group13/453070251/lessones03/LinkedListNoPrior.java deleted file mode 100644 index e26f1cd08e..0000000000 --- a/group13/453070251/lessones03/LinkedListNoPrior.java +++ /dev/null @@ -1,74 +0,0 @@ -package lessones03; -import lessones01.Node; -import lessones01.LinkedList; -import others.Range; -//只要不用prior就和单项链表一样了吧。。。 -//虽然要求是单向列表,不过所有代码不用管是单向还是双向(不是由LinkedList决定,而是Node)都能用 -public class LinkedListNoPrior extends LinkedList{ - protected void _reverse(){ - if(size() == 1){return;} - T temp = _remove(size()-1).value; - _reverse(); - _add(temp,0); - } - protected void _removeFirstHalf(){ - (first = _getNode((int)(size()>>1))).setLeft(null);//单向节点也可以有setLeft方法 - size-=size/2; - } - protected void _remove(int arg_i,int arg_length){ - Range thisRange = new Range(0,size()); - Range targetRange = thisRange.and(new Range(arg_i,arg_i+arg_length)); - if(size == arg_length){ - (lastest = first).value = null; - first.setRight(null); - }else if(targetRange.min() == 0){ - first = _getNode(targetRange.max()); - first.setLeft(null); - }else if(targetRange.max() == size){ - lastest = _getNode(targetRange.min()-1); - lastest.setRight(null); - }else{ - _getNode(targetRange.min()-1).setRight(_getNode(targetRange.max())); - } - size -= arg_length; - //for(int i = targetRange.min();i arg_list){ - //题目告诉的是已经排好序的LinkedList - //没猜错的话应该就是让想办法优化了。。。 - //然而这个工作已经在LinkedListWithFloat中完成了(笑) - //然而。。这里不能继承LinkedListWithFloat。。 - //ps:arg_list可以是LinkedListWithFloat,所以不用做什么优化 - int list_size = arg_list.size(); - T[] arr = (T[])(new Object[size()]); - int list_i = 0; - int i = arg_list.get(0/*list_i*/); - Node node = _getNode(i); - while((node!=null)&&list_i arg_list){ - for(int i=0;iE;=cFpy>rj~IPdw_e}4E0 zz!`j^VZ;vwqdG3gn(*NwF3Ik)hA}^`;Hr*mI>tqHUB?X_6SBRj<6~KqA|}Oe%8xFL z`goicaZAK)vCfD{$#GU(?ufYS!#&)W-JI+mXn3f=x0KDBrKx<{QqY{tTE${MXBAJL z8WhzC?J0XXXO`9rw1@ZGM`ve85_Hm?AnU6NlnDjus%huw-uE!MVs4m&Su?jhm?{x=go9lvZ_gHdSS&{ER9SEn%2i^oZWoETFq}*8XhSKxQB7OP%Par zvr9x>vUBNi>08oTDk*5JoM-Ii3>D`_XV1TjlBgDNdXTk0v(ibs$O3N_?0jK2O@AuC zURbooZD~kb)$N{L%9JrrNKX}XwdrulQ-1ZbD zYPfIW-Jp_Xy~8Ztfuj8x2TY>Ng<%pjdY6P_M9G>gKz81OLnt*%qM@7Dxr;AI9sk&J zo_flsqdc?w-0Se+eSAPmAD|TBp#_TPM<{dKs7uC!o-L@~!yD&X{}$R7^mx$c>ePx( zJnAc_c+k(od;67!*Hv&8qik6Z{G_UZ1R8LS+7z1b00Cssj12_w zIa=@qTJa@9c#be$F~(c8;WxD74|L!!MDRDFN*y|h!pr9jfES^TJ0KX_MoTRA8m(^- zih153T+Js4l^#8mN14GfBKC4WfaCm@L&WbKqL=GRgx`nL7ouN7=PtAvV`XYOl1@aU znMh~m1vK>~RL@y8q<)2#=(q62BHK8$DY9)d`VGQ+GH{Iy)hdG zn;UnCarx%BaSLwTA*n4gIq(a-1DgY{5&apBFvyMz1s{@*N@)C-fSJWrF2KrJ4B4fBzJ9HGPL-w@LOHrk>*4ai^TJ%3xiUWb5Sd kJ`m`61xT7zoyh+H-6zl-fgTX((SbnDvo%bH$Vkus2iOzC@Bjb+ diff --git a/group13/453070251/others/LinkedListWithFloat.java b/group13/453070251/others/LinkedListWithFloat.java deleted file mode 100644 index 50c1077510..0000000000 --- a/group13/453070251/others/LinkedListWithFloat.java +++ /dev/null @@ -1,94 +0,0 @@ -package others; -import lessones01.Node; -import lessones03.LinkedListNoPrior; -public class LinkedListWithFloat extends LinkedListNoPrior{ - 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; - } - protected void _removeFirstHalf(){ - super._removeFirstHalf(); - floatNode = first; - floatNum = 0; - } - private Node findFloatLeft(int arg_num){ - for(;floatNum>arg_num;){ - floatNode = floatNode.left; - floatNum--; - } - return floatNode; - } - private Node findFloatRight(int arg_num){ - for(;floatNumNHe#LailZ%0!fg1>U7$g{Y8Dtsw7_=A!7;G2> z8SEH@8Qd5|82lMT8B!R;7}9`xG8rTpihyDj4AKlW3^ELDKppKs^}P&=lfN=|aVj$~ YF{l9fs*^id9JpB+7#ZXl7=U650FDYWo&W#< delta 231 zcmX@Yd6{!Ugqw^{eo01ZQL(;HW?pt`ice;7NqA;ShFea4Vu>{)17~n%dR}5lX;CU8 zgCTCE6Q{hClEP`wyi8we#Bco<|Ecp0=9 z_!(>%1Q_fXgc#fygcN*SL>bZ;#27Mxs)~SO6%0}gH4M@WZ45FD?LhUt3<{H< fF?Vq)F)%SG1NEv*u4HlGW@cbykY`{3iYWj9OaeJu diff --git a/group13/453070251/others/PrimeGetter.java b/group13/453070251/others/PrimeGetter.java index 64d647ecf9..9e8375163b 100644 --- a/group13/453070251/others/PrimeGetter.java +++ b/group13/453070251/others/PrimeGetter.java @@ -1,6 +1,7 @@ package others; +import lessones01.LinkedList; public class PrimeGetter{ - private static LinkedListWithFloat primes = new LinkedListWithFloat(); + private static LinkedList primes = new LinkedList(); public static int get(int arg_num){ for(int i = primes.size()-1;i Date: Tue, 14 Mar 2017 11:16:20 +0800 Subject: [PATCH 123/177] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work2_26/.settings/.svn/all-wcprops | 11 + .../102228177/work2_26/.settings/.svn/entries | 62 +++ group17/102228177/work2_26/.svn/all-wcprops | 17 + group17/102228177/work2_26/.svn/entries | 109 ++++++ group17/102228177/work2_26/lib/.svn/entries | 42 ++ .../102228177/work2_26/src/.svn/all-wcprops | 5 + group17/102228177/work2_26/src/.svn/entries | 31 ++ .../work2_26/src/com/.svn/all-wcprops | 5 + .../102228177/work2_26/src/com/.svn/entries | 31 ++ .../src/com/coderising/.svn/all-wcprops | 5 + .../work2_26/src/com/coderising/.svn/entries | 34 ++ .../src/com/coderising/array/.svn/all-wcprops | 11 + .../src/com/coderising/array/.svn/entries | 62 +++ .../coderising/litestruts/.svn/all-wcprops | 47 +++ .../com/coderising/litestruts/.svn/entries | 266 +++++++++++++ group17/102228177/work3_5/.classpath | 7 + group17/102228177/work3_5/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/data/LinkedList.java | 366 ++++++++++++++++++ .../com/coderising/data/LinkedListTest.java | 119 ++++++ .../work3_5/src/com/coderising/data/List.java | 11 + .../coderising/download/DownloadThread.java | 53 +++ .../coderising/download/FileDownloader.java | 97 +++++ .../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 | 110 ++++++ .../download/impl/ConnectionManagerImpl.java | 19 + 30 files changed, 1650 insertions(+) create mode 100644 group17/102228177/work2_26/.settings/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/.settings/.svn/entries create mode 100644 group17/102228177/work2_26/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/.svn/entries create mode 100644 group17/102228177/work2_26/lib/.svn/entries create mode 100644 group17/102228177/work2_26/src/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/src/.svn/entries create mode 100644 group17/102228177/work2_26/src/com/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/src/com/.svn/entries create mode 100644 group17/102228177/work2_26/src/com/coderising/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/src/com/coderising/.svn/entries create mode 100644 group17/102228177/work2_26/src/com/coderising/array/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/src/com/coderising/array/.svn/entries create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/.svn/all-wcprops create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/.svn/entries create mode 100644 group17/102228177/work3_5/.classpath create mode 100644 group17/102228177/work3_5/.project create mode 100644 group17/102228177/work3_5/.settings/org.eclipse.jdt.core.prefs create mode 100644 group17/102228177/work3_5/src/com/coderising/data/LinkedList.java create mode 100644 group17/102228177/work3_5/src/com/coderising/data/LinkedListTest.java create mode 100644 group17/102228177/work3_5/src/com/coderising/data/List.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/DownloadThread.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/FileDownloader.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/api/Connection.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/api/ConnectionException.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/api/DownloadListener.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group17/102228177/work3_5/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group17/102228177/work2_26/.settings/.svn/all-wcprops b/group17/102228177/work2_26/.settings/.svn/all-wcprops new file mode 100644 index 0000000000..83cb9d8d78 --- /dev/null +++ b/group17/102228177/work2_26/.settings/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 84 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/.settings +END +org.eclipse.jdt.core.prefs +K 25 +svn:wc:ra_dav:version-url +V 111 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/.settings/org.eclipse.jdt.core.prefs +END diff --git a/group17/102228177/work2_26/.settings/.svn/entries b/group17/102228177/work2_26/.settings/.svn/entries new file mode 100644 index 0000000000..d28e34c297 --- /dev/null +++ b/group17/102228177/work2_26/.settings/.svn/entries @@ -0,0 +1,62 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/.settings +https://github.com/Ren650119726/coding2017.git + + + +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +org.eclipse.jdt.core.prefs +file + + + + +2017-03-01T08:08:01.639000Z +b853b9a1a246f2816d969fefd9ef99fa +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +587 + diff --git a/group17/102228177/work2_26/.svn/all-wcprops b/group17/102228177/work2_26/.svn/all-wcprops new file mode 100644 index 0000000000..4fd9364e65 --- /dev/null +++ b/group17/102228177/work2_26/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 74 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26 +END +.project +K 25 +svn:wc:ra_dav:version-url +V 83 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/.project +END +.classpath +K 25 +svn:wc:ra_dav:version-url +V 85 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/.classpath +END diff --git a/group17/102228177/work2_26/.svn/entries b/group17/102228177/work2_26/.svn/entries new file mode 100644 index 0000000000..22c428b9e5 --- /dev/null +++ b/group17/102228177/work2_26/.svn/entries @@ -0,0 +1,109 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26 +https://github.com/Ren650119726/coding2017.git + + + +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +.classpath +file + + + + +2017-03-06T06:43:49.456000Z +2009d505cf91672e7621cc8e40fa5432 +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +435 + +.project +file + + + + +2017-03-01T08:08:01.581000Z +3519c7cf0906e6b3e9e3c398a886e177 +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +367 + +.settings +dir + +lib +dir + + + +add + +src +dir + diff --git a/group17/102228177/work2_26/lib/.svn/entries b/group17/102228177/work2_26/lib/.svn/entries new file mode 100644 index 0000000000..f701d20217 --- /dev/null +++ b/group17/102228177/work2_26/lib/.svn/entries @@ -0,0 +1,42 @@ +10 + +dir +0 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/lib +https://github.com/Ren650119726/coding2017.git +add + + + + + + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +dom4j-1.6.1.jar +file + + + +add + + + + + +has-props +has-prop-mods + diff --git a/group17/102228177/work2_26/src/.svn/all-wcprops b/group17/102228177/work2_26/src/.svn/all-wcprops new file mode 100644 index 0000000000..b528430b8a --- /dev/null +++ b/group17/102228177/work2_26/src/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 78 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/src +END diff --git a/group17/102228177/work2_26/src/.svn/entries b/group17/102228177/work2_26/src/.svn/entries new file mode 100644 index 0000000000..fe33c17a2c --- /dev/null +++ b/group17/102228177/work2_26/src/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/src +https://github.com/Ren650119726/coding2017.git + + + +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +com +dir + diff --git a/group17/102228177/work2_26/src/com/.svn/all-wcprops b/group17/102228177/work2_26/src/com/.svn/all-wcprops new file mode 100644 index 0000000000..715471c0fd --- /dev/null +++ b/group17/102228177/work2_26/src/com/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 82 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/src/com +END diff --git a/group17/102228177/work2_26/src/com/.svn/entries b/group17/102228177/work2_26/src/com/.svn/entries new file mode 100644 index 0000000000..adbdf2823e --- /dev/null +++ b/group17/102228177/work2_26/src/com/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/src/com +https://github.com/Ren650119726/coding2017.git + + + +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +coderising +dir + diff --git a/group17/102228177/work2_26/src/com/coderising/.svn/all-wcprops b/group17/102228177/work2_26/src/com/coderising/.svn/all-wcprops new file mode 100644 index 0000000000..0ee4cbec92 --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 93 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/src/com/coderising +END diff --git a/group17/102228177/work2_26/src/com/coderising/.svn/entries b/group17/102228177/work2_26/src/com/coderising/.svn/entries new file mode 100644 index 0000000000..49a4553b08 --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/.svn/entries @@ -0,0 +1,34 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/src/com/coderising +https://github.com/Ren650119726/coding2017.git + + + +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +array +dir + +litestruts +dir + diff --git a/group17/102228177/work2_26/src/com/coderising/array/.svn/all-wcprops b/group17/102228177/work2_26/src/com/coderising/array/.svn/all-wcprops new file mode 100644 index 0000000000..1bc1b0af54 --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/array/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 99 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/src/com/coderising/array +END +ArrayUtil.java +K 25 +svn:wc:ra_dav:version-url +V 114 +/Ren650119726/coding2017.git/!svn/ver/385/trunk/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java +END diff --git a/group17/102228177/work2_26/src/com/coderising/array/.svn/entries b/group17/102228177/work2_26/src/com/coderising/array/.svn/entries new file mode 100644 index 0000000000..0e10a5fc7e --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/array/.svn/entries @@ -0,0 +1,62 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/src/com/coderising/array +https://github.com/Ren650119726/coding2017.git + + + +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +ArrayUtil.java +file +385 + + + +2017-03-06T07:23:25.054000Z +14940f5c721e426c4db476d3f7778718 +2017-03-06T07:25:29.000000Z +385 + + + + + + + + + + + + + + + + + + + + + + +5484 + diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/.svn/all-wcprops b/group17/102228177/work2_26/src/com/coderising/litestruts/.svn/all-wcprops new file mode 100644 index 0000000000..ec879784bf --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/.svn/all-wcprops @@ -0,0 +1,47 @@ +K 25 +svn:wc:ra_dav:version-url +V 104 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/src/com/coderising/litestruts +END +LoginAction.java +K 25 +svn:wc:ra_dav:version-url +V 121 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/LoginAction.java +END +Dom4jUtil.java +K 25 +svn:wc:ra_dav:version-url +V 119 +/Ren650119726/coding2017.git/!svn/ver/352/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/Dom4jUtil.java +END +StrutsTest.java +K 25 +svn:wc:ra_dav:version-url +V 120 +/Ren650119726/coding2017.git/!svn/ver/352/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/StrutsTest.java +END +View.java +K 25 +svn:wc:ra_dav:version-url +V 114 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/View.java +END +struts.xml +K 25 +svn:wc:ra_dav:version-url +V 115 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/struts.xml +END +Struts.java +K 25 +svn:wc:ra_dav:version-url +V 116 +/Ren650119726/coding2017.git/!svn/ver/355/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java +END +BeanUtil.java +K 25 +svn:wc:ra_dav:version-url +V 118 +/Ren650119726/coding2017.git/!svn/ver/351/trunk/group17/102228177/work2_26/src/com/coderising/litestruts/BeanUtil.java +END diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/.svn/entries b/group17/102228177/work2_26/src/com/coderising/litestruts/.svn/entries new file mode 100644 index 0000000000..332b44f76b --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/.svn/entries @@ -0,0 +1,266 @@ +10 + +dir +384 +https://github.com/Ren650119726/coding2017.git/trunk/group17/102228177/work2_26/src/com/coderising/litestruts +https://github.com/Ren650119726/coding2017.git + + + +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +bfb73201-f724-f2c8-530f-ce57b7db7bff + +BeanUtil.java +file + + + + +2017-03-01T08:08:05.443000Z +3043b0490c8d9761a79f7e4f2765a961 +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +549 + +Dom4jUtil.java +file + + + + +2017-03-01T08:08:05.455000Z +b8a2fdeeb2074098bbbec2368125a683 +2017-02-27T13:40:51.000000Z +352 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +2868 + +LoginAction.java +file + + + + +2017-03-01T08:08:05.464000Z +9d52a275b11f6e7879660254ee33473c +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +918 + +Struts.java +file + + + + +2017-03-06T06:43:50.315000Z +402acce3e2d326ba6b2d49c6e499e674 +2017-03-05T14:53:45.000000Z +355 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +2757 + +StrutsTest.java +file + + + + +2017-03-01T08:08:13.299000Z +f44c514b409da816b50068079b926b18 +2017-02-27T13:40:51.000000Z +352 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +1144 + +View.java +file + + + + +2017-03-01T08:08:13.319000Z +33dc6196579fa5b7b154f7a40e474260 +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +391 + +struts.xml +file + + + + +2017-03-01T08:08:13.332000Z +cea391b7c62d8932c36b21420426604f +2017-02-27T13:40:51.000000Z +351 +ren650119726 + + + + + + + + + + + + + + + + + + + + + +450 + diff --git a/group17/102228177/work3_5/.classpath b/group17/102228177/work3_5/.classpath new file mode 100644 index 0000000000..72c2ba61af --- /dev/null +++ b/group17/102228177/work3_5/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group17/102228177/work3_5/.project b/group17/102228177/work3_5/.project new file mode 100644 index 0000000000..381fe45b69 --- /dev/null +++ b/group17/102228177/work3_5/.project @@ -0,0 +1,17 @@ + + + work3_5 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/102228177/work3_5/.settings/org.eclipse.jdt.core.prefs b/group17/102228177/work3_5/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group17/102228177/work3_5/.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/work3_5/src/com/coderising/data/LinkedList.java b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java new file mode 100644 index 0000000000..22a72affaf --- /dev/null +++ b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java @@ -0,0 +1,366 @@ +package com.coderising.data; + + +import java.util.Arrays; +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; + } + //鍒ゆ柇鏄惁鎵惧埌绗琲ndex-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){ + int k = 0; + Node p = head; + while(k < index-1 && p!=null){ + k++; + p = p.next; + } + Node pn = p.next; + if(pn != null){ + p.next = pn.next; + size--; + return pn.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; + } + } + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + if(null == head || null == head.next){ + return; + } + else{ + Node pre = head; + Node cur = head.next; + Node next; + while(cur != null){ + next = cur.next; + cur.next = pre; + pre = cur; + cur = next; + } + head.next = null; + head = pre; + } + } + + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + */ + public void removeFirstHalf(){ + int num = size/2; + for (int i = 0; i < num; i++) { + removeFirst(); + } + } + + /** + * 浠庣i涓厓绱犲紑濮嬶紝 鍒犻櫎length 涓厓绱 锛 娉ㄦ剰i浠0寮濮 + * @param i + * @param length + */ + public void remove(int i, int length){ + if(i <0 || i >= size){ + throw new IndexOutOfBoundsException(); + }else{ + int len = size-i>=length ? length :size-i; + int k = 0; + while(k < len){ + remove(i); + k++; + } + } + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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[] arr = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + arr[i] = (int) this.get((int) list.get(i)); + } + return arr; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪list涓嚭鐜扮殑鍏冪礌 + * @param list + */ + + public void subtract(LinkedList list){ + for (int i = 0; i < list.size(); i++) { + this.remove(list.get(i)); + } + } + + /** + * 浼犲叆鏁版嵁鍒犻櫎鑺傜偣 + * @param obj + */ + public void remove(Object obj){ + if(head==null){ + throw new RuntimeException("LinkedList is empty!"); + } + //濡傛灉瑕佸垹闄ょ殑缁撶偣鏄涓涓紝鍒欐妸涓嬩竴涓粨鐐硅祴鍊肩粰绗竴涓粨鐐 + if(head.data==obj){ + head=head.next; + size--; + }else{ + Node pre=head; //涓婁竴鑺傜偣 + Node cur=head.next; //褰撳墠缁撶偣 + while(cur!=null){ + if(cur.data.equals(obj)){ + pre.next=cur.next; + size--; + } + pre=pre.next; + cur=cur.next; + } + } + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues(){ + if(head == null){ + throw new RuntimeException("LinkedList is empty!"); + }else{ + Node pre = head; + Node cur = head; + while(cur.next != null){ + cur = cur.next; + Object data = pre.data; + while(cur.data == data){ + if(cur.next == null){ + pre.next = null; + break; + } + pre.next = cur.next; + size--; + cur =cur.next; + if(cur == null){ + break; + } + } + pre = pre.next; + } + } + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + if(head == null){ + throw new RuntimeException("LinkedList is empty!"); + }else{ + Node q = head; + //澶村垽鏂 + if((int)q.data>min && (int)q.datamin && (int)p.data Date: Tue, 14 Mar 2017 11:22:08 +0800 Subject: [PATCH 124/177] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1=E6=96=87?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/article/20170305-20170312.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170305-20170312.md b/group17/article/20170305-20170312.md index b46d00b2c0..f43f5b5fb2 100644 --- a/group17/article/20170305-20170312.md +++ b/group17/article/20170305-20170312.md @@ -12,7 +12,7 @@ 1204187480 -102228177 +102228177 http://note.youdao.com/noteshare?id=eaa0a94d3cafd12a73315a24ea68e569 876385982 From 58cd5cf865d74c6e57a0f210fa520c5f6fd0dce7 Mon Sep 17 00:00:00 2001 From: PikachuHy <2931408816@qq.com> Date: Tue, 14 Mar 2017 11:36:48 +0800 Subject: [PATCH 125/177] fixed part --- group13/2931408816/.idea/workspace.xml | 497 ++++++++---------- .../net/pikachu/download/DownloadThread.java | 16 +- .../net/pikachu/download/FileDownloader.java | 62 +-- .../cn/net/pikachu/download/FileUtil.java | 54 ++ .../java/cn/net/pikachu/download/LogUtil.java | 10 + .../pikachu/download/impl/ConnectionImpl.java | 74 ++- .../download/impl/ConnectionManagerImpl.java | 9 +- .../impl/test/DownloadFileWithThreadPool.java | 47 ++ .../download/impl/test/DownloadWithRange.java | 80 +++ .../lesson3/src/main/kotlin/main.kt | 40 ++ .../pikachu/download/FileDownloaderTest.java | 22 +- 11 files changed, 538 insertions(+), 373 deletions(-) create mode 100644 group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java create mode 100644 group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/LogUtil.java create mode 100644 group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadFileWithThreadPool.java create mode 100644 group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadWithRange.java create mode 100644 group13/2931408816/lesson3/src/main/kotlin/main.kt diff --git a/group13/2931408816/.idea/workspace.xml b/group13/2931408816/.idea/workspace.xml index 8e622af489..5491e4d0a1 100644 --- a/group13/2931408816/.idea/workspace.xml +++ b/group13/2931408816/.idea/workspace.xml @@ -58,34 +58,51 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - + + + - - + + - - + + - - + + - - + + @@ -94,8 +111,8 @@ - - + + @@ -978,10 +995,10 @@ @@ -1337,7 +1359,7 @@ - + @@ -1544,124 +1566,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1728,80 +1632,86 @@ - + - - + + - - + - - - + - - - + - - - - - - - - + + + + - @@ -2253,19 +2150,19 @@ - - - - - + + + + + - - - - + + + + @@ -2285,43 +2182,46 @@ + + + - + - + - + - + - + - + - + - + - + - + - @@ -2334,37 +2234,38 @@ + + + + + + + + + + + - - - - - - - - - - - - + + @@ -2398,6 +2299,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -2554,7 +2479,6 @@ - @@ -2566,14 +2490,7 @@ - - - - - - - - + @@ -2586,7 +2503,6 @@ - @@ -2602,7 +2518,6 @@ - @@ -2610,7 +2525,6 @@ - @@ -2636,7 +2550,6 @@ - @@ -2648,16 +2561,7 @@ - - - - - - - - - - + @@ -2670,94 +2574,119 @@ - - + + - - - - - + + - - + + + + + + + + + - - + - - - + + - + - - + + - - + - + - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + - - + + - + - - + + - + - - + + + + + + + + + + diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java index 3547f60826..f0e9feb78b 100644 --- a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java @@ -7,13 +7,13 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.Arrays; public class DownloadThread extends Thread{ private Connection conn; private int startPos; private int endPos; - private RandomAccessFile raf = null; public DownloadThread( Connection conn, int startPos, int endPos){ @@ -24,19 +24,25 @@ public DownloadThread( Connection conn, int startPos, int endPos){ public void run(){ try { byte[] bytes = conn.read(startPos,endPos); - raf.write(bytes); - System.out.println("startPos = "+startPos+", "+"endPos = "+endPos); + LogUtil.log(" startPos = "+startPos+", "+"endPos = "+endPos); + writeToFile(bytes); } catch (IOException e) { e.printStackTrace(); } } - public void setFile(File file){ + private void writeToFile(byte[] bytes){ + File file = FileUtil.getFile(); try { - raf = new RandomAccessFile(file, "rws"); + RandomAccessFile raf = new RandomAccessFile(file, "rw"); + LogUtil.log("鍐欏叆鏂囦欢"); raf.seek(startPos); + raf.write(bytes); + raf.close(); + LogUtil.log("\n"+Arrays.toString(bytes)); } catch (IOException e) { e.printStackTrace(); } + } } diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java index bd4897e750..1e80c3db79 100644 --- a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java @@ -11,9 +11,11 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class FileDownloader { - private int threadNum = 4; + private int threadNum = 1; String url; @@ -51,23 +53,33 @@ public void execute(){ if (length < 0){ throw new ConnectionException(); } - File file =getFile(length); + threadNum = length / 1024; System.out.println("length = "+length); + FileUtil.setFile(url,length); int part = length/threadNum; + ExecutorService exe = Executors.newFixedThreadPool(threadNum); for (int i = 0; i < threadNum; i++) { DownloadThread thread; if (i==threadNum-1){ - thread = new DownloadThread(conn,i*part,length); + thread = new DownloadThread(conn,i*part,length-1); }else { thread = new DownloadThread(conn,i*part,(i+1)*part); } - thread.setFile(file); - thread.start(); + exe.execute(thread); } - listener.notifyFinished(); - } catch (ConnectionException e) { + exe.shutdown(); + while (true) { + if (exe.isTerminated()) { + System.out.println("缁撴潫浜嗭紒"); + listener.notifyFinished(); + break; + } + System.out.println("浼戠湢"); + Thread.sleep(200); + } + } catch (ConnectionException | InterruptedException e) { e.printStackTrace(); - }finally{ + } finally{ if(conn != null){ conn.close(); } @@ -82,8 +94,6 @@ public void setListener(DownloadListener listener) { this.listener = listener; } - - public void setConnectionManager(ConnectionManager ucm){ this.cm = ucm; } @@ -92,36 +102,4 @@ public DownloadListener getListener(){ return this.listener; } - private String getFileName(String url){ - int index = url.lastIndexOf("/"); - if (index<0){ - return "temp"; - } - String filename = url.substring(index+1); - if (filename.equals("")){ - return "temp"; - }else { - return filename; - } - } - private File getFile(int totalLen){ - File dir = new File("D:/Download/test"); - if(!dir.exists()){ - dir.mkdirs(); - } - File file = new File(dir, getFileName(url)); - RandomAccessFile raf = null; - try { - raf = new RandomAccessFile(file, "rws"); - System.out.println("totalLen = "+ totalLen); - if (totalLen < 0){ - throw new ConnectionException(); - } - raf.setLength(totalLen); - raf.close(); - } catch (ConnectionException | IOException e) { - e.printStackTrace(); - } - return file; - } } diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java new file mode 100644 index 0000000000..6a6b4859da --- /dev/null +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java @@ -0,0 +1,54 @@ +package cn.net.pikachu.download; + +import cn.net.pikachu.download.api.ConnectionException; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * Created by pikachu on 2017/3/13. + */ +public class FileUtil { + private static String filename = "temp"; + private static String url = null; + public static File getFile() { + return new File(filename); + } + public static void setFile(String url,int totalLen){ + + File dir = new File("D:/Download/test"); + if(!dir.exists()){ + dir.mkdirs(); + } + File file = new File(dir, getFileName(url)); + if (file.exists()){ + file.delete(); + } + RandomAccessFile raf = null; + try { + raf = new RandomAccessFile(file, "rws"); + System.out.println("totalLen = "+ totalLen); + if (totalLen < 0){ + throw new ConnectionException(); + } + raf.setLength(totalLen); + raf.close(); + filename=file.getCanonicalPath(); + } catch (ConnectionException | IOException e) { + e.printStackTrace(); + } + } + private static String getFileName(String url){ + int index = url.lastIndexOf("/"); + if (index<0){ + return "temp"; + } + String filename = url.substring(index+1); + if (filename.equals("")){ + return "temp"; + }else { + return filename; + } + } +} diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/LogUtil.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/LogUtil.java new file mode 100644 index 0000000000..a0a5b98c39 --- /dev/null +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/LogUtil.java @@ -0,0 +1,10 @@ +package cn.net.pikachu.download; + +/** + * Created by pikachu on 2017/3/14. + */ +public class LogUtil { + public static void log(String log){ + System.out.println(Thread.currentThread().getId()+"-"+Thread.currentThread().getName()+" "+log); + } +} diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java index 235e64438a..75c1e325f8 100644 --- a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java @@ -1,5 +1,6 @@ package cn.net.pikachu.download.impl; +import cn.net.pikachu.download.LogUtil; import cn.net.pikachu.download.api.Connection; import java.io.IOException; @@ -10,38 +11,62 @@ public class ConnectionImpl implements Connection { - private URL url; + private String url; private InputStream is; - private int totalReceived = 0; - public ConnectionImpl(URL url) { + + public ConnectionImpl(String url) { this.url = url; } @Override public byte[] read(int startPos, int endPos) throws IOException { - System.out.println("startPos = "+startPos+", endPos = "+endPos); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + URL u = new URL(url); + HttpURLConnection connection = (HttpURLConnection) u.openConnection(); connection.setConnectTimeout(5000); connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - is = connection.getInputStream(); - int len = endPos-startPos; - byte[] bytes = new byte[len]; - while (is.available()>0){ - System.out.println("available = "+is.available()); + InputStream is = connection.getInputStream(); + int len = endPos-startPos+1; + LogUtil.log(" startPos = "+startPos+", endPos = "+endPos+", len = "+len); + byte[] bytes = new byte[is.available()>len?is.available():len]; + int totalReceived = 0; + LogUtil.log("len = "+len+", available = "+is.available()); + int received = 0; + try { int left = len - totalReceived; - System.out.println("len - totalReceived = " + left); - int received; - if (left >= 1024){ - received = is.read(bytes,totalReceived,1024); - }else { - received = is.read(bytes,totalReceived,left); - } - System.out.println("received = "+received); - totalReceived+=received; - if (received == 0){ - break; + while (left > 0){ + LogUtil.log(" available = "+is.available()); + LogUtil.log(" left = " + left+", totalReceived = "+totalReceived+", len = "+len); + if (left >= 1024){ + received = is.read(bytes,totalReceived,1024); + }else { + received = is.read(bytes,totalReceived,left); + } + totalReceived+=received; + LogUtil.log(" received = "+received+", totalReceived = "+totalReceived); + + if (is.available() == 0){ + LogUtil.log("is.available() == 0"); + break; + } + if (received==0){ + LogUtil.log("received == 0"); + System.exit(0); + } + left = len - totalReceived; + /* + if (left == 0){ + LogUtil.log("left = 0; break;"); + break; + } + */ } + + }catch (Exception e){ + e.printStackTrace(); + LogUtil.log("Exception received = "+received+", totalReceived = "+totalReceived); + System.exit(0); } + return bytes; } @@ -50,13 +75,15 @@ public int getContentLength() { HttpURLConnection connection = null; try { - connection = (HttpURLConnection) url.openConnection(); + URL u = new URL(url); + connection = (HttpURLConnection) u.openConnection(); connection.setConnectTimeout(5000); + connection.setRequestMethod("GET"); return connection.getContentLength(); } catch (IOException e) { e.printStackTrace(); + return -1; } - return -1; } @Override @@ -69,5 +96,4 @@ public void close() { } } } - } diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java index 1eb399d32d..8115e88b34 100644 --- a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java @@ -22,13 +22,6 @@ public class ConnectionManagerImpl implements ConnectionManager { @Override public Connection open(String url) throws ConnectionException { - URL u; - try { - u = new URL(url); - } catch (java.io.IOException e) { - e.printStackTrace(); - throw new ConnectionException(); - } - return new ConnectionImpl(u); + return new ConnectionImpl(url); } } diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadFileWithThreadPool.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadFileWithThreadPool.java new file mode 100644 index 0000000000..18e279d564 --- /dev/null +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadFileWithThreadPool.java @@ -0,0 +1,47 @@ +package cn.net.pikachu.download.impl.test; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +/** + * Created by pikachu on 2017/3/13. + */ +public class DownloadFileWithThreadPool { + public void getFileWithThreadPool(String urlLocation, String filePath, int poolLength) throws IOException { + Executor threadPool = Executors.newFixedThreadPool(poolLength); + + long len = getContentLength(urlLocation); + for (int i = 0; i < poolLength; i++) { + long start = i * len / poolLength; + long end = (i + 1) * len / poolLength - 1; + if (i == poolLength - 1) { + end = len; + } + DownloadWithRange download = new DownloadWithRange(urlLocation, filePath, start, end); + threadPool.execute(download); + } + + } + + public static long getContentLength(String urlLocation) throws IOException { + URL url = null; + if (urlLocation != null) { + url = new URL(urlLocation); + } + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setReadTimeout(5000); + conn.setRequestMethod("GET"); + long len = conn.getContentLength(); + + return len; + } + + public static void main(String[] args) throws IOException { +// String url = "http://localhost:8080/mybatis-jpetstore-6.0.0/actions/Catalog.action"; + String url = "http://yydl.duowan.com/4/setup/YYSetup-8.20.0.1-zh-CN.exe"; + new DownloadFileWithThreadPool().getFileWithThreadPool(url,"D:/Download/test/yy.exe",1000); + } +} \ No newline at end of file diff --git a/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadWithRange.java b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadWithRange.java new file mode 100644 index 0000000000..a1402524be --- /dev/null +++ b/group13/2931408816/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadWithRange.java @@ -0,0 +1,80 @@ +package cn.net.pikachu.download.impl.test; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +/** + * Created by pikachu on 2017/3/13. + */ +public class DownloadWithRange implements Runnable +{ + private String urlLocation; + + private String filePath; + + private long start; + + private long end; + + DownloadWithRange(String urlLocation, String filePath, long start, long end) + { + this.urlLocation = urlLocation; + this.filePath = filePath; + this.start = start; + this.end = end; + } + + @Override + public void run() + { + try + { + HttpURLConnection conn = getHttp(); + conn.setRequestProperty("Range", "bytes=" + start + "-" + end); + + File file = new File(filePath); + RandomAccessFile out = null; + if (file != null) + { + out = new RandomAccessFile(file, "rwd"); + } + out.seek(start); + InputStream in = conn.getInputStream(); + System.out.println(in.available()+" "+(end-start)); + byte[] b = new byte[1024]; + int len = 0; + while ((len = in.read(b)) != -1) + { + out.write(b, 0, len); + } + in.close(); + out.close(); + } + catch (Exception e) + { + e.getMessage(); + } + + } + + public HttpURLConnection getHttp() throws IOException + { + URL url = null; + if (urlLocation != null) + { + url = new URL(urlLocation); + } + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setReadTimeout(5000); + conn.setRequestMethod("GET"); + + return conn; + } + +} \ No newline at end of file diff --git a/group13/2931408816/lesson3/src/main/kotlin/main.kt b/group13/2931408816/lesson3/src/main/kotlin/main.kt new file mode 100644 index 0000000000..a9d905cab4 --- /dev/null +++ b/group13/2931408816/lesson3/src/main/kotlin/main.kt @@ -0,0 +1,40 @@ +import java.io.File +import java.io.PrintWriter +import java.nio.file.Files +import java.nio.file.Paths + +/** + * Created by pikachu on 2017/3/13. + */ + +fun main(args: Array) { + val dir = File("E:/users/pikachu/documents/Tencent Files/2931408816/FileRecv/treat/Input") + dir.listFiles().forEach { + if (!it.isDirectory){ + + println(it.canonicalPath) + println(it.absolutePath) + println(it.parent) + val dir = File("${it.parent}/temp") + if (!dir.exists()){ + dir.mkdirs() + } + val file = File(dir,it.name) + if (!file.exists()){ + file.createNewFile() + } + val out = PrintWriter(file) + val stream = Files.newInputStream(Paths.get(it.canonicalPath)) + stream.buffered().use { + while (it.available()>0){ + out.print(it.read().toChar()) + if(it.available()>0){ + out.print(" ") + } + } + } + + out.close() + } + } +} \ No newline at end of file diff --git a/group13/2931408816/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java b/group13/2931408816/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java index 5bbda22795..a01cb4ce5a 100644 --- a/group13/2931408816/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java +++ b/group13/2931408816/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java @@ -23,20 +23,23 @@ public void testDownload() { // String url = "http://localhost:8080/test.jpg"; - String url = "http://n1.itc.cn/img8/wb/recom/2016/07/26/146946506808699302.JPEG"; +// String url = "http://n1.itc.cn/img8/wb/recom/2016/07/26/146946506808699302.JPEG"; + +// String url = "http://localhost:8080/mybatis-jpetstore-6.0.0/"; +// String url = "http://www.cnblogs.com/iwideal/p/6045118.html"; +// String url = "http://localhost:8080/mybatis-jpetstore-6.0.0/actions/Catalog.action"; +// String url = "http://blog.csdn.net/cnhk1225/article/details/34429317"; +// String url = "http://rel.huya.com/apk/live.apk"; +// String url = "http://yydl.duowan.com/4/setup/YYSetup-8.20.0.1-zh-CN.exe"; +// String url = "https://discuss.kotlinlang.org/t/kotlin-1-1-language-reference-as-anki-https-apps-ankiweb-net-deck/2324"; + String url = "http://qtdream.com/"; FileDownloader downloader = new FileDownloader(url); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); + downloader.setListener(() -> downloadFinished = true); downloader.execute(); @@ -44,7 +47,7 @@ public void notifyFinished() { // 绛夊緟澶氱嚎绋嬩笅杞界▼搴忔墽琛屽畬姣 while (!downloadFinished) { try { - System.out.println("杩樻病鏈変笅杞藉畬鎴愶紝浼戠湢浜旂"); + System.out.println(""); System.out.println("None"); //浼戠湢5绉 Thread.sleep(5000); @@ -52,7 +55,6 @@ public void notifyFinished() { e.printStackTrace(); } } - System.out.println("涓嬭浇瀹屾垚锛"); System.out.println("Done!"); From 8485065fa8a60e9c75dd2c080a472640b3cd8695 Mon Sep 17 00:00:00 2001 From: tankexiaomao <514302761@qq.com> Date: Tue, 14 Mar 2017 16:10:30 +0800 Subject: [PATCH 126/177] just test --- .../514302761/src/com/company/ArrayList.java | 75 +++++++++++ .../src/com/company/BinaryTreeNode.java | 32 +++++ .../514302761/src/com/company/Iterator.java | 7 + .../514302761/src/com/company/LinkedList.java | 124 ++++++++++++++++++ group27/514302761/src/com/company/List.java | 9 ++ group27/514302761/src/com/company/Main.java | 8 -- group27/514302761/src/com/company/Queue.java | 19 +++ group27/514302761/src/com/company/Stack.java | 22 ++++ 8 files changed, 288 insertions(+), 8 deletions(-) create mode 100644 group27/514302761/src/com/company/ArrayList.java create mode 100644 group27/514302761/src/com/company/BinaryTreeNode.java create mode 100644 group27/514302761/src/com/company/Iterator.java create mode 100644 group27/514302761/src/com/company/LinkedList.java create mode 100644 group27/514302761/src/com/company/List.java delete mode 100644 group27/514302761/src/com/company/Main.java create mode 100644 group27/514302761/src/com/company/Queue.java create mode 100644 group27/514302761/src/com/company/Stack.java diff --git a/group27/514302761/src/com/company/ArrayList.java b/group27/514302761/src/com/company/ArrayList.java new file mode 100644 index 0000000000..0ca210c919 --- /dev/null +++ b/group27/514302761/src/com/company/ArrayList.java @@ -0,0 +1,75 @@ +package com.company; + +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+1>elementData.length){ + elementData= Arrays.copyOf(elementData,elementData.length/3*2); + } + 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); + } + 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){ + Object old=elementData[index]; + System.arraycopy(elementData,index+1,elementData,index,size-1-index); + size--; + return old; + } + + public int size(){ + for(int i=0;i7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 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){ + + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group27/514302761/src/com/company/List.java b/group27/514302761/src/com/company/List.java new file mode 100644 index 0000000000..9e9f7bacb7 --- /dev/null +++ b/group27/514302761/src/com/company/List.java @@ -0,0 +1,9 @@ +package com.company; + +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/group27/514302761/src/com/company/Main.java b/group27/514302761/src/com/company/Main.java deleted file mode 100644 index c43739a918..0000000000 --- a/group27/514302761/src/com/company/Main.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.company; - -public class Main { - - public static void main(String[] args) { - System.out.print("this is a test"); - } -} diff --git a/group27/514302761/src/com/company/Queue.java b/group27/514302761/src/com/company/Queue.java new file mode 100644 index 0000000000..060e769c05 --- /dev/null +++ b/group27/514302761/src/com/company/Queue.java @@ -0,0 +1,19 @@ +package com.company; + +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/group27/514302761/src/com/company/Stack.java b/group27/514302761/src/com/company/Stack.java new file mode 100644 index 0000000000..38b00d19ad --- /dev/null +++ b/group27/514302761/src/com/company/Stack.java @@ -0,0 +1,22 @@ +package com.company; + +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; + } +} From 49805b0391a47f8aa7c41b1d6b62d1f11f83229f Mon Sep 17 00:00:00 2001 From: "2474600377@qq.com" <2474600377@qq.com> Date: Tue, 14 Mar 2017 17:34:43 +0800 Subject: [PATCH 127/177] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/array/ArrayUtil.java | 14 ++ .../com/coding/download/DownloadThread.java | 57 +++--- .../com/coding/download/FileDownloader.java | 177 ++++++++++-------- .../coding/download/FileDownloaderTest.java | 119 ++++++------ .../download/api/ConnectionException.java | 10 +- .../coding/download/impl/ConnectionImpl.java | 75 +++++--- .../download/impl/ConnectionManagerImpl.java | 37 ++-- .../904627477/src/com/coding/test/Test.java | 53 +++++- 8 files changed, 329 insertions(+), 213 deletions(-) diff --git a/group10/904627477/src/com/coding/array/ArrayUtil.java b/group10/904627477/src/com/coding/array/ArrayUtil.java index dc3a7a7254..aaa1dbb96a 100644 --- a/group10/904627477/src/com/coding/array/ArrayUtil.java +++ b/group10/904627477/src/com/coding/array/ArrayUtil.java @@ -109,6 +109,20 @@ public int[] grow(int [] oldArray, int size){ return newArr; } + public static byte[] grow(byte[] oldArray, int size){ + if(oldArray==null){ + return new byte[0]; + } + if(size<0){ + throw new IllegalArgumentException(); + } + byte[] newArr = new byte[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; + } + return newArr; + } + /** * 鏂愭尝閭e鏁板垪涓猴細1锛1锛2锛3锛5锛8锛13锛21...... 锛岀粰瀹氫竴涓渶澶у硷紝 杩斿洖灏忎簬璇ュ肩殑鏁板垪 * 渚嬪锛 max = 15 , 鍒欒繑鍥炵殑鏁扮粍搴旇涓 [1锛1锛2锛3锛5锛8锛13] diff --git a/group10/904627477/src/com/coding/download/DownloadThread.java b/group10/904627477/src/com/coding/download/DownloadThread.java index 525080110a..7e98539050 100644 --- a/group10/904627477/src/com/coding/download/DownloadThread.java +++ b/group10/904627477/src/com/coding/download/DownloadThread.java @@ -1,21 +1,36 @@ -package com.coding.download; - -import com.coding.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(){ - - } -} +package com.coding.download; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.coding.download.api.Connection; +import com.coding.util.IOUtils; + +public class DownloadThread extends Thread { + + Connection conn; + int startPos; + int endPos; + private File file; + + public DownloadThread(Connection conn, int startPos, int endPos,File file) { + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.file = file; + } + + public void run() { + byte[] buff; + try { + buff = conn.read(startPos, endPos); + if(buff!=null&&buff.length!=0){ + IOUtils.writeFile(file, startPos, buff); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/group10/904627477/src/com/coding/download/FileDownloader.java b/group10/904627477/src/com/coding/download/FileDownloader.java index d165f6ee18..146491f2db 100644 --- a/group10/904627477/src/com/coding/download/FileDownloader.java +++ b/group10/904627477/src/com/coding/download/FileDownloader.java @@ -1,75 +1,102 @@ -package com.coding.download; - -import com.coding.download.api.Connection; -import com.coding.download.api.ConnectionException; -import com.coding.download.api.ConnectionManager; -import com.coding.download.api.DownloadListener; - - - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 - // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 - // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 - // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 - // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 - // 鍏蜂綋鐨勫疄鐜版濊矾锛 - // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 - // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 - // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 - // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 - // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 - - // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 - 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; - } - -} +package com.coding.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.List; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; +import com.coding.download.api.Resource; +import com.coding.util.IOUtils; + + + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + private static String localFile = "c:/test/test.jpg"; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + /**/ + try { + Connection conn = cm.open(url); + int length = conn.getContentLength(); + File file = new File(localFile); + if(!file.exists()){ + IOUtils.createFile(length, localFile); + } + Resource res = new Resource(url,file); + Thread c = new CreateThread(res,length); + Thread r = new RemoveThread(res,listener); + c.start(); + r.start(); + } catch (ConnectionException e) { + e.printStackTrace(); + } + /*Connection conn = null; + try { + conn = cm.open(this.url); + int length = conn.getContentLength(); + File file = new File(localFile); + if(!file.exists()){ + IOUtils.createFile(length, localFile); + } + + + + new DownloadThread(cm.open(this.url),0,length-1,file).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/group10/904627477/src/com/coding/download/FileDownloaderTest.java b/group10/904627477/src/com/coding/download/FileDownloaderTest.java index f6d871a126..f3345d75d7 100644 --- a/group10/904627477/src/com/coding/download/FileDownloaderTest.java +++ b/group10/904627477/src/com/coding/download/FileDownloaderTest.java @@ -1,60 +1,59 @@ -package com.coding.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.coding.download.api.ConnectionManager; -import com.coding.download.api.DownloadListener; -import com.coding.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("涓嬭浇瀹屾垚锛"); - - - - } - -} +package com.coding.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; +import com.coding.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://img6.bdstatic.com/img/image/smallpic/22.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/group10/904627477/src/com/coding/download/api/ConnectionException.java b/group10/904627477/src/com/coding/download/api/ConnectionException.java index 1db8b093ec..67f59470a3 100644 --- a/group10/904627477/src/com/coding/download/api/ConnectionException.java +++ b/group10/904627477/src/com/coding/download/api/ConnectionException.java @@ -1,5 +1,5 @@ -package com.coding.download.api; - -public class ConnectionException extends Exception { - -} +package com.coding.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java b/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java index 0b5f61fdda..6f9ef0d6ae 100644 --- a/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java +++ b/group10/904627477/src/com/coding/download/impl/ConnectionImpl.java @@ -1,28 +1,47 @@ -package com.coding.download.impl; - -import java.io.IOException; - -import com.coding.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() { - - - } - -} +package com.coding.download.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +import com.coding.array.ArrayUtil; +import com.coding.download.api.Connection; + + +public class ConnectionImpl implements Connection{ + + private URLConnection ucon; + + public ConnectionImpl(String url) throws IOException{ + URL u = new URL(url); + ucon = u.openConnection(); + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + ucon.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + InputStream in = ucon.getInputStream(); + byte[] result = new byte[0]; + byte[] buff = new byte[1024]; + int len = 0; + while((len=in.read(buff))!=-1){ + int rLen = result.length; + result =ArrayUtil.grow(result, len); + System.arraycopy(buff, 0, result, rLen, len); + } + return result; + } + + @Override + public int getContentLength() { + return ucon.getContentLength(); + } + + @Override + public void close() { + //ucon = null; + } + +} diff --git a/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java b/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java index 15dc2f0b07..f949ddce6f 100644 --- a/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java +++ b/group10/904627477/src/com/coding/download/impl/ConnectionManagerImpl.java @@ -1,15 +1,22 @@ -package com.coding.download.impl; - -import com.coding.download.api.Connection; -import com.coding.download.api.ConnectionException; -import com.coding.download.api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) throws ConnectionException { - - return null; - } - -} +package com.coding.download.impl; + + +import java.io.IOException; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException{ + try { + return new ConnectionImpl(url); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group10/904627477/src/com/coding/test/Test.java b/group10/904627477/src/com/coding/test/Test.java index bebef536da..806eb3a1c5 100644 --- a/group10/904627477/src/com/coding/test/Test.java +++ b/group10/904627477/src/com/coding/test/Test.java @@ -1,6 +1,21 @@ package com.coding.test; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.net.URL; +import java.net.URLConnection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + import com.coding.basic.LinkedList; +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.impl.ConnectionManagerImpl; @@ -8,15 +23,35 @@ public class Test { - public static void main(String[] args) { - LinkedList link = new LinkedList(); - link.add(1); - link.add("bbb"); - link.add("ccc"); - link.reverse(); - System.out.println(link.get(0)); - System.out.println(link.get(1)); - System.out.println(link.get(2)); + public static void main(String[] args) throws IOException, ConnectionException { + /*URLConnection con = new URL("https://img6.bdstatic.com/img/image/smallpic/22.jpg").openConnection(); + InputStream in = con.getInputStream(); + System.out.println("---------------"); + + con.setRequestProperty("Range", "bytes=" + 1 + "-" + 2);*/ + /*URLConnection con = new URL("https://img6.bdstatic.com/img/image/smallpic/22.jpg").openConnection(); + con.getContentLength(); + con.connect(); + //con.setRequestProperty("Range", "bytes=" + 0 + "-" + 27573); + con.addRequestProperty("Range", "bytes=" + 0 + "-" + 27573); + System.out.println(con.getContentLength()); + InputStream in = con.getInputStream(); + int length = con.getContentLength(); + File file = new File("c:/test/test.jpg"); + //RandomAccessFile out = new RandomAccessFile(file, "rw"); + FileOutputStream out = new FileOutputStream(file); + byte[] buff = new byte[length]; + int len = 0; + while((len=in.read(buff))!=-1){ + out.write(buff, 0, len); + } + out.close();*/ + /**/Connection con = new ConnectionManagerImpl().open("https://img6.bdstatic.com/img/image/smallpic/22.jpg"); + byte[] buff = con.read(0, 27573); + File file = new File("c:/test/test.jpg"); + FileOutputStream out = new FileOutputStream(file); + out.write(buff); + out.close(); } } From 916f6ac7f68e91278ad6a9d5e7cd0f960779a5ba Mon Sep 17 00:00:00 2001 From: "2474600377@qq.com" <2474600377@qq.com> Date: Tue, 14 Mar 2017 17:43:26 +0800 Subject: [PATCH 128/177] Signed-off-by: 2474600377@qq.com <2474600377@qq.com> --- .../org.eclipse.core.resources.prefs | 4 +- .../src/com/coding/basic/ArrayList.java | 214 +++++++++--------- .../src/com/coding/basic/BinaryTreeNode.java | 64 +++--- .../src/com/coding/basic/Iterator.java | 14 +- .../904627477/src/com/coding/basic/List.java | 18 +- .../904627477/src/com/coding/basic/Queue.java | 56 ++--- .../904627477/src/com/coding/basic/Stack.java | 72 +++--- .../src/com/coding/download/CreateThread.java | 32 +++ .../src/com/coding/download/RemoveThread.java | 30 +++ .../download/api/ConnectionManager.java | 20 +- .../coding/download/api/DownloadListener.java | 10 +- .../src/com/coding/download/api/Resource.java | 92 ++++++++ .../src/com/coding/util/IOUtils.java | 40 ++++ 13 files changed, 430 insertions(+), 236 deletions(-) create mode 100644 group10/904627477/src/com/coding/download/CreateThread.java create mode 100644 group10/904627477/src/com/coding/download/RemoveThread.java create mode 100644 group10/904627477/src/com/coding/download/api/Resource.java create mode 100644 group10/904627477/src/com/coding/util/IOUtils.java diff --git a/group10/904627477/.settings/org.eclipse.core.resources.prefs b/group10/904627477/.settings/org.eclipse.core.resources.prefs index 99f26c0203..4824b80263 100644 --- a/group10/904627477/.settings/org.eclipse.core.resources.prefs +++ b/group10/904627477/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,2 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group10/904627477/src/com/coding/basic/ArrayList.java b/group10/904627477/src/com/coding/basic/ArrayList.java index 515d3f6030..76afd6680b 100644 --- a/group10/904627477/src/com/coding/basic/ArrayList.java +++ b/group10/904627477/src/com/coding/basic/ArrayList.java @@ -1,107 +1,107 @@ -package com.coding.basic; - -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; - } - - } - - -} +package com.coding.basic; + +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/basic/BinaryTreeNode.java b/group10/904627477/src/com/coding/basic/BinaryTreeNode.java index d7ac820192..266eff3d56 100644 --- a/group10/904627477/src/com/coding/basic/BinaryTreeNode.java +++ b/group10/904627477/src/com/coding/basic/BinaryTreeNode.java @@ -1,32 +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; - } - -} +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/group10/904627477/src/com/coding/basic/Iterator.java b/group10/904627477/src/com/coding/basic/Iterator.java index 06ef6311b2..dbe8b9afb2 100644 --- a/group10/904627477/src/com/coding/basic/Iterator.java +++ b/group10/904627477/src/com/coding/basic/Iterator.java @@ -1,7 +1,7 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group10/904627477/src/com/coding/basic/List.java b/group10/904627477/src/com/coding/basic/List.java index 10d13b5832..396b1f6416 100644 --- a/group10/904627477/src/com/coding/basic/List.java +++ b/group10/904627477/src/com/coding/basic/List.java @@ -1,9 +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(); -} +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/904627477/src/com/coding/basic/Queue.java b/group10/904627477/src/com/coding/basic/Queue.java index e54df70c96..2b2f92f74b 100644 --- a/group10/904627477/src/com/coding/basic/Queue.java +++ b/group10/904627477/src/com/coding/basic/Queue.java @@ -1,28 +1,28 @@ -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){ - return null; - } - return elementData.remove(0); - } - - public boolean isEmpty(){ - if(elementData.size()==0){ - return true; - } - return false; - } - - public int size(){ - return elementData.size(); - } -} +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){ + 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/basic/Stack.java b/group10/904627477/src/com/coding/basic/Stack.java index fc06fb3ce8..083215e615 100644 --- a/group10/904627477/src/com/coding/basic/Stack.java +++ b/group10/904627477/src/com/coding/basic/Stack.java @@ -1,36 +1,36 @@ -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(){ - 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(); - } -} +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(){ + 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/download/CreateThread.java b/group10/904627477/src/com/coding/download/CreateThread.java new file mode 100644 index 0000000000..d9a22edbbd --- /dev/null +++ b/group10/904627477/src/com/coding/download/CreateThread.java @@ -0,0 +1,32 @@ +package com.coding.download; + + +import com.coding.download.api.Resource; + +public class CreateThread extends Thread { + + private Resource resource; + private int length; + + public CreateThread(Resource resource,int length){ + this.resource = resource; + this.length = length; + } + + @Override + public void run() { + int startPos = 0; + while(true){ + //System.out.println(startPos); + if(startPos>=length){ + resource.setFlag(true); + break; + }else{ + startPos = resource.increace(); + } + } + } + + + +} diff --git a/group10/904627477/src/com/coding/download/RemoveThread.java b/group10/904627477/src/com/coding/download/RemoveThread.java new file mode 100644 index 0000000000..0a1b5e415f --- /dev/null +++ b/group10/904627477/src/com/coding/download/RemoveThread.java @@ -0,0 +1,30 @@ +package com.coding.download; + +import com.coding.download.api.DownloadListener; +import com.coding.download.api.Resource; + +public class RemoveThread extends Thread { + + private Resource resource; + private DownloadListener listener; + + public RemoveThread(Resource resource,DownloadListener listener){ + this.resource = resource; + this.listener = listener; + } + + @Override + public void run() { + while(true){ + if(resource.isFlag()&&resource.getThreads().size()==0){ + listener.notifyFinished(); + break; + }else{ + resource.decreace(); + } + } + } + + + +} diff --git a/group10/904627477/src/com/coding/download/api/ConnectionManager.java b/group10/904627477/src/com/coding/download/api/ConnectionManager.java index 1d1a83caf2..df00b84b77 100644 --- a/group10/904627477/src/com/coding/download/api/ConnectionManager.java +++ b/group10/904627477/src/com/coding/download/api/ConnectionManager.java @@ -1,10 +1,10 @@ -package com.coding.download.api; - -public interface ConnectionManager { - /** - * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} +package com.coding.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group10/904627477/src/com/coding/download/api/DownloadListener.java b/group10/904627477/src/com/coding/download/api/DownloadListener.java index c41045b0e8..bc01938d90 100644 --- a/group10/904627477/src/com/coding/download/api/DownloadListener.java +++ b/group10/904627477/src/com/coding/download/api/DownloadListener.java @@ -1,5 +1,5 @@ -package com.coding.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} +package com.coding.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group10/904627477/src/com/coding/download/api/Resource.java b/group10/904627477/src/com/coding/download/api/Resource.java new file mode 100644 index 0000000000..ae525fd9b5 --- /dev/null +++ b/group10/904627477/src/com/coding/download/api/Resource.java @@ -0,0 +1,92 @@ +package com.coding.download.api; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import com.coding.download.DownloadThread; +import com.coding.download.impl.ConnectionManagerImpl; + +public class Resource { + + private int index; + private int size; + private String url; + private List threads; + private File file; + private boolean flag; + + public Resource(String url,File file){ + index = 0; + size = 1024*2; + threads = new ArrayList(); + flag = false; + this.url = url; + this.file = file; + } + + public synchronized int increace(){ + //System.out.println(threads.size()); + while(threads.size()>=5){ + try { + this.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + int startPos = index*size; + try { + Connection conn = new ConnectionManagerImpl().open(url); + DownloadThread down = new DownloadThread(conn, startPos, startPos+size-1,file); + down.start(); + index ++; + threads.add(down); + this.notify(); + } catch (ConnectionException e) { + e.printStackTrace(); + } + return index*size; + } + + public synchronized void decreace(){ + //System.out.println("decreace:"+threads.size()); + while(threads.size()==0){ + try { + this.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + /*try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + }*/ + for (int i = 0; i < threads.size();i++) { + if(!threads.get(i).isAlive()){ + threads.remove(i); + this.notify(); + break; + } + } + } + + public List getThreads() { + return threads; + } + + public void setThreads(List threads) { + this.threads = threads; + } + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + + +} diff --git a/group10/904627477/src/com/coding/util/IOUtils.java b/group10/904627477/src/com/coding/util/IOUtils.java new file mode 100644 index 0000000000..d016d55603 --- /dev/null +++ b/group10/904627477/src/com/coding/util/IOUtils.java @@ -0,0 +1,40 @@ +package com.coding.util; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +public class IOUtils { + + public static void writeFile(File file,int startPos,byte[] buff) throws IOException{ + if(buff==null){ + return; + } + RandomAccessFile out = new RandomAccessFile(file, "rw"); + out.seek(startPos); + out.write(buff); + out.close(); + } + + public static void createFile(long length,String filePath){ + RandomAccessFile file = null; + try { + file = new RandomAccessFile(filePath, "rw"); + file.setLength(length); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally{ + if(file!=null){ + try { + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + +} From a52efdce63df0e56cf13d108c7e0c90b702b4fa4 Mon Sep 17 00:00:00 2001 From: MAC Date: Tue, 14 Mar 2017 22:06:15 +0800 Subject: [PATCH 129/177] week02 array util commit --- group26/89460886/src/week02/.DS_Store | Bin 0 -> 6148 bytes .../89460886/src/week02/source/ArrayUtil.java | 190 ++++++++++++++++++ .../src/week02/test/TestArrayUtil.java | 95 +++++++++ 3 files changed, 285 insertions(+) create mode 100644 group26/89460886/src/week02/.DS_Store create mode 100644 group26/89460886/src/week02/source/ArrayUtil.java create mode 100644 group26/89460886/src/week02/test/TestArrayUtil.java diff --git a/group26/89460886/src/week02/.DS_Store b/group26/89460886/src/week02/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 array2[arr2Index]) { + array3[arr3Index++] = array2[arr2Index++]; + } else { + array3[arr3Index++] = array1[arr1Index++] = array2[arr2Index++]; + zeroCount++; + } + } + while (arr1Index < len1) { + array3[arr3Index++] = array1[arr1Index++]; + } + while (arr2Index < len2) { + array3[arr3Index++] = array2[arr2Index++]; + } + return Arrays.copyOf(array3, len1 + len2 - zeroCount); + } + /** + * 鎶婁竴涓凡缁忓瓨婊℃暟鎹殑鏁扮粍 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); + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + int first = 1, second = 1; + int next = 2; + int[] result = new int[max]; + result[0] = first; result[1] = second; + int count = 2; + while (next < max) { + result[count++] = next; + first = second; + second = next; + next = first + second; + } + return Arrays.copyOf(result, count); + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if (max <= 2) return null; + int [] result = new int[max]; + int count = 0; + for (int i = 2; i < max; i++) { + if (!primes(i)) { + result[count++] = i; + } + } + return Arrays.copyOf(result, count); + } + + private boolean primes(int data) { + int sqrt = (int) Math.sqrt(data) + 1; + for (int i = 2; i < sqrt; i++) { + if (data % i == 0){ + return true; + } + } + return false; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] result = new int[max - 2]; + int count = 0; + for (int i = 2; i < max; i++) { + if (perfectNumber(i)) + result[count++] = i; + } + return Arrays.copyOf(result, count); + } + + private boolean perfectNumber(int number) { + int left = 2, right = number; + int sum = 1; + while (left < right) { + if (number % left == 0) { + sum += left; + right = number / left; + if (left != right) sum += right; + } + left++; + } + return sum == number; + } + + /** + * 鐢╯eparator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 + * 渚嬪array= [3,8,9], seperator = "-" + * 鍒欒繑鍥炲间负"3-8-9" + * @param array + * @param separator + * @return + */ + public String join(int[] array, String separator){ + if (array == null) return null; + StringBuilder result = new StringBuilder(); + result.append(array[0]); + for (int i = 1, len = array.length; i < len; i++) { + result.append(separator).append(array[i]); + } + return result.toString(); + } + +} diff --git a/group26/89460886/src/week02/test/TestArrayUtil.java b/group26/89460886/src/week02/test/TestArrayUtil.java new file mode 100644 index 0000000000..836d4366b8 --- /dev/null +++ b/group26/89460886/src/week02/test/TestArrayUtil.java @@ -0,0 +1,95 @@ +import coding.ArrayUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author jiaxun + */ +public class TestArrayUtil { + + private ArrayUtil arrayUtil; + + @Before + public void setUp() { + arrayUtil = new ArrayUtil(); + } + + @After + public void tearDown() { + + } + + @Test + public void testReverseArrayOdd() { + int[] actualArray = {6, 2, 5, 8, 7}; + arrayUtil.reverseArray(actualArray); + int[] expectedArray = {7, 8, 5, 2, 6}; + Assert.assertArrayEquals(expectedArray, actualArray); + } + + @Test + public void testReverseArrayEven() { + int[] actualArray = {5, 3, 6, 7}; + arrayUtil.reverseArray(actualArray); + int[] expectedArray = {7, 6, 3, 5}; + Assert.assertArrayEquals(expectedArray, actualArray); + } + + @Test + public void testRemoveZero() { + int[] oldArray = {4, 5, 0, 7, 0, 3}; + int[] newArray = arrayUtil.removeZero(oldArray); + Assert.assertEquals(newArray.length, 4); + Assert.assertEquals(newArray[2], 7); + } + + @Test + public void testMerge() { + int[] array1 = {3, 5, 7,8}; + int[] array2 = {4, 5, 6,7}; + int[] array3 = arrayUtil.merge(array1, array2); + Assert.assertEquals(array3.length, 6); + int[] expectArray = {3, 4, 5, 6, 7, 8}; + Assert.assertArrayEquals(expectArray, array3); + } + + @Test + public void testGrow() { + int[] array = {2, 3, 6}; + int[] result = arrayUtil.grow(array, 3); + Assert.assertEquals(result.length, 6); + int[] expectedArray = {2, 3, 6, 0, 0, 0}; + Assert.assertArrayEquals(expectedArray, result); + } + + @Test + public void testFibonacci() { + int[] result = arrayUtil.fibonacci(15); + int[] expect = {1, 1, 2, 3, 5, 8, 13}; + Assert.assertArrayEquals(expect, result); + } + + @Test + public void testGetPerfectNumbers() { + int[] result = arrayUtil.getPerfectNumbers(500); + int[] expected = {6, 28, 496}; + Assert.assertArrayEquals(expected, result); + } + + @Test + public void testGetPrimes() { + int[] result = arrayUtil.getPrimes(23); + int[] expectedArray = {2, 3, 5, 7, 11, 13, 17, 19}; + Assert.assertArrayEquals(expectedArray, result); + } + + @Test + public void testJoin() { + int[] source = {3,8,9}; + String result = arrayUtil.join(source, "-"); + Assert.assertEquals("3-8-9", result); + } + +} From 2302810fbab8e214838f5ad4d31cdebc7dd1106c Mon Sep 17 00:00:00 2001 From: szlele <595128841@qq.com> Date: Tue, 14 Mar 2017 23:49:06 +0800 Subject: [PATCH 130/177] =?UTF-8?q?20170314-=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/le/b/ArrayUtil.java | 197 ++++++++++++ .../src/main/java/org/le/b/LoginAction.java | 35 ++ .../src/main/java/org/le/b/Struts.java | 155 +++++++++ .../src/main/java/org/le/b/StrutsTest.java | 38 +++ .../src/main/java/org/le/b/View.java | 28 ++ .../src/main/java/org/le/c/Downloader.java | 120 +++++++ .../src/main/java/org/le/c/ImgFilter.java | 25 ++ .../src/main/java/org/le/list/ArrayList.java | 144 +++++++++ .../src/main/java/org/le/list/LinkedList.java | 299 ++++++++++++++++++ .../src/main/java/org/le/list/List.java | 19 ++ 10 files changed, 1060 insertions(+) create mode 100644 group10/595128841/src/main/java/org/le/b/ArrayUtil.java create mode 100644 group10/595128841/src/main/java/org/le/b/LoginAction.java create mode 100644 group10/595128841/src/main/java/org/le/b/Struts.java create mode 100644 group10/595128841/src/main/java/org/le/b/StrutsTest.java create mode 100644 group10/595128841/src/main/java/org/le/b/View.java create mode 100644 group10/595128841/src/main/java/org/le/c/Downloader.java create mode 100644 group10/595128841/src/main/java/org/le/c/ImgFilter.java create mode 100644 group10/595128841/src/main/java/org/le/list/ArrayList.java create mode 100644 group10/595128841/src/main/java/org/le/list/LinkedList.java create mode 100644 group10/595128841/src/main/java/org/le/list/List.java diff --git a/group10/595128841/src/main/java/org/le/b/ArrayUtil.java b/group10/595128841/src/main/java/org/le/b/ArrayUtil.java new file mode 100644 index 0000000000..29f1b3567a --- /dev/null +++ b/group10/595128841/src/main/java/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 = [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鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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); + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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/main/java/org/le/b/LoginAction.java b/group10/595128841/src/main/java/org/le/b/LoginAction.java new file mode 100644 index 0000000000..d895f6b5e6 --- /dev/null +++ b/group10/595128841/src/main/java/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/main/java/org/le/b/Struts.java b/group10/595128841/src/main/java/org/le/b/Struts.java new file mode 100644 index 0000000000..303286690f --- /dev/null +++ b/group10/595128841/src/main/java/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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + 鎹畃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瀛楁涓 + + */ + 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/main/java/org/le/b/StrutsTest.java b/group10/595128841/src/main/java/org/le/b/StrutsTest.java new file mode 100644 index 0000000000..3733a6a777 --- /dev/null +++ b/group10/595128841/src/main/java/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/main/java/org/le/b/View.java b/group10/595128841/src/main/java/org/le/b/View.java new file mode 100644 index 0000000000..39a9f8a644 --- /dev/null +++ b/group10/595128841/src/main/java/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/main/java/org/le/c/Downloader.java b/group10/595128841/src/main/java/org/le/c/Downloader.java new file mode 100644 index 0000000000..792efb3e1a --- /dev/null +++ b/group10/595128841/src/main/java/org/le/c/Downloader.java @@ -0,0 +1,120 @@ +/** + * + */ +package org.le.c; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +/** + * 澶氱嚎绋嬪浘鐗囦笅杞 + * @author yue + * @time 2017骞3鏈11鏃 + */ +public class Downloader { + + private RandomAccessFile raf; + private String url; + + public Downloader(String url,String path){ + //鑾峰彇鏂囦欢鍚 + String filePath = path+File.separator+url.substring(url.lastIndexOf("/")+1); + System.out.println("淇濆瓨璺緞锛"+filePath); + this.url = url; + try { + this.raf = new RandomAccessFile(filePath,"rw"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public void downFile() throws IOException{ + URL uurl = new URL(url); + URLConnection conn = uurl.openConnection(); + int cLen = conn.getContentLength();//鏈澶у彲琛ㄧず4G + if(cLen < 0){ + System.out.println("鏃犳硶鑾峰彇鏂囦欢澶у皬"); + return; + } + this.raf.setLength(cLen); + //鏍规嵁鏂囦欢澶у皬閫夋嫨鍚堥傜嚎绋 + int size = getByteArrayLength(cLen); + byte[] buff = new byte[size]; + System.out.println("涓嬭浇鏂囦欢锛"+url+"锛屾枃浠跺ぇ灏忥細"+cLen+"瀛楄妭锛屽崟涓嚎绋嬪ぇ灏忥細"+size); + int len = 0; + int offset = 0; + int index = 0; + try (InputStream in = conn.getInputStream()){ + while((len = in.read(buff)) != -1){ + byte[] desc = getNewByte(buff,len); + Thread thread = new DownLoadThread(desc,offset,this); + offset += len; + thread.setName("绾跨▼"+(++index)); + thread.start(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + private byte[] getNewByte(byte[] src,int len){ + byte[] desc = new byte[len]; + System.arraycopy(src, 0, desc, 0, len); + return desc; + } + + private int getByteArrayLength(int cLen) { + int m = 1024 * 1024; + int s = cLen/m; + if(s == 0){ + return 1024 *100; + } + return m; + } + + public synchronized void writeToFile(byte[] buff,int offset) { + try { + raf.seek(offset); + raf.write(buff); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + public static void main(String[] args) throws Exception { + String url = "http://162.250.97.90/file/MP4/mp413/閭撶传妫-澶滅┖涓渶浜殑鏄焄68mtv.com].mp4"; + String path = "C:/work/workspace/coding2017/coding2017/group10/595128841"; + Downloader d = new Downloader(url,path); + long st = System.currentTimeMillis(); + d.downFile(); + System.out.println("鑰楁椂锛"+(System.currentTimeMillis() - st)); + } + + static class DownLoadThread extends Thread{ + private byte[] buff; + private int offset; + private Downloader downloader; + + public DownLoadThread(byte[] buff, int offset,Downloader downloader) { + this.buff = buff; + this.downloader = downloader; + this.offset = offset; + } + + @Override + public void run() { + System.out.println(Thread.currentThread().getName()+",offset:"+offset); + downloader.writeToFile(buff,offset); + } + + } + + +} diff --git a/group10/595128841/src/main/java/org/le/c/ImgFilter.java b/group10/595128841/src/main/java/org/le/c/ImgFilter.java new file mode 100644 index 0000000000..2ce1767d32 --- /dev/null +++ b/group10/595128841/src/main/java/org/le/c/ImgFilter.java @@ -0,0 +1,25 @@ +/** + * + */ +package org.le.c; + +import java.io.File; +import java.io.FilenameFilter; + +/** + * 鍥剧墖杩囨护鍣 + * @author yue + * @time 2017骞3鏈12鏃 + */ +public class ImgFilter implements FilenameFilter { + + /** + * + */ + @Override + public boolean accept(File dir, String name) { + String s1 = name.toLowerCase(); + return s1.endsWith(".jpg") || s1.endsWith(".png"); + } + +} diff --git a/group10/595128841/src/main/java/org/le/list/ArrayList.java b/group10/595128841/src/main/java/org/le/list/ArrayList.java new file mode 100644 index 0000000000..03a74e139b --- /dev/null +++ b/group10/595128841/src/main/java/org/le/list/ArrayList.java @@ -0,0 +1,144 @@ +/** + * + */ +package org.le.list; + +/** + * @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/main/java/org/le/list/LinkedList.java b/group10/595128841/src/main/java/org/le/list/LinkedList.java new file mode 100644 index 0000000000..b4ee384ad6 --- /dev/null +++ b/group10/595128841/src/main/java/org/le/list/LinkedList.java @@ -0,0 +1,299 @@ +/** + * + */ +package org.le.list; + +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("绱㈠紩瓒婄晫锛歩ndex锛"+index+"锛宻ize锛"+size); + } + } + + private void checkElementIndex(int index){ + if(index <0 || index >= size){ + throw new IndexOutOfBoundsException("绱㈠紩瓒婄晫锛歩ndex锛"+index+"锛宻ize锛"+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/main/java/org/le/list/List.java b/group10/595128841/src/main/java/org/le/list/List.java new file mode 100644 index 0000000000..3e50bd5553 --- /dev/null +++ b/group10/595128841/src/main/java/org/le/list/List.java @@ -0,0 +1,19 @@ +package org.le.list; + +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); + +} From 2adc72850f5adfba01d6821456268cb0f1c144c0 Mon Sep 17 00:00:00 2001 From: szlele <595128841@qq.com> Date: Wed, 15 Mar 2017 00:15:40 +0800 Subject: [PATCH 131/177] =?UTF-8?q?20170315=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group10/595128841/src/main/java/org/le/c/Downloader.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/group10/595128841/src/main/java/org/le/c/Downloader.java b/group10/595128841/src/main/java/org/le/c/Downloader.java index 792efb3e1a..811bb711a4 100644 --- a/group10/595128841/src/main/java/org/le/c/Downloader.java +++ b/group10/595128841/src/main/java/org/le/c/Downloader.java @@ -89,12 +89,12 @@ public synchronized void writeToFile(byte[] buff,int offset) { public static void main(String[] args) throws Exception { - String url = "http://162.250.97.90/file/MP4/mp413/閭撶传妫-澶滅┖涓渶浜殑鏄焄68mtv.com].mp4"; + String url = "http://7xq43s.com1.z0.glb.clouddn.com/yunanding-6.jpg"; String path = "C:/work/workspace/coding2017/coding2017/group10/595128841"; Downloader d = new Downloader(url,path); long st = System.currentTimeMillis(); d.downFile(); - System.out.println("鑰楁椂锛"+(System.currentTimeMillis() - st)); + System.out.println("鑰楁椂锛"+(System.currentTimeMillis() - st)+" 姣"); } static class DownLoadThread extends Thread{ @@ -110,7 +110,7 @@ public DownLoadThread(byte[] buff, int offset,Downloader downloader) { @Override public void run() { - System.out.println(Thread.currentThread().getName()+",offset:"+offset); + System.out.println(Thread.currentThread().getName()+"锛宭ength锛"+buff.length+"锛宱ffset锛"+offset); downloader.writeToFile(buff,offset); } From 5106eadcfdd7118a17aef4bc0e597e4a54f250dc Mon Sep 17 00:00:00 2001 From: XiangYangHan Date: Wed, 15 Mar 2017 13:41:37 +0800 Subject: [PATCH 132/177] record05 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 瀹屾垚绗簩娆′綔涓氱殑ArrayUtil.java锛屽椤圭洰鏁翠綋鐩綍缁撴瀯杩涜鏁存敼銆 --- .../Exercise/src/lesson01/LinkedList.java | 20 +- .../Exercise/src/lesson02/ArrayUtil.java | 234 ++++++++++++++++++ .../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 - 11 files changed, 240 insertions(+), 403 deletions(-) create mode 100644 group13/1274639949/Exercise/src/lesson02/ArrayUtil.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/ArrayList.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/BinaryTree.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/BinaryTreeNode.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/Iterator.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/LinkedList.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/List.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/Queue.java delete mode 100644 group13/1274639949/lesson01/src/com/hans/Stack.java delete mode 100644 "group13/1274639949/\346\214\207\344\273\244\346\274\253\346\270\270\350\256\260.md" diff --git a/group13/1274639949/Exercise/src/lesson01/LinkedList.java b/group13/1274639949/Exercise/src/lesson01/LinkedList.java index 6e2689e21f..d4c0006c95 100644 --- a/group13/1274639949/Exercise/src/lesson01/LinkedList.java +++ b/group13/1274639949/Exercise/src/lesson01/LinkedList.java @@ -42,10 +42,12 @@ public void add(int index, E element) { for(int i = 0; i < index; i++){ pos = pos.next; } - temp.pre = pos.pre; - temp.next = pos; + + temp.pre = pos.pre; pos.pre.next = temp; + pos.pre = temp; + temp.next = pos; } size++; temp = null; @@ -53,7 +55,7 @@ public void add(int index, E element) { @Override public void clear() { - while(pollFirst() != null){ + while(pollLast() != null){ } } @@ -114,17 +116,7 @@ public E remove(int index) { head.next = null; last.pre = null; last = null; - }/*else if(index == 0){ - //閾捐〃涓湁涓や釜鎴栨洿澶氱殑鍏冪礌锛屼絾鏄Щ闄や笅鏍囦负0鐨勫厓绱 - temp = head.next; - obj = temp.data; - - head.next = temp.next; - temp.next.pre = head; - temp.pre = null; - temp.next = null; - temp = null; - }*/else if(index == size - 1){ + }else if(index == size - 1){ //閾捐〃涓湁涓や釜鎴栨洿澶氱殑鍏冪礌锛屼絾鏄Щ闄や笅鏍囦负size()-1鐨勫厓绱 obj = last.data; diff --git a/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java b/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java new file mode 100644 index 0000000000..c91a4e1129 --- /dev/null +++ b/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java @@ -0,0 +1,234 @@ +package lesson02; + +import lesson01.ArrayList; +import lesson01.List; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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 >> 1; 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 count = 0; + for(int i = 0; i < oldArray.length; i++){ + if(oldArray[i] != 0) + count++; + } + + int[] arr = new int[count]; + + for(int i = oldArray.length - 1; i >= 0; i--){ + if(oldArray[i] != 0) + arr[--count] = oldArray[i]; + } + return arr; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + ArrayList al = new ArrayList<>(); + + while(pos1 < array1.length && pos2 < array2.length){ + if(array1[pos1] > array2[pos2]){ + al.add(array1[pos1]); + pos1++; + }else if(array1[pos1] < array2[pos2]){ + al.add(array2[pos2]); + pos2++; + }else{ + al.add(array1[pos1]); + pos1++; + pos2++; + } + } + + while(pos1 < array1.length){ + al.add(array1[pos1++]); + } + + while(pos2 < array2.length){ + al.add(array2[pos2++]); + } + + int[] arr = W2P(al.toArray(new Integer[0])); + + return arr; + } + + private int[] W2P(Integer[] array) { + int[] arr = new int[array.length]; + for(int i = 0; i < array.length; i++){ + arr[i] = array[i].intValue(); + } + 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[] newArr = new int[len + size]; + for(int i = 0; i < len; i++){ + newArr[i] = oldArray[i]; + } + return newArr; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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("Error argument:" + max); + } + if(max == 1){ + return new int[0]; + }else{ + List list = new ArrayList<>(); + list.add(1); + list.add(1); + int count = 2; + int sum = 0; + + while((sum = list.get(count - 1) + list.get(count - 2)) <= max){ + list.add(sum); + count++; + } + return W2P((Integer[])list.toArray()); + } + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max < 2){ + throw new IllegalArgumentException("Illegal argument:" + max); + } + + List list = new ArrayList<>(); + + for(int i = 2; i <= max; i++){ + if(isPrimes(i)) + list.add(i); + } + + return W2P((Integer[])list.toArray()); + } + + private boolean isPrimes(int num) { + + for(int i = 0; i <= Math.sqrt(num); i++){ + if(num % i == 0){ + return false; + } + } + + return true; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if(max < 0){ + throw new IllegalArgumentException(); + }else{ + List list = new ArrayList<>(); + list.add(0); + + for(int i = 0; i < max; i++){ + if(isPerfectNumber(i)){ + list.add(i); + } + } + + return W2P((Integer[])list.toArray()); + } + } + + private boolean isPerfectNumber(int num) { + int sum = 0; + + for(int i = 1; i <= Math.sqrt(num); i++){ + if(num % i == 0){ + sum += i; + sum += num/i; + } + } + + return sum == num; + } + + /** + * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 + * 渚嬪array= [3,8,9], seperator = "-" + * 鍒欒繑鍥炲间负"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + int len = array.length; + if(len == 0){ + return ""; + }else{ + StringBuilder sb = new StringBuilder(); + sb.append(array[0]); + for(int i = 1; i < len; i++){ + sb.append(seperator); + sb.append(array[i]); + } + return sb.toString(); + } + } + + +} diff --git a/group13/1274639949/lesson01/src/com/hans/ArrayList.java b/group13/1274639949/lesson01/src/com/hans/ArrayList.java deleted file mode 100644 index 3eeede5ce3..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/ArrayList.java +++ /dev/null @@ -1,128 +0,0 @@ -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代表即将存入的元素的下标,所以index等于size也可以。 - 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); - } - - }; - } - - /** - * 用来检查get和remove操作中输入的下标是否越界 - * @param index 输入的下标 - */ - private void checkIndex(int index){ - if(index >= size || index < 0){ - //size代表即将存入的元素的下标,所以index下标上还没有存储内容,无法进行get和remove操作 - 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 deleted file mode 100644 index a4bf39dd3a..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/BinaryTree.java +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 683868be1d..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 4ec870ed01..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 8e2d421501..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/LinkedList.java +++ /dev/null @@ -1,148 +0,0 @@ -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; - } - /** - * 检查get和remove操作中所输入的元素是否有效 - * @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 deleted file mode 100644 index f8ffaa8f5e..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/List.java +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 2c696cca10..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index d370221f1a..0000000000 --- a/group13/1274639949/lesson01/src/com/hans/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -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" deleted file mode 100644 index a89412cc01..0000000000 --- "a/group13/1274639949/\346\214\207\344\273\244\346\274\253\346\270\270\350\256\260.md" +++ /dev/null @@ -1 +0,0 @@ -濡備粖璁$畻鏈哄凡缁忔繁鍏ヨ蛋杩涙垜浠敓娲荤殑鏂规柟闈㈤潰锛岃喘鐗┿佸ū涔愩侀楗仿仿仿仿仿凤紝鍙互璇存垜浠棤鏃舵棤鍒讳笉鍦ㄥ埄鐢ㄨ绠楁満缁欐垜浠殑 From d9ac4bdca84577dc96e2401e06f2498c61055959 Mon Sep 17 00:00:00 2001 From: orajavac Date: Wed, 15 Mar 2017 16:49:18 +0800 Subject: [PATCH 133/177] =?UTF-8?q?20170315=5F1648=20LinkedList=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orajavac/coding2017/basic/LinkedList.java | 299 +++++++++++------- 1 file changed, 192 insertions(+), 107 deletions(-) diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java index 3cc762aeff..66558840b8 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java @@ -2,142 +2,131 @@ public class LinkedList implements List,Iterator { - private Node head; - - private Node current; + public Node head; private int size=0; - public void add(Object o){ - Node n = new Node(); - n.next=this.head; - n.data=o; - this.head=n; + private static class Node{ + Object data; + Node next; } - public void add(int index , Object o){ - + + public Iterator iterator(){ + return null; + } + + public boolean hasNext(){ + return false; + } + + public Object next(){ + return null; + } + + public void add(Object o){ + if (head == null){ + head = new Node(); + Node n = new Node(); + n.data = o; + head.next = n; + size++; + head.data=size; + }else{ + Node e = head.next; + while (e.next!=null){ + e=e.next; + } + Node n = new Node(); + n.data = o; + e.next=n; + size++; + head.data=size; + } } + public Object get(int index){ - Node c = this.head; + int len=Integer.parseInt(head.data.toString()); + if (index>len||index<=0){ + throw new RuntimeException("涓嬫爣涓嶅瓨鍦"+index); + } + Node e = head; int i=0; - while(c!=null){ + while (e.next != null){ i++; - if (index==i){ - return c.data; + if (i == index){ + return e.next.data; } - c=c.next; + e=e.next; } return null; } + public Object remove(int index){ - int s=size(); - if (s==index){ - Node n=head.next; - head=n; - return null; + int len=Integer.parseInt(head.data.toString()); + if (index>len||index<=0){ + throw new RuntimeException("涓嬫爣涓嶅瓨鍦"+index); } - Node n=head; - Node p = null; - while (n!=null){ - s--; - if (s==index){ - p=n.next; - n.next=p.next; - break; + Node e = head; + Object data = null; + int i=0; + while (e.next != null){ + i++; + if (i == index){ + len--; + head.data = len; + data = e.next.data; + e.next = e.next.next; + return data; } - n=n.next; + e=e.next; } return null; } - public void listNode(){ - Node c = this.head; - while(c!=null){ - System.out.print(c.data+ " -> "); - c=c.next; - } - System.out.println(); + public Object removeFirst(){ + return remove(1); } - public int size(){ - size=0; - Node c = this.head; - while(c!=null){ - size++; - c=c.next; - } - return size; + public Object removeLast(){ + return remove(Integer.parseInt(head.data.toString())); } public void addFirst(Object o){ - if (this.head==null){ - this.head = new Node(); - this.head.data=o; - }else{ - Node f = new Node(); - Node n=head; - Node p=null; - while (n!=null){ - p=n; - n=n.next; - } - f.data=o; - p.next=f; - } + Node e = head.next; + Node n = new Node(); + n.data=o; + n.next=e; + size++; + head.next=n; + head.data=size; } + public void addLast(Object o){ add(o); } - public Object removeFirst(){ - remove(1); - return null; - } - public Object removeLast(){ - remove(size()); - return null; - } - public Iterator iterator(){ - LinkedList l = new LinkedList(); - l.head=this.head; - return l; + public int size(){ + return Integer.parseInt(head.data.toString()); } - public boolean hasNext(){ - current = head; - if (current!=null){ - head = current.next; - return true; + public void listNode(){ + Node n = head; + StringBuffer buffer = new StringBuffer(); + while (n.next!=null){ + buffer.append(n.next.data + " -> "); + n=n.next; + } + if(buffer.length()>0){ + System.out.print(buffer.substring(0,buffer.length()-3)); + System.out.println(); } - return false; - } - - public Object next(){ - return current.data; - } - - - private static class Node{ - Object data; - Node next; - } /** * 鎶婅閾捐〃閫嗙疆 * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 */ - public void reverse(){ - - } - - /** - * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 - * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 - * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 - - */ - public void removeFirstHalf(){ + public void reverse(){ } @@ -146,9 +135,33 @@ public void removeFirstHalf(){ * @param i * @param length */ - public void remove(int i, int length){ - + public void remove(int i, int length){ + if (i <= 0 || length<=0){ + throw new RuntimeException("璧峰鍊笺佺粨鏉熷奸兘涓嶈兘灏忎簬0绛変簬"); + } + int len = length + i; + if (len > size){ + throw new RuntimeException("鍒犻櫎绱㈠紩闀垮害瓒呰繃浜嗛摼琛ㄩ暱搴"); + } + Node e = head; + int y = 0; + while (e.next != null){ + y++; + if (y == i){ + Node n = e.next; + while (n!=null){ + n = n.next; + if (y == length){ + break; + } + y++; + n=n.next; + } + } + e=e.next; + } } + /** * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺list鎵鎸囧畾鐨勫厓绱 @@ -157,8 +170,40 @@ public void remove(int i, int length){ * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] * @param list */ - public static int[] getElements(LinkedList list){ - return null; + public int[] getElements(LinkedList list){ + if (list==null||list.head==null){ + throw new RuntimeException("闆嗗悎娌℃湁鍒濆鍖"); + } + int[] elements = new int[Integer.parseInt(list.head.data.toString())]; + Node l = list.head; + Node n = head; + int len = 0; + int i = 0; + while (l.next!=null){ + len = 0; + n=head; + while(n.next!=null){ + len++; + if(len==Integer.parseInt(l.next.data.toString())){ + elements[i]=Integer.parseInt(n.next.data.toString()); + i++; + break; + } + n=n.next; + } + l = l.next; + } + return elements; + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + + */ + public void removeFirstHalf(){ + } /** @@ -168,26 +213,61 @@ public static int[] getElements(LinkedList list){ * @param list */ - public void subtract(LinkedList list){ - + public void subtract(LinkedList list){ + if (list==null||list.head==null){ + throw new RuntimeException("闆嗗悎娌℃湁鍒濆鍖"); + } + Node l = list.head; + Node n = head; + int i = 0; + while (l.next!=null){ + n=head; + i=0; + while(n.next!=null){ + i++; + if(n.next.data.equals(l.next.data)){ + remove(i); + break; + } + n=n.next; + } + l = l.next; + } } /** * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 */ - public void removeDuplicateValues(){ + public void removeDuplicateValues(){ } /** * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * 11->101->201->301->401->501->601->701 * @param min * @param max */ - public void removeRange(int min, int max){ - + public void removeRange(int min, int max){ + if (min<=0||max<=0||min>max){ + throw new RuntimeException("褰曞叆涓嶆纭細"+min+","+max+" 搴旇澶т簬min涓斿皬浜巑ax鐨勫厓绱"); + } + Node n = head; + int data = 0; + Node p = null; + while(n.next != null){ + data=Integer.parseInt(n.next.data.toString()); //11 + if(data>min&&data Date: Wed, 15 Mar 2017 16:53:59 +0800 Subject: [PATCH 134/177] =?UTF-8?q?20170315=5F1653=20LinkedList=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/github/orajavac/coding2017/basic/LinkedList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java index 66558840b8..ec8fd7a4a7 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java @@ -276,7 +276,7 @@ public void removeRange(int min, int max){ * @param list */ public LinkedList intersection( LinkedList list){ - return null; + return null; } public void add(int index, Object o) { From ff34f1fa57eaa9a4d981d821b74370f349824553 Mon Sep 17 00:00:00 2001 From: ajie9608 <1778842360@qq.com> Date: Wed, 15 Mar 2017 19:53:16 +0800 Subject: [PATCH 135/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group26/1778842360/.gitignore | 2 - group26/1778842360/first heomework/.gitignore | 0 .../.settings/org.eclipse.jdt.core.prefs | 11 - .../1778842360/second homework/ArrayUtil.java | 239 ++++++++++++++++++ .../second homework/ArrayUtilTest.java | 71 ++++++ ...05\345\206\265\347\273\237\350\256\241.md" | 6 +- 6 files changed, 313 insertions(+), 16 deletions(-) delete mode 100644 group26/1778842360/.gitignore create mode 100644 group26/1778842360/first heomework/.gitignore delete mode 100644 group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs create mode 100644 group26/1778842360/second homework/ArrayUtil.java create mode 100644 group26/1778842360/second homework/ArrayUtilTest.java diff --git a/group26/1778842360/.gitignore b/group26/1778842360/.gitignore deleted file mode 100644 index 4f4c622218..0000000000 --- a/group26/1778842360/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin -/.project/.classpath \ No newline at end of file diff --git a/group26/1778842360/first heomework/.gitignore b/group26/1778842360/first heomework/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs b/group26/1778842360/first heomework/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab1683..0000000000 --- a/group26/1778842360/first heomework/.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/group26/1778842360/second homework/ArrayUtil.java b/group26/1778842360/second homework/ArrayUtil.java new file mode 100644 index 0000000000..c9efeb2d0b --- /dev/null +++ b/group26/1778842360/second homework/ArrayUtil.java @@ -0,0 +1,239 @@ +package array; + +import java.util.Arrays; + +public class ArrayUtil { + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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;iarray2[j]){ + array3[k++]=array2[j]; + j++; + } + else{ + array3[k++]=array1[i]; + i++; + j++; + } + } + while(i Date: Wed, 15 Mar 2017 21:46:07 +0800 Subject: [PATCH 136/177] record05.01 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 淇敼浜嗕竴涓柟娉曠殑瀹炵幇 --- group13/1274639949/Exercise/src/lesson02/ArrayUtil.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java b/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java index c91a4e1129..92efc27086 100644 --- a/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java +++ b/group13/1274639949/Exercise/src/lesson02/ArrayUtil.java @@ -105,9 +105,10 @@ private int[] W2P(Integer[] array) { public int[] grow(int [] oldArray, int size){ int len = oldArray.length; int[] newArr = new int[len + size]; - for(int i = 0; i < len; i++){ - newArr[i] = oldArray[i]; - } +// for(int i = 0; i < len; i++){ +// newArr[i] = oldArray[i]; +// } + System.arraycopy(oldArray, 0, newArr, 0, len); return newArr; } From e729d08880931b2aabf7001af6b3517968b4e716 Mon Sep 17 00:00:00 2001 From: guodongym Date: Wed, 15 Mar 2017 22:12:50 +0800 Subject: [PATCH 137/177] Merge branch 'master' of git://github.com/onlyliuxin/coding2017 into onlyliuxin-master Conflicts: .gitignore --- .../com/zhaogd/collection/LinkedList.java | 77 +++++++++++++++++++ .../com/zhaogd/download/DownloadThread.java | 20 +++++ .../com/zhaogd/download/FileDownloader.java | 73 ++++++++++++++++++ .../zhaogd/download/FileDownloaderTest.java | 59 ++++++++++++++ .../com/zhaogd/download/api/Connection.java | 23 ++++++ .../download/api/ConnectionException.java | 7 ++ .../download/api/ConnectionManager.java | 10 +++ .../zhaogd/download/api/DownloadListener.java | 5 ++ .../zhaogd/download/impl/ConnectionImpl.java | 27 +++++++ .../download/impl/ConnectionManagerImpl.java | 15 ++++ 10 files changed, 316 insertions(+) create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/DownloadThread.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloader.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloaderTest.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/api/Connection.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionException.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionManager.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/api/DownloadListener.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionImpl.java create mode 100644 group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionManagerImpl.java diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java index 1cd0c2e2b3..136f53284e 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java @@ -175,6 +175,83 @@ public Object removeLast() { size--; return data; } + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 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){ + + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭ist鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺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(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } + /** * 鏍规嵁涓嬫爣鑾峰彇瀵瑰簲鐨勮妭鐐 diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/download/DownloadThread.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/DownloadThread.java new file mode 100644 index 0000000000..769804eee2 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.zhaogd.download; + +import com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloader.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloader.java new file mode 100644 index 0000000000..44601853b0 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.zhaogd.download; + +import com.zhaogd.download.api.Connection; +import com.zhaogd.download.api.ConnectionException; +import com.zhaogd.download.api.ConnectionManager; +import com.zhaogd.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloaderTest.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloaderTest.java new file mode 100644 index 0000000000..bf68184c2a --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.zhaogd.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.zhaogd.download.api.ConnectionManager; +import com.zhaogd.download.api.DownloadListener; +import com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/download/api/Connection.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/Connection.java new file mode 100644 index 0000000000..f0154b8dc1 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionException.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionException.java new file mode 100644 index 0000000000..6977db3833 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionException.java @@ -0,0 +1,7 @@ +package com.zhaogd.download.api; + +public class ConnectionException extends Exception { + + private static final long serialVersionUID = -7548056370349716747L; + +} diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionManager.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionManager.java new file mode 100644 index 0000000000..96bd21be2a --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.zhaogd.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/download/api/DownloadListener.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/DownloadListener.java new file mode 100644 index 0000000000..dfb5464ad2 --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.zhaogd.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionImpl.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..b2951c3c9c --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.zhaogd.download.impl; + +import java.io.IOException; + +import com.zhaogd.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/group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionManagerImpl.java b/group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..32b7acacbf --- /dev/null +++ b/group12/377401843/learning/src/main/java/com/zhaogd/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.zhaogd.download.impl; + +import com.zhaogd.download.api.Connection; +import com.zhaogd.download.api.ConnectionException; +import com.zhaogd.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} From be30a6606f4f59e3456f894d02355b24bcb0c136 Mon Sep 17 00:00:00 2001 From: dingxiaoling Date: Thu, 16 Mar 2017 14:26:46 +0800 Subject: [PATCH 138/177] test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 娴嬭瘯涓嬪浣曟彁浜や唬鐮 --- group27/351592484/src/learn/ArrayList.java | 93 +++++++ .../351592484/src/learn/BinaryTreeNode.java | 46 ++++ group27/351592484/src/learn/Iterator.java | 7 + group27/351592484/src/learn/LinkedList.java | 255 ++++++++++++++++++ group27/351592484/src/learn/List.java | 9 + group27/351592484/src/learn/Queue.java | 32 +++ group27/351592484/src/learn/Stack.java | 23 ++ 7 files changed, 465 insertions(+) create mode 100644 group27/351592484/src/learn/ArrayList.java create mode 100644 group27/351592484/src/learn/BinaryTreeNode.java create mode 100644 group27/351592484/src/learn/Iterator.java create mode 100644 group27/351592484/src/learn/LinkedList.java create mode 100644 group27/351592484/src/learn/List.java create mode 100644 group27/351592484/src/learn/Queue.java create mode 100644 group27/351592484/src/learn/Stack.java diff --git a/group27/351592484/src/learn/ArrayList.java b/group27/351592484/src/learn/ArrayList.java new file mode 100644 index 0000000000..c0993491d1 --- /dev/null +++ b/group27/351592484/src/learn/ArrayList.java @@ -0,0 +1,93 @@ +package com.liam.learn.code2017; + +import java.lang.reflect.Array; +import java.util.Arrays; + +public class ArrayList implements List { + + private int capacity = 10; + private int size = 0; + + private Object[] elementData = null; //new Object[100]; + + public ArrayList(){ + this.capacity = capacity; + elementData = new Object[capacity]; + } + + public ArrayList(int custCapacity) { + if(custCapacity <= 0){ + throw new IllegalArgumentException("Arraylist 闀垮害涓嶈兘涓鸿礋鏁版垨0"); + } + this.capacity = custCapacity; + elementData = new Object[capacity]; + } + + public void add(Object o){ + if (size >= capacity){ + enlargeCapacity(); + } + elementData[size] = o; + size++; + } + public void add(int index, Object o){ + if(index <0 || index >= size){ + throw new IllegalArgumentException("鏁扮粍瓒婄晫"); + } + if (size >= capacity){ + enlargeCapacity(); + } + 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 IllegalArgumentException("鏁扮粍瓒婄晫"); + } + return elementData[index]; + } + + public Object remove(int index){ + Object removedObj = get(index); + + int movedSize = size - (index + 1); + if (movedSize > 0) { + System.arraycopy(elementData, index+1, elementData, index, movedSize); + } + elementData[--size] = null; + + return removedObj; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + + @Override + public String toString() { + if (size < capacity){ + //int needRemove = capacity - size; + Object[] toStringObj = new Object[size]; + System.arraycopy(elementData, 0, toStringObj, 0, size); + return Arrays.toString(toStringObj); + } + return Arrays.toString(elementData); + } + + private void enlargeCapacity(){ + capacity = capacity * 2; + Object[] temp = new Object[capacity]; + System.arraycopy(elementData, 0, temp, 0, size); + elementData = temp; + } + + + +} diff --git a/group27/351592484/src/learn/BinaryTreeNode.java b/group27/351592484/src/learn/BinaryTreeNode.java new file mode 100644 index 0000000000..86e8d5ce7b --- /dev/null +++ b/group27/351592484/src/learn/BinaryTreeNode.java @@ -0,0 +1,46 @@ +package com.liam.learn.code2017; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object data) { + this.data = data; + } + + public BinaryTreeNode() { + } + + 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 (left != null){ + return left = new BinaryTreeNode(o); + } + if (right !=null){ + return right = new BinaryTreeNode(o); + } + throw new RuntimeException("宸﹀彸瀛愭爲宸茬粡閮芥湁鍊间簡"); + } + +} diff --git a/group27/351592484/src/learn/Iterator.java b/group27/351592484/src/learn/Iterator.java new file mode 100644 index 0000000000..0f85a64dfd --- /dev/null +++ b/group27/351592484/src/learn/Iterator.java @@ -0,0 +1,7 @@ +package com.liam.learn.code2017; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group27/351592484/src/learn/LinkedList.java b/group27/351592484/src/learn/LinkedList.java new file mode 100644 index 0000000000..64c2c0e448 --- /dev/null +++ b/group27/351592484/src/learn/LinkedList.java @@ -0,0 +1,255 @@ +package com.liam.learn.code2017; + + + +public class LinkedList implements List { + private int size; + + private Node head; + + private Node tail; + + public void add(Object o){ + Node node = new Node(o, null); + if(head == null){ + head = node; + tail = node; + }else{ + tail.setNext(node); + tail = node; + } + size++; + } + public void add(int index , Object o){ + if (index < 0 || index >= size){ + throw new IllegalArgumentException("閾捐〃瓒婄晫"); + } + if (index == 0){ + addFirst(o); + }else if(index == size-1){ + addLast(o); + }else{ + Node indexNode = getNode(index); + Node newNode = new Node(o, indexNode); + Node previousNode = getNode(index-1); + previousNode.setNext(newNode); + } + size++; + } + public Object get(int index){ + Node node = getNode(index); + return node.getData(); + } + + private Node getNode(int index){ + if (index < 0 || index >= size){ + throw new IllegalArgumentException("閾捐〃瓒婄晫"); + } + if(index == 0){ + return head; + } + if(index == size-1){ + return tail; + } + Node temp = head; + for(int i=0; i= size){ + throw new IllegalArgumentException("閾捐〃瓒婄晫"); + } + + if (index == 0){ + return removeFirst(); + }else if(index == size-1){ + return removeLast(); + }else{ + Node previousNode = getNode(index-1); + Node nextNode = getNode(index+1); + previousNode.setNext(nextNode); + size--; + } + return get(index); + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(o, null); + if(head == null){ + head = node; + tail = node; + }else{ + node.setNext(head); + head = node; + } + size++; + } + public void addLast(Object o){ + Node node = new Node(o, null); + if(head == null){ + head = node; + tail = node; + }else{ + tail.setNext(node); + tail = node; + } + size++; + } + public Object removeFirst(){ + if (head == null){ + throw new RuntimeException("閾捐〃涓虹┖"); + } + if (size ==1){ + Object ret = head.getData(); + head = null; + tail = null; + return ret; + } + Object headData = head.getData(); + head = getNode(1); + size--; + return headData; + } + public Object removeLast(){ + if (head == null){ + throw new RuntimeException("閾捐〃涓虹┖"); + } + Object tailData = tail.getData(); + tail = getNode(size-2); + size--; + return tailData; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + private Object data; + private 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; + } + } + + /** + * 鎶婅閾捐〃閫嗙疆 + * 渚嬪閾捐〃涓 3->7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + if(size == 0 || size ==1){ + return; + } + /*LinkedList linkedList = new LinkedList(); + for(int i=size-1; i>=0; i--){ + linkedList.add(getNode(i)); + }*/ + + Node temp = head; + head = tail; + tail = temp; + for(int i=size-2; i>=1; i--){ + getNode(i+1).setNext(getNode(i)); + } + getNode(1).setNext(tail); + } + + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 2->5->7->8 , 鍒犻櫎浠ュ悗鐨勫间负 7->8 + * 濡傛灉list = 2->5->7->8->10 ,鍒犻櫎浠ュ悗鐨勫间负7,8,10 + + */ + public void removeFirstHalf(){ + int pre = size/2; + for (int i=0; i101->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(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group27/351592484/src/learn/List.java b/group27/351592484/src/learn/List.java new file mode 100644 index 0000000000..9b5fc82f83 --- /dev/null +++ b/group27/351592484/src/learn/List.java @@ -0,0 +1,9 @@ +package com.liam.learn.code2017; + +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/group27/351592484/src/learn/Queue.java b/group27/351592484/src/learn/Queue.java new file mode 100644 index 0000000000..dd6ed22559 --- /dev/null +++ b/group27/351592484/src/learn/Queue.java @@ -0,0 +1,32 @@ +package com.liam.learn.code2017; + +public class Queue { + + private LinkedList linkedList; + + public Queue() { + this.linkedList = new LinkedList(); + } + + public void enQueue(Object o){ + linkedList.add(o); + } + + public Object deQueue(){ + if (linkedList == null || isEmpty()){ + return null; + } + return linkedList.removeFirst(); + } + + public boolean isEmpty(){ + return linkedList.size()==0; + } + + public int size(){ + if (linkedList == null || isEmpty()){ + return 0; + } + return linkedList.size(); + } +} diff --git a/group27/351592484/src/learn/Stack.java b/group27/351592484/src/learn/Stack.java new file mode 100644 index 0000000000..1fc79645f1 --- /dev/null +++ b/group27/351592484/src/learn/Stack.java @@ -0,0 +1,23 @@ +package com.liam.learn.code2017; + +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(); + } +} From 71602fe36ffe27efcd96ce5a5641f08065aaa7db Mon Sep 17 00:00:00 2001 From: tankexiaomao <514302761@qq.com> Date: Fri, 17 Mar 2017 10:21:58 +0800 Subject: [PATCH 139/177] =?UTF-8?q?=E5=85=88=E4=BA=A4=E4=B8=8B=20=E7=84=B6?= =?UTF-8?q?=E5=90=8E=E8=8D=A1=E4=B8=8B=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/company/BinaryTreeNode.java | 37 ++++- .../514302761/src/com/company/LinkedList.java | 147 ++++++++++++++++-- group27/514302761/src/com/company/Queue.java | 12 +- group27/514302761/src/com/company/Stack.java | 22 ++- 4 files changed, 191 insertions(+), 27 deletions(-) diff --git a/group27/514302761/src/com/company/BinaryTreeNode.java b/group27/514302761/src/com/company/BinaryTreeNode.java index 33a6fe7f15..c4a70a3af6 100644 --- a/group27/514302761/src/com/company/BinaryTreeNode.java +++ b/group27/514302761/src/com/company/BinaryTreeNode.java @@ -2,15 +2,15 @@ public class BinaryTreeNode { - private Object data; + private Comparable data; private BinaryTreeNode left; private BinaryTreeNode right; - + public Object getData() { return data; } public void setData(Object data) { - this.data = data; + this.data = (Comparable) data; } public BinaryTreeNode getLeft() { return left; @@ -25,8 +25,35 @@ public void setRight(BinaryTreeNode right) { this.right = right; } - public BinaryTreeNode insert(Object o){ - return null; + public BinaryTreeNode insert(Comparable o){ + BinaryTreeNode insercode=new BinaryTreeNode(); + BinaryTreeNode compareNode=this; + insercode.setData(o); + while (null!=compareNode){ + if(null==compareNode.getData()){ + compareNode.setData(o); + break; + }else{ + Comparable com= (Comparable) compareNode.getData(); + int result=com.compareTo(o); + if(result==0){ + break; + }else if (result>0){ + if(null==compareNode.getLeft()){ + compareNode.setLeft(insercode); + break; + } + compareNode=compareNode.getLeft(); + }else if(result<0){ + if(null==compareNode.getRight()){ + compareNode.setRight(insercode); + break; + } + compareNode=compareNode.getLeft(); + } + } + } + return insercode; } } diff --git a/group27/514302761/src/com/company/LinkedList.java b/group27/514302761/src/com/company/LinkedList.java index c4efb68fb6..4a5d8da88b 100644 --- a/group27/514302761/src/com/company/LinkedList.java +++ b/group27/514302761/src/com/company/LinkedList.java @@ -1,49 +1,174 @@ package com.company; +import java.util.NoSuchElementException; public class LinkedList implements List { private Node head; public void add(Object o){ - + if(null==head){ + head=new Node(); + head.data=o; + }else { + Node node=head; + while (null!=node.next){ + node=node.next; + } + Node addNode=new Node(); + addNode.data=o; + node.next=addNode; + } } public void add(int index , Object o){ - + int size=size(); + if(index<0&&index>size){ + throw new IndexOutOfBoundsException(); + } + if(index==size){ + add(o); + return; + } + if (size==0){ + head=new Node(); + head.data=o; + return; + } + Node node=head; + Node addNode=new Node(); + addNode.data=o; + for (int i=0;isize()-1){ + throw new IndexOutOfBoundsException(); + } + Node node=head; + for (int i=0;isize()-1){ + throw new IndexOutOfBoundsException(); + } + Node removeNode=head; + if (index==0){ + head=head.next; + }else { + Node node=head; + for (int i=0;i Date: Fri, 17 Mar 2017 13:12:15 +0800 Subject: [PATCH 140/177] =?UTF-8?q?=E5=AE=8C=E6=88=90ArrayUtils=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/week2/com/coding/basic/ArrayUtil.java | 280 ++++++++++++++++++ .../week2/com/coding/test/ArrayUtilTest.java | 89 ++++++ 2 files changed, 369 insertions(+) create mode 100644 group26/191191717/src/week2/com/coding/basic/ArrayUtil.java create mode 100644 group26/191191717/src/week2/com/coding/test/ArrayUtilTest.java diff --git a/group26/191191717/src/week2/com/coding/basic/ArrayUtil.java b/group26/191191717/src/week2/com/coding/basic/ArrayUtil.java new file mode 100644 index 0000000000..9bb9c18897 --- /dev/null +++ b/group26/191191717/src/week2/com/coding/basic/ArrayUtil.java @@ -0,0 +1,280 @@ +package week2.com.coding.basic; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +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) + { + int[] tempArrays = new int[origin.length]; + int j = 0; + for (int i = origin.length - 1; i > -1; i--) + { + tempArrays[j] = 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) + { + // ArrayList不需要知道长度,所以用在此处最方便 + List 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()]; + for (int i = 0; i < list.size(); i++) + { + newArray[i] = 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 set = new HashSet(); + for (int i : array1) + { + set.add(i); + } + for (int i : array2) + { + set.add(i); + } + int[] newArr = new int[set.size()]; + Iterator it = set.iterator(); + int i = 0; + while (it.hasNext()) + { + newArr[i] = it.next(); + i++; + } + // 对newArr冒泡排序 + for (int j = 0; j < newArr.length - 1; j++) + { + for (int k = 0; k < newArr.length - 1 - j; k++) + { + int temp = 0; + if (newArr[k] > newArr[k + 1]) + { + temp = newArr[k]; + newArr[k + 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[] newArray = Arrays.copyOf(oldArray, oldArray.length + 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) + { + // f(n)=f(n-1)+f(n-2) + // f(0)=1 f(1)=1 f(2)=f(0)+f(1)=2 + List list = new ArrayList(); + int[] newArr = null; + if (max == 1) + return newArr; + int num = 0; + int x = 1, y = 1; + list.add(1);// f(0)=1; + list.add(1);// f(1)=1; + while (true) + { + num = x + y; + x = y; + y = num; + if (num >= max) + break; + list.add(num); + } + newArr = new int[list.size()]; + for (int k = 0; k < list.size(); k++) + { + newArr[k] = list.get(k); + } + return newArr; + } + + /** + * 斐波那契数列的递归算法 + * + * @param i + * @return + */ + public static int getFiboo(int i) + { + if (i == 1 || i == 2) + return 1; + else + return getFiboo(i - 1) + getFiboo(i - 2); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) + { + int[] newArr = null; + List list = new ArrayList(); + for (int i = 1; i < max; i++) + { + boolean flag = isPrime(i); + if (flag) + list.add(i); + } + newArr = new int[list.size()]; + for (int k = 0; k < list.size(); k++) + { + newArr[k] = list.get(k); + } + return newArr; + } + + public static boolean isPrime(int n) + { + if (n == 1) + return false; + if (n == 2) + return true; + if (n % 2 == 0) + return false;// 偶数肯定不是质数 + for (int i = 3; i < n; i += 2)// 去掉偶数的判断 + { + if (n % i == 0) + return false; + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) + { + List list = new ArrayList(); + List factorList = null; + for (int i = 1; i < max; i++) + { + // 所有的素数不是完数 + if (isPrime(i)) + { + continue; + } + factorList = getFactor(i); + int count = 0; + for (int j = 0; j < factorList.size(); j++) + { + count += factorList.get(j); + } + if (count != i) + continue; + list.add(i); + } + int[] newArr = new int[list.size()]; + for (int k = 0; k < list.size(); k++) + { + newArr[k] = list.get(k); + } + return newArr; + } + + /** + * 求一个数的所有因子 + **/ + public static List getFactor(int number) + { + List list = new ArrayList(); + for (int i = 1; i < number; i++) + { + if (number % i != 0) + continue; + list.add(i); + } + return list; + } + + /** + * 用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(array[i]); + break; + } + sb.append(array[i] + seperator); + } + return sb.toString(); + } + +} \ No newline at end of file diff --git a/group26/191191717/src/week2/com/coding/test/ArrayUtilTest.java b/group26/191191717/src/week2/com/coding/test/ArrayUtilTest.java new file mode 100644 index 0000000000..7ec1c88245 --- /dev/null +++ b/group26/191191717/src/week2/com/coding/test/ArrayUtilTest.java @@ -0,0 +1,89 @@ +package week2.com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week2.com.coding.basic.ArrayUtil; + +public class ArrayUtilTest +{ + private static ArrayUtil arrayUtil = null; + + @Before + public void init() + { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() + { + int[] arrays = {7, 9, 30, 3}; + arrayUtil.reverseArray(arrays); + } + + @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[] array1 = {3, 5, 7, 8}; + int[] array2 = {4, 5, 6, 7}; + int[] vaildateArr = {3, 4, 5, 6, 7, 8}; + int[] arrs = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(vaildateArr, arrs); + } + + @Test + public void testGrow() + { + int[] vaildateArr = {2, 3, 6, 0, 0, 0}; + int[] oldArr = {2, 3, 6}; + int[] arrs = arrayUtil.grow(oldArr, 3); + Assert.assertArrayEquals(vaildateArr, arrs); + + } + + @Test + public void testFibonacci() + { + int [] validateArr={1,1,2,3,5,8,13}; + int [] newArr=arrayUtil.fibonacci(15); + Assert.assertArrayEquals(validateArr, newArr); + } + + @Test + public void testGetPrimes() + { + int[] arrs = arrayUtil.getPrimes(23); + for (int i : arrs) + System.out.printf("%d ", i); + } + + @Test + public void testGetPerfectNumbers() + { + int [] validateArr={6,28};; + int [] newArr=arrayUtil.getPerfectNumbers(100); + Assert.assertArrayEquals(validateArr, newArr); + } + + @Test + public void testJoin() + { + String validateStr = "3-8-9"; + int[] oldArr = {3, 8, 9}; + String str = arrayUtil.join(oldArr, "-"); + Assert.assertEquals(validateStr, str); + } + +} From 9c43590da881e17f3f83851b6cfed4c173b73bd9 Mon Sep 17 00:00:00 2001 From: honokaBiu Date: Fri, 17 Mar 2017 11:36:22 -0400 Subject: [PATCH 141/177] week2 homework upload Finished ArrayUtil only --- .../{ => week1}/src/ArrayList.java | 92 +++---- .../{ => week1}/src/BinaryTreeNode.java | 56 ++--- .../{ => week1}/src/Iterator.java | 10 +- .../{ => week1}/src/LinkedList.java | 220 ++++++++--------- .../{ => week1}/src/List.java | 16 +- .../{ => week1}/src/Queue.java | 44 ++-- .../{ => week1}/src/Stack.java | 42 ++-- .../{ => week1}/src/honoka.md | 0 .../week2/ArrayUtil/ArrayUtil.java | 230 ++++++++++++++++++ 9 files changed, 470 insertions(+), 240 deletions(-) rename group20/1040154728/1040154728Learning/{ => week1}/src/ArrayList.java (95%) rename group20/1040154728/1040154728Learning/{ => week1}/src/BinaryTreeNode.java (94%) rename group20/1040154728/1040154728Learning/{ => week1}/src/Iterator.java (94%) rename group20/1040154728/1040154728Learning/{ => week1}/src/LinkedList.java (94%) rename group20/1040154728/1040154728Learning/{ => week1}/src/List.java (95%) rename group20/1040154728/1040154728Learning/{ => week1}/src/Queue.java (93%) rename group20/1040154728/1040154728Learning/{ => week1}/src/Stack.java (94%) rename group20/1040154728/1040154728Learning/{ => week1}/src/honoka.md (100%) create mode 100644 group20/1040154728/1040154728Learning/week2/ArrayUtil/ArrayUtil.java diff --git a/group20/1040154728/1040154728Learning/src/ArrayList.java b/group20/1040154728/1040154728Learning/week1/src/ArrayList.java similarity index 95% rename from group20/1040154728/1040154728Learning/src/ArrayList.java rename to group20/1040154728/1040154728Learning/week1/src/ArrayList.java index 77fed2b0f4..1b2b6c56cc 100644 --- a/group20/1040154728/1040154728Learning/src/ArrayList.java +++ b/group20/1040154728/1040154728Learning/week1/src/ArrayList.java @@ -1,46 +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; - } - - -} +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/week1/src/BinaryTreeNode.java similarity index 94% rename from group20/1040154728/1040154728Learning/src/BinaryTreeNode.java rename to group20/1040154728/1040154728Learning/week1/src/BinaryTreeNode.java index 425894819d..e0d2141b51 100644 --- a/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java +++ b/group20/1040154728/1040154728Learning/week1/src/BinaryTreeNode.java @@ -1,28 +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; - } - - - -} +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/week1/src/Iterator.java similarity index 94% rename from group20/1040154728/1040154728Learning/src/Iterator.java rename to group20/1040154728/1040154728Learning/week1/src/Iterator.java index 0e1a09433b..9c6eb7e6fb 100644 --- a/group20/1040154728/1040154728Learning/src/Iterator.java +++ b/group20/1040154728/1040154728Learning/week1/src/Iterator.java @@ -1,5 +1,5 @@ -public interface Iterator { - public boolean hasNext(); - public T next(); - -} +public interface Iterator { + public boolean hasNext(); + public T next(); + +} diff --git a/group20/1040154728/1040154728Learning/src/LinkedList.java b/group20/1040154728/1040154728Learning/week1/src/LinkedList.java similarity index 94% rename from group20/1040154728/1040154728Learning/src/LinkedList.java rename to group20/1040154728/1040154728Learning/week1/src/LinkedList.java index 18f6fddf37..3d811f7f83 100644 --- a/group20/1040154728/1040154728Learning/src/LinkedList.java +++ b/group20/1040154728/1040154728Learning/week1/src/LinkedList.java @@ -1,110 +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) { - } - } -} +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/week1/src/List.java similarity index 95% rename from group20/1040154728/1040154728Learning/src/List.java rename to group20/1040154728/1040154728Learning/week1/src/List.java index eb27d39f6b..addaec468d 100644 --- a/group20/1040154728/1040154728Learning/src/List.java +++ b/group20/1040154728/1040154728Learning/week1/src/List.java @@ -1,8 +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(); -} +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/week1/src/Queue.java similarity index 93% rename from group20/1040154728/1040154728Learning/src/Queue.java rename to group20/1040154728/1040154728Learning/week1/src/Queue.java index b7e03881fe..2da64b2b3c 100644 --- a/group20/1040154728/1040154728Learning/src/Queue.java +++ b/group20/1040154728/1040154728Learning/week1/src/Queue.java @@ -1,22 +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(); - } -} +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/week1/src/Stack.java similarity index 94% rename from group20/1040154728/1040154728Learning/src/Stack.java rename to group20/1040154728/1040154728Learning/week1/src/Stack.java index 959b081239..9f7b2c7bfa 100644 --- a/group20/1040154728/1040154728Learning/src/Stack.java +++ b/group20/1040154728/1040154728Learning/week1/src/Stack.java @@ -1,21 +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(); - } -} +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/week1/src/honoka.md similarity index 100% rename from group20/1040154728/1040154728Learning/src/honoka.md rename to group20/1040154728/1040154728Learning/week1/src/honoka.md diff --git a/group20/1040154728/1040154728Learning/week2/ArrayUtil/ArrayUtil.java b/group20/1040154728/1040154728Learning/week2/ArrayUtil/ArrayUtil.java new file mode 100644 index 0000000000..0f09e8a380 --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/ArrayUtil/ArrayUtil.java @@ -0,0 +1,230 @@ +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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; + } + for(int i=0, j = origin.length-1; i < j; i++,j++) { + int t = origin[i]; + origin[i] = origin[j]; + origin[j] = 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){ + if(oldArray == null) { + return null; + } + + int counter = 0; // to count how many non-zero numbers + int b[] = new int[oldArray.length]; + //count non-zero numbers + for(int i=0; i < oldArray.length; i++) { + if(oldArray[i] != 0) + { + b[counter++] = oldArray[i]; + } + } + + int newArray[] = new int[counter]; + + return Arrays.copyOf(b,counter); + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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; + } + int [] newArray = new int[array1.length + array2.length]; + + int i = 0; + int j = 0; + int counter = 0; + while(i array2[j]) + { + newArray[counter++] = array2[j++]; + } + else if(array1[i] == array2[j]) + { + newArray[counter++] = array2[j]; + i++; + j++; + } + } + while(i==array1.length && j= max) { + break; + } else { + counter++; + } + } + return Arrays.copyOf(a, counter); + + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪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[max]; + int counter = 0; + for(int n = 2; n < max; n++) { + if (isPrime(n)) { + array[counter++] = n; + } + } + return Arrays.copyOf(array, counter); + } + + private boolean isPrime(int n) { + int i = 2; + while (i < n) { + if (n % i == 0) { + break; + } + + if (n % i != 0) { + i++; + } + } + return i == n; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + if(max <= 0) return new int[0]; + + int[] array = new int[max]; + int counter = 0; + for(int n = 2; n < max; n++) + { + int sum = 0; + for(int i = 1; i < n; i++) + { + if(n % i == 0) + { + sum += i; + } + } + if(sum == n) + { + array[counter++] = n; + } + } + return Arrays.copyOf(array,counter); + } + + /** + * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 + * 渚嬪array= [3,8,9], seperator = "-" + * 鍒欒繑鍥炲间负"3-8-9" + * @param array + * @return + */ + public String join(int[] array, String seperator) { + if (array == null) return null; + if(array.length == 0) return ""; + + StringBuilder buffer = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + buffer.append(array[i]); + if (i < array.length - 1) { + buffer.append(seperator); + } + } + return buffer.toString(); + } +} From a619dc48aa862cfad49196568851e8e2ac2469fc Mon Sep 17 00:00:00 2001 From: luojunyi Date: Sat, 18 Mar 2017 23:22:42 +0800 Subject: [PATCH 142/177] Signed-off-by: luojunyi --- .../com/coding/litestruts/LoginAction.java | 52 ++++++ .../week2/com/coding/litestruts/Struts.java | 156 ++++++++++++++++++ .../com/coding/litestruts/StrutsTest.java | 41 +++++ .../src/week2/com/coding/litestruts/View.java | 23 +++ .../week2/com/coding/litestruts/struts.xml | 11 ++ 5 files changed, 283 insertions(+) create mode 100644 group26/191191717/src/week2/com/coding/litestruts/LoginAction.java create mode 100644 group26/191191717/src/week2/com/coding/litestruts/Struts.java create mode 100644 group26/191191717/src/week2/com/coding/litestruts/StrutsTest.java create mode 100644 group26/191191717/src/week2/com/coding/litestruts/View.java create mode 100644 group26/191191717/src/week2/com/coding/litestruts/struts.xml diff --git a/group26/191191717/src/week2/com/coding/litestruts/LoginAction.java b/group26/191191717/src/week2/com/coding/litestruts/LoginAction.java new file mode 100644 index 0000000000..a8bad2d7df --- /dev/null +++ b/group26/191191717/src/week2/com/coding/litestruts/LoginAction.java @@ -0,0 +1,52 @@ +package week2.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/group26/191191717/src/week2/com/coding/litestruts/Struts.java b/group26/191191717/src/week2/com/coding/litestruts/Struts.java new file mode 100644 index 0000000000..e9b902c518 --- /dev/null +++ b/group26/191191717/src/week2/com/coding/litestruts/Struts.java @@ -0,0 +1,156 @@ +package week2.com.coding.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.List; +import java.util.Map; +import java.util.Set; + +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, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 鎹畃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瀛楁涓 + * + */ + File file = new File("src/week2/com/coding/litestruts/struts.xml"); + resolveXml(file); + Object object = actions.get(actionName); + Set set = parameters.keySet();// 鑾峰彇閿 + Iterator it = set.iterator(); + View view = new View(); + try + { + while (it.hasNext()) + { + String keyName = it.next(); + String setMethodName = "set" + keyName.substring(0, 1).toUpperCase() + keyName.substring(1);// 缁勫悎鏂规硶鍚 + + Method method = object.getClass().getMethod(setMethodName, String.class); + if (method == null) + { + continue; + } + method.invoke(object, parameters.get(keyName));// 鎵цset鏂规硶 + } + + Method exeMethod = object.getClass().getMethod("execute"); + String result = (String)exeMethod.invoke(object);// 鑾峰彇execute鏂规硶杩斿洖鍊 + // 鑾峰彇瀵硅薄鎵鏈夌殑灞炴у + Field[] fs = object.getClass().getDeclaredFields(); + HashMap resultMap = new HashMap(); + for (Field f : fs) + { + String fieldName = f.getName(); + Method m2 = object.getClass() + .getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1)); + String rs2 = (String)m2.invoke(object); + // 灏嗘墍鏈塯et鏂规硶鐨勮繑鍥炲煎瓨鍏ap + resultMap.put(fieldName, rs2); + } + view.setParameters(resultMap); + // 鏍规嵁result鐨勫兼壘鍒皒ml閰嶇疆鐨勫 + if (null != result) + { + String viewURL = (String)actions.get(actionName + "_" + result); + view.setJsp(viewURL); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + return view; + } + + static Map actions = new HashMap(); + + /** + * 瑙f瀽XML,灏唜ml鏄犲皠瀵硅薄锛屼互鍙婅繑鍥炲肩殑灞炴у瓨鍏ctions + * + * @param file + */ + @SuppressWarnings("unchecked") + public static void resolveXml(File file) + { + SAXReader read = new SAXReader(); + Element rootElement = null; + try + { + rootElement = read.read(file).getRootElement(); + List actionList = rootElement.elements("action"); + for (Element ele : actionList) + { + String name = ele.attributeValue("name"); + String clz = ele.attributeValue("class");// 鎵惧埌绫诲悕 + Object obj = Class.forName(clz).newInstance(); + actions.put(name, obj); + if (ele.hasContent())// 濡傛灉杩樻湁鑺傜偣 + { + List list = ele.elements("result"); + for (Element e : list) + { + String cName = e.attributeValue("name"); + String cValue = e.getTextTrim(); + actions.put(name + "_" + cName, cValue);// 绀轰緥key:login_success + } + } + } + } + catch (DocumentException e) + { + e.printStackTrace(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public static void main(String[] args) + throws Exception + { + File file = new File("src/week2/com/coding/litestruts/struts.xml"); + resolveXml(file); + System.out.println(actions.toString()); + // Map parameters = new HashMap(); + // parameters.put("name", "luojunyi"); + // runAction("login", parameters); + // Class clazz = Class.forName("week2.com.coding.litestruts.LoginAction"); + // Object obj = clz.newInstance(); + // System.out.println(obj.toString()); + // Method m1 = clz.getMethod("setName", java.lang.String.class); + // System.out.println(m1.getName()); + // m1.invoke(obj, "hello"); + // Method m2 = clz.getMethod("getName"); + // System.out.println(m2.getName()); + // String s = (String)m2.invoke(obj); + // System.out.println(s); + // Field[] f = clazz.getDeclaredFields(); + // for (int i = 0; i < f.length; i++) + // { + // System.out.println(f[i].getName()); + // } + } +} diff --git a/group26/191191717/src/week2/com/coding/litestruts/StrutsTest.java b/group26/191191717/src/week2/com/coding/litestruts/StrutsTest.java new file mode 100644 index 0000000000..7f5125c107 --- /dev/null +++ b/group26/191191717/src/week2/com/coding/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package week2.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/group26/191191717/src/week2/com/coding/litestruts/View.java b/group26/191191717/src/week2/com/coding/litestruts/View.java new file mode 100644 index 0000000000..3d0708b0c0 --- /dev/null +++ b/group26/191191717/src/week2/com/coding/litestruts/View.java @@ -0,0 +1,23 @@ +package week2.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/group26/191191717/src/week2/com/coding/litestruts/struts.xml b/group26/191191717/src/week2/com/coding/litestruts/struts.xml new file mode 100644 index 0000000000..d63e7651d8 --- /dev/null +++ b/group26/191191717/src/week2/com/coding/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + \ No newline at end of file From 9df038777948f9264725177ff1adb3668b137353 Mon Sep 17 00:00:00 2001 From: honokaBiu Date: Sat, 18 Mar 2017 17:50:10 -0400 Subject: [PATCH 143/177] week2 homework finished --- .../week2/struts/Configuration.java | 113 ++++++++++++++++++ .../week2/struts/ConfigurationException.java | 20 ++++ .../week2/struts/ConfigurationTest.java | 45 +++++++ .../week2/struts/LoginAction.java | 39 ++++++ .../week2/struts/ReflectionUtil.java | 79 ++++++++++++ .../week2/struts/ReflectionUtilTest.java | 111 +++++++++++++++++ .../week2/struts/Struts.java | 73 +++++++++++ .../week2/struts/StrutsTest.java | 43 +++++++ .../1040154728Learning/week2/struts/View.java | 23 ++++ .../week2/struts/struts.xml | 11 ++ 10 files changed, 557 insertions(+) create mode 100644 group20/1040154728/1040154728Learning/week2/struts/Configuration.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/ConfigurationException.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/ConfigurationTest.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/LoginAction.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/ReflectionUtil.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/ReflectionUtilTest.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/Struts.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/StrutsTest.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/View.java create mode 100644 group20/1040154728/1040154728Learning/week2/struts/struts.xml diff --git a/group20/1040154728/1040154728Learning/week2/struts/Configuration.java b/group20/1040154728/1040154728Learning/week2/struts/Configuration.java new file mode 100644 index 0000000000..2db8abf0b5 --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/Configuration.java @@ -0,0 +1,113 @@ +package week2.struts; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; + +public class Configuration { + + Map actions = new HashMap<>(); + + public Configuration(String fileName) { + + String packageName = this.getClass().getPackage().getName(); + + packageName = packageName.replace('.', '/'); + + InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); + + parseXML(is); + + try { + is.close(); + } catch (IOException e) { + throw new ConfigurationException(e); + } + } + + public String getClassName(String action) { + ActionConfig ac = this.actions.get(action); + if(ac == null){ + return null; + } + return ac.getClassName(); + } + + public String getResultView(String actionName, String resultName) { + ActionConfig ac = this.actions.get(actionName); + if(ac == null){ + return null; + } + return ac.getViewName(resultName); + } + + private void parseXML(InputStream is){ + + SAXBuilder builder = new SAXBuilder(); + + try { + + Document doc = builder.build(is); + + Element root = doc.getRootElement(); + + for(Element actionElement : root.getChildren("action")){ + + String actionName = actionElement.getAttributeValue("name"); + String clzName = actionElement.getAttributeValue("class"); + + ActionConfig ac = new ActionConfig(actionName, clzName); + + for(Element resultElement : actionElement.getChildren("result")){ + + String resultName = resultElement.getAttributeValue("name"); + String viewName = resultElement.getText().trim(); + + ac.addViewResult(resultName, viewName); + + } + + this.actions.put(actionName, ac); + } + + + } catch (JDOMException e) { + throw new ConfigurationException(e); + + } catch (IOException e) { + throw new ConfigurationException(e); + + } + + + } + + private static class ActionConfig{ + + String name; + String clzName; + Map viewResult = new HashMap<>(); + + + public ActionConfig(String actionName, String clzName) { + this.name = actionName; + this.clzName = clzName; + } + public String getClassName(){ + return clzName; + } + public void addViewResult(String name, String viewName){ + viewResult.put(name, viewName); + } + public String getViewName(String resultName){ + return viewResult.get(resultName); + } + } + +} diff --git a/group20/1040154728/1040154728Learning/week2/struts/ConfigurationException.java b/group20/1040154728/1040154728Learning/week2/struts/ConfigurationException.java new file mode 100644 index 0000000000..af1fa0aa4d --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/ConfigurationException.java @@ -0,0 +1,20 @@ +package week2.struts; + +import org.jdom2.JDOMException; + +import java.io.IOException; + +/** + * Created by Bugu on 3/17/2017. + */ +public class ConfigurationException extends RuntimeException { + public ConfigurationException(String msg) { + super(msg); + } + public ConfigurationException(JDOMException e) { + super(e); + } + public ConfigurationException(IOException e) { + super(e); + } +} diff --git a/group20/1040154728/1040154728Learning/week2/struts/ConfigurationTest.java b/group20/1040154728/1040154728Learning/week2/struts/ConfigurationTest.java new file mode 100644 index 0000000000..7632a2b0a3 --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/ConfigurationTest.java @@ -0,0 +1,45 @@ +package week2.struts; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class ConfigurationTest { + + Configuration cfg = new Configuration("struts.xml"); + + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + @Test + public void testGetClassName() { + String clzName = cfg.getClassName("login"); + Assert.assertEquals("week2.LoginAction",clzName); + clzName = cfg.getClassName("logout"); + Assert.assertEquals("week2.LogoutAction",clzName); + } + + @Test + public void testGetResultView() { + String jsp = cfg.getResultView("login","success"); + Assert.assertEquals("/jsp/homepage.jsp",jsp); + + jsp = cfg.getResultView("login","fail"); + Assert.assertEquals("/jsp/showLogin.jsp",jsp); + + jsp = cfg.getResultView("logout","success"); + Assert.assertEquals("/jsp/welcome.jsp",jsp); + + jsp = cfg.getResultView("logout","error"); + Assert.assertEquals("/jsp/error.jsp",jsp); + } +} \ No newline at end of file diff --git a/group20/1040154728/1040154728Learning/week2/struts/LoginAction.java b/group20/1040154728/1040154728Learning/week2/struts/LoginAction.java new file mode 100644 index 0000000000..b7bf1adc62 --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/LoginAction.java @@ -0,0 +1,39 @@ +package week2.struts; + +/** + * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 + * @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/1040154728/1040154728Learning/week2/struts/ReflectionUtil.java b/group20/1040154728/1040154728Learning/week2/struts/ReflectionUtil.java new file mode 100644 index 0000000000..2c4481b6de --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/ReflectionUtil.java @@ -0,0 +1,79 @@ +package week2.struts; + +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; + +public class ReflectionUtil { + + public static List getSetterMethods(Class clz) { + return getMethods(clz, "set"); + } + + public static void setParameters(Object o, Map params) { + List methods = getSetterMethods(o.getClass()); + for(String name : params.keySet() ){ + String methodName = "set" + name; + for(Method m: methods){ + if(m.getName().equalsIgnoreCase(methodName)){ + try { + m.invoke(o, params.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + } + } + + public static List getGetterMethods(Class clz) { + return getMethods(clz, "get"); + } + + + public static Map getParameterMap(Object o) { + + Map params = new HashMap<>(); + + List methods = getGetterMethods(o.getClass()); + + for(Method m : methods){ + + String methodName = m.getName(); + String name = methodName.replaceFirst("get", "").toLowerCase(); + try { + Object value = m.invoke(o); + params.put(name, value); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + + return params; + } + + + + + + + + + private static List getMethods(Class clz, String startWithName) { + List methods = new ArrayList<>(); + for(Method m : clz.getDeclaredMethods()) { + if(m.getName().startsWith(startWithName)) { + methods.add(m); + } + } + return methods; + } + + + + + +} diff --git a/group20/1040154728/1040154728Learning/week2/struts/ReflectionUtilTest.java b/group20/1040154728/1040154728Learning/week2/struts/ReflectionUtilTest.java new file mode 100644 index 0000000000..e92fd8413a --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/ReflectionUtilTest.java @@ -0,0 +1,111 @@ +package week2.struts; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ReflectionUtilTest { + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testGetSetterMethod() throws Exception { + String name = "week2.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getSetterMethods(clz); + + Assert.assertEquals(2, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("setName"); + expectedNames.add("setPassword"); + + Set actualNames = new HashSet<>(); + for(Method m : methods){ + actualNames.add(m.getName()); + } + Assert.assertTrue(actualNames.containsAll(expectedNames)); + } + + @Test + public void testSetParameters() throws Exception{ + + String name = "week2.LoginAction"; + Class clz = Class.forName(name); + Object o = clz.newInstance(); + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + ReflectionUtil.setParameters(o,params); + Field f = clz.getDeclaredField("name"); + f.setAccessible(true); + Assert.assertEquals("test", f.get(o)); + + f = clz.getDeclaredField("password"); + f.setAccessible(true); + Assert.assertEquals("1234", f.get(o)); + } + + @Test + public void testGetGetterMethod() throws Exception{ + String name = "week2.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getGetterMethods(clz); + + Assert.assertEquals(3, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("getMessage"); + expectedNames.add("getName"); + expectedNames.add("getPassword"); + + Set actualNames = new HashSet<>(); + for(Method m : methods){ + actualNames.add(m.getName()); + } + + Assert.assertTrue(actualNames.containsAll(expectedNames)); + } + + @Test + public void testGetParameters() throws Exception{ + String name = "week2.LoginAction"; + Class clz = Class.forName(name); + LoginAction action = (LoginAction)clz.newInstance(); + action.setName("test"); + action.setPassword("123456"); + + Map params = ReflectionUtil.getParameterMap(action); + + Assert.assertEquals(3, params.size()); + Assert.assertEquals(null, params.get("message") ); + Assert.assertEquals("test", params.get("name") ); + Assert.assertEquals("123456", params.get("password") ); + } + + + + + + + +} \ No newline at end of file diff --git a/group20/1040154728/1040154728Learning/week2/struts/Struts.java b/group20/1040154728/1040154728Learning/week2/struts/Struts.java new file mode 100644 index 0000000000..79c3915dbe --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/Struts.java @@ -0,0 +1,73 @@ +package week2.struts; + +import java.lang.reflect.Method; +import java.util.Map; + + + +public class Struts { + + + private final static Configuration cfg = new Configuration("struts.xml"); + + 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瀛楁涓 + + */ + + + + String clzName = cfg.getClassName(actionName); + + if (clzName == null) { + return null; + } + + try { + Class clz = Class.forName(clzName); + + Object action = clz.newInstance(); + + ReflectionUtil.setParameters(action,parameters); + + Method m = clz.getDeclaredMethod("execute"); + + String resultName = (String)m.invoke(action); + + String jsp = cfg.getResultView(actionName, resultName); + + Map params = ReflectionUtil.getParameterMap(action); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(params); + + return view; + + } + //Encapsulation for each exception is needed + catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/group20/1040154728/1040154728Learning/week2/struts/StrutsTest.java b/group20/1040154728/1040154728Learning/week2/struts/StrutsTest.java new file mode 100644 index 0000000000..c422fb84e8 --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/StrutsTest.java @@ -0,0 +1,43 @@ +package week2.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/group20/1040154728/1040154728Learning/week2/struts/View.java b/group20/1040154728/1040154728Learning/week2/struts/View.java new file mode 100644 index 0000000000..2b8c86c49f --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/struts/View.java @@ -0,0 +1,23 @@ +package week2.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/group20/1040154728/1040154728Learning/week2/struts/struts.xml b/group20/1040154728/1040154728Learning/week2/struts/struts.xml new file mode 100644 index 0000000000..3947abe084 --- /dev/null +++ b/group20/1040154728/1040154728Learning/week2/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 From 8b380a075974a8e360284289e850f3c6a19d0dc7 Mon Sep 17 00:00:00 2001 From: MAC Date: Sun, 19 Mar 2017 08:45:05 +0800 Subject: [PATCH 144/177] week02 struts commit --- .../src/week02/source/struts/.DS_Store | Bin 0 -> 6148 bytes .../src/week02/source/struts/Action.java | 10 ++ .../src/week02/source/struts/Constants.java | 12 +++ .../src/week02/source/struts/DOMParser.java | 27 +++++ .../src/week02/source/struts/LoginAction.java | 48 +++++++++ .../week02/source/struts/LogoutAction.java | 7 ++ .../src/week02/source/struts/StringUtils.java | 12 +++ .../src/week02/source/struts/Struts.java | 92 ++++++++++++++++++ .../src/week02/source/struts/struts.xml | 11 +++ .../89460886/src/week02/test/TestStruct.java | 44 +++++++++ 10 files changed, 263 insertions(+) create mode 100644 group26/89460886/src/week02/source/struts/.DS_Store create mode 100644 group26/89460886/src/week02/source/struts/Action.java create mode 100644 group26/89460886/src/week02/source/struts/Constants.java create mode 100644 group26/89460886/src/week02/source/struts/DOMParser.java create mode 100644 group26/89460886/src/week02/source/struts/LoginAction.java create mode 100644 group26/89460886/src/week02/source/struts/LogoutAction.java create mode 100644 group26/89460886/src/week02/source/struts/StringUtils.java create mode 100644 group26/89460886/src/week02/source/struts/Struts.java create mode 100644 group26/89460886/src/week02/source/struts/struts.xml create mode 100644 group26/89460886/src/week02/test/TestStruct.java diff --git a/group26/89460886/src/week02/source/struts/.DS_Store b/group26/89460886/src/week02/source/struts/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 parameters) { + if (StringUtils.isEmpty(actionName)) return null; + DOMParser parser = new DOMParser(); + Document document = parser.parse("src/coding/coderising/litestruts/struts.xml"); + Element rootElement = document.getDocumentElement(); + + NodeList actionList = rootElement.getElementsByTagName("action"); + if (actionList == null || actionList.getLength() == 0) return null; + + for (int i = 0, len = actionList.getLength(); i < len; i++) { + Element element = (Element) actionList.item(i); + String name = element.getAttribute("name"); + if (actionName.equals(name)) { + return handleAction((Element) actionList.item(i), parameters); + } + } + return null; + } + + private static View handleAction(Element element, Map parameters) { + String className = element.getAttribute("class"); + try { + Class clazz = Class.forName(className); + Object object = clazz.newInstance(); + + for (Map.Entry entry : parameters.entrySet()) { + String methodStr = "set" + entry.getKey().toUpperCase().substring(0, 1) + + entry.getKey().substring(1); + Method method = clazz.getMethod(methodStr, String.class); + method.invoke(object, entry.getValue()); + } + + Method execute = clazz.getMethod("execute"); + String result = (String) execute.invoke(object); + + Map getParams = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + if (fields != null && fields.length > 0) { + for (int i = 0, len = fields.length; i < len; i++) { + PropertyDescriptor pd = new PropertyDescriptor(fields[i].getName(), clazz); + Method getMethod = pd.getReadMethod(); + if (getMethod != null) { + getParams.put(fields[i].getName(), (String) getMethod.invoke(object)); + } + } + } + + NodeList nodeList = element.getElementsByTagName("result"); + for (int i = 0; i < nodeList.getLength(); i++) { + Element resultElement = (Element) nodeList.item(i); + String name = resultElement.getAttribute("name"); + if ("success".equals(name) && Constants.ACTION_SUCCESS.equals(result)) { + return createView(resultElement, getParams); + } + if ("failure".equals(name) && Constants.ACTION_FAILURE.equals(result)) { + return createView(resultElement, getParams); + } + if ("error".equals(name) && Constants.ACTION_ERROR.equals(result)) { + return createView(resultElement, getParams); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private static View createView(Element element, Map parameters) { + View view = new View(); + view.setJsp(element.getTextContent()); + view.setParameters(parameters); + return view; + } + +} diff --git a/group26/89460886/src/week02/source/struts/struts.xml b/group26/89460886/src/week02/source/struts/struts.xml new file mode 100644 index 0000000000..811f2c9134 --- /dev/null +++ b/group26/89460886/src/week02/source/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/group26/89460886/src/week02/test/TestStruct.java b/group26/89460886/src/week02/test/TestStruct.java new file mode 100644 index 0000000000..69d80d3642 --- /dev/null +++ b/group26/89460886/src/week02/test/TestStruct.java @@ -0,0 +1,44 @@ +package coding.coderising.litestruts; + +import list.Iterator; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author jiaxun + */ +public class TestStruct { + + @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")); + } + +} From ad59244ff89e2bc8d51f43d4317814791889eef4 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Sun, 19 Mar 2017 11:12:42 +0800 Subject: [PATCH 145/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group27/383117348/.classpath | 1 + group27/383117348/.gitignore | 3 +- .../src/com/coderising/array/ArrayUtil.java | 327 ++++++++++++++++++ .../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 + 8 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 group27/383117348/src/com/coderising/array/ArrayUtil.java create mode 100644 group27/383117348/src/com/coderising/litestruts/LoginAction.java create mode 100644 group27/383117348/src/com/coderising/litestruts/Struts.java create mode 100644 group27/383117348/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group27/383117348/src/com/coderising/litestruts/View.java create mode 100644 group27/383117348/src/com/coderising/litestruts/struts.xml diff --git a/group27/383117348/.classpath b/group27/383117348/.classpath index d98690584e..840446d6d6 100644 --- a/group27/383117348/.classpath +++ b/group27/383117348/.classpath @@ -5,5 +5,6 @@ + diff --git a/group27/383117348/.gitignore b/group27/383117348/.gitignore index 9ded3b51b7..f499c9582c 100644 --- a/group27/383117348/.gitignore +++ b/group27/383117348/.gitignore @@ -18,4 +18,5 @@ hs_err_pid* rebel.* .rebel.* -target \ No newline at end of file +target +/bin/ diff --git a/group27/383117348/src/com/coderising/array/ArrayUtil.java b/group27/383117348/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..61fd42254a --- /dev/null +++ b/group27/383117348/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,327 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 渚嬪锛 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 = new int[origin.length]; + for (int x = 0; x < copy.length; x++) { + copy[x] = origin[x]; + } + for (int x = 0; x < origin.length; x++) { + origin[x] = copy[origin.length - 1 - x]; + System.out.println(copy[origin.length - 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 int[] removeZero(int[] oldArray) { + List list = new ArrayList(); + for (int x = 0; x < oldArray.length; x++) { + if (oldArray[x] != 0) + list.add(oldArray[x]); + } + + return parseToInt(list); + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 渚嬪 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]; + // 濡傛灉array1涓虹┖,array2涓嶄负绌,鍒欒繑鍥瀉rray2鎺掑簭鍚庣殑鏁扮粍 + if (array1 == null || array1.length == 0 && array2 != null && array2.length > 0) { + return sort(array2); + } + // 濡傛灉array2涓虹┖,array1涓嶄负绌,鍒欒繑鍥瀉rray1鎺掑簭鍚庣殑鏁扮粍 + if (array1 == null || array1.length == 0 && array2 != null && array2.length > 0) { + return sort(array1); + } + // 濡傛灉閮戒笉涓虹┖,鍒欏皢涓や釜鏁扮粍鏀惧叆涓涓暟缁勪腑,鍏堟帓搴忓悗鍘婚噸 + if (array1 != null && array2 != null & array1.length > 0 && array2.length > 0) { + // 灏哸rray1鐨勬暟缁勬搴忓瓨鏀 + for (int x = 0; x < array1.length; x++) { + newArray[x] = array1[x]; + } + // 灏哸rray2鐨勬暟缁勫掑簭瀛樻斁 + for (int x = 0; x < array2.length; x++) { + newArray[newArray.length - 1 - x] = array2[x]; + } + newArray = sort(newArray); + newArray = getDistinct(newArray); + } + return newArray; + } + + // 鏁扮粍鍘婚噸 + private int[] getDistinct(int[] newArray) { + List list = new java.util.ArrayList(); + for (int i = 0; i < newArray.length; i++) { + if (!list.contains(newArray[i])) {// 濡傛灉list鏁扮粍涓嶅寘鎷琻um[i]涓殑鍊肩殑璇濓紝灏辫繑鍥瀟rue銆 + list.add(newArray[i]); // 鍦╨ist鏁扮粍涓姞鍏um[i]鐨勫笺傚凡缁忚繃婊よ繃銆 + } + } + int[] result = parseToInt(list); + return result; + } + + // 鍐掓场鎺掑簭 + private int[] sort(int[] array1) { + // TODO Auto-generated method stub + int[] arr = array1; + for (int i = 0; i < arr.length; i++) + for (int j = 0; j < arr.length - i - 1; j++) { + if (arr[j] > arr[j + 1]) { + int t = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = t; + } + } + 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]; + for (int x = 0; x < oldArray.length; x++) { + newArray[x] = oldArray[x]; + } + return newArray; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 渚嬪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; + } + + private boolean primeNumber(int number) { + for (int i = 2; i < number; i++) { + if (number % i == 0) + return false; + } + return true; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + List list = 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) + list.add(i); + + } + + return parseToInt(list); + } + + /** + * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 渚嬪array= [3,8,9], seperator = "-" 鍒欒繑鍥炲间负"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + String str = ""; + if (array.length > 0) { + for (int i = 0; i < array.length; i++) { + str += array[i] + seperator; + } + str = str.substring(0, str.length() - seperator.length()); + } + return str; + } + + /** + * 灏嗛泦鍚堣浆鍖栦负int鏁扮粍 + * + * @param list + * @return + */ + private int[] parseToInt(List list) { + int[] arr = new int[list.size()]; + for (int x = 0; x < list.size(); x++) { + arr[x] = list.get(x); + } + return arr; + } + + /*********************************** 鍗曞厓娴嬭瘯 ***********************************/ + @Test + public void testReserve() { + int[] arr = { 7, 9, 30, 3 }; + reverseArray(arr); + for (int x = 0; x < 4; x++) { + System.out.println(arr[x]); + } + } + + @Test + public void testZero() { + int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int[] arr = removeZero(oldArr); + for (int x = 0; x < arr.length; x++) { + System.out.print(arr[x] + " "); + } + } + + @Test + public void testMerge() { + // a1=[3, 5, 7,8] a2 = [4, 5, 6,7] + int[] a1 = { 3, 5, 7, 8 }; + int[] a2 = { 4, 5, 6, 7 }; + // a3 = [3,4,5,6,7,8] + int[] a3 = merge(a1, a2); + for (int x = 0; x < a3.length; x++) { + System.out.print(a3[x] + " "); + } + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 3, 6 }; + int[] newArray = grow(oldArray, 3); + for (int x = 0; x < newArray.length; x++) { + System.out.println(newArray[x]); + } + } + + @Test + public void testFibo() { + // 1锛1锛2锛3锛5锛8锛13 + int[] arr = fibonacci(20); + for (int x = 0; x < arr.length; x++) { + System.out.print(arr[x] + " "); + } + } + + @Test + public void testPrime() { + int arr[] = getPrimes(23); + for (int x = 0; x < arr.length; x++) { + System.out.print(arr[x]); + System.out.print(" "); + } + } + + @Test + public void testPerfectNum() { + int[] arr = getPerfectNumbers(25); + for (int x = 0; x < arr.length; x++) { + System.out.println(arr[x]); + } + + } + + @Test + public void testJoin() { + int[] arr = new int[10]; + for (int x = 0; x < arr.length; x++) { + arr[x] = x; + } + String s = join(arr, "--"); + System.out.println(s); + } + + @Test + public void testParseToInt() { + List list = new ArrayList(); + for (int x = 0; x < 10; x++) { + list.add(x); + } + int[] arr = parseToInt(list); + for (int x = 0; x < arr.length; x++) { + System.out.println(arr[x]); + } + } + +} diff --git a/group27/383117348/src/com/coderising/litestruts/LoginAction.java b/group27/383117348/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..1005f35a29 --- /dev/null +++ b/group27/383117348/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/group27/383117348/src/com/coderising/litestruts/Struts.java b/group27/383117348/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..0619f1a88e --- /dev/null +++ b/group27/383117348/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,121 @@ +package com.coderising.litestruts; + +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; + +@SuppressWarnings("unchecked") +public class Struts { + private static List list = new ArrayList(); + static{ + SAXReader read = new SAXReader(); + Document doc = null; + try { + doc = read.read(Struts.class.getResourceAsStream("struts.xml")); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Element root = doc.getRootElement(); + list = root.elements(); + } + + + + public static View runAction(String actionName, Map parameters){ + String className = ""; + Map viewName = new HashMap(); + Element element = null; + View view = new View(); + for(Element e : list){ + if(e.attributeValue("name").equals(actionName)){ + className = e.attribute("class").getText(); + element = e; + } + } + Iterator e = element.elementIterator(); + while(e.hasNext()){ + Element result = e.next(); + if(result.getName().equals("result")); + viewName.put(result.attributeValue("name"), result.getStringValue()); + } + Class clazz = null; + try { + clazz = Class.forName(className); + Object obj = clazz.newInstance(); + Iterator keys = parameters.keySet().iterator(); + while(keys.hasNext()){ + String key = keys.next(); + String methodName = "set"+key.substring(0,1).toUpperCase()+key.substring(1).toLowerCase(); + Method method =obj.getClass().getMethod(methodName, String.class); + method.invoke(obj, parameters.get(key)); + } + Method execute = obj.getClass().getDeclaredMethod("execute"); + String result = (String)execute.invoke(obj); + Map map = new HashMap(); + Method[] methods = obj.getClass().getDeclaredMethods(); + for(Method method : methods){ + String methodName = method.getName(); + if(methodName.startsWith("get")){ + map.put(methodName.substring(3,4).toLowerCase()+methodName.substring(4), method.invoke(obj)); + String s = (String)method.invoke(obj); + System.out.println(methodName.substring(3,4).toLowerCase()+methodName.substring(4)); + System.out.println(s); + } + + } + view.setJsp(viewName.get(result)); + view.setParameters(map); + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + /* + + 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 view; + } + + public static void main(String[] args) { + SAXReader read = new SAXReader(); + Document doc = null; + try { + doc = read.read(Struts.class.getResourceAsStream("struts.xml")); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Element root = doc.getRootElement(); + list = root.elements(); + for(Element e : list){ + System.out.println(e.attributeValue("class")); + } + } +} diff --git a/group27/383117348/src/com/coderising/litestruts/StrutsTest.java b/group27/383117348/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a44c1878ac --- /dev/null +++ b/group27/383117348/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/group27/383117348/src/com/coderising/litestruts/View.java b/group27/383117348/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..0194c681f6 --- /dev/null +++ b/group27/383117348/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/group27/383117348/src/com/coderising/litestruts/struts.xml b/group27/383117348/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..0582b7d4ea --- /dev/null +++ b/group27/383117348/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + From 148474176c11b6b37a2a940369a37fc66e10a4d1 Mon Sep 17 00:00:00 2001 From: guoqixuan <1016908591@qq.com> Date: Sun, 19 Mar 2017 16:30:53 +0800 Subject: [PATCH 146/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/array/ArrayUtil.java | 195 +++++++++++++++ .../coderising/litestruts/LoginAction.java | 39 +++ .../src/com/coderising/litestruts/Struts.java | 228 ++++++++++++++++++ .../com/coderising/litestruts/StrutsTest.java | 60 +++++ .../src/com/coderising/litestruts/View.java | 23 ++ .../src/com/coderising/litestruts/struts.xml | 11 + group27/1016908591/week002/src/struts.xml | 11 + 7 files changed, 567 insertions(+) create mode 100644 group27/1016908591/week002/src/com/coderising/array/ArrayUtil.java create mode 100644 group27/1016908591/week002/src/com/coderising/litestruts/LoginAction.java create mode 100644 group27/1016908591/week002/src/com/coderising/litestruts/Struts.java create mode 100644 group27/1016908591/week002/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group27/1016908591/week002/src/com/coderising/litestruts/View.java create mode 100644 group27/1016908591/week002/src/com/coderising/litestruts/struts.xml create mode 100644 group27/1016908591/week002/src/struts.xml diff --git a/group27/1016908591/week002/src/com/coderising/array/ArrayUtil.java b/group27/1016908591/week002/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..15b15e667c --- /dev/null +++ b/group27/1016908591/week002/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,195 @@ +package com.coderising.array; + +import java.util.Arrays; + +import javax.ws.rs.HEAD; + +import javassist.expr.NewArray; + +import com.coding.basic.*; + + +public class ArrayUtil extends ArrayList { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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[] reArray = new int[origin.length]; + for(int i = 0;i parameters) + throws ClassNotFoundException, DocumentException, InstantiationException, IllegalAccessException, + NoSuchMethodException, InvocationTargetException{ + + /* + + 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瀛楁涓 + + */ + //鐢熸垚set鏂规硶鐨勬暟缁 + View view = new View(); + String[] methodNames = createSetMethodNames(parameters); + InputStream is=Struts.class.getResourceAsStream("/struts.xml"); + //鑾峰彇xml鏂囦欢涓殑鐩爣鑺傜偣 + Element element = getTargetElement(actionName); + //寰楀埌璇ヨ妭鐐圭被鐨勫悕绉 + String className = element.attribute(1).getValue(); + //鑾峰緱瀵瑰簲鐨凜lass瀵硅薄 + Class clz = Class.forName(className); + + + + //瀹炰緥鍖栬绫 + + Object obj = clz.newInstance(); + //璋冪敤杩欎釜鏂规硶锛岃鏂规硶鏄氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + // 鎹畃arameters涓殑鏁版嵁锛岃皟鐢ㄥ璞$殑setter鏂规硶锛 渚嬪parameters涓殑鏁版嵁鏄 ("name"="test" , + //"password"="1234") , 閭e氨搴旇璋冪敤 setName鍜宻etPassword鏂规硶 + + invokeObjectSetter(parameters, methodNames, clz, obj); + + + + /*鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲硷紝 纭畾鍝竴涓猨sp锛 + 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 + */ + + setViewJsp(view, element, clz, obj); + + //浜х敓涓涓狹ap闆嗗悎 + view.setParameters(createGetterMap(clz,obj)); + + return view; + + + + + + + + + + + + } + + + + private static void setViewJsp(View view, Element element, Class clz, + Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + view.setJsp(getJsp(element, executeToGetResult(clz, obj))); + + } + + //閫氳繃鍙嶅皠璋冪敤瀵硅薄鐨別xectue 鏂规硶锛 骞惰幏寰楄繑鍥炲硷紝渚嬪"success" + + private static String executeToGetResult(Class clz, Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + + + + //璋冪敤鎸囧畾绫讳腑鐨別xcute鐨勬柟娉 + Method method = clz.getMethod("execute"); + String result = (String) method.invoke(obj); + return result; + + + + + + } + +//杩斿洖瀵瑰簲鐨凧sp + @SuppressWarnings("unchecked") + private static String getJsp(Element element, String result) { + + List elements = element.elements(); + if (elements!=null){ + for (Element e : elements) { + //濡傛灉result鐨勫间笌鑺傜偣鐨勫肩浉鍚屽垯杩斿洖鑺傜偣鏂囨湰鍐呭 + System.out.println(result); + if (e!=null&&result.equals(e.attribute(0).getValue())) { + return e.getTextTrim(); + } + + + + } + } + + + return null; + } + + + + + /* 閫氳繃鍙嶅皠鎵惧埌瀵硅薄鐨勬墍鏈塯etter鏂规硶锛堜緥濡 getMessage锛, + 閫氳繃鍙嶅皠鏉ヨ皟鐢紝 鎶婂煎拰灞炴у舰鎴愪竴涓狧ashMap , 渚嬪 {"message": "鐧诲綍鎴愬姛"} , + 鏀惧埌View瀵硅薄鐨刾arameters*/ + + private static Map createGetterMap(Class clz, Object obj) throws IllegalAccessException, IllegalArgumentException, 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(); + + //璋冪敤鐨勬槸get鏂规硶 + Object value = item.invoke(obj); + System.out.println(item.invoke(obj)); + map.put(key,value); + + } + } + + return map; + } + + //璋冪敤set鏂规硶 + private static void invokeObjectSetter(Map parameters, + String[] methodNames, Class clz, Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + //閬嶅巻瀵瑰簲鐨勬柟娉 + for(String ke:methodNames){ + + Method method = clz.getMethod(ke,String.class); + + //璋冪敤璇ユ柟娉 + String key = ke.substring(3).toLowerCase(); + method.invoke(obj, parameters.get(key)); + + + + + + + + + + + } + + } + //鑾峰緱鏍硅妭鐐癸紝杩斿洖闇瑕佺殑xml鐨勮妭鐐 + private static Element getTargetElement(String actionName) { + try { + SAXReader reader = new SAXReader(); + InputStream inputStream =Struts.class.getResourceAsStream("/struts.xml"); + Document document = null; + + document = reader.read(inputStream); + Element rootNode = (Element) document.getRootElement(); + List elements = ((org.dom4j.Element) rootNode).elements(); + for (Element item : elements) { + if (actionName.equals(((org.dom4j.Element) item).attribute(0).getValue())) { + return item; + } + } + } catch (DocumentException e) { + + e.printStackTrace(); + } + return null; + } + //浜х敓Set鏂规硶鐨勬暟缁 + private static String[] createSetMethodNames(Map parameters) { + String[] methodNames=new String[parameters.size()]; + int i = 0; + for (String key:parameters.keySet()){ + //浜х敓set鏂规硶 + methodNames[i++] = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + + + } + return methodNames; + } + + +} diff --git a/group27/1016908591/week002/src/com/coderising/litestruts/StrutsTest.java b/group27/1016908591/week002/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..3b5c29cde5 --- /dev/null +++ b/group27/1016908591/week002/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,60 @@ +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; + + view = Struts.runAction(actionName,params); + System.out.println( view.getJsp()); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + System.out.println( view.getParameters().get("message")); + 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; + + 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/group27/1016908591/week002/src/com/coderising/litestruts/View.java b/group27/1016908591/week002/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group27/1016908591/week002/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/group27/1016908591/week002/src/com/coderising/litestruts/struts.xml b/group27/1016908591/week002/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group27/1016908591/week002/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/group27/1016908591/week002/src/struts.xml b/group27/1016908591/week002/src/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group27/1016908591/week002/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 From 757181507aad739667674040bbce7546a4ef42c7 Mon Sep 17 00:00:00 2001 From: Memory-Cunese Date: Sun, 19 Mar 2017 18:16:13 +0800 Subject: [PATCH 147/177] Delete .classpath --- group26/1778842360/first heomework/.classpath | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 group26/1778842360/first heomework/.classpath diff --git a/group26/1778842360/first heomework/.classpath b/group26/1778842360/first heomework/.classpath deleted file mode 100644 index fb565a588d..0000000000 --- a/group26/1778842360/first heomework/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - From 5bae8d8e6cbd110bce8a8765ab7402eed7662503 Mon Sep 17 00:00:00 2001 From: Memory-Cunese Date: Sun, 19 Mar 2017 18:20:24 +0800 Subject: [PATCH 148/177] Delete .gitignore --- group26/1778842360/first heomework/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 group26/1778842360/first heomework/.gitignore diff --git a/group26/1778842360/first heomework/.gitignore b/group26/1778842360/first heomework/.gitignore deleted file mode 100644 index e69de29bb2..0000000000 From 53897b1cbfe3d76ebee35949ae86cd70903a2901 Mon Sep 17 00:00:00 2001 From: Memory-Cunese Date: Sun, 19 Mar 2017 18:20:47 +0800 Subject: [PATCH 149/177] Delete .project --- group26/1778842360/first heomework/.project | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 group26/1778842360/first heomework/.project diff --git a/group26/1778842360/first heomework/.project b/group26/1778842360/first heomework/.project deleted file mode 100644 index 88536f7819..0000000000 --- a/group26/1778842360/first heomework/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - first heomework - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - From aebe0e7264b7e640ef36f8beddbda047827d9211 Mon Sep 17 00:00:00 2001 From: Lizhy Date: Sun, 19 Mar 2017 20:49:07 +0800 Subject: [PATCH 150/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/second/array/ArrayUtil.java | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 group26/lizhy2017/homework/second/array/ArrayUtil.java diff --git a/group26/lizhy2017/homework/second/array/ArrayUtil.java b/group26/lizhy2017/homework/second/array/ArrayUtil.java new file mode 100644 index 0000000000..253356ef7d --- /dev/null +++ b/group26/lizhy2017/homework/second/array/ArrayUtil.java @@ -0,0 +1,206 @@ +package second.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + * 渚嬪锛 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) { + if (null != origin) return; + for (int i = 0; i < origin.length; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + 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) { + if (null != oldArray) { + return null; + } + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + System.arraycopy(oldArray, i + 1, oldArray, i, oldArray.length - i - 1); + } + } + return oldArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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 && null != array2) return null; + int[] temp = new int[array1.length + array2.length]; + int i = 0, j = 0; + if (array1.length >= array2.length) { + while (i < array2.length) { + i++; + if (array1[i] <= array2[i]) + temp[i] = array1[i]; + else + temp[i] = array2[i]; + } + System.arraycopy(array1, i + 1, temp, i + 1, temp.length - i - 1); + } else { + while (j < array1.length) { + j++; + if (array1[j] <= array2[j]) + temp[j] = array1[j]; + else + temp[j] = array2[j]; + } + System.arraycopy(array1, j + 1, temp, j + 1, temp.length - j - 1); + } + 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 oldCapacity = oldArray.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity < size) { + newCapacity = size; + } + if (newCapacity > 2147483639) { + newCapacity = 2147483639; + } + return oldArray = Arrays.copyOf(oldArray, newCapacity); + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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[] temp = new int[max]; + temp[0] = 1; + temp[1] = 1; + int last = 1; + int count = temp.length; + while (last < max) { + int x = temp[count - 1] + temp[count - 2]; + temp[count] = x; + count++; + last = x; + } + System.arraycopy(temp, count, temp, count - 1, max - count); + return temp; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ +// public int[] getPrimes(int max) { +// int[] temp = new int[max]; +// if (max < 2) +// return new int[0]; +// else if (max == 2) +// return new int[]{2}; +// else { +// temp[2] = 2; +// int index = 3; +// for (int i = 3; i <= max; i += 2) { +// boolean flag = true; +// for (int j = 2; j < i; j++) { +// if (i % j == 0) { +// flag = false; +// } +// } +// if (flag) { +// temp[index++] = i; +// } +// } +// if (temp[temp.length - 2] >= max) +// System.arraycopy(temp, temp.length - 1, temp, temp.length - 2, 1); +// } +// +// return temp; +// } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] temp = new int[max]; + int index = 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) { + temp[index++] = i; + } + } + + return temp; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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++) { + if (i == array.length - 1) { + builder.append(array[i]); + } else builder.append(array[i]).append(seperator); + } + return builder.toString(); + } + + +} From d2402c31cd957e33db372375b07c25514e6e60ee Mon Sep 17 00:00:00 2001 From: PG <1067041567@qq.com> Date: Sun, 19 Mar 2017 21:18:32 +0800 Subject: [PATCH 151/177] =?UTF-8?q?1067041567=E7=AC=AC=E4=BA=8C=E5=91=A8?= =?UTF-8?q?=E7=BC=96=E7=A8=8B=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group27/1067041567/TestColleaction/.classpath | 2 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 1 + .../RemoteSystemsTempFiles/.project | 12 + .../src/cn/task2/ArrayUtil.java | 290 ++++++++++++++++++ .../src/cn/task2/ArrayUtilTest.java | 43 +++ .../src/cn/task2/LoginAction.java | 34 ++ .../TestColleaction/src/cn/task2/Struts.java | 93 ++++++ .../src/cn/task2/StrutsTest.java | 38 +++ .../TestColleaction/src/cn/task2/View.java | 23 ++ .../TestColleaction/src/cn/test/Test.java | 11 + .../src/cn/test/TestReflect.java | 39 +++ .../TestColleaction/src/cn/test/TestUtil.java | 39 +++ .../1067041567/TestColleaction/src/struts.xml | 11 + 14 files changed, 638 insertions(+) create mode 100644 group27/1067041567/TestColleaction/.settings/org.eclipse.core.resources.prefs create mode 100644 group27/1067041567/TestColleaction/RemoteSystemsTempFiles/.project create mode 100644 group27/1067041567/TestColleaction/src/cn/task2/ArrayUtil.java create mode 100644 group27/1067041567/TestColleaction/src/cn/task2/ArrayUtilTest.java create mode 100644 group27/1067041567/TestColleaction/src/cn/task2/LoginAction.java create mode 100644 group27/1067041567/TestColleaction/src/cn/task2/Struts.java create mode 100644 group27/1067041567/TestColleaction/src/cn/task2/StrutsTest.java create mode 100644 group27/1067041567/TestColleaction/src/cn/task2/View.java create mode 100644 group27/1067041567/TestColleaction/src/cn/test/Test.java create mode 100644 group27/1067041567/TestColleaction/src/cn/test/TestReflect.java create mode 100644 group27/1067041567/TestColleaction/src/cn/test/TestUtil.java create mode 100644 group27/1067041567/TestColleaction/src/struts.xml diff --git a/group27/1067041567/TestColleaction/.classpath b/group27/1067041567/TestColleaction/.classpath index fb565a588d..dfa83d7793 100644 --- a/group27/1067041567/TestColleaction/.classpath +++ b/group27/1067041567/TestColleaction/.classpath @@ -2,5 +2,7 @@ + + diff --git a/group27/1067041567/TestColleaction/.settings/org.eclipse.core.resources.prefs b/group27/1067041567/TestColleaction/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group27/1067041567/TestColleaction/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group27/1067041567/TestColleaction/.settings/org.eclipse.jdt.core.prefs b/group27/1067041567/TestColleaction/.settings/org.eclipse.jdt.core.prefs index 7341ab1683..d17b6724d1 100644 --- a/group27/1067041567/TestColleaction/.settings/org.eclipse.jdt.core.prefs +++ b/group27/1067041567/TestColleaction/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,6 @@ 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 diff --git a/group27/1067041567/TestColleaction/RemoteSystemsTempFiles/.project b/group27/1067041567/TestColleaction/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group27/1067041567/TestColleaction/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group27/1067041567/TestColleaction/src/cn/task2/ArrayUtil.java b/group27/1067041567/TestColleaction/src/cn/task2/ArrayUtil.java new file mode 100644 index 0000000000..f3d2d7f09a --- /dev/null +++ b/group27/1067041567/TestColleaction/src/cn/task2/ArrayUtil.java @@ -0,0 +1,290 @@ +package cn.task2; + +import org.junit.Test; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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){ + enSure(origin); + int len = origin.length-1; + for(int k=0;k"+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){ + enSure(oldArray); + int len = 0; + for(int i=0;i temp[j+1]){ + int arr = temp[j]; + temp[j] = temp[j+1]; + temp[j+1] = arr; + } + } + } + for(int i=0;i"+a); + for(int i=0;i"+a); + System.out.println(); + for(int i=0;i 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瀛楁涓 + + */ + SAXReader read = new SAXReader(); + Document document = null; + View view = new View(); + Map map = new HashMap(); + try { + document = read.read(Struts.class.getClassLoader().getResourceAsStream("struts.xml")); + //鑾峰彇鍞竴鐨勬牴鑺傜偣 + Element root = document.getRootElement(); + //鑾峰彇瀛愯妭鐐圭殑闆嗗悎 + List childNode = root.elements(); + + for(Element ele : childNode){ + //鑾峰彇action鑺傜偣鐨刵ame鍜宑lass鍊 + String name = ele.attributeValue("name"); + String className = ele.attributeValue("class"); + + + if(name.equals(actionName)){ + try { + Class clazz = Class.forName(className); + Object obj = clazz.newInstance(); + for(Map.Entry param : parameters.entrySet()){ + String key = "set"+param.getKey().substring(0,1).toUpperCase()+param.getKey().substring(1); + Method m =clazz.getMethod(key,String.class); +// System.out.println(param.getKey()+" "+param.getValue()); + m.invoke(obj, param.getValue()); + } + + Method execute = clazz.getMethod("execute"); + Type type = execute.getReturnType(); + //鑾峰彇result鑺傜偣鐨刵ame鍜岃繑鍥炵殑jsp + List list2 = ele.elements(); + for(Element e:list2){ +// System.out.println(e.attributeValue("name")); +// System.out.println(e.getText()); +// System.out.println(execute.invoke(obj)); + if(e.attributeValue("name").equals(execute.invoke(obj))){ + System.out.println(e.getText()); + view.setJsp(e.getText()); + } + } + + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } + } + + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + view.setParameters(parameters); + + return view; + } +} diff --git a/group27/1067041567/TestColleaction/src/cn/task2/StrutsTest.java b/group27/1067041567/TestColleaction/src/cn/task2/StrutsTest.java new file mode 100644 index 0000000000..d7c0aacca5 --- /dev/null +++ b/group27/1067041567/TestColleaction/src/cn/task2/StrutsTest.java @@ -0,0 +1,38 @@ +package cn.task2; + +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/group27/1067041567/TestColleaction/src/cn/task2/View.java b/group27/1067041567/TestColleaction/src/cn/task2/View.java new file mode 100644 index 0000000000..f4fe693f43 --- /dev/null +++ b/group27/1067041567/TestColleaction/src/cn/task2/View.java @@ -0,0 +1,23 @@ +package cn.task2; + +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/group27/1067041567/TestColleaction/src/cn/test/Test.java b/group27/1067041567/TestColleaction/src/cn/test/Test.java new file mode 100644 index 0000000000..ca55b5056e --- /dev/null +++ b/group27/1067041567/TestColleaction/src/cn/test/Test.java @@ -0,0 +1,11 @@ +package cn.test; + +public class Test { + + public static void main(String[] args) { + String name = "name"; + String n ="set"+name.substring(0,1).toUpperCase()+name.substring(1); + + System.out.println(n); + } +} diff --git a/group27/1067041567/TestColleaction/src/cn/test/TestReflect.java b/group27/1067041567/TestColleaction/src/cn/test/TestReflect.java new file mode 100644 index 0000000000..c05bea04de --- /dev/null +++ b/group27/1067041567/TestColleaction/src/cn/test/TestReflect.java @@ -0,0 +1,39 @@ +package cn.test; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; + +public class TestReflect { + + public static void main(String[] args) { + + try { + Class clazz = Class.forName("cn.task2.LoginAction"); + + Method[] me = clazz.getMethods(); + + for(Method m:me){ + System.out.println(m); + } + + //Method m1 = clazz.getMethod("setName",String.class); + Object obj = clazz.newInstance(); + Method m3 = clazz.getMethod("setName",String.class); + Method mm = clazz.getMethod("getName"); + //m1.invoke(obj, "woshi"); + System.out.println(obj); + //System.out.println(m1.invoke(obj)); + m3.invoke(obj, "dassdasd-----------------"); + System.out.println(mm.invoke(obj)); + Method execute = clazz.getMethod("execute"); + Type type = execute.getReturnType(); + + System.out.println("type : "+type); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } +} diff --git a/group27/1067041567/TestColleaction/src/cn/test/TestUtil.java b/group27/1067041567/TestColleaction/src/cn/test/TestUtil.java new file mode 100644 index 0000000000..5fc93b9f6c --- /dev/null +++ b/group27/1067041567/TestColleaction/src/cn/test/TestUtil.java @@ -0,0 +1,39 @@ +package cn.test; + +import java.io.File; +import java.util.List; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import cn.task2.Struts; + +public class TestUtil { + + public static void main(String[] args) { + SAXReader read = new SAXReader(); + Document document = null; + try { + document = read.read(Struts.class.getClassLoader().getResourceAsStream("struts.xml")); + //鑾峰彇鍞竴鐨勬牴鑺傜偣 + Element root = document.getRootElement(); + //鑾峰彇瀛愯妭鐐圭殑闆嗗悎 + List childNode = root.elements(); + + for(Element ele : childNode){ + System.out.println(ele.attributeValue("name")+" "+ele.attributeValue("class")); + List list2 = ele.elements(); + for(Element e:list2){ + System.out.println(e.getName()+"--"+e.attributeValue("name")+" "+e.getText()); + } + } + + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } +} diff --git a/group27/1067041567/TestColleaction/src/struts.xml b/group27/1067041567/TestColleaction/src/struts.xml new file mode 100644 index 0000000000..e4d58e912c --- /dev/null +++ b/group27/1067041567/TestColleaction/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 From 36e35f91fba997cc2291f480be989acc3f228db0 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:11:15 +0800 Subject: [PATCH 152/177] Create week1 --- group26/1515345281/src/week1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week1 diff --git a/group26/1515345281/src/week1 b/group26/1515345281/src/week1 new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week1 @@ -0,0 +1 @@ + From 597e0e024fa5aaa671b1bc4e487eaec688e1d8a8 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:11:40 +0800 Subject: [PATCH 153/177] Delete week1 --- group26/1515345281/src/week1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 group26/1515345281/src/week1 diff --git a/group26/1515345281/src/week1 b/group26/1515345281/src/week1 deleted file mode 100644 index 8b13789179..0000000000 --- a/group26/1515345281/src/week1 +++ /dev/null @@ -1 +0,0 @@ - From 9555d309af905888d23cf28e264b30a1eea5427e Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:14:14 +0800 Subject: [PATCH 154/177] Create ww --- group26/1515345281/src/week1/ww | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week1/ww diff --git a/group26/1515345281/src/week1/ww b/group26/1515345281/src/week1/ww new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week1/ww @@ -0,0 +1 @@ + From f353cfa1372e58da5b1245ef14d4aa233c8522bb Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:14:32 +0800 Subject: [PATCH 155/177] Create week2 --- group26/1515345281/src/week2 | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week2 diff --git a/group26/1515345281/src/week2 b/group26/1515345281/src/week2 new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week2 @@ -0,0 +1 @@ + From 4b40386be291b13473d13cdd8be31b9e52b093a1 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:14:49 +0800 Subject: [PATCH 156/177] Delete week2 --- group26/1515345281/src/week2 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 group26/1515345281/src/week2 diff --git a/group26/1515345281/src/week2 b/group26/1515345281/src/week2 deleted file mode 100644 index 8b13789179..0000000000 --- a/group26/1515345281/src/week2 +++ /dev/null @@ -1 +0,0 @@ - From bd8f374ab06c401a7f7b1cffbd77f265b7087ca0 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:15:06 +0800 Subject: [PATCH 157/177] Create 11 --- group26/1515345281/src/week2/11 | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week2/11 diff --git a/group26/1515345281/src/week2/11 b/group26/1515345281/src/week2/11 new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week2/11 @@ -0,0 +1 @@ + From fcba1ed913a27991fe8a69592908b9d10a03c602 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:15:16 +0800 Subject: [PATCH 158/177] Delete 11 --- group26/1515345281/src/week2/11 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 group26/1515345281/src/week2/11 diff --git a/group26/1515345281/src/week2/11 b/group26/1515345281/src/week2/11 deleted file mode 100644 index 8b13789179..0000000000 --- a/group26/1515345281/src/week2/11 +++ /dev/null @@ -1 +0,0 @@ - From b195d8581045e43b0a8ec2b015ba2e726d81b909 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:15:37 +0800 Subject: [PATCH 159/177] Create qqq --- group26/1515345281/src/week2/qqq | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week2/qqq diff --git a/group26/1515345281/src/week2/qqq b/group26/1515345281/src/week2/qqq new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week2/qqq @@ -0,0 +1 @@ + From e2194be906b69ad8e7a5052b24f5a3ede2bbe88b Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:17:08 +0800 Subject: [PATCH 160/177] Create a --- group26/1515345281/src/week1/collection/test/a | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week1/collection/test/a diff --git a/group26/1515345281/src/week1/collection/test/a b/group26/1515345281/src/week1/collection/test/a new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week1/collection/test/a @@ -0,0 +1 @@ + From 3c26d9c2caf738a800ce862338b6c1db699bf6e1 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:17:29 +0800 Subject: [PATCH 161/177] Delete ww --- group26/1515345281/src/week1/ww | 1 - 1 file changed, 1 deletion(-) delete mode 100644 group26/1515345281/src/week1/ww diff --git a/group26/1515345281/src/week1/ww b/group26/1515345281/src/week1/ww deleted file mode 100644 index 8b13789179..0000000000 --- a/group26/1515345281/src/week1/ww +++ /dev/null @@ -1 +0,0 @@ - From 843a85107e5752762588da832b212cf73b892f72 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:18:40 +0800 Subject: [PATCH 162/177] Add files via upload --- .../week1/collection/test/ArrayListTest.java | 69 ++++++++++++++ .../collection/test/BinarySearchTreeTest.java | 23 +++++ .../week1/collection/test/LinkedListTest.java | 90 +++++++++++++++++++ .../src/week1/collection/test/QueueTest.java | 27 ++++++ .../src/week1/collection/test/StackTest.java | 56 ++++++++++++ 5 files changed, 265 insertions(+) create mode 100644 group26/1515345281/src/week1/collection/test/ArrayListTest.java create mode 100644 group26/1515345281/src/week1/collection/test/BinarySearchTreeTest.java create mode 100644 group26/1515345281/src/week1/collection/test/LinkedListTest.java create mode 100644 group26/1515345281/src/week1/collection/test/QueueTest.java create mode 100644 group26/1515345281/src/week1/collection/test/StackTest.java diff --git a/group26/1515345281/src/week1/collection/test/ArrayListTest.java b/group26/1515345281/src/week1/collection/test/ArrayListTest.java new file mode 100644 index 0000000000..0fa7701041 --- /dev/null +++ b/group26/1515345281/src/week1/collection/test/ArrayListTest.java @@ -0,0 +1,69 @@ +package week1.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import week1.collection.ArrayList; +import week1.collection.Iterator; + +public class ArrayListTest { + + private ArrayList list=new ArrayList(); + + @Test + public void testAddObject(){ + list.add(1); + assertEquals(1 , list.get(0)); + } + + @Test + public void testAddIndexObject(){ + list.add("aa"); + list.add("bb"); + list.add(0,"cc"); + assertEquals("cc",list.get(0)); + try{ + list.add(-1,"pp"); + fail("- can't be index"); + + list.add(list.size()+100,"bb"); + fail("index should <= size"); + + }catch(Exception ex){ + + } + } + + @Test + public void testGetObject(){ + list.add(1); + assertEquals(1,list.get(0)); + } + + @Test + public void testRemoveObject(){ + list.add(1); + list.add(2); + list.add(3); + list.remove(0); + list.remove(2); + assertEquals(2,list.get(0)); + } + + @Test + public void testSize(){ + assertEquals(0,list.size()); + } + + @Test + public void testIterator(){ + list.add(1); + list.add(2); + list.add(3); + Iterator it=list.iterator(); + while(it.hasNext()){ + System.out.println(it.next()); + } + } +} diff --git a/group26/1515345281/src/week1/collection/test/BinarySearchTreeTest.java b/group26/1515345281/src/week1/collection/test/BinarySearchTreeTest.java new file mode 100644 index 0000000000..a6ea1cac3f --- /dev/null +++ b/group26/1515345281/src/week1/collection/test/BinarySearchTreeTest.java @@ -0,0 +1,23 @@ +package week1.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import week1.collection.BinaryTreeNode; + +public class BinarySearchTreeTest { + + private BinaryTreeNode root=new BinaryTreeNode(5); + + @Test + public void testInsert(){ + root.insert(2); + root.insert(2); + root.insert(7); + root.insert(1); + root.insert(4); + root.insert(3); + assertEquals(3,root.getLeft().getRight().getLeft().getData()); + } +} diff --git a/group26/1515345281/src/week1/collection/test/LinkedListTest.java b/group26/1515345281/src/week1/collection/test/LinkedListTest.java new file mode 100644 index 0000000000..cba45c719d --- /dev/null +++ b/group26/1515345281/src/week1/collection/test/LinkedListTest.java @@ -0,0 +1,90 @@ +package week1.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import week1.collection.Iterator; +import week1.collection.LinkedList; + +public class LinkedListTest { + + private LinkedList list=new LinkedList(); + + @Test + public void testAdd(){ + list.add("1"); + list.add("2"); + list.add("3"); + assertEquals("1",list.get(0)); + assertEquals("2",list.get(1)); + assertEquals(3,list.size()); + } + + @Test + public void testAddByIndex(){ + list.add(2); + list.add(4); + list.add(6); + list.add(0,0); + list.add(3,3); + list.add(5,7); + assertEquals(0, list.get(0)); + assertEquals(3, list.get(3)); + assertEquals(7, list.get(5)); + try{ + list.add(-1,0); + fail("-1 not a correctly index"); + }catch(Exception ex){ + + } + } + + @Test + public void testGet(){ + list.add(0); + list.add(1); + list.add(2); + assertEquals(0,list.get(0)); + } + + @Test + public void testRemove(){ + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + assertEquals(0,list.remove(0)); + assertEquals(4,list.remove(3)); + assertEquals(2,list.remove(1)); + } + + @Test + public void testSize(){ + list.add(0); + list.addLast(0); + list.addFirst(0); + list.remove(0); + list.removeLast(); + list.removeFirst(); + assertEquals(0,list.size()); + } + + @Test + public void testOther(){ + list.add(1); + list.add(1); + list.add(1); + list.add(1); + list.addFirst(0); + list.addLast(2); + list.removeFirst(); + list.removeLast(); + Iterator it=list.iterator(); + while(it.hasNext()){ + System.out.print(it.next()+"銆"); + } + } + +} diff --git a/group26/1515345281/src/week1/collection/test/QueueTest.java b/group26/1515345281/src/week1/collection/test/QueueTest.java new file mode 100644 index 0000000000..81979682a6 --- /dev/null +++ b/group26/1515345281/src/week1/collection/test/QueueTest.java @@ -0,0 +1,27 @@ +package week1.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import week1.collection.Queue; + +public class QueueTest { + + private Queue queue=new Queue(); + + @Test + public void testEnQueue(){ + queue.enQueue("123"); + queue.enQueue("456"); + assertEquals("123",queue.deQueue()); + } + + @Test + public void testDeQueue(){ + queue.enQueue("123"); + queue.enQueue("456"); + queue.deQueue(); + assertEquals("456",queue.deQueue()); + } +} diff --git a/group26/1515345281/src/week1/collection/test/StackTest.java b/group26/1515345281/src/week1/collection/test/StackTest.java new file mode 100644 index 0000000000..717bf9b6a8 --- /dev/null +++ b/group26/1515345281/src/week1/collection/test/StackTest.java @@ -0,0 +1,56 @@ +package week1.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import week1.collection.Stack; + +public class StackTest { + + private Stack stack=new Stack(); + + @Test + public void testPush(){ + stack.push("hello"); + stack.push("world"); + assertEquals("world",stack.peek()); + } + + @Test + public void testPop(){ + stack.push("hello"); + stack.push("world"); + assertEquals("world",stack.pop()); + assertEquals(1,stack.size()); + } + + @Test + public void testPeek(){ + stack.push("world"); + assertEquals("world",stack.peek()); + stack.pop(); + try{ + stack.peek(); + fail("stack is empty,can't do peek"); + + }catch(Exception ex){ + + } + } + + @Test + public void testEmpty(){ + assertEquals(true,stack.isEmpty()); + stack.push("hello"); + stack.push("world"); + assertEquals(false,stack.isEmpty()); + } + + @Test + public void testSize(){ + stack.push("hello"); + stack.pop(); + assertEquals(0,stack.size()); + } +} From 338118ec396146c9f2e262328158e83a68d3cb77 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:19:14 +0800 Subject: [PATCH 163/177] Delete a --- group26/1515345281/src/week1/collection/test/a | 1 - 1 file changed, 1 deletion(-) delete mode 100644 group26/1515345281/src/week1/collection/test/a diff --git a/group26/1515345281/src/week1/collection/test/a b/group26/1515345281/src/week1/collection/test/a deleted file mode 100644 index 8b13789179..0000000000 --- a/group26/1515345281/src/week1/collection/test/a +++ /dev/null @@ -1 +0,0 @@ - From d4d8debdbbcc48dba2e8e6aee44f26f038c9bac5 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:20:15 +0800 Subject: [PATCH 164/177] Add files via upload --- .../src/week1/collection/ArrayList.java | 79 +++++++ .../src/week1/collection/BinaryTreeNode.java | 94 ++++++++ .../src/week1/collection/Iterator.java | 5 + .../src/week1/collection/LinkedList.java | 214 ++++++++++++++++++ .../1515345281/src/week1/collection/List.java | 9 + .../src/week1/collection/ListUtils.java | 9 + .../src/week1/collection/Queue.java | 24 ++ .../src/week1/collection/Stack.java | 37 +++ 8 files changed, 471 insertions(+) create mode 100644 group26/1515345281/src/week1/collection/ArrayList.java create mode 100644 group26/1515345281/src/week1/collection/BinaryTreeNode.java create mode 100644 group26/1515345281/src/week1/collection/Iterator.java create mode 100644 group26/1515345281/src/week1/collection/LinkedList.java create mode 100644 group26/1515345281/src/week1/collection/List.java create mode 100644 group26/1515345281/src/week1/collection/ListUtils.java create mode 100644 group26/1515345281/src/week1/collection/Queue.java create mode 100644 group26/1515345281/src/week1/collection/Stack.java diff --git a/group26/1515345281/src/week1/collection/ArrayList.java b/group26/1515345281/src/week1/collection/ArrayList.java new file mode 100644 index 0000000000..2ba58db6f0 --- /dev/null +++ b/group26/1515345281/src/week1/collection/ArrayList.java @@ -0,0 +1,79 @@ +package week1.collection; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size=0; + + private Object[] elementData=new Object[100]; + + public void add(Object o){ + + add(size,o); + + } + + public void add(int index, Object o){ + + ListUtils.checkIndexRange(index,size); + + if(size == elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length+50); + } + + if(index < size){ + for(int i=size-1;i>=index;i--){ + elementData[i+1]=elementData[i]; + } + } + elementData[index] = o; + size++; + } + + public Object get(int index){ + + ListUtils.checkIndexRange(index+1,size); + + return elementData[index]; + } + + public Object remove(int index){ + + ListUtils.checkIndexRange(index+1,size); + + Object object=elementData[index]; + for(int i=index;i 0){ + if(null == currentNode.getLeft()){ + BinaryTreeNode insertNode=new BinaryTreeNode(o); + currentNode.setLeft(insertNode); + return insertNode; + } + currentNode=currentNode.left; + }else{ + if(null ==currentNode.right){ + BinaryTreeNode insertNode=new BinaryTreeNode(o); + currentNode.setRight(insertNode); + return insertNode; + } + currentNode=currentNode.right; + } + } + return new BinaryTreeNode(o); + }*/ + + /* + * 閫掑綊瀹炵幇 + */ + public BinaryTreeNode insert(Comparable o){ + + Comparable data=(Comparable) this.getData(); + int result=data.compareTo(o); + + if(result == 0){ + return this; + }else if(result > 0){ + if(this.getLeft()==null){ + BinaryTreeNode node=new BinaryTreeNode(o); + this.setLeft(node); + return node; + } + return this.getLeft().insert(o); + }else{ + if(this.getRight()==null){ + BinaryTreeNode node=new BinaryTreeNode(o); + this.setRight(node); + return node; + } + return this.getRight().insert(o); + } + } + + 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; + } + +} diff --git a/group26/1515345281/src/week1/collection/Iterator.java b/group26/1515345281/src/week1/collection/Iterator.java new file mode 100644 index 0000000000..03e50730f7 --- /dev/null +++ b/group26/1515345281/src/week1/collection/Iterator.java @@ -0,0 +1,5 @@ +package week1.collection; +public interface Iterator{ + public boolean hasNext(); + public Object next(); +} \ No newline at end of file diff --git a/group26/1515345281/src/week1/collection/LinkedList.java b/group26/1515345281/src/week1/collection/LinkedList.java new file mode 100644 index 0000000000..fd0b9c76dd --- /dev/null +++ b/group26/1515345281/src/week1/collection/LinkedList.java @@ -0,0 +1,214 @@ +package week1.collection; + +/* + * 瑕佹眰:鍗曞悜閾捐〃瀹炵幇 + */ +public class LinkedList implements List { + + private int size=0;//琛ㄧず璇ラ摼琛ㄧ殑闀垮害 + private Node head;//閾捐〃鐨勫ご鍏冪礌 + + public void add(Object o){ + if(null == head){ + head = new Node(o); + size++; + return ; + } + + Node node=head; + while(null != node.next){ + node=node.next; + } + Node addNode=new Node(o); + node.next=addNode; + size++; + } + + public void add(int index , Object o){ + if(size == 0 || index ==size){ + add(o); + return ; + } + + ListUtils.checkIndexRange(index, size); + + if(index==0){ + Node node=new Node(head.next.data); + node.next=head.next; + head.next=node; + head.data=o; + size++; + return ; + } + + Node node=head; + for(int i=0;i7->10 , 閫嗙疆鍚庡彉涓 10->7->3 + */ + public void reverse(){ + + } + + /** + * 鍒犻櫎涓涓崟閾捐〃鐨勫墠鍗婇儴鍒 + * 渚嬪锛歭ist = 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){ + + } + /** + * 鍋囧畾褰撳墠閾捐〃鍜宭istB鍧囧寘鍚凡鍗囧簭鎺掑垪鐨勬暣鏁 + * 浠庡綋鍓嶉摼琛ㄤ腑鍙栧嚭閭d簺listB鎵鎸囧畾鐨勫厓绱 + * 渚嬪褰撳墠閾捐〃 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 杩斿洖鐨勭粨鏋滃簲璇ユ槸[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 浠庡綋鍓嶉摼琛ㄤ腑涓垹闄ゅ湪listB涓嚭鐜扮殑鍏冪礌 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 宸茬煡褰撳墠閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 鍒犻櫎琛ㄤ腑鎵鏈夊肩浉鍚岀殑澶氫綑鍏冪礌锛堜娇寰楁搷浣滃悗鐨勭嚎鎬ц〃涓墍鏈夊厓绱犵殑鍊煎潎涓嶇浉鍚岋級 + */ + public void removeDuplicateValues(){ + + } + + /** + * 宸茬煡閾捐〃涓殑鍏冪礌浠ュ奸掑鏈夊簭鎺掑垪锛屽苟浠ュ崟閾捐〃浣滃瓨鍌ㄧ粨鏋勩 + * 璇曞啓涓楂樻晥鐨勭畻娉曪紝鍒犻櫎琛ㄤ腑鎵鏈夊煎ぇ浜巑in涓斿皬浜巑ax鐨勫厓绱狅紙鑻ヨ〃涓瓨鍦ㄨ繖鏍风殑鍏冪礌锛 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 鍋囪褰撳墠閾捐〃鍜屽弬鏁發ist鎸囧畾鐨勯摼琛ㄥ潎浠ュ厓绱犱緷鍊奸掑鏈夊簭鎺掑垪锛堝悓涓琛ㄤ腑鐨勫厓绱犲煎悇涓嶇浉鍚岋級 + * 鐜拌姹傜敓鎴愭柊閾捐〃C锛屽叾鍏冪礌涓哄綋鍓嶉摼琛ㄥ拰list涓厓绱犵殑浜ら泦锛屼笖琛–涓殑鍏冪礌鏈変緷鍊奸掑鏈夊簭鎺掑垪 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} \ No newline at end of file diff --git a/group26/1515345281/src/week1/collection/List.java b/group26/1515345281/src/week1/collection/List.java new file mode 100644 index 0000000000..013956e25b --- /dev/null +++ b/group26/1515345281/src/week1/collection/List.java @@ -0,0 +1,9 @@ +package week1.collection; + +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/group26/1515345281/src/week1/collection/ListUtils.java b/group26/1515345281/src/week1/collection/ListUtils.java new file mode 100644 index 0000000000..3ebb559aea --- /dev/null +++ b/group26/1515345281/src/week1/collection/ListUtils.java @@ -0,0 +1,9 @@ +package week1.collection; + +public class ListUtils { + + public static void checkIndexRange(int index, int size) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException(); + } +} diff --git a/group26/1515345281/src/week1/collection/Queue.java b/group26/1515345281/src/week1/collection/Queue.java new file mode 100644 index 0000000000..06f5ea52c8 --- /dev/null +++ b/group26/1515345281/src/week1/collection/Queue.java @@ -0,0 +1,24 @@ +package week1.collection; + +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/group26/1515345281/src/week1/collection/Stack.java b/group26/1515345281/src/week1/collection/Stack.java new file mode 100644 index 0000000000..63b226dca8 --- /dev/null +++ b/group26/1515345281/src/week1/collection/Stack.java @@ -0,0 +1,37 @@ +package week1.collection; + +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 data=elementData.get(size()-1); + elementData.remove(size()-1); + return data; + } + + public Object peek(){ + return (Object)elementData.get(size()-1); + } + + public boolean isEmpty(){ + if(elementData.size()==0) + return true; + else + return false; + } + + public int size(){ + return elementData.size(); + } +} From 1939a6347f8911f56ead6b2b50119699634f99b6 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:22:36 +0800 Subject: [PATCH 165/177] Create ArrayUtil.java --- .../src/week2/arrayutil/ArrayUtil.java | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 group26/1515345281/src/week2/arrayutil/ArrayUtil.java diff --git a/group26/1515345281/src/week2/arrayutil/ArrayUtil.java b/group26/1515345281/src/week2/arrayutil/ArrayUtil.java new file mode 100644 index 0000000000..dcc530949d --- /dev/null +++ b/group26/1515345281/src/week2/arrayutil/ArrayUtil.java @@ -0,0 +1,225 @@ +package week2.arrayutil; + +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + 渚嬪锛 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 list=new ArrayList(); + int i=0; + int j=0; + while(i array2[j]){ + list.add(array2[j]); + j++; + }else{ + list.add(array1[i]); + i++; + j++; + } + } + while(i=result.length ){ + result=this.grow(result, 5); + } + result[cursor]=result[cursor-2]+result[cursor-1]; + cursor++; + } + return result; + } + + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪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]; + } + if(max == 2){ + return new int[]{2}; + } + + int[] temp=new int[max]; + temp[2]=2; + int primeNum=0; + for(int i=3;i list=new ArrayList(); + for(int i=6;i Date: Sun, 19 Mar 2017 23:22:58 +0800 Subject: [PATCH 166/177] Delete qqq --- group26/1515345281/src/week2/qqq | 1 - 1 file changed, 1 deletion(-) delete mode 100644 group26/1515345281/src/week2/qqq diff --git a/group26/1515345281/src/week2/qqq b/group26/1515345281/src/week2/qqq deleted file mode 100644 index 8b13789179..0000000000 --- a/group26/1515345281/src/week2/qqq +++ /dev/null @@ -1 +0,0 @@ - From 43416367d6769b7486e15ee50ba113642214f93e Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:23:44 +0800 Subject: [PATCH 167/177] Create View.java --- .../1515345281/src/week2/struts2/View.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 group26/1515345281/src/week2/struts2/View.java diff --git a/group26/1515345281/src/week2/struts2/View.java b/group26/1515345281/src/week2/struts2/View.java new file mode 100644 index 0000000000..5a907a455f --- /dev/null +++ b/group26/1515345281/src/week2/struts2/View.java @@ -0,0 +1,23 @@ +package week2.struts2; + +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; + } +} From b0fe53ffc6878af624b023cc320dd51e4dd833ce Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:24:33 +0800 Subject: [PATCH 168/177] Add files via upload --- .../src/week2/struts2/LoginAction.java | 39 ++++++++++++++++++ .../src/week2/struts2/LoginOutAction.java | 5 +++ .../1515345281/src/week2/struts2/Struts.java | 34 ++++++++++++++++ .../src/week2/struts2/StrutsTest.java | 40 +++++++++++++++++++ .../1515345281/src/week2/struts2/struts.xml | 12 ++++++ 5 files changed, 130 insertions(+) create mode 100644 group26/1515345281/src/week2/struts2/LoginAction.java create mode 100644 group26/1515345281/src/week2/struts2/LoginOutAction.java create mode 100644 group26/1515345281/src/week2/struts2/Struts.java create mode 100644 group26/1515345281/src/week2/struts2/StrutsTest.java create mode 100644 group26/1515345281/src/week2/struts2/struts.xml diff --git a/group26/1515345281/src/week2/struts2/LoginAction.java b/group26/1515345281/src/week2/struts2/LoginAction.java new file mode 100644 index 0000000000..0a34e92f18 --- /dev/null +++ b/group26/1515345281/src/week2/struts2/LoginAction.java @@ -0,0 +1,39 @@ +package week2.struts2; + +/** + * 杩欐槸涓涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩 + * @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/group26/1515345281/src/week2/struts2/LoginOutAction.java b/group26/1515345281/src/week2/struts2/LoginOutAction.java new file mode 100644 index 0000000000..54bfb503fd --- /dev/null +++ b/group26/1515345281/src/week2/struts2/LoginOutAction.java @@ -0,0 +1,5 @@ +package week2.struts2; + +public class LoginOutAction { + +} diff --git a/group26/1515345281/src/week2/struts2/Struts.java b/group26/1515345281/src/week2/struts2/Struts.java new file mode 100644 index 0000000000..06edfe7e20 --- /dev/null +++ b/group26/1515345281/src/week2/struts2/Struts.java @@ -0,0 +1,34 @@ +package week2.struts2; + +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/group26/1515345281/src/week2/struts2/StrutsTest.java b/group26/1515345281/src/week2/struts2/StrutsTest.java new file mode 100644 index 0000000000..68ec3ee4b4 --- /dev/null +++ b/group26/1515345281/src/week2/struts2/StrutsTest.java @@ -0,0 +1,40 @@ +package week2.struts2; + +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/group26/1515345281/src/week2/struts2/struts.xml b/group26/1515345281/src/week2/struts2/struts.xml new file mode 100644 index 0000000000..9e69fa4e47 --- /dev/null +++ b/group26/1515345281/src/week2/struts2/struts.xml @@ -0,0 +1,12 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file From 96e57174278bccd9a9ef56077f6c05fe5349969d Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:26:01 +0800 Subject: [PATCH 169/177] Create ArrayUtilTest.java --- group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java diff --git a/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java b/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java @@ -0,0 +1 @@ + From acd6537cdf67c7abbc3a61106e6d40ea35578532 Mon Sep 17 00:00:00 2001 From: SJsunshine Date: Sun, 19 Mar 2017 23:26:27 +0800 Subject: [PATCH 170/177] Update ArrayUtilTest.java --- .../src/week2/arrayutil/ArrayUtilTest.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java b/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java index 8b13789179..7b0d3c94e0 100644 --- a/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java +++ b/group26/1515345281/src/week2/arrayutil/ArrayUtilTest.java @@ -1 +1,97 @@ +package week2.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import week2.arrayutil.ArrayUtil; + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil=new ArrayUtil(); + + @Test + public void testReverseArray(){ + + int[] origin={1,2,3,4}; + arrayUtil.reverseArray(origin); + assertArrayEquals(new int[]{4,3,2,1}, origin); + + int[] origin1={5,6,7}; + arrayUtil.reverseArray(origin1); + assertArrayEquals(new int[]{7,6,5},origin1); + } + + @Test + public void testRemoveArray(){ + + int[] oldArray={0,0,1,2,0,0,3,4,0,0}; + int[] result=arrayUtil.removeZero(oldArray); + assertArrayEquals(new int[]{1,2,3,4},result); + } + + @Test + public void testMerge(){ + int[] array1={3,5,7,8}; + int[] array2={4,5,6,7}; + int[] array=arrayUtil.merge(array1, array2); + assertArrayEquals(new int[]{3,4,5,6,7,8}, array); + } + + @Test + public void testGrow(){ + int[] oldArray={2,3,6}; + int size=3; + int[] newArray=new int[oldArray.length+size]; + newArray=arrayUtil.grow(oldArray, size); + assertArrayEquals(new int[]{2,3,6,0,0,0},newArray); + } + + @Test + public void testFibonacci(){ + int max=1; + int[] result=arrayUtil.fibonacci(max); + assertArrayEquals(new int[0],result); + + max=2; + int[] result1=arrayUtil.fibonacci(max); + assertEquals(1,result1[0]); + + max=15; + int[] result2=arrayUtil.fibonacci(max); + assertArrayEquals(new int[]{1,1,2,3,5,8,13},result2); + } + + @Test + public void testGetPrime(){ + int max=-1; + int[] result=arrayUtil.getPrimes(max); + assertEquals(new int[0],result); + + max=23; + result=arrayUtil.getPrimes(max); + assertEquals(new int[]{2,3,5,7,11,13,17,19},result); + + } + + @Test + public void testGetPerfectNumbers(){ + int max=7; + int[] result=arrayUtil.getPerfectNumbers(max); + assertArrayEquals(new int[]{6},result); + + max=100; + result=arrayUtil.getPerfectNumbers(max); + assertArrayEquals(new int[]{6,28},result); + } + + @Test + public void testJoin(){ + String seperator="-"; + int[] array={3,5,8}; + String result=arrayUtil.join(array, seperator); + assertEquals("3-5-8",result); + + } +} From 34d5a8bf9168c30228b9d3ae84fb41766d4eefcd Mon Sep 17 00:00:00 2001 From: zzl93 Date: Sun, 19 Mar 2017 23:31:45 +0800 Subject: [PATCH 171/177] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E5=91=A8=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group27/514402862/dataStructure/pom.xml | 14 ++ .../src/main/java/com/zzl/util/ArrayList.java | 91 ++++++++++ .../java/com/zzl/util/BinaryTreeNode.java | 34 ++++ .../src/main/java/com/zzl/util/Iterator.java | 6 + .../main/java/com/zzl/util/LinkedList.java | 159 ++++++++++++++++++ .../src/main/java/com/zzl/util/List.java | 13 ++ .../src/main/java/com/zzl/util/Queue.java | 24 +++ .../src/main/java/com/zzl/util/Stack.java | 40 +++++ .../test/java/com/zzl/util/ArrayListTest.java | 100 +++++++++++ .../src/test/java/com/zzl/util/Common.java | 28 +++ .../java/com/zzl/util/LinkedListTest.java | 103 ++++++++++++ .../src/test/java/com/zzl/util/QueueTest.java | 44 +++++ .../src/test/java/com/zzl/util/StackTest.java | 54 ++++++ group27/514402862/zzl.md | 0 14 files changed, 710 insertions(+) create mode 100644 group27/514402862/dataStructure/pom.xml create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/ArrayList.java create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/BinaryTreeNode.java create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/Iterator.java create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/LinkedList.java create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/List.java create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/Queue.java create mode 100644 group27/514402862/dataStructure/src/main/java/com/zzl/util/Stack.java create mode 100644 group27/514402862/dataStructure/src/test/java/com/zzl/util/ArrayListTest.java create mode 100644 group27/514402862/dataStructure/src/test/java/com/zzl/util/Common.java create mode 100644 group27/514402862/dataStructure/src/test/java/com/zzl/util/LinkedListTest.java create mode 100644 group27/514402862/dataStructure/src/test/java/com/zzl/util/QueueTest.java create mode 100644 group27/514402862/dataStructure/src/test/java/com/zzl/util/StackTest.java create mode 100644 group27/514402862/zzl.md diff --git a/group27/514402862/dataStructure/pom.xml b/group27/514402862/dataStructure/pom.xml new file mode 100644 index 0000000000..f870b75fce --- /dev/null +++ b/group27/514402862/dataStructure/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + com.zzl + dataStructure + 0.0.1-SNAPSHOT + + + + junit + junit + 4.11 + + + \ No newline at end of file diff --git a/group27/514402862/dataStructure/src/main/java/com/zzl/util/ArrayList.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/ArrayList.java new file mode 100644 index 0000000000..f95f3a4d35 --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/ArrayList.java @@ -0,0 +1,91 @@ +package com.zzl.util; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List{ + + private static final int DEFAULT_SIZE = 4; + + private int size = 0; + private Object[] elementData = new Object[DEFAULT_SIZE]; + + 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 moveNum = size - index - 1; + if(moveNum > 0) + System.arraycopy(elementData, index+1, elementData, index, moveNum); + + elementData[--size] = null; + return oldValue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private void rangeCheck(int index){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException("Index:" + index + "size:" + size); + } + + private void ensureCapacity(int minCapacity){ + if(minCapacity <= DEFAULT_SIZE){ + minCapacity = DEFAULT_SIZE; + } + + if(minCapacity - elementData.length > 0) + grow(minCapacity); + } + + private void grow(int minCapacity){ + int oldSize = elementData.length; + int newSize = oldSize + DEFAULT_SIZE; + elementData = Arrays.copyOf(elementData, newSize); + } + + private class ArrayListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor < size; + } + + @Override + public Object next() { + if (hasNext()){ + return elementData[cursor++]; + } + throw new NoSuchElementException(); + } + + } +} diff --git a/group27/514402862/dataStructure/src/main/java/com/zzl/util/BinaryTreeNode.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/BinaryTreeNode.java new file mode 100644 index 0000000000..37fd8a3d4f --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/BinaryTreeNode.java @@ -0,0 +1,34 @@ +package com.zzl.util; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private int size = 0; + + 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){ + data = o; + + return this; + } +} diff --git a/group27/514402862/dataStructure/src/main/java/com/zzl/util/Iterator.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/Iterator.java new file mode 100644 index 0000000000..33dba5b016 --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/Iterator.java @@ -0,0 +1,6 @@ +package com.zzl.util; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group27/514402862/dataStructure/src/main/java/com/zzl/util/LinkedList.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/LinkedList.java new file mode 100644 index 0000000000..3ddeb2fb25 --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/LinkedList.java @@ -0,0 +1,159 @@ +package com.zzl.util; + +import java.util.NoSuchElementException; + +public class LinkedList implements List{ + + private int size = 0; + private Node head; + private Node last; + + void linkFirst(Object o){ + final Node h = head; + final Node newNode = new Node(o, h); + head = newNode; + if(h == null) + last = newNode; + + size++; + } + + void linkLast(Object o){ + final Node l = last; + final Node newNode = new Node(o, null); + last = newNode; + if(l == null) + head = newNode; + else + l.next = newNode; + + size++; + } + + void linkBefore(Object o, Node succ){ + final Node next = succ.next; + final Node newNode = new Node(o, next); + succ.next = newNode; + size++; + } + + @Override + public void add(Object o) { + linkLast(o); + } + + @Override + public void add(int index, Object o) { + rangeCheck(index); + + if(index == 0) + linkFirst(o); + else if(index == size) + linkLast(o); + else + linkBefore(o, node(index - 1)); + } + + @Override + public Object get(int index) { + rangeCheck(index); + + return node(index).data; + } + + @Override + public Object remove(int index) { + rangeCheck(index); + + return changeNode(node(index), index); + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o){ + linkFirst(o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size - 1); + } + + public Iterator iterator(){ + return new LinkedListIterator(); + } + + private Object changeNode(Node oldNode, int index){ + Object oldNodeValue = oldNode.data; + if(index == 0){ + head = oldNode.next; + }else { + Node oldNodePrev = node(index - 1); + oldNodePrev.next = oldNode.next; + if(null == oldNode.next){ + last = oldNodePrev; + } + } + oldNode.data = null; + oldNode.next = null; + + size--; + return oldNodeValue; + } + + private void rangeCheck(int index){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException("Index:" + index + "size:" + size); + } + + 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; + + private Node(Object o, Node l){ + this.next = l; + this.data = o; + } + } + + private class LinkedListIterator implements Iterator{ + private Node lastReturned; + private Node next; + private int nextIndex; + + LinkedListIterator(){ + next = LinkedList.this.head; + nextIndex = 0; + } + + @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; + } + + } +} diff --git a/group27/514402862/dataStructure/src/main/java/com/zzl/util/List.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/List.java new file mode 100644 index 0000000000..7268a54fbf --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/List.java @@ -0,0 +1,13 @@ +package com.zzl.util; + +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/group27/514402862/dataStructure/src/main/java/com/zzl/util/Queue.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/Queue.java new file mode 100644 index 0000000000..6e2869bd04 --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/Queue.java @@ -0,0 +1,24 @@ +package com.zzl.util; + +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(){ + int len = elementData.size(); + + return len == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group27/514402862/dataStructure/src/main/java/com/zzl/util/Stack.java b/group27/514402862/dataStructure/src/main/java/com/zzl/util/Stack.java new file mode 100644 index 0000000000..bcaf5fec95 --- /dev/null +++ b/group27/514402862/dataStructure/src/main/java/com/zzl/util/Stack.java @@ -0,0 +1,40 @@ +package com.zzl.util; + +import java.util.EmptyStackException; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object o; + int len = elementData.size(); + + o = peek(); + elementData.remove(len - 1); + return o; + } + + public Object peek(){ + int len = elementData.size(); + + if(len == 0) + throw new EmptyStackException(); + + return elementData.get(len - 1); + } + + public boolean isEmpty(){ + int len = elementData.size(); + + return len == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group27/514402862/dataStructure/src/test/java/com/zzl/util/ArrayListTest.java b/group27/514402862/dataStructure/src/test/java/com/zzl/util/ArrayListTest.java new file mode 100644 index 0000000000..14cf0f02e0 --- /dev/null +++ b/group27/514402862/dataStructure/src/test/java/com/zzl/util/ArrayListTest.java @@ -0,0 +1,100 @@ +package com.zzl.util; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + private List list; + private ArrayList aList; + + @Before + public void init() { + list = new ArrayList(); + + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + list.add("5"); + + aList = new ArrayList(); + + aList.add("1"); + aList.add("2"); + aList.add("3"); + aList.add("4"); + aList.add("5"); + } + + @Test + public void testAddObject() { + + assertEquals(list.size(), 5); + } + + @Test + public void testAddIntObject() { + + list.add(2, "5"); + + assertEquals(list.get(2), "5"); + assertEquals(list.get(4), "4"); + } + + @Test + public void testGet() { + + String[] str = {"1","2","3","4","5"}; + Common.loop(list, str); + + list.add(4, "6"); + + String[] str1 = {"1","2","3","4","6","5"}; + Common.loop(list, str1); + } + + @Test + public void testRemove() { + + String[] str = {"1","2","4","5"}; + String result = Common.removeTest(list, 2, str); + list.add(2 ,result); + + String[] str1 = {"2","3","4","5"}; + result = Common.removeTest(list, 0, str1); + list.add(0 ,result); + + String[] str2 = {"1","2","3","4"}; + result = Common.removeTest(list, 4, str2); + list.add(4 ,result); + + String[] str3 = {"1","2","3","4","5"}; + Common.loop(list, str3); + } + + @Test + public void testIterator() { + + Iterator it = aList.iterator(); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "1"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "2"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "3"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "4"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "5"); + + assertFalse(it.hasNext()); + } +} diff --git a/group27/514402862/dataStructure/src/test/java/com/zzl/util/Common.java b/group27/514402862/dataStructure/src/test/java/com/zzl/util/Common.java new file mode 100644 index 0000000000..05eee18628 --- /dev/null +++ b/group27/514402862/dataStructure/src/test/java/com/zzl/util/Common.java @@ -0,0 +1,28 @@ +package com.zzl.util; + +import static org.junit.Assert.assertEquals; + +public class Common { + public static String removeTest(List list,int index, String[] str){ + assertEquals(list.size(), 5); + String result = (String)list.remove(index); + assertEquals(list.size(), 4); + + loop(list,str); + return result; + } + + public static void loop(List list,String[] str){ + for(int i = 0; i < list.size(); i++){ + assertEquals(list.get(i), str[i]); + } + } + + public static void loop(Stack s,String[] str){ + int len = s.size(); + for(int i = len - 1; i >= 0; i--){ + assertEquals(s.peek(), str[i]); + s.pop(); + } + } +} diff --git a/group27/514402862/dataStructure/src/test/java/com/zzl/util/LinkedListTest.java b/group27/514402862/dataStructure/src/test/java/com/zzl/util/LinkedListTest.java new file mode 100644 index 0000000000..c4820fee8b --- /dev/null +++ b/group27/514402862/dataStructure/src/test/java/com/zzl/util/LinkedListTest.java @@ -0,0 +1,103 @@ +package com.zzl.util; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +public class LinkedListTest { + + private List list; + private LinkedList aList; + + @Before + public void init() { + list = new LinkedList(); + + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + list.add("5"); + + aList = new LinkedList(); + + aList.add("1"); + aList.add("2"); + aList.add("3"); + aList.add("4"); + aList.add("5"); + } + + @Test + public void testAddObject() { + assertEquals(list.size(), 5); + String[] str = {"1","2","3","4","5"}; + Common.loop(list, str); + } + + @Test + public void testAddIntObject() { + + list.add(3, "6"); + + assertEquals(list.get(3), "6"); + assertEquals(list.get(5), "5"); + + String[] str = {"1","2","3","6","4","5"}; + Common.loop(list, str); + } + + @Test + public void testRemove() { + + String[] str = {"1","2","4","5"}; + String result = Common.removeTest(aList, 2, str); + aList.add(2 ,result); + + String[] str1 = {"2","3","4","5"}; + result = Common.removeTest(aList, 0, str1); + aList.addFirst(result); + + String[] str2 = {"2","3","4","5"}; + aList.removeFirst(); + Common.loop(aList,str2); + aList.addFirst(result); + + String[] str3 = {"1","2","3","4"}; + result = Common.removeTest(aList, 4, str3); + aList.add(4 ,result); + + String[] str4 = {"1","2","3","4"}; + aList.removeLast(); + Common.loop(aList,str4); + aList.add(4 ,result); + + String[] str5 = {"1","2","3","4","5"}; + Common.loop(aList,str5); + } + + @Test + public void testIterator() { + + Iterator it = aList.iterator(); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "1"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "2"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "3"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "4"); + + assertTrue(it.hasNext()); + assertEquals(it.next(), "5"); + + assertFalse(it.hasNext()); + } +} diff --git a/group27/514402862/dataStructure/src/test/java/com/zzl/util/QueueTest.java b/group27/514402862/dataStructure/src/test/java/com/zzl/util/QueueTest.java new file mode 100644 index 0000000000..bc9da8f843 --- /dev/null +++ b/group27/514402862/dataStructure/src/test/java/com/zzl/util/QueueTest.java @@ -0,0 +1,44 @@ +package com.zzl.util; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class QueueTest { + + private Queue q; + + @Before + public void init() { + q = new Queue(); + + q.enQueue("1"); + q.enQueue("2"); + q.enQueue("3"); + q.enQueue("4"); + q.enQueue("5"); + } + + @Test + public void testEnQueue() { + assertEquals(q.size(), 5); + + q.deQueue(); + assertEquals(q.size(), 4); + } + + @Test + public void testIsEmpty() { + q = new Queue(); + + assertEquals(q.isEmpty(), true); + + q.enQueue("1"); + assertEquals(q.isEmpty(), false); + + q.deQueue(); + assertEquals(q.isEmpty(), true); + } + +} diff --git a/group27/514402862/dataStructure/src/test/java/com/zzl/util/StackTest.java b/group27/514402862/dataStructure/src/test/java/com/zzl/util/StackTest.java new file mode 100644 index 0000000000..e104c49f45 --- /dev/null +++ b/group27/514402862/dataStructure/src/test/java/com/zzl/util/StackTest.java @@ -0,0 +1,54 @@ +package com.zzl.util; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class StackTest { + + private Stack s; + + @Before + public void init() { + s = new Stack(); + + s.push("1"); + s.push("2"); + s.push("3"); + s.push("4"); + s.push("5"); + } + + @Test + public void testPush() { + assertEquals(s.size(), 5); + } + + @Test + public void testPop() { + s.pop(); + + assertEquals(s.size(), 4); + String[] str = {"1","2","3","4"}; + Common.loop(s, str); + } + + @Test + public void testPeek() { + String[] str = {"1","2","3","4","5"}; + Common.loop(s, str); + } + + @Test + public void testIsEmpty() { + assertFalse(s.isEmpty()); + + String[] str = {"1","2","3","4","5"}; + Common.loop(s, str); + assertTrue(s.isEmpty()); + + s.push("1"); + assertFalse(s.isEmpty()); + } +} diff --git a/group27/514402862/zzl.md b/group27/514402862/zzl.md new file mode 100644 index 0000000000..e69de29bb2 From 68c05424ecea2a3d2ad1e2e5631e596b5afa2efc Mon Sep 17 00:00:00 2001 From: BlindingDark Date: Sun, 19 Mar 2017 11:10:30 -0500 Subject: [PATCH 172/177] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 绗簩娆′綔涓氭彁浜 --- ...04\346\203\205\345\206\265\347\273\237\350\256\241.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/group26/26\347\273\204\346\203\205\345\206\265\347\273\237\350\256\241.md" "b/group26/26\347\273\204\346\203\205\345\206\265\347\273\237\350\256\241.md" index 74fab9de80..165922cc87 100644 --- "a/group26/26\347\273\204\346\203\205\345\206\265\347\273\237\350\256\241.md" +++ "b/group26/26\347\273\204\346\203\205\345\206\265\347\273\237\350\256\241.md" @@ -5,17 +5,17 @@ | | 鏂囩珷1 | | | | | | 723161901 | 宸插畬鎴 | | | | | | | | | | | | -| jiaxun1990锛89460886锛 | 宸插畬鎴 | | | | | +| jiaxun1990锛89460886锛 | 宸插畬鎴 | 宸插畬鎴 | | | | | | https://goo.gl/Wvz3Od | | | | | -| 1515345281 | 宸插畬鎴 | | | | | +| 1515345281 | 宸插畬鎴 | 宸插畬鎴 | | | | | | | | | | | | 2070509107 | 宸插畬鎴 | | | | | | | | | | | | -| lizhy2017 | 閮ㄥ垎瀹屾垚 | | | | | +| lizhy2017 | 閮ㄥ垎瀹屾垚 | 宸插畬鎴 | | | | | | | | | | | | JEE-閫嗘按鐧惧窛 | 閮ㄥ垎瀹屾垚 | | | | | | | http://blog.csdn.net/u012759397/article/details/61618612 | | | | | -|191191717 |宸插畬鎴恷 聽 聽 聽 | 聽 聽 聽 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | +|191191717 |宸插畬鎴恷 聽 宸插畬鎴惵 聽 | 聽 聽 聽 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | 聽 聽 | | | | | | | | | | | | | | 1778842360 | 宸插畬鎴 |瀹屾垚80% | | | | | | | | | | | 鏂囩珷1 http://note.youdao.com/noteshare?id=7e8faf2bd2a7a3e5259d83bb1e6d9d8f | | | | | | | | | | From d1f8c30298b79f2f726bf3f6067cb504cd7c34d0 Mon Sep 17 00:00:00 2001 From: tankexiaomao <514302761@qq.com> Date: Sun, 19 Mar 2017 22:11:11 +0800 Subject: [PATCH 173/177] =?UTF-8?q?=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/coderising/array/ArrayUtil.java | 211 ++++++++++++++++++ .../coderising/litestruts/LoginAction.java | 36 +++ .../company/coderising/litestruts/Struts.java | 34 +++ .../coderising/litestruts/StrutsTest.java | 41 ++++ .../company/coderising/litestruts/View.java | 23 ++ .../company/coderising/litestruts/struts.xml | 11 + 6 files changed, 356 insertions(+) create mode 100644 group27/514302761/src/com/company/coderising/array/ArrayUtil.java create mode 100644 group27/514302761/src/com/company/coderising/litestruts/LoginAction.java create mode 100644 group27/514302761/src/com/company/coderising/litestruts/Struts.java create mode 100644 group27/514302761/src/com/company/coderising/litestruts/StrutsTest.java create mode 100644 group27/514302761/src/com/company/coderising/litestruts/View.java create mode 100644 group27/514302761/src/com/company/coderising/litestruts/struts.xml diff --git a/group27/514302761/src/com/company/coderising/array/ArrayUtil.java b/group27/514302761/src/com/company/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..9531bb9853 --- /dev/null +++ b/group27/514302761/src/com/company/coderising/array/ArrayUtil.java @@ -0,0 +1,211 @@ +package com.company.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + * 渚嬪锛 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 - 1 - i]; + origin[n - 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.length == 0) { + return null; + } + int count = 0; + for (int i = 0; i < oldArray.length - 1; i++) { + if (oldArray[i] == 0) { + count++; + } + } + int[] newArray = new int[oldArray.length - count]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[j++] = oldArray[i]; + } + } + return newArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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++) { + if (!arrayList.contains(array1[i])) { + arrayList.add(array1[i]); + } + } + for (int i = 0; i < array2.length; i++) { + if (!arrayList.contains(array2[i])) { + arrayList.add(array2[i]); + } + } + int[] newArray = new int[arrayList.size()]; + for (int i = 0; i < arrayList.size(); i++) { + newArray[i] = arrayList.get(i); + } + 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]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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[]{}; + } else if (max == 2) { + return new int[]{1, 1}; + } else { + List list = new ArrayList(); + list.add(1); + list.add(1); + int pos = 2; + while (pos < max) { + list.add(pos); + pos = list.get(list.size() - 1) + list.get(list.size() - 2); + } + int[] newArray = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + newArray[i] = list.get(i); + } + return newArray; + } + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max <= 2) { + return null; + } + List list = new ArrayList(); + list.add(2); + for (int i = 3; i < max; i++) { + int j = 2; + for (; j < Math.sqrt(i); j++) { + if (i % j == 0) { + break; + } + } + if (i % j != 0) { + list.add(i); + } + } + int[] newArray = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + newArray[i] = list.get(i); + } + return newArray; + + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + List list = new ArrayList(); + for (int j = 2; j < max; j++) { + int val = 0; + for (int i = 1; i < j; i++) { + if (j % i == 0) { + val = val + i; + } + if (val == j) { + list.add(j); + } + } + if (list.size() != 0) { + int[] newArray = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + newArray[i] = list.get(i); + } + return newArray; + } + } + return null; + } + + /** + * 鐢╯eperator 鎶婃暟缁 array缁欒繛鎺ヨ捣鏉 + * 渚嬪array= [3,8,9], seperator = "-" + * 鍒欒繑鍥炲间负"3-8-9" + * + * @param array + * @param + * @return + */ + public String join(int[] array, String seperator) { + String str = "" + array[0]; + for (int i = 1; i < array.length; i++) { + str = str + seperator + array[i]; + } + return str; + } +} diff --git a/group27/514302761/src/com/company/coderising/litestruts/LoginAction.java b/group27/514302761/src/com/company/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..7d557f2c9a --- /dev/null +++ b/group27/514302761/src/com/company/coderising/litestruts/LoginAction.java @@ -0,0 +1,36 @@ +package com.company.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/group27/514302761/src/com/company/coderising/litestruts/Struts.java b/group27/514302761/src/com/company/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..c4e8e3b26b --- /dev/null +++ b/group27/514302761/src/com/company/coderising/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.company.coderising.litestruts; + +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/group27/514302761/src/com/company/coderising/litestruts/StrutsTest.java b/group27/514302761/src/com/company/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..aac1dbe85e --- /dev/null +++ b/group27/514302761/src/com/company/coderising/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package com.company.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/group27/514302761/src/com/company/coderising/litestruts/View.java b/group27/514302761/src/com/company/coderising/litestruts/View.java new file mode 100644 index 0000000000..867eb0408d --- /dev/null +++ b/group27/514302761/src/com/company/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.company.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/group27/514302761/src/com/company/coderising/litestruts/struts.xml b/group27/514302761/src/com/company/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..171848ecd1 --- /dev/null +++ b/group27/514302761/src/com/company/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + From 33ebc240367d253b1ebf8d83f790cd21d6ca7620 Mon Sep 17 00:00:00 2001 From: tankexiaomao <514302761@qq.com> Date: Mon, 20 Mar 2017 00:25:03 +0800 Subject: [PATCH 174/177] =?UTF-8?q?=E6=B2=A1=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/coderising/litestruts/Struts.java | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/group27/514302761/src/com/company/coderising/litestruts/Struts.java b/group27/514302761/src/com/company/coderising/litestruts/Struts.java index c4e8e3b26b..32079985ae 100644 --- a/group27/514302761/src/com/company/coderising/litestruts/Struts.java +++ b/group27/514302761/src/com/company/coderising/litestruts/Struts.java @@ -1,5 +1,14 @@ package com.company.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.Method; +import java.util.HashMap; import java.util.Map; @@ -9,7 +18,7 @@ public class Struts { public static View runAction(String actionName, Map parameters) { /* - + 0. 璇诲彇閰嶇疆鏂囦欢struts.xml 1. 鏍规嵁actionName鎵惧埌鐩稿搴旂殑class 锛 渚嬪LoginAction, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 @@ -27,7 +36,45 @@ public static View runAction(String actionName, Map parameters) { 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 */ - + try { + DocumentBuilderFactory dbfactory=DocumentBuilderFactory.newInstance(); + DocumentBuilder dbuilder=dbfactory.newDocumentBuilder(); + Document doc=dbuilder.parse("src/com/company/litestruts/struts.xml"); + doc.getDocumentElement().normalize(); + + NodeList list=doc.getElementsByTagName("action"); + for(int i=0;i map=new HashMap(); + map.put("message",getMessage.invoke(o).toString()); + View view=new View(); + view.setParameters(map); + NodeList nodeListT=element.getElementsByTagName("result"); + for (int j=0;j Date: Mon, 20 Mar 2017 00:28:34 +0800 Subject: [PATCH 175/177] =?UTF-8?q?=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group27/514302761/src/com/company/{ => code}/ArrayList.java | 4 ++-- .../514302761/src/com/company/{ => code}/BinaryTreeNode.java | 2 +- group27/514302761/src/com/company/{ => code}/Iterator.java | 2 +- group27/514302761/src/com/company/{ => code}/LinkedList.java | 2 +- group27/514302761/src/com/company/{ => code}/List.java | 2 +- group27/514302761/src/com/company/{ => code}/Queue.java | 2 +- group27/514302761/src/com/company/{ => code}/Stack.java | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) rename group27/514302761/src/com/company/{ => code}/ArrayList.java (94%) rename group27/514302761/src/com/company/{ => code}/BinaryTreeNode.java (98%) rename group27/514302761/src/com/company/{ => code}/Iterator.java (75%) rename group27/514302761/src/com/company/{ => code}/LinkedList.java (99%) rename group27/514302761/src/com/company/{ => code}/List.java (87%) rename group27/514302761/src/com/company/{ => code}/Queue.java (92%) rename group27/514302761/src/com/company/{ => code}/Stack.java (83%) diff --git a/group27/514302761/src/com/company/ArrayList.java b/group27/514302761/src/com/company/code/ArrayList.java similarity index 94% rename from group27/514302761/src/com/company/ArrayList.java rename to group27/514302761/src/com/company/code/ArrayList.java index 0ca210c919..9441f256bb 100644 --- a/group27/514302761/src/com/company/ArrayList.java +++ b/group27/514302761/src/com/company/code/ArrayList.java @@ -1,8 +1,8 @@ -package com.company; +package com.company.code; import java.util.Arrays; -public class ArrayList implements List { +public class ArrayList implements List { private int size = 0; diff --git a/group27/514302761/src/com/company/BinaryTreeNode.java b/group27/514302761/src/com/company/code/BinaryTreeNode.java similarity index 98% rename from group27/514302761/src/com/company/BinaryTreeNode.java rename to group27/514302761/src/com/company/code/BinaryTreeNode.java index c4a70a3af6..1d809b1071 100644 --- a/group27/514302761/src/com/company/BinaryTreeNode.java +++ b/group27/514302761/src/com/company/code/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package com.company; +package com.company.code; public class BinaryTreeNode { diff --git a/group27/514302761/src/com/company/Iterator.java b/group27/514302761/src/com/company/code/Iterator.java similarity index 75% rename from group27/514302761/src/com/company/Iterator.java rename to group27/514302761/src/com/company/code/Iterator.java index 2e93f47bc2..b9ee6d2501 100644 --- a/group27/514302761/src/com/company/Iterator.java +++ b/group27/514302761/src/com/company/code/Iterator.java @@ -1,4 +1,4 @@ -package com.company; +package com.company.code; public interface Iterator { public boolean hasNext(); diff --git a/group27/514302761/src/com/company/LinkedList.java b/group27/514302761/src/com/company/code/LinkedList.java similarity index 99% rename from group27/514302761/src/com/company/LinkedList.java rename to group27/514302761/src/com/company/code/LinkedList.java index 4a5d8da88b..8131fffbd4 100644 --- a/group27/514302761/src/com/company/LinkedList.java +++ b/group27/514302761/src/com/company/code/LinkedList.java @@ -1,4 +1,4 @@ -package com.company; +package com.company.code; import java.util.NoSuchElementException; diff --git a/group27/514302761/src/com/company/List.java b/group27/514302761/src/com/company/code/List.java similarity index 87% rename from group27/514302761/src/com/company/List.java rename to group27/514302761/src/com/company/code/List.java index 9e9f7bacb7..d142c6e2bf 100644 --- a/group27/514302761/src/com/company/List.java +++ b/group27/514302761/src/com/company/code/List.java @@ -1,4 +1,4 @@ -package com.company; +package com.company.code; public interface List { public void add(Object o); diff --git a/group27/514302761/src/com/company/Queue.java b/group27/514302761/src/com/company/code/Queue.java similarity index 92% rename from group27/514302761/src/com/company/Queue.java rename to group27/514302761/src/com/company/code/Queue.java index 3cd4984585..6d4eec7573 100644 --- a/group27/514302761/src/com/company/Queue.java +++ b/group27/514302761/src/com/company/code/Queue.java @@ -1,4 +1,4 @@ -package com.company; +package com.company.code; public class Queue { private LinkedList elementDatas=new LinkedList(); diff --git a/group27/514302761/src/com/company/Stack.java b/group27/514302761/src/com/company/code/Stack.java similarity index 83% rename from group27/514302761/src/com/company/Stack.java rename to group27/514302761/src/com/company/code/Stack.java index c0220f3a66..e4c745c0a7 100644 --- a/group27/514302761/src/com/company/Stack.java +++ b/group27/514302761/src/com/company/code/Stack.java @@ -1,9 +1,9 @@ -package com.company; +package com.company.code; import java.util.EmptyStackException; public class Stack { - private ArrayList elementData = new ArrayList(); + private ArrayList elementData = new ArrayList(); public void push(Object o){ elementData.add(o); From 0ac06dfa9c031baf5da37f5551186b6192371884 Mon Sep 17 00:00:00 2001 From: GordenChow <513274874@qq.com> Date: Mon, 20 Mar 2017 09:27:11 +0800 Subject: [PATCH 176/177] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=AC=AC=E4=BA=8C?= =?UTF-8?q?=E5=91=A8=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 鎻愪氦绗簩鍛ㄤ綔涓氾紝骞舵牴鎹璇句紭鍖栫涓鍛ㄤ綔涓 --- .../src/com/coding/basic/ArrayList.java | 8 +- .../coding/coderising/array/ArrayUtil.java | 262 ++++++++++++++++++ .../coderising/array/ArrayUtilTest.java | 110 ++++++++ .../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 + .../coderising/litestruts/LoginAction.java | 39 +++ .../coding/coderising/litestruts/Struts.java | 254 +++++++++++++++++ .../coderising/litestruts/StrutsTest.java | 53 ++++ .../coding/coderising/litestruts/View.java | 23 ++ .../coding/coderising/litestruts/struts.xml | 11 + 17 files changed, 995 insertions(+), 2 deletions(-) create mode 100644 group27/513274874/homework/src/com/coding/coderising/array/ArrayUtil.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/array/ArrayUtilTest.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/DownloadThread.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/FileDownloader.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/FileDownloaderTest.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/api/Connection.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionException.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionManager.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/api/DownloadListener.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/impl/ConnectionImpl.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/litestruts/LoginAction.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/litestruts/Struts.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/litestruts/StrutsTest.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/litestruts/View.java create mode 100644 group27/513274874/homework/src/com/coding/coderising/litestruts/struts.xml diff --git a/group27/513274874/homework/src/com/coding/basic/ArrayList.java b/group27/513274874/homework/src/com/coding/basic/ArrayList.java index 1b6f5c4e7d..9e55e92529 100644 --- a/group27/513274874/homework/src/com/coding/basic/ArrayList.java +++ b/group27/513274874/homework/src/com/coding/basic/ArrayList.java @@ -65,16 +65,20 @@ public Object get(int index) { public Object remove(int index) { Object o = this.get(index); - this.size--; + //index鍚庨潰鐨勬暟鍚戝墠绉诲姩涓浣 for (int cur = index + 1; cur < this.size; cur++) { this.elementData[cur] = this.elementData[cur + 1]; } + //鏈鍚庝竴涓厓绱犲垹闄 + this.elementData[this.size-1] = null; + + this.size--; return o; } public int size() { - return this.size; + return this.size + 1; } public Iterator iterator() { diff --git a/group27/513274874/homework/src/com/coding/coderising/array/ArrayUtil.java b/group27/513274874/homework/src/com/coding/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..1684b512ad --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/array/ArrayUtil.java @@ -0,0 +1,262 @@ +package com.coding.coderising.array; + +public class ArrayUtil { + + /** + * 缁欏畾涓涓暣褰㈡暟缁刟 , 瀵硅鏁扮粍鐨勫艰繘琛岀疆鎹 + * 渚嬪锛 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(final int[] origin) { + int size = origin.length; + if (size <= 0) return; + + int[] newArray = copyOf(origin); + + for (int i = 0; i < size; i++) { + origin[i] = newArray[size - 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) { + int size = oldArray.length; + int countZero = 0; + //棣栧厛鍒ゆ柇鏁扮粍涓0鐨勪釜鏁 + for (int i : oldArray) { + if (i == 0) countZero++; + } + int[] newArray = new int[size - countZero]; + //cur 鍛藉悕newArray鐨勬父鏍 + int cur = 0; + for (int i = 0; i < size; i++) { + if (oldArray[i] == 0) continue; + newArray[cur++] = oldArray[i]; + } + + return newArray; + } + + /** + * 缁欏畾涓や釜宸茬粡鎺掑簭濂界殑鏁村舰鏁扮粍锛 a1鍜宎2 , 鍒涘缓涓涓柊鐨勬暟缁刟3, 浣垮緱a3 鍖呭惈a1鍜宎2 鐨勬墍鏈夊厓绱狅紝 骞朵笖浠嶇劧鏄湁搴忕殑 + * 渚嬪 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 size1 = array1.length; + int size2 = array2.length; + if (size1 <= 0 || size2 <= 0) + return size1 <= 0 ? array2 : array1; + + //鍏堝皢涓や釜鏁扮粍鍚堝苟鎴愪竴涓暟缁 + int[] newArray = new int[size1 + size2]; + System.arraycopy(array1, 0, newArray, 0, size1); + System.arraycopy(array2, 0, newArray, size1, size2); + + + //瀵规暟缁勮繘琛屾彃鍏ユ帓搴忥紙鍋囧畾array1宸茬粡鏄湁搴忔暟缁勶級 + int in, out; + for (out = size1; out < newArray.length; out++) { + in = out; + int temp = newArray[out]; + + while (in > 0 && newArray[in - 1] >= temp) { + //鍙崇Щ + newArray[in] = newArray[in - 1]; + --in; + } + newArray[in] = 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 static int[] grow(int[] oldArray, int size) { + int oldSize = oldArray.length; + if (oldSize == 0) return new int[size]; + + if (size <= 0) return oldArray; + + int[] newArray = new int[oldSize + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldSize); + + return newArray; + } + + /** + * 鏂愭尝閭e鏁板垪涓猴細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[]{}; + //杩欓噷鐨刢ur鎸囩殑鏄暟缁勭殑涓嬫爣锛屼粠0寮濮嬶紝鑰屼笉鏄暟瀛﹀嚱鏁1寮濮 + int cur = 2; + int val_1 = 1; + int val_2 = 1; + while (val_1 + val_2 <= max) { + int temp = val_1; + val_1 = val_2; + val_2 += temp; + ++cur; + } + + int[] newArray = new int[cur]; + for (int i = 0; i < cur; i++) { + if (i == 0 || i == 1) { + newArray[i] = 1; + continue; + } + newArray[i] = newArray[i - 1] + newArray[i - 2]; + + } + return newArray; + } + + /** + * 杩斿洖灏忎簬缁欏畾鏈澶у糾ax鐨勬墍鏈夌礌鏁版暟缁 + * 渚嬪max = 23, 杩斿洖鐨勬暟缁勪负[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + //鍏堢‘瀹氭暟缁勯暱搴 + //鍒ゆ柇璐ㄦ暟寰幆 + int count = 0; + for (int i = 1; i < max; i++) { + //鍘绘帀鍋舵暟 + if (i == 1 || (i % 2 == 0 && i != 2)) continue; + boolean flag = true; + for (int j = 3; j <= Math.sqrt(i); j += 2) { + if (i % j == 0) { + flag = false; + break; + } + } + if (flag) count++; + } + int[] newArray = new int[count]; + int cur = 0; + for (int i = 1; i < max; i++) { + //鍘绘帀鍋舵暟 + if (i == 1 || (i % 2 == 0 && i != 2)) continue; + //鍒ゆ柇鍒板紑鏍瑰彿鍗冲彲 + boolean flag = true; + for (int j = 3; j <= Math.sqrt(i); j += 2) { + if (i % j == 0) { + flag = false; + + } + } + if (flag) { + newArray[cur] = i; + ++cur; + } + + } + + + return newArray; + } + + /** + * 鎵璋撯滃畬鏁扳濓紝 鏄寚杩欎釜鏁版伆濂界瓑浜庡畠鐨勫洜瀛愪箣鍜岋紝渚嬪6=1+2+3 + * 缁欏畾涓涓渶澶у糾ax锛 杩斿洖涓涓暟缁勶紝 鏁扮粍涓槸灏忎簬max 鐨勬墍鏈夊畬鏁 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + //姹傛暟缁勯暱搴 + int count = 0; + for (int a = 1; a <= max; a++) { + int sum = 0; + for (int i = 1; i <= a / 2; i++) + if (a % i == 0) + sum += i; + if (a == sum) + ++count; + } + + int[] newArray = new int[count]; + int cur = 0; + for (int a = 1; a <= max; a++) { + int sum = 0; + for (int i = 1; i <= a / 2; i++) + if (a % i == 0) + sum += i; + if (a == sum) { + newArray[cur] = a; + ++cur; + } + } + + return newArray; + } + + /** + * 鐢╯eperator 鎶婃暟缁 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; + if (size == 0) return ""; + StringBuffer sb = new StringBuffer(""); + for (int i = 0; i < size - 1; i++) { + sb.append(array[i]).append(seperator); + } + sb.append(array[size - 1]); + return sb.toString(); + } + + + /** + * 绫荤鏈夊嚱鏁帮紝澶嶅埗杩斿洖涓涓柊鐨勬暟缁 + */ + private static int[] copyOf(int[] source) { + int size = source.length; + if (size <= 0) return null; + + int[] newArray = new int[size]; + //int[] ints = Arrays.copyOf(origin, size); + System.arraycopy(source, 0, newArray, 0, size); + return newArray; + } + + +} diff --git a/group27/513274874/homework/src/com/coding/coderising/array/ArrayUtilTest.java b/group27/513274874/homework/src/com/coding/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..7f5ca8fdf6 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/array/ArrayUtilTest.java @@ -0,0 +1,110 @@ +package com.coding.coderising.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * ArrayUtil Tester. + * + * @author + * @version 1.0 + * @since
涓夋湀 14, 2017
+ */ +public class ArrayUtilTest { + + int[] testArray ; + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + testArray = new int[]{}; + } + + /** + * Method: reverseArray(final int[] origin) + */ + @Test + public void testReverseArray() throws Exception { + testArray = new int[]{1,3,5,7,9,4,6}; + ArrayUtil.reverseArray(testArray); + Assert.assertArrayEquals(new int[]{6,4,9,7,5,3,1},testArray); + } + + + /** + * Method: removeZero(int[] oldArray) + */ + @Test + public void testRemoveZero() throws Exception { + testArray = new int[]{1,3,0,7,0,4,6}; + int[] newArray = ArrayUtil.removeZero(testArray); + Assert.assertArrayEquals(new int[]{1,3,7,4,6}, newArray); + } + + /** + * Method: merge(int[] array1, int[] array2) + */ + @Test + public void testMerge() throws Exception { + int[] testArray1 = new int[]{1,3,6,8,9}; + int[] testArray2 = new int[]{2,3,3,10,12}; + + int[] mergedArray = ArrayUtil.merge(testArray1,testArray2); + Assert.assertArrayEquals(new int[]{1,2,3,3,3,6,8,9,10,12},mergedArray); + } + + /** + * Method: grow(int[] oldArray, int size) + */ + @Test + public void testGrow() throws Exception { + testArray = new int[]{1,2,3,4,5,6}; + int[] grewArray = ArrayUtil.grow(testArray,4); + Assert.assertArrayEquals(new int[]{1,2,3,4,5,6,0,0,0,0},grewArray); + + } + + /** + * Method: fibonacci(int max) + */ + @Test + public void testFibonacci() throws Exception { + int[] fibArray = ArrayUtil.fibonacci(20); + Assert.assertArrayEquals(new int[]{1,1,2,3,5,8,13},fibArray); + } + + /** + * Method: getPrimes(int max) + */ + @Test + public void testGetPrimes() throws Exception { + testArray = ArrayUtil.getPrimes(23); + Assert.assertArrayEquals(new int[]{2,3,5,7,11,13,17,19},testArray); + } + + /** + * Method: getPerfectNumbers(int max) + */ + @Test + public void testGetPerfectNumbers() throws Exception { + testArray = ArrayUtil.getPerfectNumbers(1000); + Assert.assertArrayEquals(new int[]{6,28,496},testArray); + } + + /** + * Method: join(int[] array, String seperator) + */ + @Test + public void testJoin() throws Exception { + testArray = new int[]{1,2,3,5,7,9,12}; + String seperated = ArrayUtil.join(testArray,"-"); + Assert.assertEquals("1-2-3-5-7-9-12",seperated); + } + + +} diff --git a/group27/513274874/homework/src/com/coding/coderising/download/DownloadThread.java b/group27/513274874/homework/src/com/coding/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..1456314140 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/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/group27/513274874/homework/src/com/coding/coderising/download/FileDownloader.java b/group27/513274874/homework/src/com/coding/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..f5d7999eb4 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/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(){ + // 鍦ㄨ繖閲屽疄鐜颁綘鐨勪唬鐮侊紝 娉ㄦ剰锛 闇瑕佺敤澶氱嚎绋嬪疄鐜颁笅杞 + // 杩欎釜绫讳緷璧栦簬鍏朵粬鍑犱釜鎺ュ彛, 浣犻渶瑕佸啓杩欏嚑涓帴鍙g殑瀹炵幇浠g爜 + // (1) ConnectionManager , 鍙互鎵撳紑涓涓繛鎺ワ紝閫氳繃Connection鍙互璇诲彇鍏朵腑鐨勪竴娈碉紙鐢╯tartPos, endPos鏉ユ寚瀹氾級 + // (2) DownloadListener, 鐢变簬鏄绾跨▼涓嬭浇锛 璋冪敤杩欎釜绫荤殑瀹㈡埛绔笉鐭ラ亾浠涔堟椂鍊欑粨鏉燂紝鎵浠ヤ綘闇瑕佸疄鐜板綋鎵鏈 + // 绾跨▼閮芥墽琛屽畬浠ュ悗锛 璋冪敤listener鐨刵otifiedFinished鏂规硶锛 杩欐牱瀹㈡埛绔氨鑳芥敹鍒伴氱煡銆 + // 鍏蜂綋鐨勫疄鐜版濊矾锛 + // 1. 闇瑕佽皟鐢–onnectionManager鐨刼pen鏂规硶鎵撳紑杩炴帴锛 鐒跺悗閫氳繃Connection.getContentLength鏂规硶鑾峰緱鏂囦欢鐨勯暱搴 + // 2. 鑷冲皯鍚姩3涓嚎绋嬩笅杞斤紝 娉ㄦ剰姣忎釜绾跨▼闇瑕佸厛璋冪敤ConnectionManager鐨刼pen鏂规硶 + // 鐒跺悗璋冪敤read鏂规硶锛 read鏂规硶涓湁璇诲彇鏂囦欢鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆鐨勫弬鏁帮紝 杩斿洖鍊兼槸byte[]鏁扮粍 + // 3. 鎶奲yte鏁扮粍鍐欏叆鍒版枃浠朵腑 + // 4. 鎵鏈夌殑绾跨▼閮戒笅杞藉畬鎴愪互鍚庯紝 闇瑕佽皟鐢╨istener鐨刵otifiedFinished鏂规硶 + + // 涓嬮潰鐨勪唬鐮佹槸绀轰緥浠g爜锛 涔熷氨鏄鍙湁涓涓嚎绋嬶紝 浣犻渶瑕佹敼閫犳垚澶氱嚎绋嬬殑銆 + 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/group27/513274874/homework/src/com/coding/coderising/download/FileDownloaderTest.java b/group27/513274874/homework/src/com/coding/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..8171ee5763 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/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/group27/513274874/homework/src/com/coding/coderising/download/api/Connection.java b/group27/513274874/homework/src/com/coding/coderising/download/api/Connection.java new file mode 100644 index 0000000000..9710e270e1 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/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/group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionException.java b/group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..8dbfe95dda --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionManager.java b/group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..fb44ede457 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 缁欏畾涓涓猽rl , 鎵撳紑涓涓繛鎺 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group27/513274874/homework/src/com/coding/coderising/download/api/DownloadListener.java b/group27/513274874/homework/src/com/coding/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..4cd0b3eab1 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group27/513274874/homework/src/com/coding/coderising/download/impl/ConnectionImpl.java b/group27/513274874/homework/src/com/coding/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..32f03efdc7 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/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/group27/513274874/homework/src/com/coding/coderising/download/impl/ConnectionManagerImpl.java b/group27/513274874/homework/src/com/coding/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..046f7c49a4 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/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; + } + +} diff --git a/group27/513274874/homework/src/com/coding/coderising/litestruts/LoginAction.java b/group27/513274874/homework/src/com/coding/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..689678f3ad --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.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/group27/513274874/homework/src/com/coding/coderising/litestruts/Struts.java b/group27/513274874/homework/src/com/coding/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..7aa7dacb4a --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/litestruts/Struts.java @@ -0,0 +1,254 @@ +package com.coding.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.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.io.File; +import java.io.FileNotFoundException; +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 { + + private static Struts instance = null; + private static Map strutsXml; + + private Struts() { + } + + /** + * 鍗曚緥妯″紡鍒濆鍖杝truts.xml锛岃屼笉鏄瘡娆¤窇runAction鐨勬椂鍊欓兘瑕佸垵濮嬪寲涓娆 + * + * @return + */ + public static Struts init() throws FileNotFoundException { + + if (instance == null) { + /** + * 0. 璇诲彇閰嶇疆鏂囦欢struts.xml + */ + //鍒涘缓SAXReader瀵硅薄 + SAXReader reader = new SAXReader(); + //璇诲彇鏂囦欢 杞崲鎴怐ocument + Document document = null; + try { + document = reader.read(new File("src/com/coding/coderising/litestruts/struts.xml")); + } catch (DocumentException e) { + e.printStackTrace(); + } + //鑾峰彇鏍硅妭鐐瑰厓绱犲璞 + Element root = document.getRootElement(); + if ("struts".equals(root.getName())) { + strutsXml = new HashMap(); + + Iterator actions = root.elementIterator(); + while (actions.hasNext()) { + Element action = actions.next(); + List attrList = action.attributes(); + + String actionName = null; + StrutsXml xml = null; + if (!"action".equals(action.getName())) { + continue; + } + //閬嶅巻灞炴ц妭鐐 + for (Attribute attribute : attrList) { + xml = new StrutsXml(); + if ("name".equals(attribute.getName())) { + actionName = attribute.getValue(); + } + if ("class".equals(attribute.getName())) { + xml.setClazz(attribute.getValue()); + //鑾峰彇result淇℃伅 + Iterator results = action.elementIterator(); + while (results.hasNext()) { + Element result = results.next(); + List resultList = result.attributes(); + for (Attribute resultAttr : resultList) { + //System.out.println(resultAttr.getValue() + " ,"+result.getText()); + xml.getResult().put(resultAttr.getValue(), result.getText()); + } + } + + } + //System.out.println("灞炴"+attribute.getName() +":" + attribute.getValue()); + } + + strutsXml.put(actionName, xml); + } + } else { + throw new FileNotFoundException("not a struts XML file !"); + } + + + instance = new Struts(); + } + return instance; + } + + public static View runAction(String actionName, Map parameters) { + + if (instance == null) return null; + if (actionName == null || "".equals(actionName.trim())) return null; + View view = new View(); + StrutsXml struts = strutsXml.get(actionName); + + Class clazz = null; + /** + * 1. 鏍规嵁actionName鎵惧埌鐩稿搴旂殑class 锛 渚嬪LoginAction, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛 + * 鎹畃arameters涓殑鏁版嵁锛岃皟鐢ㄥ璞$殑setter鏂规硶锛 渚嬪parameters涓殑鏁版嵁鏄 + * ("name"="test" , "password"="1234") ,閭e氨搴旇璋冪敤 setName鍜宻etPassword鏂规硶 + */ + //鑾峰彇鐩稿簲澶勭悊鐨刟ction + if (struts != null) { + String className = struts.getClazz(); + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } else { + throw new NullPointerException("action not found in struts file !"); + } + + if (clazz != null) { + Object action = null; + try { + action = clazz.newInstance(); + + //鍙嶅皠璋冪敤璁剧疆鍙傛暟 + for (Map.Entry entry : parameters.entrySet()) { + String para = entry.getKey(); + if (!checkField(clazz, para)) continue; + //鏍规嵁涔犳儻锛岀被鐨勫睘鎬ч瀛楁瘝鍦ㄨ皟鐢ㄦ椂澶у啓锛屼緥濡傚睘鎬у悕鏄 age锛屽垯绫绘柟娉曚负getAge + PropertyDescriptor pd = new PropertyDescriptor(para, clazz); + + Method setMethod = pd.getWriteMethod();//鑾峰緱set鏂规硶 + + setMethod.invoke(action, entry.getValue()); + + } + /** + * 2. 閫氳繃鍙嶅皠璋冪敤瀵硅薄鐨別xectue 鏂规硶锛 骞惰幏寰楄繑鍥炲硷紝渚嬪"success" + */ + //鎵цexecute() + Method excuteMethod = clazz.getDeclaredMethod("execute"); + String result = (String) excuteMethod.invoke(action); + //閫氳繃xml鏂囦欢鑾峰彇杩斿洖鍊 + String jsp = struts.getResult().get(result); + + if (jsp == null || jsp.trim().equals("")) { + throw new NullPointerException("the requested file is not found !"); + } + /** + * 3. 閫氳繃鍙嶅皠鎵惧埌瀵硅薄鐨勬墍鏈塯etter鏂规硶锛堜緥濡 getMessage锛, + * 閫氳繃鍙嶅皠鏉ヨ皟鐢紝 鎶婂煎拰灞炴у舰鎴愪竴涓狧ashMap , 渚嬪 {"message": "鐧诲綍鎴愬姛"} , + * 鏀惧埌View瀵硅薄鐨刾arameters + */ + //鎵цget鏂规硶 + Map viewMap = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields();//鑾峰緱灞炴 + + for (Field field : fields) { + String getMethodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1); + Method getMethod = clazz.getDeclaredMethod(getMethodName); + String returnVal = (String) getMethod.invoke(action); + viewMap.put(field.getName(), returnVal); + } + /** + * 4. 鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲硷紝 纭畾鍝竴涓猨sp锛 + * 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓 + */ + view.setJsp(jsp); + view.setParameters(viewMap); + + } catch (IntrospectionException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + } + + return view; + + + } + + private static boolean checkField(Class clazz, String fieldName) { + if (fieldName == null || fieldName.trim().equals("")) return false; + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (fieldName.equals(field.getName())) return true; + } + return false; + } + + + public static void main(String args[]) { + try { + Struts.init(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + Map paras = new HashMap<>(); + paras.put("name", "test"); + paras.put("password", "1234"); + View view = Struts.runAction("login", paras); + } +} + +class StrutsXml { + private String actionName; + private String clazz; + private Map result = new HashMap<>(); + + public StrutsXml(String actionName, String clazz, Map result) { + this.actionName = actionName; + this.clazz = clazz; + this.result = result; + } + + public StrutsXml() { + } + + public String getActionName() { + return actionName; + } + + public void setActionName(String actionName) { + this.actionName = actionName; + } + + public String getClazz() { + return clazz; + } + + public void setClazz(String clazz) { + this.clazz = clazz; + } + + public Map getResult() { + return result; + } + + public void setResult(Map result) { + this.result = result; + } +} \ No newline at end of file diff --git a/group27/513274874/homework/src/com/coding/coderising/litestruts/StrutsTest.java b/group27/513274874/homework/src/com/coding/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..9d876abfa4 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/litestruts/StrutsTest.java @@ -0,0 +1,53 @@ +package com.coding.coderising.litestruts; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + + + + +public class StrutsTest { + @Before + public void before() throws Exception { + Struts.init(); + } + + @After + public void after() throws Exception { + } + + @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/group27/513274874/homework/src/com/coding/coderising/litestruts/View.java b/group27/513274874/homework/src/com/coding/coderising/litestruts/View.java new file mode 100644 index 0000000000..ab1297a4a0 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +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/group27/513274874/homework/src/com/coding/coderising/litestruts/struts.xml b/group27/513274874/homework/src/com/coding/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..92cb2bcb23 --- /dev/null +++ b/group27/513274874/homework/src/com/coding/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + From 16e186e55f3bfdf2a4a519e82a2b5abb8c342d63 Mon Sep 17 00:00:00 2001 From: wizardzhang2017 <282287610@qq.com> Date: Wed, 22 Mar 2017 09:42:51 +0800 Subject: [PATCH 177/177] fix --- .gitignore.bak | 285 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 285 insertions(+) diff --git a/.gitignore.bak b/.gitignore.bak index ec55baf87d..bfc52534d9 100644 --- a/.gitignore.bak +++ b/.gitignore.bak @@ -1,5 +1,272 @@ +<<<<<<< HEAD + +======= +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml +*.publishproj + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[cod] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg +.gitignore +======= + + +# 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 + + +*.xml +*.iml +.idea +*.iml +rebel.xml +rebel-remote.xml + +.classpath +.project +.setting +.metadata + +target *.class +log +*.log +tmp +*.tmp + +.metadata +RemoteSystemsTempFiles +.gitignore + + +build/ +.idea/ +.gradle/ +>>>>>>> 9480ef8682c393444f53a282b34e23a087ef73e6 +*.class # Mobile Tools for Java (J2ME) .mtj.tmp/ @@ -14,3 +281,21 @@ hs_err_pid* #ide config .metadata .recommenders +.idea/ +*.iml +rebel.* +.rebel.* + +target +<<<<<<< HEAD + +#bin/ +#.setting/ +#*.classpath +#*.project +======= +*.DS_Store +liuxin/.DS_Store +liuxin/src/.DS_Store +>>>>>>> 9480ef8682c393444f53a282b34e23a087ef73e6 +