diff --git a/.gitignore b/.gitignore
index 8b13789179..6945ca9d30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,26 @@
 
+build/
+.idea/
+.gradle/
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
+
diff --git a/group01/1298552064/.classpath b/group01/1298552064/.classpath
new file mode 100644
index 0000000000..05cf0dba9e
--- /dev/null
+++ b/group01/1298552064/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="src/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group04/564451732/.gitignore b/group01/1298552064/.gitignore
similarity index 100%
rename from group04/564451732/.gitignore
rename to group01/1298552064/.gitignore
diff --git a/group01/1298552064/.project b/group01/1298552064/.project
new file mode 100644
index 0000000000..ddbb7719d0
--- /dev/null
+++ b/group01/1298552064/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>1298552064Learning</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group01/1298552064/src/week01/basic/MyLinkedList.java b/group01/1298552064/src/week01/basic/MyLinkedList.java
index 4894c5ff6c..88db213864 100644
--- a/group01/1298552064/src/week01/basic/MyLinkedList.java
+++ b/group01/1298552064/src/week01/basic/MyLinkedList.java
@@ -124,7 +124,7 @@ public Object removeLast() {
 			Node p = head;
 			for (int i = 0; i < size; i++) {
 				if (p.next.next == null) {
-					removeObject = p.next;
+					removeObject = p.next.data;
 					p.next = null;
 					break;
 				} else {
diff --git a/group01/1298552064/src/week02/array/ArrayUtil.java b/group01/1298552064/src/week02/array/ArrayUtil.java
new file mode 100644
index 0000000000..9b6c0bebaf
--- /dev/null
+++ b/group01/1298552064/src/week02/array/ArrayUtil.java
@@ -0,0 +1,245 @@
+package week02.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+	// 工具类，不予许创建实例
+	private ArrayUtil() {
+	}
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin) {
+		if (origin != null && origin.length > 0) {
+			int temp = 0;
+
+			// 数组首尾元素置换
+			for (int i = 0; i < origin.length / 2; i++) {
+				temp = origin[i];
+				origin[i] = origin[origin.length - i - 1];
+				origin[origin.length - i - 1] = temp;
+			}
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		int[] newArray = null;
+		if (oldArray != null) {
+			newArray = new int[oldArray.length];
+			int size = 0;
+			for (int i = 0; i < oldArray.length; i++) {
+				if (oldArray[i] != 0) {
+					newArray[size] = oldArray[i];
+					size++;
+				}
+			}
+			newArray = Arrays.copyOf(newArray, size);
+		}
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+		int[] newArray = null;
+		if (array1 != null && array2 != null) {
+			int size = 0;
+
+			// index1、index2表示array1和array2数组的比较索引
+			int index1 = 0, index2 = 0;
+			newArray = new int[array1.length + array2.length];
+
+			while (index1 < array1.length && index2 < array2.length) {
+				if (array1[index1] == array2[index2]) {
+					newArray[size++] = array1[index1];
+					index1++;
+					index2++;
+				} else if (array1[index1] < array2[index2]) {
+					// 数组array1去重
+					if (size > 0 && array1[index1] == newArray[size - 1]) {
+						size--;
+					}
+					newArray[size++] = array1[index1];
+					index1++;
+				} else {
+					// 数组array2去重
+					if (size > 0 && array2[index2] == newArray[size - 1]) {
+						size--;
+					}
+					newArray[size++] = array2[index2];
+					index2++;
+				}
+			}
+
+			// 将数组array1剩下的元素放入
+			while (index1 < array1.length) {
+				newArray[size++] = array1[index1++];
+			}
+
+			// 将数组array2剩下的元素放入
+			while (index2 < array2.length) {
+				newArray[size++] = array2[index2++];
+			}
+
+			// 合并后有序数组
+			newArray = Arrays.copyOf(newArray, size);
+		}
+		return newArray;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] newArray = null;
+		if (oldArray != null) {
+			newArray = new int[oldArray.length + size];
+			for (int i = 0; i < oldArray.length; i++) {
+				newArray[i] = oldArray[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+
+		// 计算方法：f(n) = f(n-1) + f(n-2) 采用数组计算
+		int[] result = null;
+		if (max <= 1) {
+			result = new int[] {};
+		} else {
+			int i = 2;
+			result = new int[max];
+			result[0] = result[1] = 1;
+			for (; i < max; i++) {
+				if (result[i - 1] + result[i - 2] < max) {
+					result[i] = result[i - 1] + result[i - 2];
+				} else {
+					break;
+				}
+			}
+			result = Arrays.copyOf(result, i);
+		}
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		int[] newArray = new int[] {};
+		if (max > 2) {
+			newArray = new int[max];
+			int size = 0, j = 0;
+			for (int i = 2; i < max; i++) {
+				for (j = 2; j < i / 2 + 1; j++) {
+					if (i % j == 0) {
+						break;
+					}
+				}
+
+				if (j == i / 2 + 1) {
+					newArray[size++] = i;
+				}
+			}
+			newArray = Arrays.copyOf(newArray, size);
+		}
+		return newArray;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) {
+		int[] newArray = new int[] {};
+		if (max > 0) {
+			newArray = new int[max];
+			int size = 0, sum = 0;
+			for (int i = 1; i < max; i++) {
+				sum = 0;
+				for (int j = 1; j < i / 2 + 1; j++) {
+					if (i % j == 0) {
+						sum += j;
+					}
+				}
+				if (i == sum) {
+					newArray[size++] = i;
+				}
+			}
+			newArray = Arrays.copyOf(newArray, size);
+		}
+		return newArray;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		String joinResult = null;
+		if (array != null) {
+			joinResult = "";
+			for (int i = 0; i < array.length; i++) {
+				joinResult += array[i] + seperator;
+			}
+			joinResult = joinResult.equals("") ? "" : joinResult.substring(0, joinResult.length() - 1);
+		}
+		return joinResult;
+	}
+
+	public static void main(String[] args) {
+		int[] a = new ArrayUtil().getPerfectNumbers(1000);
+		for (int i = 0; i < a.length; i++) {
+			System.out.println(a[i]);
+		}
+
+		// [2,3,5,7,11,13,17,19]
+		a = new ArrayUtil().getPrimes(20);
+		for (int i = 0; i < a.length; i++) {
+			System.out.println(a[i]);
+		}
+	}
+}
diff --git a/group01/1298552064/src/week02/litestruts/LoginAction.java b/group01/1298552064/src/week02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..aec243dd1b
--- /dev/null
+++ b/group01/1298552064/src/week02/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package week02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}
diff --git a/group01/1298552064/src/week02/litestruts/Struts.java b/group01/1298552064/src/week02/litestruts/Struts.java
new file mode 100644
index 0000000000..3cef26c396
--- /dev/null
+++ b/group01/1298552064/src/week02/litestruts/Struts.java
@@ -0,0 +1,106 @@
+package week02.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+
+		try {
+
+			// 0. 读取配置文件struts.xml
+			SAXReader reader = new SAXReader();
+			InputStream in = Struts.class.getResourceAsStream("struts.xml");
+			Document document = reader.read(in);
+			Element root = document.getRootElement();
+
+			// 与actionName匹配的Element
+			Element actionElement = null;
+			String className = null;
+
+			for (Iterator<Element> iterator = root.elementIterator("action"); iterator.hasNext();) {
+				Element e = iterator.next();
+				if (e.attributeValue("name").equals(actionName)) {
+					actionElement = e;
+					className = e.attributeValue("class");
+					break;
+				}
+			}
+
+			Class<?> clazz = Class.forName(className);
+			Object action = clazz.newInstance();
+
+			// 1. 反射设置属性
+			if (parameters != null) {
+				for (Map.Entry<String, String> entry : parameters.entrySet()) {
+					String fieldName = entry.getKey();
+					String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+					Class<?> fieldType = clazz.getDeclaredField(fieldName).getType();
+					Method method = clazz.getDeclaredMethod(methodName, fieldType);
+					method.invoke(action, entry.getValue());
+				}
+			}
+
+			// 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+			Method execute = clazz.getDeclaredMethod("execute");
+			String result = (String) execute.invoke(action);
+
+			// 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap
+			Method[] methods = clazz.getDeclaredMethods();
+			Map<String, Object> param = new HashMap<String, Object>();
+			for (Method method : methods) {
+				String methodName = method.getName();
+				if (method.getName().startsWith("get")) {
+					String fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
+					Object fieldValue = method.invoke(action);
+					param.put(fieldName, fieldValue);
+				}
+			}
+
+			View view = new View();
+			view.setParameters(param);
+
+			// 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+			// 放到View对象的jsp字段中。
+			for (Iterator<Element> iterator = actionElement.elementIterator("result"); iterator.hasNext();) {
+				Element resultElement = iterator.next();
+				if (resultElement.attributeValue("name").equals(result)) {
+					view.setJsp(resultElement.getText());
+					break;
+				}
+			}
+
+			return view;
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+	}
+}
diff --git a/group01/1298552064/src/week02/litestruts/View.java b/group01/1298552064/src/week02/litestruts/View.java
new file mode 100644
index 0000000000..a286412f0e
--- /dev/null
+++ b/group01/1298552064/src/week02/litestruts/View.java
@@ -0,0 +1,26 @@
+package week02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/1298552064/src/week02/litestruts/struts.xml b/group01/1298552064/src/week02/litestruts/struts.xml
new file mode 100644
index 0000000000..01398e9c3d
--- /dev/null
+++ b/group01/1298552064/src/week02/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="week02.litestruts.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+	<action name="logout" class="week02.litestruts.LogoutAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/group01/1298552064/src/week02/test/ArrayUtilTest.java b/group01/1298552064/src/week02/test/ArrayUtilTest.java
new file mode 100644
index 0000000000..e796b5f845
--- /dev/null
+++ b/group01/1298552064/src/week02/test/ArrayUtilTest.java
@@ -0,0 +1,75 @@
+package week02.test;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import week02.array.ArrayUtil;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		int[] a = new int[] { 7, 9, 30, 3 };
+		int[] b = new int[] { 7, 9, 30, 3, 4 };
+
+		ArrayUtil.reverseArray(a);
+		ArrayUtil.reverseArray(b);
+
+		Assert.assertArrayEquals(new int[] { 3, 30, 9, 7 }, a);
+		Assert.assertArrayEquals(new int[] { 4, 3, 30, 9, 7 }, b);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int[] oldArr = new int[] { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
+		int[] newArray = ArrayUtil.removeZero(oldArr);
+		Assert.assertArrayEquals(new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }, newArray);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = new int[] { 3, 5, 7, 8 };
+		int[] a2 = new int[] { 4, 5, 6, 6, 7, 7 };
+		int[] a3 = ArrayUtil.merge(a1, a2);
+		Assert.assertArrayEquals(new int[] { 3, 4, 5, 6, 7, 8 }, a3);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = new int[] { 2, 3, 6 };
+		int size = 3;
+		int[] newArray = ArrayUtil.grow(oldArray, size);
+		Assert.assertArrayEquals(new int[] { 2, 3, 6, 0, 0, 0 }, newArray);
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15;
+		int max2 = 1;
+		int[] newArray = ArrayUtil.fibonacci(max);
+		int[] newArray2 = ArrayUtil.fibonacci(max2);
+		Assert.assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, newArray);
+		Assert.assertArrayEquals(new int[] {}, newArray2);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] newArray = ArrayUtil.getPrimes(23);
+		Assert.assertArrayEquals(new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }, newArray);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] newArray = ArrayUtil.getPerfectNumbers(1000);
+		Assert.assertArrayEquals(new int[] { 6, 28, 496 }, newArray);
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = new int[] { 3, 8, 9 };
+		String seperator = "-";
+		String result = ArrayUtil.join(array, seperator);
+		Assert.assertEquals("3-8-9", result);
+	}
+
+}
diff --git a/group01/1298552064/src/week02/test/StrutsTest.java b/group01/1298552064/src/week02/test/StrutsTest.java
new file mode 100644
index 0000000000..3eb6d01fd0
--- /dev/null
+++ b/group01/1298552064/src/week02/test/StrutsTest.java
@@ -0,0 +1,41 @@
+package week02.test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import week02.litestruts.Struts;
+import week02.litestruts.View;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		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<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/1664823950/src/com/coderising/array/ArrayUtil.java b/group01/1664823950/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..afb557277f
--- /dev/null
+++ b/group01/1664823950/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,209 @@
+package com.coderising.array;
+import java.util.*;
+
+import com.sun.org.apache.bcel.internal.generic.NEWARRAY;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin)
+	{
+		int[] a = origin;
+		for (int i = 0; i < a.length; i++)
+		{
+			origin[i] = a[a.length-i];
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray)
+	{
+		ArrayList<Integer> a= new ArrayList<Integer>();
+		
+		for (int i : oldArray)
+		{
+			if (i != 0)
+			{
+				a.add(i);
+			}
+		}
+		
+		int[] newArray = new int[a.size()];
+		for (int i = 0; i < a.size(); i++)
+		{
+			newArray[i] = a.get(i);
+		}
+		return null;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2)
+	{
+		for (int i = 0; i < array1.length; i++)
+		{
+			for (int j = 0; j < array2.length; j++)
+			{
+				if(array1[i] == array2[j])
+				{
+					array2[j] = 0;
+				}
+			}
+		}
+		
+		removeZero(array2);
+		
+		int[] array3 = new int[array1.length + array2.length];
+		
+		for (int i = 0; i < array1.length; i++)
+		{
+			array3[i] = array1[i];
+		}
+		
+		for (int i = 0; i < array2.length; i++)
+		{
+			array3[array1.length + i] = array2[i];
+		}
+		
+		Arrays.sort(array3);
+		return  array3;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size)
+	{
+		return new int[oldArray.length + size];
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max)
+	{
+		int top = 1;
+		int sec = 1;
+		ArrayList<Integer> tem = new ArrayList<Integer>();
+		while (top < max)
+		{
+			tem.add(top);
+			int a = top;
+			top += sec;
+			sec = a;
+		}
+		
+		
+		return toArray(tem);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max)
+	{
+		ArrayList<Integer> tem = new ArrayList<Integer>();
+		for (int i = 0; i < max; i++)
+		{
+			if (isPrimes(i))
+			{
+				tem.add(i);
+			}
+		}
+		
+		return toArray(tem);
+	}
+	
+	private boolean isPrimes(int i)
+	{
+		return true;
+	}
+	
+	private int[] toArray(ArrayList<Integer> tem)
+	{
+		int[] newArr = new int[tem.size()];
+		for (int i = 0; i < newArr.length; i++)
+		{
+			newArr[i] = tem.get(i);	
+		}
+		return newArr;
+	}
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max)
+	{
+		ArrayList<Integer> tem = new ArrayList<Integer>();
+		for (int i = 0; i < max; i++)
+		{
+			if (isPerfectNumbers(i))
+			{
+				tem.add(i);
+			}
+		}
+		
+		return toArray(tem);
+	}
+	
+	
+	private boolean isPerfectNumbers(int i)
+	{
+		return true;
+	}
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator)
+	{
+		String newStr = "";
+		for (int i = 0; i < array.length; i++)
+		{
+			if(i == array.length-1)
+			{
+				seperator = "";
+			}
+			newStr += array[i] + seperator;
+		}
+		return newStr;
+	}
+	
+}
diff --git a/group01/1664823950/src/com/coderising/litestruts/LoginAction.java b/group01/1664823950/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group01/1664823950/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/1664823950/src/com/coderising/litestruts/Struts.java b/group01/1664823950/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..44cc35bf01
--- /dev/null
+++ b/group01/1664823950/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/group01/1664823950/src/com/coderising/litestruts/StrutsTest.java b/group01/1664823950/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group01/1664823950/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/1664823950/src/com/coderising/litestruts/View.java b/group01/1664823950/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group01/1664823950/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/1664823950/src/com/coderising/litestruts/struts.xml b/group01/1664823950/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..99063bcb0c
--- /dev/null
+++ b/group01/1664823950/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result = "success">/jsp/welcome.jsp</result>
+    	<result = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/1814014897/zhouhui/src/.project b/group01/1814014897/zhouhui/src/.project
new file mode 100644
index 0000000000..f7d6de6781
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>src</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java b/group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java
new file mode 100644
index 0000000000..dd939e7d2c
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java
@@ -0,0 +1,222 @@
+package week02.array;
+
+/**
+ * 
+ * @author Hui Zhou
+ * @version 1.0 2017-02-28
+ *
+ */
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin == null) return;
+		
+		int mid = origin.length/2;
+		for(int i=0;i<mid;i++){
+			int sto = origin[i];
+			origin[i] = origin[origin.length-i-1];
+			origin[origin.length-i-1] = sto;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if(oldArray == null) return new int[]{};
+		
+		int zero_sum = 0;
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i] == 0){
+				zero_sum++;
+			}
+		}
+		
+		int[] newArray = new int[oldArray.length - zero_sum];
+		int j=0;
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i] != 0){
+				newArray[j++] = oldArray[i];
+			}
+		}
+		
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		if(array1 == null && array2 == null) return new int[]{};
+		
+		int[] array3 = new int[array1.length + array2.length];
+		System.arraycopy(array1, 0, array3, 0, array1.length);
+		System.arraycopy(array2, 0, array3, array1.length, array2.length);
+		
+		//得到重复元素个数
+		int counts = 0;
+		for(int i=0;i<array3.length-1;i++){
+			for(int j=i+1;j<array3.length;j++){
+				if(array3[i] == array3[j])
+					counts++;
+			}
+		}
+		
+		//删除重复元素
+		int[] array4 = new int[array3.length - counts];
+		int index = 0;
+		for(int i=0;i<array3.length;i++){
+			boolean flag = false;
+			for(int j=0;j<array4.length;j++){
+				if(array4[j] == array3[i]){
+					flag = true;
+					break;
+				}
+			}
+				
+			if(flag == false){
+				array4[index++] = array3[i];
+			}
+		}
+		
+		//冒泡排序
+		for(int i=1;i<array4.length;i++){
+			for(int j=0;j<array4.length-i;j++){
+				if(array4[j]>array4[j+1]){
+					int sto = array4[j];
+					array4[j] = array4[j+1];
+					array4[j+1] = sto;
+				}
+			}
+		}
+		return  array4;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(size<0 || oldArray==null) return null;
+		
+		int[] newArray = new int[oldArray.length + size];
+		for(int i=0;i<oldArray.length;i++){
+			newArray[i] = oldArray[i];
+		}
+		for(int i=0;i<size;i++){
+			newArray[oldArray.length+i] = 0;
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max<=1) return new int[]{};
+		else{
+			int i=1;
+			int j=1;
+			int[] fib = new int[max];
+			fib[0] = fib[1] = 1;
+			int index = 2;
+			for(int k=2;k<max;k= i + j){
+				i = j;
+				j = k;
+				fib[index++] = j;
+			}
+			fib = removeZero(fib);
+			return fib;
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max<=2) return new int[]{};
+		else{
+			int[] prime = new int[max];
+			int index =0;
+			for(int i=2;i<max;i++){
+				int j=2;
+				while(i%j!=0){
+					j++;
+				}
+				if(i==j){
+					prime[index++] = i;
+				}
+			}
+			prime = removeZero(prime);
+			return prime;
+		}
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max<=6) return new int[]{};
+		else{
+			int[] perNum = new int[max];
+			int index = 0;
+			for(int i=2;i<max;i++){
+				int sum = 0;
+				for(int j=1;j<i;j++){
+					if(i%j==0) sum+=j; 
+				}
+				if(sum == i) perNum[index++] = i;
+			}
+			perNum = removeZero(perNum);
+			return perNum;
+		}
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String link = "";
+		for(int i=0;i<array.length-1;i++){
+			link += array[i]+seperator;
+		}
+		return link+array[array.length-1];
+	}
+}
diff --git a/group01/1814014897/zhouhui/src/week02/array/ArrayUtilTest.java b/group01/1814014897/zhouhui/src/week02/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..b18125ca1c
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/array/ArrayUtilTest.java
@@ -0,0 +1,74 @@
+package week02.array;
+
+import org.junit.*;
+
+/**
+ * 
+ * @author Hui Zhou
+ * @version 1.0 2017-02-28
+ *
+ */
+
+public class ArrayUtilTest {
+	
+	ArrayUtil array;
+
+	@Before
+	public void setUp() throws Exception {
+		array = new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] origin = {7,9,30,3};
+		array.reverseArray(origin);
+		Assert.assertArrayEquals(new int[]{3,30,9,7},origin);
+		origin = new int[]{7,9,30,3,4};
+		array.reverseArray(origin);
+		Assert.assertArrayEquals(new int[]{4,3,30,9,7},origin);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		 int[] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		 Assert.assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5},array.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = new int[]{3, 5, 7, 8};  int[] a2 = new int[]{4, 5, 6, 7};
+		Assert.assertArrayEquals(new int[]{3,4,5,6,7,8}, array.merge(a1, a2));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = new int[]{2,3,6};
+		Assert.assertArrayEquals(new int[]{2,3,6,0,0,0,},array.grow(oldArray, 3));
+	}
+
+	@Test
+	public void testFibonacci() {
+		Assert.assertArrayEquals(new int[]{1,1,2,3,5,8,13},array.fibonacci(15));
+		Assert.assertArrayEquals(new int[]{},array.fibonacci(1));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		Assert.assertArrayEquals(new int[]{2,3,5,7,11,13,17,19},array.getPrimes(23));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		Assert.assertArrayEquals(new int[]{},array.getPerfectNumbers(6));
+		Assert.assertArrayEquals(new int[]{6},array.getPerfectNumbers(10));
+		Assert.assertArrayEquals(new int[]{6,28},array.getPerfectNumbers(30));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] arr= new int[]{3,8,9};
+		String seperator = "-";
+		Assert.assertEquals("3-8-9", array.join(arr, seperator));
+	}
+
+}
diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/LoginAction.java b/group01/1814014897/zhouhui/src/week02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..100779527c
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package week02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author Hui Zhou
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/Struts.java b/group01/1814014897/zhouhui/src/week02/litestruts/Struts.java
new file mode 100644
index 0000000000..92663a7dc4
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/litestruts/Struts.java
@@ -0,0 +1,120 @@
+package week02.litestruts;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+import javax.xml.parsers.*;
+import org.w3c.dom.*;
+import org.xml.sax.SAXException;
+import week01.BasicDataStructure.LinkedList;
+import week01.BasicDataStructure.List;
+
+/**
+ * @author Hui Zhou
+ * @version 1.0 2017-02-28
+ */
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	//读取配置文件struts.xml
+    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    	DocumentBuilder builder;
+    	Document doc = null; 
+    	View view = new View();  //实例化View（后面调用view，存储parameters以及jsp，最后return view）
+	try {
+		builder = factory.newDocumentBuilder();
+		File f = new File("src/week02/litestruts/struts.xml");
+	    	doc = builder.parse(f);
+	} catch (ParserConfigurationException|SAXException|IOException e) {
+		e.printStackTrace();
+	} 
+    	
+    	//根据actionName找到相对应的action
+    	Element root = doc.getDocumentElement();
+    	NodeList actionNode = root.getElementsByTagName("action");
+    	Element action = null;
+    	for(int i=0;i<actionNode.getLength();i++){
+    		NamedNodeMap attributes = actionNode.item(i).getAttributes();
+    		for(int j=0;j<attributes.getLength();j++){
+    			Node attribute = attributes.item(j);
+    			String value = attribute.getNodeValue();
+    			if(value.equals(actionName)){
+    				action = (Element) actionNode.item(i);
+    			}
+    		}
+    	}
+    	
+    	//根据action找到相对应的class
+    	String actionClass = action.getAttribute("class");
+    	try {
+		Class<?> cls = Class.forName(actionClass);
+		Object obj = cls.newInstance();
+		Method setName = cls.getMethod("setName", String.class); 
+		Method setPassword = cls.getMethod("setPassword", String.class);
+		setName.invoke(obj, parameters.get("name"));
+		setPassword.invoke(obj, parameters.get("password"));
+			
+		//通过反射调用对象的exectue 方法,并获得返回值
+		Method execute = cls.getMethod("execute");
+		String exe_val = (String) execute.invoke(obj);
+			
+		//通过反射找到对象的所有getter方法,通过反射来调用
+		Method[] met = cls.getDeclaredMethods();
+		List list = new LinkedList();
+		for(int i=0;i<met.length;i++){
+			if(met[i].getName().startsWith("get")){
+				list.add(met[i]);
+			}
+		}
+			
+		Method[] getter = new Method[list.size()];
+		for(int i=0;i<list.size();i++){
+			getter[i] = (Method) list.get(i);
+		}
+			
+		//通过反射来调用,把值和属性形成一个HashMap,例如 {"message","login successful"} 
+		Map<String ,String> param = new HashMap<>();
+		for(int i=0;i<getter.length;i++){
+			if(getter[i].equals(cls.getMethod("getMessage")))
+			param.put("message",(String) getter[i].invoke(obj));
+		}
+			
+		//放到View对象的parameters
+		view.setParameters(param);
+			
+		//根据struts.xml中的 <result> 配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp字段中
+		if(exe_val.equals("success"))
+			view.setJsp("/jsp/homepage.jsp");
+		else view.setJsp("/jsp/showLogin.jsp");
+			
+	} catch (ClassNotFoundException|InstantiationException|IllegalAccessException
+		|NoSuchMethodException|SecurityException|IllegalArgumentException|InvocationTargetException e) {
+			e.printStackTrace();
+		} 
+    	
+    	return view;
+    }   
+}
diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java b/group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..e65f6525bd
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java
@@ -0,0 +1,41 @@
+package week02.litestruts;
+
+import java.util.*;
+import org.junit.*;
+
+/**
+ * @author Hui Zhou
+ * @version 1.0 2017-02-28
+ */
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/View.java b/group01/1814014897/zhouhui/src/week02/litestruts/View.java
new file mode 100644
index 0000000000..3043fb5d5a
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/litestruts/View.java
@@ -0,0 +1,28 @@
+package week02.litestruts;
+
+import java.util.Map;
+
+/**
+ * @author Hui Zhou
+ * @version 1.0 2017-02-28
+ */
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/struts.xml b/group01/1814014897/zhouhui/src/week02/litestruts/struts.xml
new file mode 100644
index 0000000000..f449db14dd
--- /dev/null
+++ b/group01/1814014897/zhouhui/src/week02/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="week02.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="week02.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/2137642225/work01/README.md b/group01/2137642225/work01/README.md
new file mode 100644
index 0000000000..46aae880a3
--- /dev/null
+++ b/group01/2137642225/work01/README.md
@@ -0,0 +1,6 @@
+- 实现基本的数据结构
+# ArrayList
+# LinkedList
+# Stack
+# Queue
+# BinaryTree
\ No newline at end of file
diff --git a/group01/2137642225/work02/.classpath b/group01/2137642225/work02/.classpath
new file mode 100644
index 0000000000..f832756744
--- /dev/null
+++ b/group01/2137642225/work02/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group13/413007522/lesson01/.gitignore b/group01/2137642225/work02/.gitignore
similarity index 100%
rename from group13/413007522/lesson01/.gitignore
rename to group01/2137642225/work02/.gitignore
diff --git a/group01/2137642225/work02/.project b/group01/2137642225/work02/.project
new file mode 100644
index 0000000000..e340a1dc5b
--- /dev/null
+++ b/group01/2137642225/work02/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>work02</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs b/group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..838bd9d694
--- /dev/null
+++ b/group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/group01/2137642225/work02/README.md b/group01/2137642225/work02/README.md
new file mode 100644
index 0000000000..ce9e536748
--- /dev/null
+++ b/group01/2137642225/work02/README.md
@@ -0,0 +1 @@
+-- 实现数组工具类和读取xml
\ No newline at end of file
diff --git a/group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java b/group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..f760a015f9
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,236 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if (origin != null && origin.length > 1) {
+			int len = origin.length;
+			int temp;
+			for(int left = 0,right = len - 1; left < right; left++,right = len - left - 1){
+				temp = origin[left];
+				origin[left] = origin[right];
+				origin[right] = temp;
+			}
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	public int[] removeZero(int[] oldArray){
+		int[] newArray = null;
+		if (oldArray != null && oldArray.length > 0) {
+			int[] indexArray = new int[oldArray.length];
+			int j = 0;
+			for (int i = 0; i < oldArray.length; i++) {
+				if(oldArray[i] != 0){
+					indexArray[j++] = i;
+				}
+			}
+			newArray = new int[j];
+			for (int i = 0; i < j; i++) {
+				newArray[i] = oldArray[indexArray[i]];
+			}
+			indexArray = null;
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		if(array1 == null || array1.length <= 0){
+			return array2;
+		}
+		if(array2 == null || array2.length <= 0){
+			return array1;
+		}
+		int[] tempArray = new int[array1.length + array2.length];
+		int i = 0,j = 0,k = 0;
+		for (; i < array1.length && j < array2.length; ) {
+			if (array1[i] > array2[j]) {
+				tempArray[k++] = array2[j++];
+			}
+			else if(array1[i] < array2[j]){
+				tempArray[k++] = array1[i++];
+			}
+			else {
+				tempArray[k++] = array1[i++];
+				j++;
+			}
+		}
+		// 以array1为结束点
+		if(array1[array1.length - 1] > array2[array2.length - 1]){
+			for (; i < array1.length;) {
+				tempArray[k++] = array1[i++];
+			}
+		} else { // 以array2为结束点
+			for (; j < array2.length;) {
+				tempArray[k++] = array1[j++];
+			}
+		}
+		int[] mergeArray = new int[k];
+		for (int l = 0; l < mergeArray.length; l++) {
+			mergeArray[l] = tempArray[l];
+		}
+		tempArray = null;
+		return mergeArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(size <= 0){
+			throw new RuntimeException("size大于0");
+		}
+		int[] newArray = null;
+		if(oldArray != null && oldArray.length > 0){
+			newArray = new int[oldArray.length + size];
+			for (int i = 0; i <  oldArray.length; i++) {
+				newArray[i] = oldArray[i];
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max <= 1){
+			return new int[0];
+		}
+		int[] tempArray = new int[max];
+		int i = 0;
+		tempArray[i++] = 1;
+		tempArray[i] = 1;
+		while(tempArray[i] < max){
+			i++;
+			tempArray[i] = tempArray[i - 1] + tempArray[i - 2];
+		}
+		int[] array = new int[i];
+		for (int j = 0; j < array.length; j++) {
+			array[j] = tempArray[j];
+		}
+		tempArray = null;
+		return array;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max <= 2){
+			return new int[0];
+		}
+		int[] tempArray = new int[max];
+		int j = 0;
+		for (int i = 2; i < max; i++) {
+			if(isPrime(i)){
+				tempArray[j++] = i;
+			}
+		}
+		int[] array = new int[j];
+		for (int i = 0; i < j; i++) {
+			array[i] = tempArray[i];
+		}
+		tempArray = null;
+		return array;
+	}
+	
+	private boolean isPrime(int i) {
+		for (int j = 2; j < i; j++) {
+			if(i % j == 0){
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max <= 2){
+			return new int[0];
+		}
+		int[] tempArray = new int[max];
+		int j = 0;
+		for (int i = 3; i < max; i++) {
+			if(isPerfectNumber(i)){
+				tempArray[j++] = i;
+			}
+		}
+		int[] array = new int[j];
+		for (int i = 0; i < j; i++) {
+			array[i] = tempArray[i];
+		}
+		tempArray = null;
+		return array;
+	}
+	
+	private boolean isPerfectNumber(int num) {
+		int sum = 1;
+		for(int i = 2; i < num; i++){
+			if(num % i == 0){
+				sum += i;
+			}
+		}
+		if(sum == num){
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		char[] chars = new char[array.length<<1];
+		for (int i = 0,j = 1; i < chars.length; i+=2,j+=2) {
+			chars[i] = (char) (array[i>>1] + 48);
+			chars[j] = seperator.charAt(0);
+		}
+		return new String(chars, 0, chars.length - 1);
+	}
+	
+
+}
diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java b/group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/Struts.java b/group01/2137642225/work02/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..ab57e27477
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,338 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+@SuppressWarnings("unchecked")
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+    	
+    	if(actionName == null || actionName.trim().equals("")){
+    		throw new RuntimeException("传入的actionName不能为null或者空");
+    	}
+    	
+    	// 0. 读取配置文件struts.xml ok
+    	URL resource = Struts.class.getResource("/com/coderising/litestruts");
+    	String path = "";
+    	try {
+    		path = URLDecoder.decode(resource.getPath(), "UTF-8");
+    	} catch (UnsupportedEncodingException e) {
+    		// TODO Auto-generated catch block
+    		e.printStackTrace();
+    	}
+    	Map<String,Map<String, Object>> actionMap = xmlParse(path + File.separator + "struts.xml");
+    	
+    	// 找到访问的action通过actionName
+    	Map<String,Object> action = findAction(actionName,actionMap);
+    	
+    	//1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+    	//据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+    	//("name"="test" ,  "password"="1234") ,     	
+    	//那就应该调用 setName和setPassword方法
+    	// 实例化对象
+    	String className = (String) action.get("class");
+    	Class<?> clazz = getActionClassByClassName(className);
+		Object actionObject = buildActionObject(clazz,parameters);
+    	
+		//2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+    	// 执行访问的方法
+    	String result = (String) executeAccessMethod(actionObject,clazz,"execute");
+    	
+    	//3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+    	//通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+    	//放到View对象的parameters
+    	Map<String,Object> parameterMap = getActionObjectParameters(actionObject,clazz);
+    	
+    	//4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+    	//放到View对象的jsp字段中。
+    	String jsp = getViewPath(action,result);
+    	View v = buildView(jsp,parameterMap);
+    	
+    	return v;
+    }
+
+    private static Class<?> getActionClassByClassName(String className) {
+    	
+    	if(className == null || className.trim().equals("")){
+    		throw new RuntimeException("没有配置action的class属性");
+    	}
+    	
+    	try {
+    		return Class.forName(className);
+    	} catch (ClassNotFoundException e) {
+    		e.printStackTrace();
+    	}
+		return null;
+	}
+
+	/**
+     * 获取配置文件中视图的路径
+     * @param action
+     * @param result
+     * @return
+     */
+	private static String getViewPath(Map<String, Object> action, String result) {
+		
+		if(result != null && !result.trim().equals("")){
+			
+			List<Map<String,Object>> resultList = (List<Map<String, Object>>) action.get("childElementList");
+			
+			if(resultList != null && !resultList.isEmpty()){
+				for (Map<String, Object> map : resultList) {
+					String readResult = (String) map.get("name");
+					if(result.equals(readResult)){
+						Object jsp = map.get("text");
+						if(jsp  == null){
+				    		throw new RuntimeException("未找到与返回结果[" + result + "]之对应的视图");
+				    	}
+						return (String) jsp;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 执行访问的方法
+	 * @param actionObject 访问的action实例化的对象
+	 * @param clazz 访问的action Class
+	 * @param methodName 访问的方法名称
+	 * @return 方法的执行结果
+	 */
+	private static Object executeAccessMethod(Object actionObject, Class<?> clazz,String methodName) {
+		try {
+			Method method = clazz.getMethod(methodName);
+			return method.invoke(actionObject);
+		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 执行action对象的getter方法，将执行结果放入map中
+	 * @param actionObject 访问的action实例化的对象
+	 * @param clazz 访问的action Class
+	 * @return
+	 */
+	private static Map<String, Object> getActionObjectParameters(Object actionObject, Class<?> clazz) {
+		
+		Map<String, Object> parameterMap = new HashMap<>();
+		Object result = null;
+		Method[] declaredMethods = clazz.getDeclaredMethods();
+		Class<?>[] parameterTypes = null;
+		if (declaredMethods != null && declaredMethods.length > 0) {
+			try {
+				for (Method method : declaredMethods) {
+					if (isGetMethod(method)) {
+						parameterTypes = method.getParameterTypes();
+						result = method.invoke(actionObject, (Object[])parameterTypes);
+
+						String methodName = method.getName();
+						// getMessage 截取 M(转小写) + 截取essage
+						String subMethodName = Character.toLowerCase(methodName.charAt(3))
+								+ methodName.substring(4, methodName.length());
+
+						parameterMap.put(subMethodName, result);
+					}
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return parameterMap;
+	}
+
+	/**
+	 * 建立action对象
+	 * @param clazz
+	 * @param parameters 传过来的参数
+	 * @return
+	 */
+	private static Object buildActionObject(@SuppressWarnings("rawtypes") Class clazz, Map<String,String> parameters) {
+		
+		Object actionObj = null;
+		try {
+			actionObj = clazz.newInstance();
+			// 给action对象的属性设置传过来的参数值
+			setProperties(clazz, actionObj, parameters);
+			return actionObj;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		if(actionObj == null){
+    		throw new RuntimeException("无法实例化action:");
+    	}
+		return actionObj;
+	}
+
+	/**
+	 * 建立View对象
+	 * @param jsp 
+	 * @param parameters
+	 * @return
+	 */
+	private static View buildView(String jsp,Map<String,Object> parameters) {
+		
+		View v = new View();
+		v.setJsp(jsp);
+		v.setParameters(parameters);
+		
+		return v;
+	}
+
+	/**
+	 * 通过actionName在action列表中查找对应的action(map)
+	 * @param actionName
+	 * @param actionMap action列表
+	 * @return
+	 */
+	private static Map<String, Object> findAction(String actionName, Map<String, Map<String, Object>> actionMap) {
+		Map<String, Object> action = (actionMap != null && !actionMap.isEmpty()) ? actionMap.get(actionName) : null;
+		if(action == null){
+    		throw new RuntimeException("访问的action[" + actionName + "]不存在");
+    	}
+		return action;
+	}
+
+	/**
+	 * 是否是getter方法
+	 * @param method2
+	 * @return
+	 */
+	private static boolean isGetMethod(Method method2) {
+		if(method2.getName().startsWith("get")){
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * 为Action对象设置属性，也就是执行与参数对应的setter方法
+	 * @param clazz
+	 * @param actionObj
+	 * @param parameters 参数
+	 * @throws NoSuchMethodException
+	 * @throws SecurityException
+	 * @throws InstantiationException
+	 * @throws IllegalAccessException
+	 * @throws IllegalArgumentException
+	 * @throws InvocationTargetException
+	 */
+	private static void setProperties(@SuppressWarnings("rawtypes") Class clazz, Object actionObj, Map<String, String> parameters) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		
+		if(parameters != null && !parameters.isEmpty()){
+			Set<Entry<String, String>> entrySet = parameters.entrySet();
+			for (Entry<String, String> entry : entrySet) {
+				String key = entry.getKey();
+				String value = entry.getValue();
+				Method method = clazz.getMethod("set" + Character.toUpperCase(key.charAt(0)) + key.substring(1, key.length()),String.class);
+				method.invoke(actionObj, value);
+			}
+		}
+	}
+
+	/**
+	 * 解析xml配置文件
+	 * @param xmlFilePath
+	 * @return
+	 */
+	private static Map<String,Map<String, Object>> xmlParse(String xmlFilePath) {
+		File file = new File(xmlFilePath);
+		SAXReader saxReader = new SAXReader();
+		
+		Map<String,Map<String, Object>> actionMap = new HashMap<>();
+		try {
+			Document document = saxReader.read(file);
+			Element rootElement = document.getRootElement();
+			actionMap = readActionElement(rootElement);
+			return actionMap;
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 读取action节点元素
+	 * @param rootElement
+	 * @return
+	 */
+	private static Map<String, Map<String, Object>> readActionElement(Element rootElement) {
+		// 存储所有action的信息
+		Map<String, Map<String, Object>> actionMap = new HashMap<>();
+		for (Iterator<Element> i = rootElement.elementIterator();i.hasNext();) {
+			Element element = i.next();
+			Map<String, Object> action = readElement(element );			
+			// 设置actionMap key[action的name] value[action map]
+			actionMap.put((String) action.get("name"), action);
+		}
+		return actionMap;
+	}
+	
+	/**
+	 * 读取元素信息
+	 * @param element
+	 * @return
+	 */
+	private static Map<String, Object> readElement(Element element) {
+		// 读属性
+		Map<String, Object> map = readAttribute(element);
+		String text = readText(element);
+		map.put("text", text);
+		List<Map<String, Object>> childElementList = new ArrayList<>();
+		// 查找子元素
+		for(Iterator<Element> iterator = element.elementIterator();iterator.hasNext();){
+			childElementList.add(readElement(iterator.next()));
+		}
+		if(childElementList != null && !childElementList.isEmpty()){
+			map.put("childElementList", childElementList);
+		}
+		return map;
+	}
+
+	/**
+	 * 读取节点的text "<e>text</e>"
+	 * @param element
+	 * @return
+	 */
+	private static String readText(Element element) {
+		return element.getText();
+	}
+
+
+	/**
+	 * 读取节点的属性值 
+	 * @param element
+	 * @return map key:属性名称 value：属性值
+	 */
+	private static Map<String, Object> readAttribute(Element element) {
+		Map<String,Object> attrMap = new HashMap<>();
+		for (Iterator<Attribute> a = element.attributeIterator();a.hasNext();) {
+			Attribute attr = a.next();
+			attrMap.put(attr.getName(), attr.getData());
+		}
+		return attrMap;
+	} 
+	
+}
diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java b/group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a0408661a5
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,44 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+	
+}
diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/View.java b/group01/2137642225/work02/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..b94168e223
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/litestruts/View.java
@@ -0,0 +1,26 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	@SuppressWarnings("rawtypes")
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	@SuppressWarnings("rawtypes")
+	public Map getParameters() {
+		return parameters;
+	}
+	@SuppressWarnings("rawtypes")
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/struts.xml b/group01/2137642225/work02/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..a4ca47c733
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java b/group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java
new file mode 100644
index 0000000000..2be9e8bbfd
--- /dev/null
+++ b/group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java
@@ -0,0 +1,76 @@
+package com.coderising.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.array.ArrayUtil;
+
+public class ArrayUtilTest {
+	
+	private ArrayUtil arrayUtil;
+	@Before
+	public void setUp() throws Exception {
+		arrayUtil = new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] array = new int[]{7, 9, 30, 3, 4};
+		arrayUtil.reverseArray(array);
+		assertArrayEquals(new int[]{4,3,30,9,7}, array);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int[] oldArray = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArray = arrayUtil.removeZero(oldArray);
+		assertEquals(12, newArray.length);
+		assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, newArray);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] array1 = new int[]{3, 5, 7,8};
+		int[] array2 = new int[]{4, 5, 6,7};
+		int[] merge = arrayUtil.merge(array1, array2);
+		assertArrayEquals(new int[]{3,4,5,6,7,8}, merge);
+		assertEquals(6, merge.length);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] array = new int[]{2,3,6};
+		int[] grow = arrayUtil.grow(array, 3);
+		assertArrayEquals(new int[]{2,3,6,0,0,0}, grow);
+		assertEquals(6, grow.length);
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] fibonacci = arrayUtil.fibonacci(15);
+		assertArrayEquals(new int[]{1,1,2,3,5,8,13}, fibonacci);
+		assertEquals(7, fibonacci.length);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] primes = arrayUtil.getPrimes(23);
+		assertArrayEquals(new int[]{2,3,5,7,11,13,17,19}, primes);
+		assertEquals(8, primes.length);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] perfectNumbers = arrayUtil.getPerfectNumbers(1000);
+		assertArrayEquals(new int[]{6,28,496}, perfectNumbers);
+	}
+
+	@Test
+	public void testJoin() {
+		String join = arrayUtil.join(new int[]{3,8,9}, "-");
+		assertEquals("3-8-9", join);
+	}
+
+}
diff --git a/group01/280646174/basic/pom.xml b/group01/280646174/basic/pom.xml
index 421a346d70..ed06a3dfdc 100644
--- a/group01/280646174/basic/pom.xml
+++ b/group01/280646174/basic/pom.xml
@@ -12,6 +12,14 @@
     <artifactId>basic</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>org.jvnet.hudson.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
         <!--test-->
         <dependency>
             <groupId>junit</groupId>
diff --git a/group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java b/group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java
new file mode 100644
index 0000000000..aca4036e16
--- /dev/null
+++ b/group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java
@@ -0,0 +1,275 @@
+package com.coding2017.array;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * 
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        if (nullOrEmpty(origin) || origin.length == 1) {
+            return;
+        }
+
+        int length = origin.length;
+        for (int i = 0; i < length / 2; i++) {
+            swap(origin, i, length - 1 - i);
+        }
+    }
+
+    private void swap(int[] array, int index1, int index2) {
+        int temp = array[index1];
+        array[index1] = array[index2];
+        array[index2] = temp;
+    }
+
+    /**
+     * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     * 
+     * @param oldArray
+     * @return
+     */
+    public int[] removeZero(int[] oldArray) {
+        if (nullOrEmpty(oldArray)) {
+            return new int[0];
+        }
+
+        int[] tempArray = new int[oldArray.length];
+        int newLength = 0;
+        for (int e : oldArray) {
+            if (e != 0) {
+                tempArray[newLength++] = e;
+            }
+        }
+        int[] newArray = new int[newLength];
+        System.arraycopy(tempArray, 0, newArray, 0, newLength);
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3
+     * 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+     * 
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public int[] merge(int[] array1, int[] array2) {
+        if (nullOrEmpty(array1)) {
+            return array2;
+        }
+        if (nullOrEmpty(array2)) {
+            return array1;
+        }
+
+        int index1 = 0;
+        int index2 = 0;
+        int length1 = array1.length;
+        int length2 = array2.length;
+        int[] tempArray = new int[length1 + length2];
+        int pos = 0;
+        while (index1 < length1 && index2 < length2) {
+            if (array1[index1] == array2[index2]) {
+                // 元素相同情况下, 忽略其中一个
+                index1++;
+            } else if (array1[index1] < array2[index2]) {
+                tempArray[pos++] = array1[index1++];
+            } else {
+                tempArray[pos++] = array2[index2++];
+            }
+        }
+
+        while (index1 < length1) {
+            tempArray[pos++] = array1[index1++];
+        }
+        while (index2 < length2) {
+            tempArray[pos++] = array2[index2++];
+        }
+
+        if (pos == tempArray.length) {
+            return tempArray;
+        }
+        int[] result = new int[pos];
+        System.arraycopy(tempArray, 0, result, 0, pos);
+        return result;
+    }
+
+    private boolean nullOrEmpty(int[] array) {
+        return array == null || array.length == 0;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size =
+     * 3,则返回的新数组为 [2,3,6,0,0,0]
+     * 
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        assert oldArray != null;
+        assert size >= 0;
+
+        int[] result = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, result, 0, oldArray.length);
+        return result;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+     * 
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (max <= 1) {
+            return new int[0];
+        }
+        int f1 = 1;
+        int f2 = 1;
+        // 超过max的那个pos, 也就是最终长度
+        int maxPos = 2;
+        while (true) {
+            int curData = f1 + f2;
+            if (curData > max) {
+                break;
+            }
+            f1 = f2;
+            f2 = curData;
+            maxPos++;
+        }
+
+        int[] result = new int[maxPos];
+        f1 = 1;
+        f2 = 1;
+        for (int i = 0; i < maxPos; i++) {
+            if (i == 0 || i == 1) {
+                result[i] = 1;
+            } else {
+                result[i] = f1 + f2;
+                f1 = f2;
+                f2 = result[i];
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * 
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        if (max <= 2) {
+            return new int[0];
+        }
+
+        boolean[] data = new boolean[max];
+
+        // 1. 把2放置为true
+        data[2] = true;
+
+        // 2. 把奇数首先初始化为true
+        for (int i = 3; i < max; i += 2) {
+            data[i] = true;
+        }
+
+        // 3. 从3开始到max/2检查素数, 然后把这个数的倍数全都置为false
+        for (int i = 3; i < max / 2; i += 2) {
+            data[i] = isPrime(i);
+            for (int j = 3; i * j < max; j += 2) {
+                data[i * j] = false;
+            }
+        }
+
+        // 4. 查一共多少个
+        int primeCount = 0;
+        for (int i = 0; i < max; i++) {
+            if (data[i]) {
+                primeCount++;
+            }
+        }
+
+        // 5. 构造结果
+        int[] result = new int[primeCount];
+        int pos = 0;
+        for (int i = 0; i < max; i++) {
+            if (data[i]) {
+                result[pos++] = i;
+            }
+        }
+        return result;
+    }
+
+    private boolean isPrime(int n) {
+        for (int i = 2; i <= n / 2; i++) {
+            if (n % i == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * 
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        boolean[] data = new boolean[max];
+        int count = 0;
+        for (int i = 0; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                data[i] = true;
+                count++;
+            }
+        }
+
+        int[] result = new int[count];
+        int pos = 0;
+        for (int i = 0; i < max; i++) {
+            if (data[i]) {
+                result[pos++] = i;
+            }
+        }
+        return result;
+    }
+
+    private boolean isPerfectNumber(int n) {
+        if (n <= 0) {
+            return false;
+        }
+
+        int temp = 0;
+        for (int i = 1; i <= n / 2; i++) {
+            if (n % i == 0) {
+                temp += i;
+            }
+        }
+
+        return temp == n;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+     * 
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        if (nullOrEmpty(array)) {
+            return "";
+        }
+        StringBuilder builder = new StringBuilder(String.valueOf(array[0]));
+        for (int i = 1; i < array.length; i++) {
+            builder.append(seperator).append(array[i]);
+        }
+        return builder.toString();
+    }
+}
diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java
new file mode 100644
index 0000000000..e03337fbd3
--- /dev/null
+++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coding2017.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java
new file mode 100644
index 0000000000..eba40d8412
--- /dev/null
+++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java
@@ -0,0 +1,127 @@
+package com.coding2017.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.common.base.Strings;
+
+public class Struts {
+
+    private static final String STRUTS_FILE_PATH = "/struts.xml";
+
+    private static final String ACTION_EXECUTE_METHOD = "execute";
+
+    /**
+     * 0. 读取配置文件struts.xml
+     * 
+     * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象） 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+     * ("name"="test" , "password"="1234") , 那就应该调用 setName和setPassword方法
+     * 
+     * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+     * 
+     * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , 放到View对象的parameters
+     * 
+     * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。
+     * 
+     * @param actionName
+     * @param parameters
+     * @return
+     */
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        if (Strings.isNullOrEmpty(actionName)) {
+            return null;
+        }
+
+        StrutsDefinition strutsDefinition = StrutsXmlUtil
+                .parseResource(Struts.class.getResourceAsStream(STRUTS_FILE_PATH));
+        if (strutsDefinition == null) {
+            return null;
+        }
+        StrutsDefinition.ActionDefinition actionDefinition = findActionDefinition(strutsDefinition, actionName);
+        if (actionDefinition == null) {
+            return null;
+        }
+        try {
+            Class<?> actionClass = Class.forName(actionDefinition.getClazz());
+            Object action = actionClass.newInstance();
+            setParameter(actionClass, action, parameters);
+
+            Method executeMethod = actionClass.getMethod(ACTION_EXECUTE_METHOD);
+            String actionResult = (String) executeMethod.invoke(action);
+
+            StrutsDefinition.ResultDefinition resultDefinition = findResultDefinition(actionDefinition, actionResult);
+            if (resultDefinition == null) {
+                return null;
+            }
+
+            View view = new View();
+            view.setJsp(resultDefinition.getValue());
+            view.setParameters(makeParameters(action, actionClass));
+            return view;
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        } catch (InstantiationException e) {
+            throw new RuntimeException(e);
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static Map makeParameters(Object action, Class<?> actionClass)
+            throws InvocationTargetException, IllegalAccessException {
+        Method[] methods = actionClass.getMethods();
+        Map map = new HashMap();
+        for (Method method : methods) {
+            if (method.getName().startsWith("get")) {
+                map.put(getField(method.getName()), method.invoke(action));
+            }
+        }
+        return map;
+    }
+
+    private static String getField(String getMethodName) {
+        String field = getMethodName.substring(3);
+        return field.substring(0, 1).toLowerCase() + field.substring(1);
+    }
+
+    private static StrutsDefinition.ResultDefinition findResultDefinition(
+            StrutsDefinition.ActionDefinition actionDefinition, String actionResult) {
+        for (StrutsDefinition.ResultDefinition resultDefinition : actionDefinition.getResultDefinitions()) {
+            if (resultDefinition.getName().equals(actionResult)) {
+                return resultDefinition;
+            }
+        }
+        return null;
+    }
+
+    private static void setParameter(Class<?> actionClass, Object action, Map<String, String> parameters)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        for (Map.Entry<String, String> paramEntry : parameters.entrySet()) {
+            String setMethodName = getMethodName(paramEntry.getKey());
+            Method method = actionClass.getMethod(setMethodName, String.class);
+            method.invoke(action, paramEntry.getValue());
+        }
+    }
+
+    private static String getMethodName(String field) {
+        return "set" + field.substring(0, 1).toUpperCase() + field.substring(1);
+    }
+
+    private static StrutsDefinition.ActionDefinition findActionDefinition(StrutsDefinition strutsDefinition,
+            String actionName) {
+        for (StrutsDefinition.ActionDefinition definition : strutsDefinition.getActionDefinitionList()) {
+            if (actionName.equals(definition.getName())) {
+                return definition;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java
new file mode 100644
index 0000000000..a54c3c9eb7
--- /dev/null
+++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java
@@ -0,0 +1,69 @@
+package com.coding2017.litestruts;
+
+import java.util.List;
+
+/**
+ * Created by kaitao.li on 2017/3/4.
+ */
+public class StrutsDefinition {
+    private List<ActionDefinition> actionDefinitionList;
+
+    public List<ActionDefinition> getActionDefinitionList() {
+        return actionDefinitionList;
+    }
+
+    public void setActionDefinitionList(List<ActionDefinition> actionDefinitionList) {
+        this.actionDefinitionList = actionDefinitionList;
+    }
+
+    public static class ActionDefinition {
+        private String name;
+        private String clazz;
+        private List<ResultDefinition> resultDefinitions;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getClazz() {
+            return clazz;
+        }
+
+        public void setClazz(String clazz) {
+            this.clazz = clazz;
+        }
+
+        public List<ResultDefinition> getResultDefinitions() {
+            return resultDefinitions;
+        }
+
+        public void setResultDefinitions(List<ResultDefinition> resultDefinitions) {
+            this.resultDefinitions = resultDefinitions;
+        }
+    }
+
+    public static class ResultDefinition {
+        private String name;
+        private String value;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+    }
+}
\ No newline at end of file
diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java
new file mode 100644
index 0000000000..b6f15ddb90
--- /dev/null
+++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java
@@ -0,0 +1,58 @@
+package com.coding2017.litestruts;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+/**
+ * Created by kaitao.li on 2017/3/4.
+ */
+public class StrutsXmlUtil {
+
+    public static StrutsDefinition parseResource(InputStream inputStream) {
+
+        SAXReader saxReader = new SAXReader();
+        Document document;
+        try {
+            document = saxReader.read(inputStream);
+        } catch (DocumentException e) {
+            throw new RuntimeException("解析xml出错");
+        }
+
+        // 获取根节点对象
+        Element rootElement = document.getRootElement();
+        StrutsDefinition strutsDefinition = new StrutsDefinition();
+        Iterator<Element> actionIterator = rootElement.elements("action").iterator();
+        List<StrutsDefinition.ActionDefinition> actionDefinitions = new ArrayList<StrutsDefinition.ActionDefinition>();
+        strutsDefinition.setActionDefinitionList(actionDefinitions);
+        while (actionIterator.hasNext()) {
+            Element actionElement = actionIterator.next();
+            StrutsDefinition.ActionDefinition actionDefinition = new StrutsDefinition.ActionDefinition();
+            actionDefinition.setName(actionElement.attributeValue("name"));
+            actionDefinition.setClazz(actionElement.attributeValue("class"));
+            actionDefinitions.add(actionDefinition);
+
+            Iterator<Element> resultIterator = actionElement.elements("result").iterator();
+            List<StrutsDefinition.ResultDefinition> resultDefinitions = new ArrayList<StrutsDefinition.ResultDefinition>();
+            actionDefinition.setResultDefinitions(resultDefinitions);
+            while (resultIterator.hasNext()) {
+                Element resultElement = resultIterator.next();
+                StrutsDefinition.ResultDefinition resultDefinition = new StrutsDefinition.ResultDefinition();
+                resultDefinition.setName(resultElement.attributeValue("name"));
+                resultDefinition.setValue(resultElement.getTextTrim());
+                resultDefinitions.add(resultDefinition);
+            }
+        }
+        return strutsDefinition;
+    }
+
+    public static void main(String[] args) {
+        StrutsXmlUtil.parseResource(StrutsXmlUtil.class.getResourceAsStream("/struts.xml"));
+    }
+}
\ No newline at end of file
diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java
new file mode 100644
index 0000000000..af3374ce24
--- /dev/null
+++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java
@@ -0,0 +1,26 @@
+package com.coding2017.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group01/280646174/basic/src/main/resources/struts.xml b/group01/280646174/basic/src/main/resources/struts.xml
new file mode 100644
index 0000000000..01fc673ed6
--- /dev/null
+++ b/group01/280646174/basic/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding2017.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding2017.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java b/group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..23f650dd57
--- /dev/null
+++ b/group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java
@@ -0,0 +1,72 @@
+package com.coding2017.array;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Created by kaitao.li on 2017/3/4.
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil arrayUtil = new ArrayUtil();
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] oddArray = new int[] { 1, 2, 3 };
+        arrayUtil.reverseArray(oddArray);
+        assertArrayEquals(oddArray, new int[] { 3, 2, 1 });
+
+        int[] evenArray = new int[] { 1, 2, 3, 4 };
+        arrayUtil.reverseArray(evenArray);
+        assertArrayEquals(evenArray, new int[] { 4, 3, 2, 1 });
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int oldArr[] = new int[] { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
+        int[] newArray = arrayUtil.removeZero(oldArr);
+        assertArrayEquals(newArray, new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 });
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a1 = new int[] { 3, 5, 7, 8 };
+        int[] a2 = new int[] { 4, 5, 6, 7 };
+        int[] merge = arrayUtil.merge(a1, a2);
+        assertArrayEquals(merge, new int[] { 3, 4, 5, 6, 7, 8 });
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[] oldArray = new int[] { 2, 3, 6 };
+        int[] grow = arrayUtil.grow(oldArray, 3);
+        assertArrayEquals(grow, new int[] { 2, 3, 6, 0, 0, 0 });
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        int[] fibonacci = arrayUtil.fibonacci(15);
+        assertArrayEquals(fibonacci, new int[] { 1, 1, 2, 3, 5, 8, 13 });
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int[] primes = arrayUtil.getPrimes(23);
+        assertArrayEquals(primes, new int[] { 2, 3, 5, 7, 11, 13, 17, 19 });
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int[] perfectNumbers = arrayUtil.getPerfectNumbers(1000);
+        assertArrayEquals(perfectNumbers, new int[] { 6, 28, 496 });
+    }
+
+    @Test
+    public void join() throws Exception {
+        int[] array = new int[] { 1, 2, 3 };
+        assertTrue("1-2-3".equals(arrayUtil.join(array, "-")));
+    }
+
+}
\ No newline at end of file
diff --git a/group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java b/group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..3d877a0eab
--- /dev/null
+++ b/group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.coding2017.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); // 密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
diff --git a/group01/280646174/pom.xml b/group01/280646174/pom.xml
index c99644072b..75422ec638 100644
--- a/group01/280646174/pom.xml
+++ b/group01/280646174/pom.xml
@@ -19,6 +19,17 @@
 
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>org.jvnet.hudson.dom4j</groupId>
+                <artifactId>dom4j</artifactId>
+                <version>1.6.1-hudson-3</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>20.0</version>
+            </dependency>
             <!--test-->
             <dependency>
                 <groupId>junit</groupId>
diff --git a/group01/360176196/.classpath b/group01/360176196/.classpath
index fb5011632c..3c662f3c9b 100644
--- a/group01/360176196/.classpath
+++ b/group01/360176196/.classpath
@@ -2,5 +2,8 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/UserLibrary"/>
+	<classpathentry kind="lib" path="D:/Download/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group01/360176196/.settings/org.eclipse.core.resources.prefs b/group01/360176196/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..99f26c0203
--- /dev/null
+++ b/group01/360176196/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/group01/360176196/src/xqfGit/dataStructure/conderising/ArrayUtil.java b/group01/360176196/src/xqfGit/dataStructure/conderising/ArrayUtil.java
new file mode 100644
index 0000000000..93762e4818
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/conderising/ArrayUtil.java
@@ -0,0 +1,179 @@
+package xqfGit.dataStructure.conderising;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int [] temp = new int[origin.length];
+		for(int i =0;i<origin.length;i++){
+			temp[origin.length-1-i]=origin[i];
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int num = 0;
+		int index = 0;
+		int [] temp = new int[oldArray.length];
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i]!=0){
+				temp[index] = oldArray[i];
+				num =num +1;
+				index++;
+			}
+		}
+		return Arrays.copyOf(temp, num);
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int index = 0;
+		int [] temp = new int[array1.length+array2.length];
+		for(int j=0;j<array1.length;j++){
+			for(int i =0;i<array2.length;i++){
+				if(array1[j] > array2[i]){
+					temp[index] = array2[i];
+					index++;
+				} if(array1[j] == array2[i]){
+					temp[index] = array2[i];
+					index++;
+					continue;
+				} if(array1[j] < array2[i]){
+					temp[index] = array1[j];
+					index++;
+					continue;
+				}
+			}
+		}
+		return  temp;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return Arrays.copyOf(oldArray, oldArray.length+size);
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int n=0;
+		int[] temp ={};
+		if(max == 1){
+			return temp;
+		}else{
+			for(int i =0;i<30;i++){
+				if(fibo(i) > max){
+					n = i;
+					break;
+				}
+			}
+			for(int i = 0;i < n;i++){
+				temp = Arrays.copyOf(temp, i+1);
+				temp[temp.length-1] = fibo(i);
+			}
+			return temp;
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] temp ={};
+		for(int i =2;i<max;i++){
+			if(isPrimes(i)){
+				temp = Arrays.copyOf(temp, i-1);
+				temp[temp.length-1] = i;
+			}
+		}
+		return removeZero(temp);
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer temp = new StringBuffer();
+		for(int i = 0;i<array.length;i++){
+			if(i == array.length-1){
+				temp.append(array[i]);
+			}else{
+				temp.append(array[i]+seperator);
+			}
+		}
+		return temp.toString();
+	}
+	
+	/*
+	 * 菲波那切数列
+	 */
+	private int fibo(int n){
+		if(n < 2){
+			return 1;
+		}
+		return fibo(n-1)+fibo(n-2);
+	}
+	
+	/*
+	 * 判断一个数是否为素数(质数)
+	 */
+	private boolean isPrimes(int n){
+		for(int i =2;i<=Math.sqrt(n);i++){
+			if(n%i == 0)
+		    return false;
+		}
+		return true;
+	}
+}
diff --git a/group01/360176196/src/xqfGit/dataStructure/conderising/TestArrayUtil.java b/group01/360176196/src/xqfGit/dataStructure/conderising/TestArrayUtil.java
new file mode 100644
index 0000000000..287310f384
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/conderising/TestArrayUtil.java
@@ -0,0 +1,10 @@
+package xqfGit.dataStructure.conderising;
+
+public class TestArrayUtil {
+	
+	public static void main(String[] args) {
+		int[] num ={1,4,6,7,3,5};
+		String temp=new ArrayUtil().join(num, "-");
+		System.out.println(temp);
+	}
+}
diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/LoginAction.java b/group01/360176196/src/xqfGit/dataStructure/litileStruts/LoginAction.java
new file mode 100644
index 0000000000..2179bddf5f
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/LoginAction.java
@@ -0,0 +1,39 @@
+package xqfGit.dataStructure.litileStruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/Struts.java b/group01/360176196/src/xqfGit/dataStructure/litileStruts/Struts.java
new file mode 100644
index 0000000000..df87a85ed9
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/Struts.java
@@ -0,0 +1,61 @@
+package xqfGit.dataStructure.litileStruts;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	SAXReader reader = new SAXReader();
+    	try {
+    		//解析Struts.xml
+			Document document = reader.read(new File("struts.xml"));
+			Element root = document.getRootElement();
+			List<Element> list_child = root.elements();
+			String actionname = list_child.get(0).attributeValue("name");
+			String actionClass = list_child.get(0).attributeValue("class");
+			
+			//通过反射，创建Action，调用方法。
+			try {
+				Class clazz = Class.forName(actionClass);
+				Method setName =  clazz.getMethod("setName");
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}    	
+    	return null;
+    }    
+
+}
diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java b/group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java
new file mode 100644
index 0000000000..8c9b6cd92e
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package xqfGit.dataStructure.litileStruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java b/group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java
new file mode 100644
index 0000000000..2ec6974941
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java
@@ -0,0 +1,23 @@
+package xqfGit.dataStructure.litileStruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml b/group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml
new file mode 100644
index 0000000000..865d390eb6
--- /dev/null
+++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="xqfGit.dataStructure.litileStruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="xqfGit.dataStructure.litileStruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/378213871/.classpath b/group01/378213871/.classpath
index fb5011632c..d815a5f517 100644
--- a/group01/378213871/.classpath
+++ b/group01/378213871/.classpath
@@ -2,5 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="/Users/Victor/Desktop/dom4j-1.6.1.jar" sourcepath="/Volumes/TimeMachine/dom4j_1_6_1.zip"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group01/378213871/src/com/coderising/week02/array/ArrayUtil.java b/group01/378213871/src/com/coderising/week02/array/ArrayUtil.java
new file mode 100644
index 0000000000..476e0ff7a8
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/array/ArrayUtil.java
@@ -0,0 +1,255 @@
+package com.coderising.week02.array;
+
+import java.util.Stack;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		Stack stack = new Stack();
+		for(int i = 0; i < origin.length; i++ ) {
+			stack.push(origin[i]);
+		}
+		for(int i = 0; i < origin.length; i++ ) {
+			int j = (int) stack.pop();
+			origin[i] = j;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if (oldArray == null) {
+			throw new IllegalArgumentException();
+		}
+		//算出oldArr数组中0的个数
+		int zeronum = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				zeronum++;
+			}
+		}
+		int j = 0; //新数组的索引
+		int[] newArray = new int[oldArray.length - zeronum];
+		//遍历旧数组
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] != 0) {
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int array1length = array1.length;
+		int array2length = array2.length;
+		int repeat = 0; //初始化两个数组中重复数字的个数为0
+		for (int i = 0; i < array1length; i++) {
+			for (int j = 0; j < array2length; j++) {
+				if (array1[i] == array2[j]) {
+					repeat++;
+				}
+			}
+		}
+		//合并后的数组长度为两个数组长度相加减去重复数字的个数
+		int[] mergearray = new int[array1length+array2length-repeat];
+		int index1 = 0; //array1数组的当前索引
+		int index2 = 0; //array2数组的当前索引
+		int indexMerge = 0; //mergearray数组的当前索引
+		//循环，只要array1和array2都没有循环完就一直循环
+		while (index1 < array1length && index2 < array2length) {
+			//如果当前array1[index1]比array2[index2]小,则将mergearray[indexMerge]元素置为array1[index1]
+			//同时index1++，indexMerge++
+			if (array1[index1] < array2[index2]) {
+				mergearray[indexMerge++] = array1[index1++];
+			} 
+			//如果当前array1[index1]比array2[index2]大,则将mergearray[indexMerge]元素置为array2[index2]
+			//同时index2++，indexMerge++
+			if (array1[index1] > array2[index2]) {
+				mergearray[indexMerge++] = array2[index2++];
+			}
+			//如果当前array1[index1]等于array2[index2],则将mergearray[indexMerge]元素置为array1[index1]
+			//同时index1++，index2++，indexMerge++
+			else {
+				mergearray[indexMerge] = array1[index1];
+				index1++;
+				index2++;
+				indexMerge++;
+			}
+		}
+		//上个循环能够结束，说明array1已经循环完或array2已经循环完  
+		//下述两个循环只能有一个满足循环条件  
+		//只要array1没有循环完，就把array1中剩下的元素依次放入mergearray中  
+		while (index1 < array1length) {
+			mergearray[indexMerge++] = array1[index1++];
+		}
+		//只要array2没有循环完，就把array2中剩下的元素依次放入mergearray中  
+		while (index2 < array2length) {
+			mergearray[indexMerge++] = array2[index2++];
+		}
+		
+		return mergearray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int oldLength = oldArray.length;
+		int[] newArray = new int[oldLength+size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldLength);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		int count = 0; //数列项数
+		//循环得到数组的长度
+		while (fiboindex(count) < max) {
+			count++;
+		}
+		int[] fiboArray = new int[count];
+		if(max <= 1) {
+			fiboArray = new int[] {};
+		} else {
+			for (int i = 0; i < count; i++) {
+				fiboArray[i] = fiboindex(i);
+			}
+		}
+		return fiboArray;
+	}
+	//通过递归的方式推导斐波那契数列
+	public static int fiboindex(int n) {
+		if (n < 2) {
+			return 1;
+		}
+		else {
+			return fiboindex(n-1) + fiboindex(n-2);
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if (max < 2) {
+			throw new IllegalArgumentException();
+		}
+		int i,j;
+		int count = 0;
+		int[] maxArray = new int[max];
+		for(i = 2; i < max; i++) {
+			for (j = 2; j <= i; j++) {
+				if (i % j == 0) {
+					break;
+				} 
+			}
+			if(j >= i) {
+				maxArray[count]=i;
+				count++;
+			}
+		}
+		int[] primeArray = new int[count];
+		System.arraycopy(maxArray, 0, primeArray, 0, count);
+		return primeArray;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if (max < 0) {
+			throw new IllegalArgumentException();
+		}
+		
+		int i,j;
+		int count = 0;
+		int[] maxArray = new int[max];
+
+		
+		for(i = 1; i < max; i++) {
+			int sum = 0;
+			for(j = 1; j < i; j++) {
+				if (i % j == 0) {
+					sum += j;
+				}
+			}
+			if (sum == i) {
+				maxArray[count] = i;
+				count++;
+			}
+		}
+		
+		int[] perfectArray = new int[count];
+		System.arraycopy(maxArray, 0, perfectArray, 0, count);
+		
+		return perfectArray;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if (array == null) {
+			throw new IllegalArgumentException();
+		}
+		if (array.length == 0) {
+			return "";
+		}
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			sb.append(array[i]);
+			if(i != array.length - 1) {
+				sb.append(seperator);
+			}
+		}
+		
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java b/group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..8d82ff3095
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java
@@ -0,0 +1,90 @@
+package com.coderising.week02.array;
+
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	
+	private ArrayUtil arrayUtil;
+	
+	@Before
+	public void setUp() {
+		arrayUtil = new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+        int[] a = {};
+        arrayUtil.reverseArray(a);
+        Assert.assertArrayEquals(new int[] {}, a);
+
+        int[] b = {1, 2, 3};
+        arrayUtil.reverseArray(b);
+        Assert.assertArrayEquals(new int[] {3, 2, 1}, b);
+
+	}
+
+	@Test
+	public void testRemoveZero() {
+        int oldArr1[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int newArr1[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5};
+        Assert.assertArrayEquals(newArr1, arrayUtil.removeZero(oldArr1));
+
+        int oldArr2[] = {0, 0, 0, 0, 0};
+        int newArr2[] = {};
+        Assert.assertArrayEquals(newArr2, arrayUtil.removeZero(oldArr2));
+
+        int oldArr3[] = {0, 0, 0, 0, 0, 1, 2, 3};
+        int newArr3[] = {1, 2, 3};
+        Assert.assertArrayEquals(newArr3, arrayUtil.removeZero(oldArr3));
+
+	}
+
+	@Test
+	public void testMerge() {
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        Assert.assertArrayEquals(new int[] {3, 4, 5, 6, 7, 8}, arrayUtil.merge(a1, a2));
+	}
+
+	@Test
+	public void testGrow() {
+        int[] a1 = {2, 3, 6};
+        Assert.assertArrayEquals(new int[] {2, 3, 6, 0, 0, 0}, arrayUtil.grow(a1, 3));
+        Assert.assertArrayEquals(new int[] {2, 3, 6}, arrayUtil.grow(a1, 0));
+	}
+
+	@Test
+	public void testFibonacci() {
+        Assert.assertArrayEquals(new int[] {}, arrayUtil.fibonacci(1));
+        Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 5, 8, 13}, arrayUtil.fibonacci(15));
+
+        int[] a = new int[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597,
+                2584, 4181, 6765};
+        Assert.assertArrayEquals(a, arrayUtil.fibonacci(6766));
+ 
+	}
+
+	@Test
+	public void testGetPrimes() {
+        Assert.assertArrayEquals(new int[] {2, 3, 5, 7, 11, 13, 17, 19}, arrayUtil.getPrimes(23));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+        Assert.assertArrayEquals(new int[] {6, 28, 496}, arrayUtil.getPerfectNumbers(497));
+        Assert.assertArrayEquals(new int[] {6, 28, 496, 8128}, arrayUtil.getPerfectNumbers(8129));
+
+	}
+
+	@Test
+	public void testJoin() {
+        Assert.assertEquals("", arrayUtil.join(new int[] {}, "-"));
+        Assert.assertEquals("1", arrayUtil.join(new int[] {1}, "-"));
+        Assert.assertEquals("1-2-8-3-4-5", arrayUtil.join(new int[] {1, 2, 8, 3, 4, 5}, "-"));
+
+	}
+
+}
diff --git a/group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java b/group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..01e4011dfd
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.week02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/378213871/src/com/coderising/week02/litestruts/Struts.java b/group01/378213871/src/com/coderising/week02/litestruts/Struts.java
new file mode 100644
index 0000000000..103cb3c7ed
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/litestruts/Struts.java
@@ -0,0 +1,110 @@
+package com.coderising.week02.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	try {
+    		//将xml转换为输出流
+    		InputStream inputStream = Struts.class.getResourceAsStream("struts.xml");
+    		//创建SAXReader读取器，专门用于读取xml
+    		SAXReader saxReader = new SAXReader();
+    		//读取xml文件，获得Document对象
+    		Document document = saxReader.read(inputStream);
+    		//actionName对应的类名
+    		String className = "";
+    		//获取文档的根节点
+    		Element rootElement = document.getRootElement();
+    		Iterator iterator = rootElement.elementIterator("action");
+    		//actionName对应的action
+    		Element targetAction = null;
+    		//对action节点下的所有子节点进行遍历  
+    		while (iterator.hasNext()) {
+    			Element element = (Element) iterator.next();
+    			String name = element.attributeValue("name");
+    			if(name.equals(actionName)) {
+    				className = element.attributeValue("class");
+    				targetAction = element;
+    				break;
+    			}
+    		}
+    		
+    		Class<?> clazz = Class.forName(className);
+    		Object instance = clazz.newInstance();
+    		
+    		Set<String> keySet = parameters.keySet();
+    		for(String key : keySet) {
+    			// 将变量名称拼成set方法名
+    			String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
+    			Class<?> type = clazz.getDeclaredField(key).getType();
+    			Method method = clazz.getDeclaredMethod(methodName, type);
+    			//依次调用相应的set方法
+    			method.invoke(instance, parameters.get(key));
+    		}
+    		//通过反射调用对象的exectue方法,并获得返回值
+    		String result = (String)clazz.getDeclaredMethod("execute").invoke(instance);
+    		
+    		Method[] declaredMethods = clazz.getDeclaredMethods();
+    		HashMap<String, String> map = new HashMap<>();
+    		for (int i = 0; i < declaredMethods.length; i++) {
+    			if (declaredMethods[i].getName().startsWith("get")) {
+    				String fieldValue = (String) declaredMethods[i].invoke(instance);
+    				String fieldName = declaredMethods[i].getName().substring(3, 4).toLowerCase() 
+    								+ declaredMethods[i].getName().substring(4);
+    				map.put(fieldName, fieldValue);
+    			}
+    		}
+    		
+    		View view = new View();
+    		view.setParameters(map);
+    		
+    		Iterator elementIterator = targetAction.elementIterator("result");
+    		while(elementIterator.hasNext()) {
+    			Element element = (Element) elementIterator.next();
+    			if (result.equals(element.attributeValue("name"))) {
+    				view.setJsp(element.getText());
+    			}
+    		}
+    		
+    		return view;
+    		
+    		
+    	} catch(Exception e) {
+    		e.printStackTrace();
+    	}
+    	return null;
+    }    
+
+}
diff --git a/group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java b/group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..ee10f9d60f
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.week02.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/378213871/src/com/coderising/week02/litestruts/View.java b/group01/378213871/src/com/coderising/week02/litestruts/View.java
new file mode 100644
index 0000000000..3e85e82938
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.week02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/378213871/src/com/coderising/week02/litestruts/struts.xml b/group01/378213871/src/com/coderising/week02/litestruts/struts.xml
new file mode 100644
index 0000000000..3254cb8ba6
--- /dev/null
+++ b/group01/378213871/src/com/coderising/week02/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.week02.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.week02.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/496740686/build.gradle b/group01/496740686/build.gradle
new file mode 100644
index 0000000000..864adec57e
--- /dev/null
+++ b/group01/496740686/build.gradle
@@ -0,0 +1,23 @@
+
+apply plugin: 'java'
+apply plugin: 'maven'
+
+group = 'com'
+version = '0.0.1-SNAPSHOT'
+
+description = """camile"""
+
+sourceCompatibility = 1.7
+targetCompatibility = 1.7
+
+
+
+repositories {
+        
+    maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
+}
+dependencies {
+    // https://mvnrepository.com/artifact/commons-digester/commons-digester
+    compile group: 'commons-digester', name: 'commons-digester', version: '2.1'
+    testCompile group: 'junit', name: 'junit', version:'4.12'
+}
diff --git a/group01/496740686/gradle/wrapper/gradle-wrapper.properties b/group01/496740686/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..f9c28ae23b
--- /dev/null
+++ b/group01/496740686/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sun Mar 05 11:04:29 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-all.zip
diff --git a/group01/496740686/gradlew b/group01/496740686/gradlew
new file mode 100644
index 0000000000..9d82f78915
--- /dev/null
+++ b/group01/496740686/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/group01/496740686/gradlew.bat b/group01/496740686/gradlew.bat
new file mode 100644
index 0000000000..72d362dafd
--- /dev/null
+++ b/group01/496740686/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/group01/496740686/settings.gradle b/group01/496740686/settings.gradle
new file mode 100644
index 0000000000..e034102924
--- /dev/null
+++ b/group01/496740686/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'camile'
diff --git a/group01/496740686/src/Impl/MyLinkedList.java b/group01/496740686/src/Impl/MyLinkedList.java
deleted file mode 100644
index 017bac5baf..0000000000
--- a/group01/496740686/src/Impl/MyLinkedList.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package Impl;
-
-import Interface.Iterator;
-import Interface.LinkedList;
-import ex.MyArrest;
-
-/**
- * Created by Administrator on 2017/2/26.
- */
-public class MyLinkedList extends LinkedList {
-    private MyLinkedList.Node head;
-    private int size = 1;
-
-    public MyLinkedList() {
-
-    }
-
-    private static class Node {
-        Object data;
-        MyLinkedList.Node next;
-
-        public Node(Object data, Node next) {
-            this.data = data;
-            this.next = next;
-        }
-    }
-
-    public void add(Object o) {
-        if (this.size == 1) {
-            head.data = o;
-            return;
-        }
-        MyLinkedList.Node newHead = new MyLinkedList.Node(o, this.head);
-        this.size += 1;
-        this.head = newHead;
-    }
-
-
-    public void add(int index, Object o) {
-        IndexVildate(index);
-        int pos = 0;
-        if (index == 1) {
-            this.head = new Node(o, null);
-            return;
-        }
-        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
-            pos += 1;
-            if (pos == index - 1) {
-                node.data = o;
-                this.size += 1;
-            }
-        }
-    }
-
-
-    public Object get(int index) {
-        int pos = 0;
-        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
-            if (pos == index - 1) {
-                return node.data;
-            }
-            pos += 1;
-        }
-        return null;
-    }
-
-
-    public Object remove(int index) {
-        IndexVildate(index);
-        int pos = 0;
-        MyLinkedList.Node preNode;
-        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
-            pos += 1;
-            if (pos == index - 2) {
-                //record previous node
-                preNode = node;
-                if (pos == index - 1) {
-                    MyLinkedList.Node willDelNode = node;
-                    preNode.next = node.next;
-                    node = null;
-                    this.size -= 1;
-                    return willDelNode;
-                }
-            }
-        }
-        return null;
-    }
-
-
-    public int size() {
-        return this.size;
-    }
-
-
-    public void addFirst(Object o) {
-        MyLinkedList.Node newHead = this.head;
-        newHead.data = o;
-        newHead.next = this.head;
-        this.size += 1;
-        this.head = newHead;
-    }
-
-
-    public void addLast(Object o) {
-        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
-            if (node.next == null) {
-                MyLinkedList.Node lastNode = new MyLinkedList.Node(o, null);
-                node.next = lastNode;
-                this.size += 1;
-            }
-        }
-    }
-
-
-    public Object removeFirst() {
-        MyLinkedList.Node oldHead = this.head;
-        this.head = oldHead.next;
-        this.size -= 1;
-        return oldHead;
-    }
-
-
-    public Object removeLast() {
-        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
-            if (node.next == null) {
-                MyLinkedList.Node willDelNode = node.next;
-                node.next = null;
-                this.size -= 1;
-                return willDelNode;
-            }
-        }
-        return null;
-    }
-
-    public Iterator iterator() {
-        return new LinkedListIterator(this);
-    }
-
-    private class LinkedListIterator implements Iterator {
-        private MyLinkedList linkedList;
-        private int index;
-
-        public LinkedListIterator(MyLinkedList linkedList) {
-            this.linkedList = linkedList;
-            this.index = linkedList.size;
-        }
-
-        @Override
-        public boolean hasNext() {
-            if (index > linkedList.size) {
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        @Override
-        public Object next() {
-            Object obj = linkedList.get(index);
-            index++;
-            return obj;
-        }
-    }
-
-    private void IndexVildate(int index) {
-        if (index > this.size || index < 0) {
-            System.out.println("happend error");
-        }
-    }
-
-    public static void main(String[] args) {
-        MyLinkedList linkedList = new MyLinkedList();
-        linkedList.add(1, 23);
-        MyArrest.arrestEqByBasicType(1, linkedList.size());
-
-    }
-}
diff --git a/group01/496740686/src/Impl/MyQueue.java b/group01/496740686/src/Impl/MyQueue.java
deleted file mode 100644
index 1a029738d2..0000000000
--- a/group01/496740686/src/Impl/MyQueue.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package Impl;
-
-import Interface.Queue;
-
-/**
- * Created by Administrator on 2017/2/26.
- */
-public class MyQueue extends Queue {
-
-    private Node first; // beginning of queue
-    private Node last; // end of queue
-    private int size; // number of elements on queue
-
-    private static class Node {
-        private Object value;
-        private Node next;
-
-        public Node(Object value, Node next) {
-            this.value = value;
-            this.next = next;
-        }
-    }
-
-    public MyQueue() {
-        first = null;
-        last = null;
-        int n = 0;
-    }
-
-    @Override
-    public void enQueue(Object o) {
-        Node oldlast = this.last;
-        this.last = new Node(o, null);
-        size += 1;
-        //第一个进队列
-        if (isEmpty()) {
-            first = last;
-        } else {
-            oldlast.next = this.last;
-        }
-
-    }
-
-    @Override
-    public Object deQueue() {
-        if (isEmpty()) {
-            return null;
-        } else {
-            Node oldFirst = this.first;
-            Node newFirst = this.first.next;
-            this.first = null;
-            this.first = newFirst;
-            this.size -= 1;
-            return oldFirst;
-
-        }
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    @Override
-    public int size() {
-        return size;
-    }
-}
diff --git a/group01/496740686/src/Impl/MyStack.java b/group01/496740686/src/Impl/MyStack.java
deleted file mode 100644
index 3a7c119e99..0000000000
--- a/group01/496740686/src/Impl/MyStack.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package Impl;
-
-import Interface.ArrayList;
-import Interface.Stack;
-
-
-/**
- * Created by Administrator on 2017/2/26.
- */
-public class MyStack extends Stack {
-
-    private MyStack.Node first; // beginning of queue
-    private MyStack.Node last; // end of queue
-    private int size; // number of elements on queue
-
-    private static class Node {
-        private Object value;
-        private MyStack.Node next;
-
-        public Node(Object value, MyStack.Node next) {
-            this.value = value;
-            this.next = next;
-        }
-    }
-
-    public MyStack() {
-        first = null;
-        last = null;
-        int n = 0;
-    }
-
-    @Override
-    public void push(Object o) {
-        if (isEmpty()) {
-            MyStack.Node oldFirst = this.first;
-            this.first = new MyStack.Node(o, null);
-            size += 1;
-            //第一个进栈
-            if (isEmpty()) {
-                first = last;
-            } else {
-                oldFirst.next = this.last;
-            }
-        }
-    }
-
-    @Override
-    public Object pop() {
-        if (isEmpty()) {
-            return null;
-        } else {
-            MyStack.Node oldFirst = this.first;
-            this.first = oldFirst.next;
-            this.size -= 1;
-            return oldFirst;
-
-        }
-
-    }
-
-    @Override
-    public Object peek() {
-        return this.first;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return first == null;
-    }
-}
diff --git a/group01/496740686/src/Interface/ArrayList.java b/group01/496740686/src/Interface/ArrayList.java
deleted file mode 100644
index 567c1996b1..0000000000
--- a/group01/496740686/src/Interface/ArrayList.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package Interface;
-
-
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData = new Object[100];
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index, Object o){
-		
-	}
-	
-	public Object get(int index){
-		return null;
-	}
-	
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public Iterator iterator(){
-		return null;
-	}
-	
-}
diff --git a/group01/496740686/src/Interface/BinaryTreeNode.java b/group01/496740686/src/Interface/BinaryTreeNode.java
deleted file mode 100644
index c5480a614f..0000000000
--- a/group01/496740686/src/Interface/BinaryTreeNode.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package Interface;
-
-public class BinaryTreeNode {
-	
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	
-	public Object getData() {
-		return data;
-	}
-	public void setData(Object data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-	
-	public BinaryTreeNode insert(Object o){
-		return  null;
-	}
-	
-}
diff --git a/group01/496740686/src/Interface/Iterator.java b/group01/496740686/src/Interface/Iterator.java
deleted file mode 100644
index 77e3c0b216..0000000000
--- a/group01/496740686/src/Interface/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package Interface;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/group01/496740686/src/Interface/LinkedList.java b/group01/496740686/src/Interface/LinkedList.java
deleted file mode 100644
index b7166a1731..0000000000
--- a/group01/496740686/src/Interface/LinkedList.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package Interface;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index , Object o){
-		
-	}
-	public Object get(int index){
-		return null;
-	}
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public void addFirst(Object o){
-		
-	}
-	public void addLast(Object o){
-		
-	}
-	public Object removeFirst(){
-		return null;
-	}
-	public Object removeLast(){
-		return null;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-		
-	}
-
-}
diff --git a/group01/496740686/src/Interface/List.java b/group01/496740686/src/Interface/List.java
deleted file mode 100644
index 98d6a4da0a..0000000000
--- a/group01/496740686/src/Interface/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package Interface;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/group01/496740686/src/Interface/Queue.java b/group01/496740686/src/Interface/Queue.java
deleted file mode 100644
index 8e3a5d5f43..0000000000
--- a/group01/496740686/src/Interface/Queue.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package Interface;
-
-public class Queue {
-	
-	public void enQueue(Object o){		
-	}
-	
-	public Object deQueue(){
-		return null;
-	}
-	
-	public boolean isEmpty(){
-		return false;
-	}
-	
-	public int size(){
-		return -1;
-	}
-}
diff --git a/group01/496740686/src/Interface/Stack.java b/group01/496740686/src/Interface/Stack.java
deleted file mode 100644
index 7e536e250a..0000000000
--- a/group01/496740686/src/Interface/Stack.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package Interface;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){		
-	}
-	
-	public Object pop(){
-		return null;
-	}
-	
-	public Object peek(){
-		return null;
-	}
-	public boolean isEmpty(){
-		return false;
-	}
-	public int size(){
-		return -1;
-	}
-}
diff --git a/group01/496740686/src/main/java/com/camile/App.java b/group01/496740686/src/main/java/com/camile/App.java
new file mode 100644
index 0000000000..862f102bc3
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/App.java
@@ -0,0 +1,13 @@
+package com.camile;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}
diff --git a/group01/496740686/src/Impl/MyArraryList.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java
similarity index 93%
rename from group01/496740686/src/Impl/MyArraryList.java
rename to group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java
index 20fb5dcfdf..8185620b6e 100644
--- a/group01/496740686/src/Impl/MyArraryList.java
+++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java
@@ -1,8 +1,8 @@
-package Impl;
+package com.camile._1.Impl;
 
-import Interface.ArrayList;
-import Interface.Iterator;
-import ex.MyArrest;
+import com.camile._1.Interface.ArrayList;
+import com.camile._1.Interface.Iterator;
+import com.camile._1.ex.MyArrest;
 
 /**
  * Created by Administrator on 2017/2/25.
@@ -89,7 +89,7 @@ public ArrayListIterator(MyArraryList arraryList) {
             this.index = arraryList.size - 1;
         }
 
-        @Override
+
         public boolean hasNext() {
             if (index > arraryList.size) {
                 return true;
@@ -98,7 +98,7 @@ public boolean hasNext() {
             }
         }
 
-        @Override
+
         public Object next() {
             Object obj = arraryList.get(index);
             index++;
diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java
new file mode 100644
index 0000000000..367b722025
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java
@@ -0,0 +1,177 @@
+package com.camile._1.Impl;
+
+import com.camile._1.Interface.Iterator;
+import com.camile._1.Interface.LinkedList;
+import com.camile._1.ex.MyArrest;
+
+/**
+ * Created by Administrator on 2017/2/26.
+ */
+public class MyLinkedList extends LinkedList {
+    private MyLinkedList.Node head;
+    private int size = 1;
+
+    public MyLinkedList() {
+
+    }
+
+    private static class Node {
+        Object data;
+        MyLinkedList.Node next;
+
+        public Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+
+    public void add(Object o) {
+        if (this.size == 1) {
+            head.data = o;
+            return;
+        }
+        MyLinkedList.Node newHead = new MyLinkedList.Node(o, this.head);
+        this.size += 1;
+        this.head = newHead;
+    }
+
+
+    public void add(int index, Object o) {
+        IndexVildate(index);
+        int pos = 0;
+        if (index == 1) {
+            this.head = new Node(o, null);
+            return;
+        }
+        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
+            pos += 1;
+            if (pos == index - 1) {
+                node.data = o;
+                this.size += 1;
+            }
+        }
+    }
+
+
+    public Object get(int index) {
+        int pos = 0;
+        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
+            if (pos == index - 1) {
+                return node.data;
+            }
+            pos += 1;
+        }
+        return null;
+    }
+
+
+    public Object remove(int index) {
+        IndexVildate(index);
+        int pos = 0;
+        MyLinkedList.Node preNode;
+        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
+            pos += 1;
+            if (pos == index - 2) {
+                //record previous node
+                preNode = node;
+                if (pos == index - 1) {
+                    MyLinkedList.Node willDelNode = node;
+                    preNode.next = node.next;
+                    node = null;
+                    this.size -= 1;
+                    return willDelNode;
+                }
+            }
+        }
+        return null;
+    }
+
+
+    public int size() {
+        return this.size;
+    }
+
+
+    public void addFirst(Object o) {
+        MyLinkedList.Node newHead = this.head;
+        newHead.data = o;
+        newHead.next = this.head;
+        this.size += 1;
+        this.head = newHead;
+    }
+
+
+    public void addLast(Object o) {
+        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
+            if (node.next == null) {
+                MyLinkedList.Node lastNode = new MyLinkedList.Node(o, null);
+                node.next = lastNode;
+                this.size += 1;
+            }
+        }
+    }
+
+
+    public Object removeFirst() {
+        MyLinkedList.Node oldHead = this.head;
+        this.head = oldHead.next;
+        this.size -= 1;
+        return oldHead;
+    }
+
+
+    public Object removeLast() {
+        for (MyLinkedList.Node node = this.head; node != null; node = node.next) {
+            if (node.next == null) {
+                MyLinkedList.Node willDelNode = node.next;
+                node.next = null;
+                this.size -= 1;
+                return willDelNode;
+            }
+        }
+        return null;
+    }
+
+    public Iterator iterator() {
+        return new LinkedListIterator(this);
+    }
+
+    private class LinkedListIterator implements Iterator {
+        private MyLinkedList linkedList;
+        private int index;
+
+        public LinkedListIterator(MyLinkedList linkedList) {
+            this.linkedList = linkedList;
+            this.index = linkedList.size;
+        }
+
+        @Override
+        public boolean hasNext() {
+            if (index > linkedList.size) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        @Override
+        public Object next() {
+            Object obj = linkedList.get(index);
+            index++;
+            return obj;
+        }
+    }
+
+    private void IndexVildate(int index) {
+        if (index > this.size || index < 0) {
+            System.out.println("happend error");
+        }
+    }
+
+    public static void main(String[] args) {
+        MyLinkedList linkedList = new MyLinkedList();
+        linkedList.add(1, 23);
+        MyArrest.arrestEqByBasicType(1, linkedList.size());
+
+    }
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java
new file mode 100644
index 0000000000..bcddc8680a
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java
@@ -0,0 +1,68 @@
+package com.camile._1.Impl;
+
+import com.camile._1.Interface.Queue;
+
+/**
+ * Created by Administrator on 2017/2/26.
+ */
+public class MyQueue extends Queue {
+
+    private Node first; // beginning of queue
+    private Node last; // end of queue
+    private int size; // number of elements on queue
+
+    private static class Node {
+        private Object value;
+        private Node next;
+
+        public Node(Object value, Node next) {
+            this.value = value;
+            this.next = next;
+        }
+    }
+
+    public MyQueue() {
+        first = null;
+        last = null;
+        int n = 0;
+    }
+
+    @Override
+    public void enQueue(Object o) {
+        Node oldlast = this.last;
+        this.last = new Node(o, null);
+        size += 1;
+        //第一个进队列
+        if (isEmpty()) {
+            first = last;
+        } else {
+            oldlast.next = this.last;
+        }
+
+    }
+
+    @Override
+    public Object deQueue() {
+        if (isEmpty()) {
+            return null;
+        } else {
+            Node oldFirst = this.first;
+            Node newFirst = this.first.next;
+            this.first = null;
+            this.first = newFirst;
+            this.size -= 1;
+            return oldFirst;
+
+        }
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    @Override
+    public int size() {
+        return size;
+    }
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java
new file mode 100644
index 0000000000..119798a218
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java
@@ -0,0 +1,70 @@
+package com.camile._1.Impl;
+
+import com.camile._1.Interface.ArrayList;
+import com.camile._1.Interface.Stack;
+
+
+/**
+ * Created by Administrator on 2017/2/26.
+ */
+public class MyStack extends Stack {
+
+    private MyStack.Node first; // beginning of queue
+    private MyStack.Node last; // end of queue
+    private int size; // number of elements on queue
+
+    private static class Node {
+        private Object value;
+        private MyStack.Node next;
+
+        public Node(Object value, MyStack.Node next) {
+            this.value = value;
+            this.next = next;
+        }
+    }
+
+    public MyStack() {
+        first = null;
+        last = null;
+        int n = 0;
+    }
+
+    @Override
+    public void push(Object o) {
+        if (isEmpty()) {
+            MyStack.Node oldFirst = this.first;
+            this.first = new MyStack.Node(o, null);
+            size += 1;
+            //第一个进栈
+            if (isEmpty()) {
+                first = last;
+            } else {
+                oldFirst.next = this.last;
+            }
+        }
+    }
+
+    @Override
+    public Object pop() {
+        if (isEmpty()) {
+            return null;
+        } else {
+            MyStack.Node oldFirst = this.first;
+            this.first = oldFirst.next;
+            this.size -= 1;
+            return oldFirst;
+
+        }
+
+    }
+
+    @Override
+    public Object peek() {
+        return this.first;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return first == null;
+    }
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java b/group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java
new file mode 100644
index 0000000000..fb9bf7c2f9
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java
@@ -0,0 +1,34 @@
+package  com.camile._1.Interface;
+
+
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java b/group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java
new file mode 100644
index 0000000000..a38f18788e
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.camile._1.Interface;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java b/group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java
new file mode 100644
index 0000000000..ed642f8295
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java
@@ -0,0 +1,7 @@
+package com.camile._1.Interface;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java b/group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java
new file mode 100644
index 0000000000..25f042f135
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java
@@ -0,0 +1,47 @@
+package com.camile._1.Interface;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/List.java b/group01/496740686/src/main/java/com/camile/_1/Interface/List.java
new file mode 100644
index 0000000000..4d1febe487
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/List.java
@@ -0,0 +1,9 @@
+package com.camile._1.Interface;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java b/group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java
new file mode 100644
index 0000000000..4cc27c9f5f
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java
@@ -0,0 +1,19 @@
+package com.camile._1.Interface;
+
+public class Queue {
+	
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java b/group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java
new file mode 100644
index 0000000000..2c138b8493
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java
@@ -0,0 +1,22 @@
+package com.camile._1.Interface;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group01/496740686/src/ex/MyArrest.java b/group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java
similarity index 95%
rename from group01/496740686/src/ex/MyArrest.java
rename to group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java
index 9987b83535..12cc3df902 100644
--- a/group01/496740686/src/ex/MyArrest.java
+++ b/group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java
@@ -1,4 +1,4 @@
-package ex;
+package com.camile._1.ex;
 
 /**
  * Created by Administrator on 2017/2/26.
diff --git a/group01/496740686/src/main/java/com/camile/_1/package-info.java b/group01/496740686/src/main/java/com/camile/_1/package-info.java
new file mode 100644
index 0000000000..c5edbab3ef
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_1/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 基本的数据结构
+ */
+/**
+ * @author Camile
+ *
+ */
+package  com.camile._1;
\ No newline at end of file
diff --git a/group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java b/group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java
new file mode 100644
index 0000000000..7cf22302bf
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java
@@ -0,0 +1,100 @@
+package com.camile._2.array;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int size = origin.length;
+		int[] newArr = new int[size];
+		for (int index = 0; index <size; index++) {
+			newArr[size - index -1]=origin[index];
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		return null;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		return null;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		return null;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		return null;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		return null;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		return null;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		return null;
+	}
+
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/LoginAction.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/LoginAction.java
new file mode 100644
index 0000000000..5d6a2828a4
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package  com.camile._2.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/Struts.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/Struts.java
new file mode 100644
index 0000000000..a9616cc745
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/Struts.java
@@ -0,0 +1,122 @@
+package com.camile._2.litestruts;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Scanner;
+
+import org.apache.commons.digester.Digester;
+import org.junit.experimental.theories.Theories;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+
+import com.camile._2.litestruts.bean.Action;
+import com.camile._2.litestruts.bean.Result;
+import com.camile._2.litestruts.bean.Structs;
+
+/**
+ * @author Administrator 0. 读取配置文件struts.xml
+ * 
+ *         1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+ *         据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+ *         "password"="1234") , 那就应该调用 setName和setPassword方法
+ * 
+ *         2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+ * 
+ *         3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+ *         {"message": "登录成功"} , 放到View对象的parameters 4. 根据struts.xml中的 <result>
+ *         配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中
+ */
+public class Struts {
+
+	public View runAction(String actionName, Map<String, String> parameters) {
+
+		Structs structs = makeObjFromXml(readProfiles("struts.xml"));
+		for (Action a : structs.getActions()) {
+			if (a.getName().equals(actionName)) {
+				try {
+					Class<?> actionClass = Class.forName(a.getClazz());
+					Object instance = actionClass.newInstance();
+					Field field;
+					// get field
+					for (Map.Entry<String, String> entry : parameters.entrySet()) {
+						field = actionClass.getDeclaredField(entry.getKey());
+						field.setAccessible(true);
+						field.set(instance, entry.getValue());
+					}
+					Method execute = actionClass.getMethod("execute");
+					String resultString = (String) execute.invoke(instance);
+					Method getMessage = actionClass.getMethod("getMessage");
+					String message = (String) getMessage.invoke(instance);
+					Map<String, String> map = new HashMap<>();
+					map.put("message", message);
+					View view = new View();
+					String viewPath;
+					for (Result path : a.getResults()) {
+						if (path.getName().equals(resultString)) {
+							viewPath = path.getValue();
+							view.setParameters(map);
+							view.setJsp(viewPath);
+						}
+					}
+					return view;
+
+				} catch (NoSuchFieldException | SecurityException e) {
+					System.out.println("获取参数失败");
+					e.printStackTrace();
+				} catch (ClassNotFoundException e) {
+					System.out.println("并没有在xml中找到相关action");
+					e.printStackTrace();
+				} catch (InstantiationException | IllegalAccessException e) {
+					System.out.println("获取反射对象失败");
+					e.printStackTrace();
+				} catch (NoSuchMethodException e) {
+					System.out.println("获取方法");
+					e.printStackTrace();
+				} catch (IllegalArgumentException | InvocationTargetException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return null;
+	}
+
+	private URL readProfiles(String filePath) {
+		ClassLoader classLoader = Struts.class.getClassLoader();
+		URL resource = classLoader.getResource(filePath);
+		if (resource == null)
+			throw new RuntimeException("文件不存在");
+		return resource;
+	}
+
+	private Structs makeObjFromXml(URL resource) {
+		Digester digester = new Digester();
+		digester.addObjectCreate("struts", Structs.class);
+		digester.addObjectCreate("struts/action", Action.class);
+		digester.addSetProperties("struts/action", new String[] { "name", "class" }, new String[] { "name", "clazz" });
+		digester.addSetNext("struts/action", "addAction");
+		digester.addObjectCreate("struts/action/result", Result.class);
+		digester.addSetProperties("struts/action/result");
+		digester.addBeanPropertySetter("struts/action/result", "value");
+		digester.addSetNext("struts/action/result", "addResult");
+		try {
+			return (Structs) digester.parse(resource);
+		} catch (IOException | SAXException e) {
+			e.printStackTrace();
+			throw new RuntimeException("解析XML文件时发生错误");
+		}
+	}
+
+	public static void main(String[] args) {
+
+	}
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/View.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/View.java
new file mode 100644
index 0000000000..2a4bb815bd
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.camile._2.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java
new file mode 100644
index 0000000000..2b3ff88897
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java
@@ -0,0 +1,34 @@
+package com.camile._2.litestruts.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Action {
+    private String name;
+    private String clazz;
+    private List<Result> results = new ArrayList<>();
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+
+    public void addResult(Result result) {
+        this.results.add(result);
+    }
+
+    public List<Result> getResults() {
+        return results;
+    }
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java
new file mode 100644
index 0000000000..5850984c27
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java
@@ -0,0 +1,22 @@
+package com.camile._2.litestruts.bean;
+
+public class Result {
+	private String name;
+	private String value;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java
new file mode 100644
index 0000000000..855de8a083
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java
@@ -0,0 +1,16 @@
+package com.camile._2.litestruts.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Structs {
+	private List<Action> actions = new ArrayList<>();
+
+	public void addAction(Action action) {
+		actions.add(action);
+	}
+
+	public List<Action> getActions() {
+		return actions;
+	}
+}
diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java
new file mode 100644
index 0000000000..0763881974
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+/**
+ * @author Administrator
+ *
+ */
+package com.camile._2.litestruts.bean;
\ No newline at end of file
diff --git a/group01/496740686/src/main/java/com/camile/_2/package-info.java b/group01/496740686/src/main/java/com/camile/_2/package-info.java
new file mode 100644
index 0000000000..46f85287db
--- /dev/null
+++ b/group01/496740686/src/main/java/com/camile/_2/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+/**
+ * @author Administrator
+ *
+ */
+package  com.camile._2;
\ No newline at end of file
diff --git a/group01/496740686/src/main/resources/struts.xml b/group01/496740686/src/main/resources/struts.xml
new file mode 100644
index 0000000000..84ca94a962
--- /dev/null
+++ b/group01/496740686/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.camile._2.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.camile._2.litestruts.LoginAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java b/group01/496740686/src/test/java/com/camile/AppTest.java
similarity index 91%
rename from group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java
rename to group01/496740686/src/test/java/com/camile/AppTest.java
index 57fc7ea596..e277ecea87 100644
--- a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java
+++ b/group01/496740686/src/test/java/com/camile/AppTest.java
@@ -1,38 +1,38 @@
-package com.sunline.project_basic_001;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest 
-    extends TestCase
-{
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public AppTest( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite( AppTest.class );
-    }
-
-    /**
-     * Rigourous Test :-)
-     */
-    public void testApp()
-    {
-        assertTrue( true );
-    }
-}
+package com.camile;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}
diff --git a/group01/496740686/src/test/java/com/camile/_2/StrutsTest.java b/group01/496740686/src/test/java/com/camile/_2/StrutsTest.java
new file mode 100644
index 0000000000..5e7a12f2dc
--- /dev/null
+++ b/group01/496740686/src/test/java/com/camile/_2/StrutsTest.java
@@ -0,0 +1,46 @@
+package com.camile._2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.camile._2.litestruts.Struts;
+import com.camile._2.litestruts.View;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        Struts struts = new Struts();
+        View view  = struts.runAction(actionName,params);
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        Struts struts = new Struts();
+        View view  = struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/List.java b/group01/553624797/code2017/src/com/xxt/DataStructure/List.java
new file mode 100644
index 0000000000..473354e821
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/List.java
@@ -0,0 +1,9 @@
+package com.xxt.DataStructure;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java
new file mode 100644
index 0000000000..9d3f3e8f03
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java
@@ -0,0 +1,99 @@
+package com.xxt.DataStructure;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * Created by star on 2017/2/26.
+ */
+public class MyArrayList implements List {
+
+
+
+    private Object[] elementData;
+    private int size = elementData.length;
+
+
+    public MyArrayList(int initialCapacity) {
+        if (initialCapacity > 0) {
+            this.elementData = new Object[initialCapacity];
+        } else {
+            throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
+        }
+    }
+
+    public MyArrayList() {
+        this(10);
+    }
+
+
+    @Override
+    public void add(Object o) {
+        ensureCapacity(size + 1);
+        elementData[size + 1] = o;
+    }
+
+    @Override
+    public void add(int index, Object o) {
+        //判断数组下标是否越界
+        if(index < 0 || index > elementData.length){
+            throw new IndexOutOfBoundsException("index : "+index+"size : "+size);
+        }
+        ensureCapacity(index);
+        System.arraycopy(elementData, index,elementData, index + 1, size - index);
+        elementData[index] = o;
+        size++;
+    }
+
+    @Override
+    public Object get(int index) {
+        return elementData[index];
+    }
+
+    @Override
+    public Object remove(int index) {
+        //判断数组下标是否越界
+        if(index < 0 || index > elementData.length){
+            throw new IndexOutOfBoundsException("index : "+index+"size : "+size);
+        }
+
+
+        //取出删除的值
+        Object oldValue = elementData[index];
+
+        //做删除操作同样是复制数组
+        //计算要删除的数量
+        int numMoved = size - index - 1;
+        if ( numMoved > 0){
+            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
+        }
+
+        //将数组最后一个元素置为空，让GC回收
+        elementData[size - 1] = null;
+        return oldValue;
+
+    }
+
+    @Override
+    public int size() {
+        return elementData.length;
+    }
+
+
+    //判断是否扩容
+    public void ensureCapacity(int minCapacity) {
+        //取得当前数组容量
+        int currentCapacity = elementData.length;
+        //如果最小需要的容量小于当前数组容量则需要扩容
+        if (minCapacity < currentCapacity) {
+            int newCapacity = currentCapacity + (currentCapacity >> 1);
+            //如果扩容后的长度还是小于最小需要的长度，则直接以最小需要的长度作为当前数组的长度
+            if (newCapacity < minCapacity) {
+                newCapacity = minCapacity;
+                elementData = Arrays.copyOf(elementData, newCapacity);
+            }
+        }
+
+    }
+
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java
new file mode 100644
index 0000000000..0c40956197
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java
@@ -0,0 +1,141 @@
+package com.xxt.DataStructure;
+
+import java.util.Iterator;
+
+import java.util.LinkedList;
+import java.util.function.Consumer;
+
+/**
+ * Created by star on 2017/2/25.
+ */
+public class MyLinkedList<E> implements List{
+
+    public  static class Node<E>{
+        E elementData;
+        Node<E> prerious;
+        Node<E> next;
+
+        public Node(Node<E> prerious , E elementData, Node<E> next) {
+            this.prerious = prerious;
+            this.elementData= elementData;
+            this.next = next;
+        }
+    }
+
+
+
+    private Node header;
+    private Node last;
+
+    private int size = 0;
+
+
+    //往最后一个节点添加元素
+    @Override
+    public void add(Object elementData) {
+        addBefore((E) elementData, last);
+    }
+
+    @Override
+    public void add(int index, Object elementData) {
+        addBefore((E) elementData, (index == size ? last : node(index)));
+    }
+
+    @Override
+    public Object get(int index) {
+        return node(index).elementData;
+
+    }
+
+    //获取index位置的节点
+    private Node<E> node(int index){
+        if(index < 0 || index > size){
+            throw  new IndexOutOfBoundsException("数组下标越界"+size);
+        }
+
+        if(index < (size >> 1)){
+            Node<E> e = header;
+            for(int i = 0; i < index; i ++){
+                e = header.next;
+                return e;
+            }
+        }else {
+            Node<E> e = last;
+            for(int i = size - 1; i > index; i--){
+                e = last.prerious;
+                return e;
+            }
+        }
+        return null;
+    }
+
+
+    @Override
+    public Object remove(int index) {
+
+        if (index < 0 || index > size) {
+            throw new IndexOutOfBoundsException("inde :" + index);
+        }
+
+        return remove(node(index));
+    }
+
+
+
+    //返回被删除的节点
+    private Object remove(Node<E> e){
+       E movedElementData = e.elementData;
+
+        //被删除节点的上个节点指向该节点的下个节点
+       e.prerious.next = e.next;
+
+        //被删除节点的下个节点指向该节点的上个节点
+        e.next.prerious = e.prerious;
+
+
+        //将该节点置为空，让GC能够回收
+        e.next = e.prerious = null;
+        e.elementData = null;
+        //长度-1
+        size--;
+        return movedElementData;
+    }
+
+
+    @Override
+    public int size() {
+        return size;
+    }
+
+    public Object removeFirst(){
+        return remove(header.next);
+
+
+    }
+
+    public Object removeLast(){
+        return remove(last.prerious);
+    }
+
+    public Iterator iterator(){
+        return null;
+    }
+
+
+
+    //插入一个新的节点
+    private Node<E> addBefore(E e, Node<E> node){
+
+        Node<E> newNode = new Node<E>(node.prerious, e, node.next);
+
+        //将上个节点的next指向自己
+        newNode.prerious.next = newNode;
+
+        //将下个节点的previous指向自己
+        newNode.next.prerious = newNode;
+
+        size++;
+        return newNode;
+    }
+
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java
new file mode 100644
index 0000000000..75d878af3b
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java
@@ -0,0 +1,88 @@
+package com.xxt.DataStructure;
+
+import java.util.Iterator;
+
+/**
+ * Created by star on 2017/2/26.
+ */
+public class MyQueue{
+
+
+    public  static class Node<E>{
+        Object elementData;
+        Node<E> prerious;
+        Node<E> next;
+
+        public Node(Object elementData, Node<E> prerious, Node<E> next) {
+            this.elementData = elementData;
+            this.prerious = prerious;
+            this.next = next;
+        }
+
+    }
+
+
+    private MyQueue.Node header;
+    private MyQueue.Node last;
+
+    private int size = 0;
+
+
+    //入队操作.在链表的头节点插入元素
+    public void enQueue(Object o){
+        addBefore(o, header);
+    }
+
+
+    //出队操作，返回链表的尾节点的元素
+    public Object deQueue(){
+        return node(size);
+    }
+
+
+    public boolean isEmpty(){
+        return header == last;
+    }
+
+
+
+    public int size(){
+        return size;
+    }
+
+   private Node addBefore(Object o , Node node){
+       Node newNode = new Node(o, node.prerious, node.next);
+
+       newNode.prerious.next = newNode;
+       newNode.next.prerious = newNode;
+
+       size++;
+       return newNode;
+
+   }
+
+
+    private Node node(int index){
+        if(index < 0 || index > size){
+            throw  new IndexOutOfBoundsException("数组下标越界"+size);
+        }
+
+        if(index < (size >> 1)){
+            Node e = header;
+            for(int i = 0; i < index; i ++){
+                e = header.next;
+                return e;
+            }
+        }else {
+            Node e = last;
+            for(int i = size - 1; i > index; i--){
+                e = last.prerious;
+                return e;
+            }
+        }
+        return null;
+    }
+
+
+
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java
new file mode 100644
index 0000000000..4ac0cf3698
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java
@@ -0,0 +1,52 @@
+package com.xxt.DataStructure;
+
+import java.util.EmptyStackException;
+
+/**
+ * Created by star on 2017/2/26.
+ */
+public class MyStack {
+
+
+    //采用数组实现；
+    private Object[] array;
+    //栈顶指针
+    private int top;
+    private final static int size = 100;
+
+    public MyStack(Object[] array, int top) {
+        this.array = array;
+        //空栈
+        top = -1 ;
+    }
+
+    public void push(Object elementData){
+        //栈满
+        if(top == size - 1){
+            throw new StackOverflowError();
+        }else {
+            array[++top] = elementData;
+        }
+    }
+
+    //弹栈
+    public Object pop(){
+        if( top == -1){
+            throw  new EmptyStackException();
+        }else {
+            return array[top--];
+        }
+    }
+
+    public boolean isEmpty(){
+        return top == -1;
+    }
+
+    public  Object peek(){
+        if(top == -1){
+            throw new EmptyStackException();
+        }else {
+            return array[top];
+        }
+    }
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java
new file mode 100644
index 0000000000..635c22fa88
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java
@@ -0,0 +1,36 @@
+package com.xxt.DataStructure.base;
+
+import com.xxt.DataStructure.base.List;
+
+import java.util.Iterator;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java
new file mode 100644
index 0000000000..ada0b84c78
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.xxt.DataStructure.base;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java
new file mode 100644
index 0000000000..4c8b3ae747
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java
@@ -0,0 +1,7 @@
+package com.xxt.DataStructure.base;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java
new file mode 100644
index 0000000000..924cf10ff0
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java
@@ -0,0 +1,48 @@
+package com.xxt.DataStructure.base;
+
+import com.xxt.DataStructure.base.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public com.xxt.DataStructure.base.Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java
new file mode 100644
index 0000000000..2148154c46
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java
@@ -0,0 +1,12 @@
+package com.xxt.DataStructure.base;
+
+/**
+ * Created by star on 2017/2/26.
+ */
+public interface List {
+    public void add(Object o);
+    public void add(int index, Object o);
+    public Object get(int index);
+    public Object remove(int index);
+    public int size();
+}
\ No newline at end of file
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java
new file mode 100644
index 0000000000..5427579179
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java
@@ -0,0 +1,18 @@
+package com.xxt.DataStructure.base;
+
+public class Queue {
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java
new file mode 100644
index 0000000000..9c62bcdceb
--- /dev/null
+++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java
@@ -0,0 +1,24 @@
+package com.xxt.DataStructure.base;
+
+import com.xxt.DataStructure.base.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group01/751425278/.classpath b/group01/751425278/.classpath
index fb5011632c..c03982172c 100644
--- a/group01/751425278/.classpath
+++ b/group01/751425278/.classpath
@@ -2,5 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="D:/devspace/etoak/jars/poi/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group01/751425278/.gitignore b/group01/751425278/.gitignore
index ae3c172604..f5f89256ae 100644
--- a/group01/751425278/.gitignore
+++ b/group01/751425278/.gitignore
@@ -1 +1,32 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+*.iml
+*.idea
+
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+
+
+#macOS
+.DS_Store
+
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
+
 /bin/
diff --git a/group01/751425278/src/com/sanmubird/array/ArrayUtil.java b/group01/751425278/src/com/sanmubird/array/ArrayUtil.java
new file mode 100644
index 0000000000..e6101d3fca
--- /dev/null
+++ b/group01/751425278/src/com/sanmubird/array/ArrayUtil.java
@@ -0,0 +1,287 @@
+package com.sanmubird.array;
+
+import java.util.Arrays;
+
+import com.sanmubird.basicDataStructure.ArrayList;
+import com.sanmubird.basicDataStructure.Iterator;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public  void reverseArray(int[] origin){
+		int[] result = new int[origin.length];
+		for(int i = 0 ; i < origin.length ; i++){
+			result[i] = origin[origin.length -1 -i];
+			System.out.println(result[i]);
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public  int[] removeZero(int[] oldArray){
+		int countZero = 0 ;
+		for(int i = 0 ; i < oldArray.length ; i++){
+			if(oldArray[i] == 0 ) {
+				countZero++ ;
+			}
+		}
+		int[] newArray = new int[ oldArray.length - countZero];
+		int index = 0 ;
+		for(int i = 0 ; i < oldArray.length ; i++){
+			if(oldArray[i] != 0 ){
+				newArray[index] = oldArray[i] ;
+				System.out.println(newArray[index]);
+				index++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	/**
+	 * 	第一种思路：不考虑原有的数组是否有序，先将这些数组，混合到一个数组里面，然后再去重，再排序；
+	 * 	第二种思路: 能不能使用二叉树的方法快速排序？
+	 * 
+	 * */
+	
+	
+	public  int[] merge(int[] array1, int[] array2){
+		//先将两个数组合并成为一个数组；
+		int newLength = array1.length + array2.length;
+		int[] array3 = Arrays.copyOf(array1, newLength);
+		for(int i = array1.length ; i < newLength ; i++ ){
+			array3[i] = array2[newLength - i -1];
+		}
+		// 对这个数组进行冒泡排序；
+		int temp ;
+		for(int i = 0 ; i < array3.length ; i++){
+			for(int j = 0 ; j < array3.length - i -1 ; j++){
+				if(array3[j+1] < array3[j]){
+					 temp = array3[j+1];
+					array3[j+1] = array3[j];
+					array3[j] = temp ;
+				}
+			}
+		}
+		//计算出排序后的数组中重复值的个数；
+		int count = 0 ;
+		for(int i = 0 ; i  < array3.length -1 ; i++){
+			if(array3[i] == array3[i+1]){
+				count++;
+			}
+		}
+		//创建一个新的数组；
+		int[] array = new int[array3.length - count];
+		//把合并后的数组复制到新的数组中去，在复制的过程中，去除重复的元素；
+		int size = 0 ;
+		for(int i = 0 ; i < array3.length  ; i++){
+			if(i < array3.length - 1){
+				if(array3[i] == array3[i+1]){
+					array[size] = array3[i+1] ;
+				}else{
+					array[size] = array3[i];
+					size++;
+				}
+			}else{
+				array[size] = array3[i];
+			}
+		}
+		return  array;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		for(int i = 0 ; i < oldArray.length ; i++){
+			newArray[i] = oldArray[i]; 
+		}
+		for(int i = 0 ; i < newArray.length ; i++){
+			System.out.print(newArray[i]+",");
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int count1 = 0 ;
+		int result1 ;
+		for(int i = 1 ; i <= max ;i++ ){
+			result1 = getFiBo(i);
+			if(max >= result1){
+				count1++;
+			}else{
+				break;
+			}
+		}
+		System.out.println(count1);
+		int[] array = new int[count1];
+		int count = 0 ;
+		int result ;
+		for(int i = 1 ; i <= max ;i++ ){
+			result = getFiBo(i);
+			if(max >= result){
+				array[count] = result ;
+				count++;
+			}else{
+				break;
+			}
+		}
+			
+		for(int i = 0 ; i < array.length ; i++){
+			System.out.println("array["+i+"]:"+array[i]+",");
+		}
+		return array;
+	}
+	
+	public static int getFiBo(int i){
+		if(i == 1 || i == 2){
+			return 1 ;
+		}else{
+			return getFiBo(i-1) + getFiBo(i -2) ;
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int count1 = 0 ;
+		for(int i = 1 ; i < max ; i++ ){
+			if( isPrime(i )){
+				count1++;
+			}
+		}
+		int[] array = new int[count1];
+		int count = 0 ;
+		for(int i = 1 ; i < max ; i++ ){
+			if( isPrime(i )){
+				array[count] = i ;
+				count++;
+			}
+		}
+		for(int i = 0 ; i < array.length ; i++){
+			System.out.println("array["+i+"]:"+array[i]+",");
+		}
+		
+		return array;
+	}
+	
+	public static boolean isPrime(int a ){
+		int count = 0 ;
+		for(int i = 1 ; i <= a ; i++){
+			if(a % i == 0 ){
+				count++;
+			}
+		}
+		if(count == 2 ){
+			return true ;
+		}
+		return false ;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		ArrayList al = new ArrayList();
+		for(int i = 1 ; i <= max ; i++){
+			if(isPerfectNumber(i)){
+				al.add(i);
+			}
+		}
+		int[] array = arrayListToArray(al);
+		for(int i = 0 ; i < array.length ; i++){
+			System.out.println("array["+i+"]:"+array[i]+",");
+		}
+		return array ;
+	}
+	
+	public static int[] arrayListToArray(ArrayList al){
+		int size = al.size();
+		int[] array = new int[size];
+		for(int i = 0 ; i < size ; i++){
+			array[i] = (int) al.get(i);
+		}
+		return array ;
+	}
+	
+	public static boolean isPerfectNumber(int a){
+		ArrayList al = new ArrayList();
+		for(int i = 1 ; i <= a/2  ; i++ ){
+			if(a%i == 0){
+				al.add(i);
+			}
+		}
+		int sum = 0 ;
+		Iterator it=al.iterator();
+		while(it.hasNext()){
+			sum += (int) it.next();
+		}
+		if(a == sum ){
+			return true ;
+		}
+		return false ;
+	}
+
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		String s = "";
+		String ss = "";
+		String sss ="";
+		for(int i = 0 ; i < array.length ; i++){
+			if(i == array.length-1){
+				sss = array[i]+"";
+				s += sss;
+			}else{
+				ss = array[i]+seperator;
+				s += ss;
+			}
+		}
+		return s;
+	}
+}
diff --git a/group01/751425278/src/com/sanmubird/litestruts/LoginAction.java b/group01/751425278/src/com/sanmubird/litestruts/LoginAction.java
new file mode 100644
index 0000000000..63d91a4bac
--- /dev/null
+++ b/group01/751425278/src/com/sanmubird/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.sanmubird.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/751425278/src/com/sanmubird/litestruts/Struts.java b/group01/751425278/src/com/sanmubird/litestruts/Struts.java
new file mode 100644
index 0000000000..3334beda30
--- /dev/null
+++ b/group01/751425278/src/com/sanmubird/litestruts/Struts.java
@@ -0,0 +1,125 @@
+package com.sanmubird.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.xml.sax.SAXException;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	View view = new View();
+    	String actionClassPath = null ; 
+    	Class actionClass; 
+    	String resultName = null;
+    	List<Element> actionElement =   parseXML();
+    	try {
+	    	for(Element e : actionElement){
+	    		if("action".equals(e.getName())){
+	    			if(e.attributeValue("name").equals(actionName)){
+	    				actionClassPath = e.attributeValue("class");
+						actionClass = Class.forName(actionClassPath);
+		    			Object actionClassInstance = actionClass.newInstance();	//通过反射 得到类的对象
+		    			
+		    			if(parameters != null){
+		    				for(Map.Entry<String, String> entry : parameters.entrySet()){
+		    					String filedName = entry.getKey();
+		    					String methodName = "set"+toUpperFirstLetter(filedName);
+		    					Class<?> filedType = actionClass.getDeclaredField(filedName).getType();
+		    					Method method = actionClass.getDeclaredMethod(methodName, filedType);
+		    					method.invoke(actionClassInstance, entry.getValue());//对当前对象的实例化;
+		    				}
+		    			}
+		    			
+		    			Method execute = actionClass.getDeclaredMethod("execute");
+		    			String result = (String) execute.invoke(actionClassInstance); //得到execute执行的结果
+		    			
+		    			Method[] methods = actionClass.getDeclaredMethods();
+		    			Map<String,Object> param  = new HashMap<String,Object>();
+		    			for(Method method : methods){
+		    				String methodName = method.getName();
+		    				if(method.getName().startsWith("get")){
+		    					String filedName = methodName.substring(3,4).toLowerCase()+methodName.substring(4);
+		    					Object filedValue = method.invoke(actionClassInstance);
+		    					param.put(filedName, filedValue);
+		    				}
+		    			}
+		    			
+		    			view.setParameters(param);
+		    			List<Element> resultElement = e.elements();
+		    			for(Element e1 : resultElement ){
+		    				if("result".equals(e1.getName())){
+		    					resultName = e1.attributeValue("name");
+		    					if(resultName.equals(result)){
+		    						view.setJsp(e1.getText());
+		    						break;
+		    					}
+		    				}
+		    			}
+	    			}
+	    		}
+	    	} 
+    	}catch (Exception e1) {
+				e1.printStackTrace();
+		}
+    	return view ;
+    }    
+    
+    public static List<Element> parseXML(){
+    	SAXReader reader = new SAXReader();
+    	List<Element> firstList = null;
+    	try {
+			
+			InputStream in = Struts.class.getClassLoader().getResourceAsStream("com/sanmubird/litestruts/struts.xml");//  要加载的文件和.class文件在同一个目录下;
+			// Class.getClassLoader.getResourceAsStream(String path);  默认是从ClassPath根下获取的;
+			// Class.getResourceAsStream(String path) path(/dirName/fileName)是从ClassPath根下获取的,没有/则是从本.class文件同目录中获取的;
+			Document doc = reader.read(in);
+			Element root = doc.getRootElement();
+			firstList = root.elements();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+    	return firstList;
+    }
+
+    public static String toUpperFirstLetter(String s){
+    	if(s != "" ){
+    		String s1 = s.substring(0,1).toUpperCase();
+    		String other = s.substring(1);
+    		return s1+other;
+    	}else{
+    		throw new RuntimeException("传入的参数不能是空 或 '' ");
+    	}
+    }
+    
+}
diff --git a/group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java b/group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..75e642de87
--- /dev/null
+++ b/group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.sanmubird.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/751425278/src/com/sanmubird/litestruts/View.java b/group01/751425278/src/com/sanmubird/litestruts/View.java
new file mode 100644
index 0000000000..840fcb1ef3
--- /dev/null
+++ b/group01/751425278/src/com/sanmubird/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.sanmubird.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/751425278/src/com/sanmubird/litestruts/struts.xml b/group01/751425278/src/com/sanmubird/litestruts/struts.xml
new file mode 100644
index 0000000000..8d05fbd92d
--- /dev/null
+++ b/group01/751425278/src/com/sanmubird/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.sanmubird.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.sanmubird.litestruts.LoginAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name  = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..96bff301c7
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java
@@ -0,0 +1,263 @@
+package zavier.week02.coderising.array;
+
+import zavier.week01.basic.ArrayList;
+import zavier.week01.basic.List;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = [7, 9, 30, 3, 4] ,
+     * 置换后为 [4,3, 30 , 9,7]
+     * 
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        if (origin == null) {
+            throw new IllegalArgumentException();
+        }
+
+        int temp;
+        for (int i = 0; i < origin.length / 2; i++) {
+            temp = origin[i];
+            origin[i] = origin[origin.length - 1 - i];
+            origin[origin.length - 1 - i] = temp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+     * 
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        if (oldArray == null) {
+            throw new IllegalArgumentException();
+        }
+
+        int[] noZeroArray = new int[oldArray.length];
+        int index = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                noZeroArray[index++] = oldArray[i];
+            }
+        }
+
+        return copyOf(noZeroArray, index);
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 = [3, 5, 7,8] a2 = [4,
+     * 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+     * 
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        if (array1 == null || array2 == null) {
+            throw new IllegalArgumentException();
+        }
+
+        int indexOfArray1 = 0;
+        int indexOfArray2 = 0;
+        int totalLength = array1.length + array2.length;
+        int[] destArr = new int[totalLength];
+
+        for (int i = 0; i < totalLength; i++) {
+            if (indexOfArray1 >= array1.length) {
+                // array1填充完毕，将array2填充剩下的元素
+                arrayCopy(array2, indexOfArray2, destArr, i, array2.length - indexOfArray2);
+                int actualSize = i + array2.length - indexOfArray2;
+                return copyOf(destArr, actualSize);
+            }
+
+            if (indexOfArray2 >= array2.length) {
+                arrayCopy(array1, indexOfArray1, destArr, i, array1.length - indexOfArray1);
+                int actualSize = i + array1.length - indexOfArray1;
+                return copyOf(destArr, actualSize);
+            }
+
+            if (array1[indexOfArray1] < array2[indexOfArray2]) {
+                destArr[i] = array1[indexOfArray1];
+                indexOfArray1++;
+            } else if (array1[indexOfArray1] == array2[indexOfArray2]) {
+                destArr[i] = array1[indexOfArray1];
+                indexOfArray1++;
+                indexOfArray2++; // 去除重复元素
+            } else {
+                destArr[i] = array2[indexOfArray2];
+                indexOfArray2++;
+            }
+
+        }
+        // array1.length、array2.length均为0的情况
+        return new int[0];
+    }
+
+    private void arrayCopy(int[] src, int srcPos, int[] dest, int destPos, int length) {
+        for (int i = 0; i < length; i++) {
+            dest[destPos++] = src[srcPos++];
+        }
+    }
+
+    private int[] copyOf(int[] original, int newLength) {
+        int[] dest = new int[newLength];
+        for (int i = 0; i < newLength; i++) {
+            dest[i] = original[i];
+        }
+        return dest;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size 注意，老数组的元素在新数组中需要保持 例如 oldArray
+     * = [2,3,6] , size = 3,则返回的新数组为 [2,3,6,0,0,0]
+     * 
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        if (oldArray == null || size < 0) {
+            throw new IllegalArgumentException();
+        }
+
+        int newSize = oldArray.length + size;
+        int[] newArray = new int[newSize];
+        for (int i = 0; i < oldArray.length; i++) {
+            newArray[i] = oldArray[i];
+        }
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * 
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (max < 0) {
+            throw new IllegalArgumentException();
+        }
+        if (max == 1) {
+            return new int[] {};
+        }
+
+        ArrayList list = new ArrayList();
+        list.add(1);
+        list.add(1);
+
+        int i = 0;
+        while (true) {
+            int num = (int) list.get(i) + (int) list.get(i + 1);
+            if (num < max) {
+                list.add(num);
+            } else {
+                break;
+            }
+            i++;
+        }
+
+        return intListToArray(list);
+    }
+
+    private int[] intListToArray(List list) {
+        int[] array = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            array[i] = (int) list.get(i);
+        }
+        return array;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * 
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        if (max < 0) {
+            throw new IllegalArgumentException();
+        }
+
+        ArrayList list = new ArrayList();
+        for (int i = 2; i < max; i++) {
+            if (isPrime(i)) {
+                list.add(i);
+            }
+        }
+        return intListToArray(list);
+    }
+
+    private boolean isPrime(int num) {
+        for (int i = 2; i <= num / 2; i++) {
+            if (num % i == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * 
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        if (max < 0) {
+            throw new IllegalArgumentException();
+        }
+
+        ArrayList list = new ArrayList();
+        for (int i = 2; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                list.add(i);
+            }
+        }
+        return intListToArray(list);
+    }
+
+    private boolean isPerfectNumber(int num) {
+        int sumOfFactor = 1;
+        for (int i = 2; i <= num / 2; i++) {
+            if (num % i == 0) {
+                sumOfFactor += i;
+            }
+        }
+        if (sumOfFactor == num) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+     * 
+     * @param array
+     * @param s
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        if (array == null) {
+            throw new IllegalArgumentException();
+        }
+        if (array.length == 0) {
+            return "";
+        }
+
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            builder.append(array[i]).append(seperator);
+        }
+        return builder.substring(0, builder.length() - seperator.length());
+    }
+
+
+}
diff --git a/group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..d0e6fa11d8
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,133 @@
+package zavier.week02.coderising.array;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+    private ArrayUtil arrayUtil;
+
+    @Before
+    public void setUp() {
+        arrayUtil = new ArrayUtil();
+    }
+
+    @Test
+    public void testReverseArray() {
+        int[] a = {};
+        arrayUtil.reverseArray(a);
+        Assert.assertArrayEquals(new int[] {}, a);
+
+        int[] b = {1, 2, 3};
+        arrayUtil.reverseArray(b);
+        Assert.assertArrayEquals(new int[] {3, 2, 1}, b);
+
+        int[] c = {1, 2, 3, 4};
+        arrayUtil.reverseArray(c);
+        Assert.assertArrayEquals(new int[] {4, 3, 2, 1}, c);
+
+        int[] d = new int[5000];
+        int[] d1 = new int[5000];
+        for (int i = 0; i < 5000; i++) {
+            d[i] = i;
+            d1[i] = 4999 - i;
+        }
+        arrayUtil.reverseArray(d);
+        Assert.assertArrayEquals(d1, d);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveZero() {
+        int oldArr1[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int newArr1[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5};
+        Assert.assertArrayEquals(newArr1, arrayUtil.removeZero(oldArr1));
+
+        int oldArr2[] = {0, 0, 0, 0, 0};
+        int newArr2[] = {};
+        Assert.assertArrayEquals(newArr2, arrayUtil.removeZero(oldArr2));
+
+        int oldArr3[] = {0, 0, 0, 0, 0, 1, 2, 3};
+        int newArr3[] = {1, 2, 3};
+        Assert.assertArrayEquals(newArr3, arrayUtil.removeZero(oldArr3));
+
+        int oldArr4[] = {1, 2, 3, 0, 0, 0, 0, 0};
+        int newArr4[] = {1, 2, 3};
+        Assert.assertArrayEquals(newArr4, arrayUtil.removeZero(oldArr4));
+
+        int oldArr5[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0};
+        int newArr5[] = {1, 2, 3, 4};
+        Assert.assertArrayEquals(newArr5, arrayUtil.removeZero(oldArr5));
+
+        int oldArr6[] = {};
+        int newArr6[] = {};
+        Assert.assertArrayEquals(newArr6, oldArr6);
+
+        arrayUtil.removeZero(null);
+    }
+
+    @Test
+    public void testMerge() {
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        Assert.assertArrayEquals(new int[] {3, 4, 5, 6, 7, 8}, arrayUtil.merge(a1, a2));
+
+        int[] b1 = {1, 2, 9, 100};
+        int[] b2 = {3, 4, 5, 90, 100};
+        Assert.assertArrayEquals(new int[] {1, 2, 3, 4, 5, 9, 90, 100}, arrayUtil.merge(b1, b2));
+
+        int[] c1 = {};
+        int[] c2 = {1, 2, 3};
+        Assert.assertArrayEquals(new int[] {1, 2, 3}, arrayUtil.merge(c1, c2));
+
+        int[] d1 = {};
+        int[] d2 = {};
+        Assert.assertArrayEquals(new int[] {}, arrayUtil.merge(d1, d2));
+    }
+
+    @Test
+    public void testGrow() {
+        int[] a1 = {2, 3, 6};
+        Assert.assertArrayEquals(new int[] {2, 3, 6, 0, 0, 0}, arrayUtil.grow(a1, 3));
+        Assert.assertArrayEquals(new int[] {2, 3, 6}, arrayUtil.grow(a1, 0));
+    }
+
+    @Test
+    public void testFibonacci() {
+        Assert.assertArrayEquals(new int[] {}, arrayUtil.fibonacci(1));
+        Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 5, 8, 13}, arrayUtil.fibonacci(15));
+
+        int[] a = new int[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597,
+                2584, 4181, 6765};
+        Assert.assertArrayEquals(a, arrayUtil.fibonacci(6766));
+    }
+
+    @Test
+    public void testGetPrimes() {
+        Assert.assertArrayEquals(new int[] {}, arrayUtil.getPrimes(1));
+        Assert.assertArrayEquals(new int[] {}, arrayUtil.getPrimes(2));
+        Assert.assertArrayEquals(new int[] {2, 3, 5, 7, 11, 13, 17, 19}, arrayUtil.getPrimes(23));
+        Assert.assertArrayEquals(new int[] {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
+                53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139,
+                149, 151, 157, 163, 167, 173, 179}, arrayUtil.getPrimes(181));
+    }
+
+    @Test
+    public void testGetPerfectNumbers() {
+        Assert.assertArrayEquals(new int[] {6}, arrayUtil.getPerfectNumbers(7));
+        Assert.assertArrayEquals(new int[] {6, 28}, arrayUtil.getPerfectNumbers(496));
+        Assert.assertArrayEquals(new int[] {6, 28, 496}, arrayUtil.getPerfectNumbers(497));
+        Assert.assertArrayEquals(new int[] {6, 28, 496, 8128}, arrayUtil.getPerfectNumbers(8129));
+
+    }
+
+    @Test
+    public void testJoin() {
+        Assert.assertEquals("", arrayUtil.join(new int[] {}, "-"));
+        Assert.assertEquals("1", arrayUtil.join(new int[] {1}, "-"));
+        Assert.assertEquals("1-2-8-3-4-5", arrayUtil.join(new int[] {1, 2, 8, 3, 4, 5}, "-"));
+        Assert.assertEquals("1*-*2*-*8*-*3*-*4*-*5",
+                arrayUtil.join(new int[] {1, 2, 8, 3, 4, 5}, "*-*"));
+    }
+
+}
diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java b/group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..617b5f115b
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package zavier.week02.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java b/group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..d30beaafb3
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java
@@ -0,0 +1,117 @@
+package zavier.week02.coderising.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         * 
+         * 0. 读取配置文件struts.xml
+         * 
+         * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象） 据parameters中的数据，调用对象的setter方法，
+         * 例如parameters中的数据是 ("name"="test" , "password"="1234") , 那就应该调用 setName和setPassword方法
+         * 
+         * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+         * 
+         * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message": "登录成功"}
+         * , 放到View对象的parameters
+         * 
+         * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。
+         * 
+         */
+
+        try {
+
+            SAXReader reader = new SAXReader();
+            InputStream struts = Struts.class.getResourceAsStream("struts.xml");
+            Document document = null;
+            try {
+                document = reader.read(struts);
+            } catch (DocumentException e) {
+                e.printStackTrace();
+            }
+
+            String className = ""; // actionName对应的类名
+            Element rootElement = document.getRootElement();
+            Iterator iterator = rootElement.elementIterator("action");
+            Element targetAction = null; // actionName对应的action
+            while (iterator.hasNext()) {
+                Element element = (Element) iterator.next();
+                String name = element.attributeValue("name");
+                if (name.equals(actionName)) {
+                    className = element.attributeValue("class");
+                    targetAction = element;
+                    break;
+                }
+            }
+
+
+            Class<?> class1 = Class.forName(className);
+            Object instance = class1.newInstance();
+
+            Set<String> keySet = parameters.keySet();
+            for (String key : keySet) {
+                // 将变量名拼成对应的set方法名
+                String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
+                Class<?> type = class1.getDeclaredField(key).getType();
+                Method method = class1.getDeclaredMethod(methodName, type);
+                // 依次调用对应的set方法
+                method.invoke(instance, parameters.get(key));
+            }
+
+            String result = (String) class1.getDeclaredMethod("execute").invoke(instance);
+
+            Method[] declaredMethods = class1.getDeclaredMethods();
+            HashMap<String, String> map = new HashMap<>();
+            for (int i = 0; i < declaredMethods.length; i++) {
+                if (declaredMethods[i].getName().startsWith("get")) {
+                    String fieldValue = (String) declaredMethods[i].invoke(instance);
+                    String fieldName = methodNameToFieldName(declaredMethods[i].getName());
+                    map.put(fieldName, fieldValue);
+                }
+            }
+
+            View view = new View();
+            view.setParameters(map);
+
+            Iterator elementIterator = targetAction.elementIterator("result");
+            while (elementIterator.hasNext()) {
+                Element element = (Element) elementIterator.next();
+                if (result.equals(element.attributeValue("name"))) {
+                    view.setJsp(element.getText());
+                }
+            }
+
+            return view;
+
+
+        } catch (Exception e1) {
+            e1.printStackTrace();
+        }
+
+        return null;
+    }
+
+    private static String methodNameToFieldName(String methodName) {
+        if (!methodName.startsWith("get") && !methodName.startsWith("set")) {
+            throw new IllegalArgumentException();
+        }
+
+        return methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
+    }
+
+}
diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java b/group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..ba800c2fdc
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,42 @@
+package zavier.week02.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); // 密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd",
+                view.getParameters().get("message"));
+    }
+}
diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/View.java b/group01/765324639/src/zavier/week02/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f164c4bfc5
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/litestruts/View.java
@@ -0,0 +1,26 @@
+package zavier.week02.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml b/group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..ffe9110788
--- /dev/null
+++ b/group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="zavier.week02.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="zavier.week02.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java b/group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java
new file mode 100644
index 0000000000..dd25201471
--- /dev/null
+++ b/group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java
@@ -0,0 +1,226 @@
+package com.coderising;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin) {
+		for (int i = 0; i < origin.length / 2; i++) {
+			int temp = origin[i];
+			origin[i] = origin[origin.length - i - 1];
+			origin[origin.length - i - 1] = temp;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		int size = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				size++;
+			}
+		}
+		int[] newArray = new int[size];
+		int j = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[j++] = oldArray[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+		int[] newArr = new int[array1.length + array2.length];
+		int index1 = 0;
+		int index2 = 0;
+		int z = 0;
+		for (int i = 0; i < array2.length; i++) {
+			if (array1[index1] - array2[index2] > 0) {
+				newArr[z++] = array2[index2];
+			}
+		}
+
+		return null;
+	}
+
+	public static int[] merge1(int[] array1, int[] array2) {
+		int size = 0;
+		for (int i = 0; i < array1.length; i++) {
+			for (int j = 0; j < array2.length; j++) {
+				if (array1[i] == array2[j]) {
+					size++;
+				}
+			}
+		}
+		int[] newArr = new int[array1.length + array2.length - size];
+		int z = 0;
+		for (int i = 0; i < array1.length; i++) {
+			for (int j = 0; j < array2.length; j++) {
+				if (array1[i] < array2[j]) {
+					newArr[z++] = array1[i];
+					break;
+				} else if (array1[i] > array2[j]) {
+					newArr[z++] = array2[j];
+					break;
+				} else if (array1[i] == array2[j]) {
+					newArr[z++] = array1[i];
+					break;
+				}
+
+			}
+		}
+		System.out.println(size);
+		return null;
+	}
+
+	/**
+	 * 把一个已存满数据的数组oldArray的容量进行扩展，扩展后的新数据大小为OldArray,length+size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 
+	 * @param args
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, size);
+		return newArray;
+	}
+
+	/**
+	 * 裴波那契数列为：1，1，2，3，5，8，13，21。。。 例如max = 15，则返回的数组应该为[1,1,2,3,5,8,13] max =1
+	 * ,则返回空数组[]
+	 * 
+	 * @param args
+	 */
+	public static int[] fibonacci(int max) {
+		if (max == 1) {
+			int[] arr = new int[0];
+			return arr;
+		}
+		int x = 1;
+		int y = 1;
+		int temp = 0;
+		int size = 0;
+		while (true) {
+			temp = y;
+			y = x + y;
+			x = temp;
+			if (y >= max) {
+				break;
+			}
+			size++;
+
+		}
+		int[] array = new int[size + 2];
+		array[0] = 1;
+		array[1] = 1;
+		int j = 2;
+		int m = 1;
+		int n = 1;
+		int temp1 = 1;
+		while (true) {
+			temp1 = n;
+			n = m + n;
+			m = temp1;
+			if (n >= max) {
+				break;
+			}
+			size++;
+			array[j++] = n;
+		}
+		return array;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23， 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 */
+	public static int[] getPrimes(int max) {
+		int i = 0;
+		for (int j = 2; j < max; j++) {
+			boolean b = false;
+			for (int j2 = 2; j2 < j; j2++) {
+				if (j % j2 == 0) {
+					b = true;
+					break;
+				} 
+			}
+			if (b == false) {
+				i++;
+			}
+		}
+		int[] arr = new int[i];
+		int z = 0;
+		for (int j = 2; j < max; j++) {
+			boolean b = false;
+			for (int j2 = 2; j2 < j; j2++) {
+				if (j % j2 == 0) {
+					b = true;
+					break;
+				}
+			}
+			if (b == false) {
+				arr[z++] = j;
+			}
+		}
+		return arr;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		for (int i = 0; i < array.length; i++) {
+			if (i == 0) {
+				seperator = array[i] + "";
+			} else {
+				seperator = seperator + "-" + "" + array[i] + "";
+			}
+		} 
+		return seperator;
+	}
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		return null;
+	}
+
+	public static void main(String[] args) {
+		int[] a = { 1, 3, 5, 6 };
+		int[] b = { 2, 3, 4, 5, 7 };
+		int[] ab = ArrayUtil.fibonacci(30);
+		int array[] = { 1, 2, 3, 4 };
+		String s = ArrayUtil.join(array, new String());
+		System.out.println(s);
+	}
+}
diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java b/group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..ccb1acce9a
--- /dev/null
+++ b/group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,36 @@
+package com.coderising.action;
+
+public class LoginAction {
+	private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/Struts.java b/group01/819048836/lvxg2017/src/com/coderising/action/Struts.java
new file mode 100644
index 0000000000..c6362cb87a
--- /dev/null
+++ b/group01/819048836/lvxg2017/src/com/coderising/action/Struts.java
@@ -0,0 +1,102 @@
+package com.coderising.action;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+		try {
+			SAXReader reader = new SAXReader();
+			InputStream in = Struts.class.getResourceAsStream("struts.xml");
+			Document document = reader.read(in);
+			Element root = document.getRootElement();
+			System.out.println(root);
+			System.out.println(document);
+
+			// 与actionName匹配的Element
+			Element actionElement = null;
+			String className = null;
+
+			for (Iterator<Element> iterator = root.elementIterator("action"); iterator.hasNext();) {
+				Element e = iterator.next();
+				if (e.attributeValue("name").equals(actionName)) {
+					actionElement = e;
+					className = e.attributeValue("class");
+					break;
+				}
+			}
+			Class<?> clazz = Class.forName(className);
+			Object instance = clazz.newInstance();
+			Set<String> keySet = parameters.keySet();
+			for (String key : keySet) {
+				String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
+				Class<?> type = clazz.getDeclaredField(key).getType();
+				Method method = clazz.getDeclaredMethod(methodName, type);
+				// 依次调用对应的set方法
+				method.invoke(instance, parameters.get(key));
+			}
+			String result = (String) clazz.getDeclaredMethod("execute").invoke(instance);
+			// 反射调用getter方法
+            Method[] methods =clazz.getDeclaredMethods();
+            Map<String,Object> param  = new HashMap<>();
+			for (Method method : methods) {
+				 String methodname = method.getName();
+				 if(method.getName().startsWith("get")){
+					 String fieldName = methodname.substring(3, 4).toLowerCase() + methodname.substring(4);
+					 Object fieldValue = method.invoke(instance);
+					 param.put(fieldName, fieldValue);
+				 }
+			}
+			View view  = new View();
+			view.setParameters(param);
+			for (Iterator<Element> iterator = actionElement.elementIterator("result"); iterator.hasNext();) {
+				Element resultElement = iterator.next();
+				if (resultElement.attributeValue("name").equals(result)) {
+					view.setJsp(resultElement.getText());
+					break;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+	public static void main(String[] args) {
+		Map map = new HashMap<>();
+		map.put("name", "test");
+		map.put("password", "1234");
+		Struts.runAction("login", map);
+
+	}
+}
diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java b/group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java
new file mode 100644
index 0000000000..7f72a992a0
--- /dev/null
+++ b/group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java
@@ -0,0 +1,24 @@
+package com.coderising.action;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	
+	@Test
+	public void testLoginActionSuccess() {
+	//	File f = new 
+		
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        
+	}
+}
diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/View.java b/group01/819048836/lvxg2017/src/com/coderising/action/View.java
new file mode 100644
index 0000000000..e79c9beb3f
--- /dev/null
+++ b/group01/819048836/lvxg2017/src/com/coderising/action/View.java
@@ -0,0 +1,23 @@
+package com.coderising.action;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/struts.xml b/group01/819048836/lvxg2017/src/com/coderising/action/struts.xml
new file mode 100644
index 0000000000..a087b48337
--- /dev/null
+++ b/group01/819048836/lvxg2017/src/com/coderising/action/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/895457260/code/src/algorithm/ArrayUtil.java b/group01/895457260/code/src/algorithm/ArrayUtil.java
new file mode 100644
index 0000000000..bb5a25a93a
--- /dev/null
+++ b/group01/895457260/code/src/algorithm/ArrayUtil.java
@@ -0,0 +1,239 @@
+package algorithm;
+
+import datastructure.basic.ArrayList;
+
+import java.util.stream.Stream;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int head = 0;
+		int rear = origin.length - 1;
+		for (; head < rear; ++head, --rear) {
+			if (origin[head] != origin[rear]) {
+				int t = origin[head];
+				origin[head] = origin[rear];
+				origin[rear] = t;
+			}
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray) {
+		int count = 0;
+		int[] tempArray = new int[oldArray.length];
+		for (int i : oldArray) {
+			if (i != 0) {
+				tempArray[count++] = i;
+			}
+		}
+		int[] newArray = new int[count];
+		System.arraycopy(tempArray, 0, newArray, 0, count);
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2) {
+		int[] tempArray = new int[array1.length + array2.length];
+		int count = 0;
+		int p1 = 0, p2 = 0;
+
+		while (p1 < array1.length && p2 < array2.length) {
+			if (array1[p1] < array2[p2]) {
+				if (count == 0 || array1[p1] != tempArray[count - 1]) {
+					tempArray[count++] = array1[p1];
+				}
+				p1++;
+			} else if (array1[p1] > array2[p2]) {
+				if (count == 0 || array2[p2] != tempArray[count - 1]) {
+					tempArray[count++] = array2[p2++];
+				}
+				p2++;
+			} else {
+				if (count == 0 || array1[p1] != tempArray[count - 1]) {
+					tempArray[count++] = array1[p1++];
+				}
+				p1++;
+				p2++;
+			}
+		}
+		while (p1 < array1.length) {
+			if (count == 0 || array1[p1] != tempArray[count - 1]) {
+				tempArray[count++] = array1[p1];
+			}
+			p1++;
+		}
+		while (p2 < array2.length) {
+			if (count == 0 || array2[p2] != tempArray[count - 1]) {
+				tempArray[count++] = array2[p2];
+			}
+			p2++;
+		}
+
+		int[] newArray = new int[count];
+		System.arraycopy(tempArray, 0, newArray, 0, count);
+		return newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max <= 1) {
+			return new int[0];
+		}
+
+		ArrayList list = new ArrayList();
+		list.add(1);
+		list.add(1);
+		while (true) {
+			int a = (int) (list.get(list.size() - 1));
+			int b = (int) (list.get(list.size() - 2));
+			if (a + b < max) {
+				list.add(a + b);
+			} else {
+				break;
+			}
+		}
+		int[] result = new int[list.size()];
+		for (int i = 0; i < list.size(); ++i) {
+			result[i] = (int) list.get(i);
+		}
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		if (max <= 2) {
+			return new int[0];
+		}
+
+		ArrayList list = new ArrayList();
+		for (int i = 2; true; ++i) {
+			if (i >= max) {
+				break;
+			} else if (isPrime(i)) {
+				list.add(i);
+			}
+		}
+
+		int[] result = new int[list.size()];
+		for (int i = 0; i < list.size(); ++i) {
+			result[i] = (int) list.get(i);
+		}
+		return result;
+	}
+
+	private boolean isPrime(int n) {
+		for (int i = 2; i <= Math.sqrt(n); ++i) {
+			if (n % i == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		if (max <= 6) {
+			return new int[0];
+		}
+
+		ArrayList list = new ArrayList();
+		for (int i = 2; true; ++i) {
+			if (i >= max) {
+				break;
+			} else if (isPerfect(i)) {
+				list.add(i);
+			}
+		}
+
+		int[] result = new int[list.size()];
+		for (int i = 0; i < list.size(); ++i) {
+			result[i] = (int) list.get(i);
+		}
+		return result;
+	}
+
+	private boolean isPerfect(int n) {
+		int sum = 1;
+		for (int i = 2; i <= n / 2; ++i) {
+			if (sum > n) {
+				return false;
+			}
+			if (n % i == 0) {
+				sum += i;
+			}
+		}
+		return sum == n;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		if (array.length == 0) {
+			return "";
+		}
+		StringBuilder builder = new StringBuilder();
+		builder.append(array[0]);
+		for (int i = 1; i < array.length; ++i) {
+			builder.append(seperator).append(array[i]);
+		}
+		return builder.toString();
+	}
+}
diff --git a/group01/895457260/code/src/algorithm/test/ArrayUtilTest.java b/group01/895457260/code/src/algorithm/test/ArrayUtilTest.java
new file mode 100644
index 0000000000..85f04f3b31
--- /dev/null
+++ b/group01/895457260/code/src/algorithm/test/ArrayUtilTest.java
@@ -0,0 +1,234 @@
+package algorithm.test;
+
+import algorithm.ArrayUtil;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.After;
+
+/**
+ * ArrayUtil Tester.
+ *
+ * @author <Authors name>
+ * @version 1.0
+ * @since <pre>二月 27, 2017</pre>
+ */
+public class ArrayUtilTest {
+    ArrayUtil util = new ArrayUtil();
+
+    /**
+     * Method: reverseArray(int[] origin)
+     */
+    @Test
+    public void testReverseArray() throws Exception {
+//TODO: Test goes here...
+        int[][] arrays = {
+                {7, 9, 30, 3},
+                {7, 9, 30, 3, 4},
+                {5},
+                {}
+        };
+        for (int[] a : arrays) {
+            util.reverseArray(a);
+        }
+
+        int[][] result = {
+                {3, 30, 9, 7},
+                {4, 3, 30, 9, 7},
+                {5},
+                {}
+        };
+        Assert.assertArrayEquals(arrays, result);
+    }
+
+    /**
+     * Method: removeZero(int[] oldArray)
+     */
+    @Test
+    public void testRemoveZero() throws Exception {
+//TODO: Test goes here...
+        int[][] arrays = {
+                {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5},
+                {6, 6, 3, 5, 4},
+                {0, 0, 0},
+                {}
+        };
+
+        for (int i = 0; i < arrays.length; ++i) {
+            arrays[i] = util.removeZero(arrays[i]);
+        }
+
+        int[][] result = {
+                {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5},
+                {6, 6, 3, 5, 4},
+                {},
+                {}
+        };
+        Assert.assertArrayEquals(arrays, result);
+    }
+
+    /**
+     * Method: merge(int[] array1, int[] array2)
+     */
+    @Test
+    public void testMerge() throws Exception {
+//TODO: Test goes here...
+        int[][] arrays1 = {
+                {3, 5, 7, 8},
+                {2, 3, 4},
+                {1, 2, 3, 3, 4, 5},
+                {1, 2, 2},
+                {},
+                {}
+        };
+        int[][] arrays2 = {
+                {4, 5, 6, 7},
+                {6, 7, 8, 9, 9},
+                {4, 4, 5, 7},
+                {},
+                {2, 2, 3},
+                {}
+        };
+
+        int[][] merged = new int[arrays1.length][];
+        for (int i = 0; i < arrays1.length; ++i) {
+            merged[i] = util.merge(arrays1[i], arrays2[i]);
+        }
+
+        int[][] result = {
+                {3, 4, 5, 6, 7, 8},
+                {2, 3, 4, 6, 7, 8, 9},
+                {1, 2, 3, 4, 5, 7},
+                {1, 2},
+                {2, 3},
+                {}
+        };
+        Assert.assertArrayEquals(merged, result);
+    }
+
+    /**
+     * Method: grow(int [] oldArray, int size)
+     */
+    @Test
+    public void testGrow() throws Exception {
+//TODO: Test goes here...
+        int[][] arrays = {
+                {2, 3, 6},
+                {},
+                {1}
+        };
+
+        int[] size = {3, 3, 0};
+
+        for (int i = 0; i < arrays.length; ++i) {
+            arrays[i] = util.grow(arrays[i], size[i]);
+        }
+
+        int[][] result = {
+                {2, 3, 6, 0, 0, 0},
+                {0, 0, 0},
+                {1}
+        };
+        Assert.assertArrayEquals(arrays, result);
+    }
+
+    /**
+     * Method: fibonacci(int max)
+     */
+    @Test
+    public void testFibonacci() throws Exception {
+//TODO: Test goes here...
+        int[] max = {0, 1, 2, 15};
+
+        int[][] arrays = new int[max.length][];
+
+        for (int i = 0; i < arrays.length; ++i) {
+            arrays[i] = util.fibonacci(max[i]);
+        }
+
+        int[][] result = {
+                {},
+                {},
+                {1, 1},
+                {1, 1, 2, 3, 5, 8, 13}
+        };
+        Assert.assertArrayEquals(arrays, result);
+    }
+
+    /**
+     * Method: getPrimes(int max)
+     */
+    @Test
+    public void testGetPrimes() throws Exception {
+//TODO: Test goes here...
+        int[] max = {0, 1, 2, 3, 11};
+
+        int[][] arrays = new int[max.length][];
+
+        for (int i = 0; i < arrays.length; ++i) {
+            arrays[i] = util.getPrimes(max[i]);
+        }
+
+        int[][] result = {
+                {},
+                {},
+                {},
+                {2},
+                {2, 3, 5, 7}
+        };
+        Assert.assertArrayEquals(arrays, result);
+    }
+
+    /**
+     * Method: getPerfectNumbers(int max)
+     */
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+//TODO: Test goes here...
+        int[] max = {0, 6, 7, 496, 497};
+
+        int[][] arrays = new int[max.length][];
+
+        for (int i = 0; i < arrays.length; ++i) {
+            arrays[i] = util.getPerfectNumbers(max[i]);
+        }
+
+        int[][] result = {
+                {},
+                {},
+                {6},
+                {6, 28},
+                {6, 28, 496}
+        };
+        Assert.assertArrayEquals(arrays, result);
+    }
+
+    /**
+     * Method: join(int[] array, String seperator)
+     */
+    @Test
+    public void testJoin() throws Exception {
+//TODO: Test goes here...
+        int[][] arrays = {
+                {3, 8, 9},
+                {5},
+                {6, 6},
+                {}
+        };
+
+        String[] sep = {"-", "**", "", "---"};
+        String[] joined = new String[arrays.length];
+
+        for (int i = 0; i < arrays.length; ++i) {
+            joined[i] = util.join(arrays[i], sep[i]);
+        }
+
+        String[] result = {
+                "3-8-9",
+                "5",
+                "66",
+                ""
+        };
+        Assert.assertArrayEquals(joined, result);
+    }
+} 
diff --git a/group01/895457260/code/src/datastructure/test/ArrayListTest.java b/group01/895457260/code/src/datastructure/test/ArrayListTest.java
new file mode 100644
index 0000000000..3a3f742634
--- /dev/null
+++ b/group01/895457260/code/src/datastructure/test/ArrayListTest.java
@@ -0,0 +1,152 @@
+package datastructure.test;
+
+import datastructure.basic.ArrayList;
+import datastructure.basic.Iterator;
+import datastructure.basic.List;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.After;
+
+/**
+ * ArrayList Tester.
+ *
+ * @author <Authors name>
+ * @version 1.0
+ * @since <pre>二月 24, 2017</pre>
+ */
+public class ArrayListTest {
+
+    @Before
+    public void before() throws Exception {
+    }
+
+    @After
+    public void after() throws Exception {
+    }
+
+    protected final List getList() {
+        List list = createList();
+        init(list);
+        return list;
+    }
+
+    List createList() {
+        return new ArrayList(5);
+    }
+
+    private void init(List list) {
+        for (int i = 1; i <= 5; ++i) {
+            list.add(i);
+        }
+    }
+
+    protected final Object[] toArray(List list) {
+        Object[] array = new Object[list.size()];
+        Iterator iterator = list.iterator();
+        int pos = 0;
+        while (iterator.hasNext()) {
+            array[pos++] = iterator.next();
+        }
+        return array;
+    }
+
+    /**
+     * Method: add(Object o)
+     */
+    @Test
+    public void testAddO() throws Exception {
+//TODO: Test goes here...
+        List list = getList();
+        for (int i = 6; i <= 10; ++i) {
+            list.add(i);
+        }
+        Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
+        Assert.assertEquals(list.size(), 10);
+    }
+
+    /**
+     * Method: add(int index, Object o)
+     */
+    @Test
+    public void testAddForIndexO() throws Exception {
+//TODO: Test goes here...
+        List list = getList();
+        int nowSize = list.size();
+        int[] indexes = {nowSize + 1, -1, nowSize, nowSize, 0, 1};
+        Object[] values = {0, 0, 300, 400, 100, 200};
+        boolean[] exceptions = new boolean[indexes.length];
+        for (int i = 0; i < indexes.length; ++i) {
+            try {
+                list.add(indexes[i], values[i]);
+            } catch (IndexOutOfBoundsException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(toArray(list), new Object[]{100, 200, 1, 2, 3, 4, 5, 400, 300});
+        Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false});
+        Assert.assertEquals(list.size(), nowSize + 4);
+    }
+
+    /**
+     * Method: get(int index)
+     */
+    @Test
+    public void testGet() throws Exception {
+//TODO: Test goes here...
+        List list = getList();
+        int nowSize = list.size();
+        int[] indexes = {-1, nowSize, 0, 1, nowSize - 1, nowSize - 2};
+        Object[] values = new Object[indexes.length];
+        boolean[] exceptions = new boolean[indexes.length];
+        for (int i = 0; i < indexes.length; ++i) {
+            try {
+                values[i] = list.get(indexes[i]);
+            } catch (IndexOutOfBoundsException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(values, new Object[]{null, null, 1, 2, 5, 4});
+        Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false});
+        Assert.assertEquals(list.size(), nowSize);
+    }
+
+    /**
+     * Method: remove(int index)
+     */
+    @Test
+    public void testRemove() throws Exception {
+//TODO: Test goes here...
+        List list = getList();
+        int nowSize = list.size();
+        int[] indexes = {-1, nowSize, nowSize - 2, nowSize - 2, 1, 0};
+        Object[] values = new Object[indexes.length];
+        boolean[] exceptions = new boolean[indexes.length];
+        for (int i = 0; i < indexes.length; ++i) {
+            try {
+                values[i] = list.remove(indexes[i]);
+            } catch (IndexOutOfBoundsException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(values, new Object[]{null, null, 4, 5, 2, 1});
+        Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false});
+        Assert.assertEquals(list.size(), nowSize - 4);
+    }
+
+    /**
+     * Method: iterator()
+     */
+    @Test
+    public void testIterator() throws Exception {
+//TODO: Test goes here...
+        List list = getList();
+        Iterator iterator = list.iterator();
+        Object[] values = new Object[list.size()];
+        int pos = 0;
+        while (iterator.hasNext()) {
+            values[pos++] = iterator.next();
+        }
+        Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5});
+    }
+} 
diff --git a/group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java b/group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java
similarity index 98%
rename from group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java
rename to group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java
index ce15d5622c..f0374b2700 100644
--- a/group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java
+++ b/group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java
@@ -1,4 +1,4 @@
-package test.datastructure.basic;
+package datastructure.test;
 
 import datastructure.basic.BinarySortedTree;
 import datastructure.basic.BinaryTreeNode;
diff --git a/group01/895457260/code/src/datastructure/test/LinkedListTest.java b/group01/895457260/code/src/datastructure/test/LinkedListTest.java
new file mode 100644
index 0000000000..43e080258c
--- /dev/null
+++ b/group01/895457260/code/src/datastructure/test/LinkedListTest.java
@@ -0,0 +1,88 @@
+package datastructure.test;
+
+import datastructure.exception.EmptyListException;
+import datastructure.basic.LinkedList;
+import datastructure.basic.List;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * LinkedList Tester.
+ *
+ * @author <Authors name>
+ * @version 1.0
+ * @since <pre>二月 24, 2017</pre>
+ */
+public class LinkedListTest extends ArrayListTest {
+
+    @Override
+    List createList() {
+        return new LinkedList();
+    }
+
+    /**
+     * Method: addFirst(Object o)
+     */
+    @Test
+    public void testAddFirst() throws Exception {
+//TODO: Test goes here...
+        LinkedList list = (LinkedList) getList();
+        list.addFirst(100);
+        Assert.assertArrayEquals(toArray(list), new Object[]{100, 1, 2, 3, 4, 5});
+    }
+
+    /**
+     * Method: addLast(Object o)
+     */
+    @Test
+    public void testAddLast() throws Exception {
+//TODO: Test goes here...
+        LinkedList list = (LinkedList) getList();
+        list.addLast(100);
+        Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 100});
+    }
+
+    /**
+     * Method: removeFirst()
+     */
+    @Test
+    public void testRemoveFirst() throws Exception {
+//TODO: Test goes here...
+        LinkedList list = (LinkedList) getList();
+        int count = list.size() + 2;
+        Object[] values = new Object[count];
+        boolean[] exceptions = new boolean[count];
+        for (int i = 0; i < count; ++i) {
+            try {
+                values[i] = list.removeFirst();
+            } catch (EmptyListException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null});
+        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
+        Assert.assertArrayEquals(toArray(list), new Object[0]);
+    }
+
+    /**
+     * Method: removeLast()
+     */
+    @Test
+    public void testRemoveLast() throws Exception {
+//TODO: Test goes here...
+        LinkedList list = (LinkedList) getList();
+        int count = list.size() + 2;
+        Object[] values = new Object[count];
+        boolean[] exceptions = new boolean[count];
+        for (int i = 0; i < count; ++i) {
+            try {
+                values[i] = list.removeLast();
+            } catch (EmptyListException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null});
+        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
+        Assert.assertArrayEquals(toArray(list), new Object[0]);
+    }
+}
diff --git a/group01/895457260/code/src/datastructure/test/QueueTest.java b/group01/895457260/code/src/datastructure/test/QueueTest.java
new file mode 100644
index 0000000000..5a47f764a9
--- /dev/null
+++ b/group01/895457260/code/src/datastructure/test/QueueTest.java
@@ -0,0 +1,108 @@
+package datastructure.test;
+
+import datastructure.exception.EmptyQueueException;
+import datastructure.basic.Queue;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.After;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Queue Tester.
+ *
+ * @author <Authors name>
+ * @version 1.0
+ * @since <pre>二月 24, 2017</pre>
+ */
+public class QueueTest {
+
+    @Before
+    public void before() throws Exception {
+    }
+
+    @After
+    public void after() throws Exception {
+    }
+
+    private Queue getQueue() {
+        Queue queue = new Queue(5);
+        for (int i = 1; i <= 5; ++i) {
+            queue.enQueue(i);
+        }
+        return queue;
+    }
+
+    private void assertQueue(Queue queue, Object[] actual) {
+        Class<Queue> clazz = Queue.class;
+        Object[] array = null;
+        int head = 0;
+        int rear = 0;
+        Method mapIndex = null;
+        try {
+            Field arrayField = clazz.getDeclaredField("array");
+            Field headField = clazz.getDeclaredField("head");
+            Field rearField = clazz.getDeclaredField("rear");
+            mapIndex = clazz.getDeclaredMethod("mapIndex", int.class);
+            arrayField.setAccessible(true);
+            headField.setAccessible(true);
+            rearField.setAccessible(true);
+            mapIndex.setAccessible(true);
+            array = (Object[]) arrayField.get(queue);
+            head = (int) headField.get(queue);
+            rear = (int) rearField.get(queue);
+        } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
+            e.printStackTrace();
+        }
+        int size = queue.size();
+        Object[] excepted = new Object[size];
+        int pos = 0;
+        try {
+            while (head < rear) {
+                excepted[pos++] = array[(int) mapIndex.invoke(queue, head)];
+                head++;
+            }
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        Assert.assertArrayEquals(excepted, actual);
+    }
+
+    /**
+     * Method: enQueue(Object o)
+     */
+    @Test
+    public void testEnQueue() throws Exception {
+//TODO: Test goes here...
+        Queue queue = getQueue();
+        for (int i = 6; i <= 10; ++i) {
+            queue.enQueue(i);
+        }
+        assertQueue(queue, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
+    }
+
+    /**
+     * Method: deQueue()
+     */
+    @Test
+    public void testDeQueue() throws Exception {
+//TODO: Test goes here...
+        Queue queue = getQueue();
+        int count = queue.size() + 2;
+        Object[] values = new Object[count];
+        boolean[] exceptions = new boolean[count];
+        for (int i = 0; i < count; ++i) {
+            try {
+                values[i] = queue.deQueue();
+            } catch (EmptyQueueException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null});
+        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
+        assertQueue(queue, new Object[0]);
+    }
+} 
diff --git a/group01/895457260/code/src/datastructure/test/StackTest.java b/group01/895457260/code/src/datastructure/test/StackTest.java
new file mode 100644
index 0000000000..24d7db58d8
--- /dev/null
+++ b/group01/895457260/code/src/datastructure/test/StackTest.java
@@ -0,0 +1,93 @@
+package datastructure.test;
+
+import datastructure.basic.*;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.After;
+
+import java.lang.reflect.Field;
+import java.util.EmptyStackException;
+
+/**
+ * Stack Tester.
+ *
+ * @author <Authors name>
+ * @version 1.0
+ * @since <pre>二月 24, 2017</pre>
+ */
+public class StackTest {
+
+    @Before
+    public void before() throws Exception {
+    }
+
+    @After
+    public void after() throws Exception {
+    }
+
+    private Stack getStack() {
+        Stack stack = new Stack();
+        for (int i = 1; i <= 5; ++i) {
+            stack.push(i);
+        }
+        return stack;
+    }
+
+    private void assertStack(Stack stack, Object[] actual) {
+        Class<Stack> clazz = Stack.class;
+        ArrayList elementData = null;
+        try {
+            Field field = clazz.getDeclaredField("elementData");
+            field.setAccessible(true);
+            elementData = (ArrayList) field.get(stack);
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            e.printStackTrace();
+        }
+
+        Object[] excepted = null;
+        if (elementData != null) {
+            int size = stack.size();
+            excepted = new Object[size];
+            for (int i = 0; i < size; ++i) {
+                excepted[i] = elementData.get(i);
+            }
+        }
+        Assert.assertArrayEquals(excepted, actual);
+    }
+
+    /**
+     * Method: push(Object o)
+     */
+    @Test
+    public void testPush() throws Exception {
+//TODO: Test goes here...
+        Stack stack = getStack();
+        for (int i = 6; i <= 10; ++i) {
+            stack.push(i);
+        }
+        assertStack(stack, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
+    }
+
+    /**
+     * Method: pop()
+     */
+    @Test
+    public void testPop() throws Exception {
+//TODO: Test goes here...
+        Stack stack = getStack();
+        int count = stack.size() + 2;
+        Object[] values = new Object[count];
+        boolean[] exceptions = new boolean[count];
+        for (int i = 0; i < count; ++i) {
+            try {
+                values[i] = stack.pop();
+            } catch (EmptyStackException e) {
+                exceptions[i] = true;
+            }
+        }
+        Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null});
+        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
+        assertStack(stack, new Object[0]);
+    }
+} 
diff --git a/group01/895457260/code/src/test/datastructure/basic/TestSuite.java b/group01/895457260/code/src/datastructure/test/TestSuite.java
similarity index 89%
rename from group01/895457260/code/src/test/datastructure/basic/TestSuite.java
rename to group01/895457260/code/src/datastructure/test/TestSuite.java
index f7c5868383..d13bff3e5d 100644
--- a/group01/895457260/code/src/test/datastructure/basic/TestSuite.java
+++ b/group01/895457260/code/src/datastructure/test/TestSuite.java
@@ -1,4 +1,4 @@
-package test.datastructure.basic;
+package datastructure.test;
 
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
diff --git a/group01/895457260/code/src/litestruts/Struts.java b/group01/895457260/code/src/litestruts/Struts.java
new file mode 100644
index 0000000000..a84581b93c
--- /dev/null
+++ b/group01/895457260/code/src/litestruts/Struts.java
@@ -0,0 +1,188 @@
+package litestruts;
+
+import datastructure.basic.ArrayList;
+import litestruts.exception.XmlElementNotFoundException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Hashtable;
+import java.util.Map;
+
+public class Struts {
+
+    /*
+                0. 读取配置文件struts.xml
+
+                 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+                据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+                ("name"="test" ,  "password"="1234") ,
+                那就应该调用 setName和setPassword方法
+
+                2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+                3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+                通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+                放到View对象的parameters
+
+                4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+                放到View对象的jsp字段中。
+        */
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        //读取xml
+        Document document;
+        try {
+            document = loadXml();
+        } catch (ParserConfigurationException | IOException | SAXException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        //获取所有action
+        Element struts = document.getDocumentElement();
+        NodeList actionList = struts.getElementsByTagName("action");
+
+        //根据actionName找到相应action，创建View
+        try {
+            Element action = getAction(actionList, actionName);
+            return createView(action, parameters);
+        } catch (InvocationTargetException | XmlElementNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private static Element getAction(NodeList actionList, String name) throws XmlElementNotFoundException {
+        //根据actionName找到相应action
+        for (int i = 0; i < actionList.getLength(); ++i) {
+            Element action = (Element) actionList.item(i);
+            if (action.getAttribute("name").equals(name)) {
+                return action;
+            }
+        }
+        throw new XmlElementNotFoundException(elementNotFoundMessage("action", name));
+    }
+
+    private static View createView(Element action, Map<String, String> parameters)
+            throws InvocationTargetException {
+
+        String className = action.getAttribute("class");
+        Class clazz;
+        Object object;
+        String executeResult;
+        try {
+            clazz = Class.forName(className);
+            object = clazz.newInstance();
+            setParameters(object, parameters);
+            executeResult = execute(object);
+        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+                InvocationTargetException | NoSuchMethodException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        NodeList resultList = action.getElementsByTagName("result");
+        String jsp;
+        Map<String, String> parameterMap;
+        try {
+            jsp = getJsp(resultList, executeResult);
+            parameterMap = createParameterMap(clazz, object);
+        } catch (XmlElementNotFoundException | IllegalAccessException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        View view = new View();
+        view.setJsp(jsp);
+        view.setParameters(parameterMap);
+        return view;
+    }
+
+    private static Map<String, String> createParameterMap(Class clazz, Object object)
+            throws InvocationTargetException, IllegalAccessException {
+        //获取所有getter
+        Method[] getters = getAllGetters(clazz);
+        //创建parameter Map
+        Map<String, String> parameterMap = new Hashtable<>();
+        for (Method getter : getters) {
+            parameterMap.put(getAttributeName(getter.getName()), (String) getter.invoke(object));
+        }
+        return parameterMap;
+    }
+
+    private static String getJsp(NodeList resultList, String executeResult) throws XmlElementNotFoundException {
+        return getResult(resultList, executeResult).getTextContent();
+    }
+
+    private static Element getResult(NodeList resultList, String name) throws XmlElementNotFoundException {
+        for (int j = 0; j < resultList.getLength(); ++j) {
+            Element result = (Element) resultList.item(j);
+            if (result.getAttribute("name").equals(name)) {
+                return result;
+            }
+        }
+        throw new XmlElementNotFoundException(elementNotFoundMessage("result", name));
+    }
+
+    private static String elementNotFoundMessage(String elementName, String nameAttribute) {
+        return "\"" + elementName + "\" XML element not found: " + "attribute \"name\": " + nameAttribute;
+    }
+
+    private static Method[] getAllGetters(Class<?> clazz) {
+        Method[] methods = clazz.getDeclaredMethods();
+        ArrayList list = new ArrayList();
+        for (Method method : methods) {
+            if (method.getName().startsWith("get")) {
+                list.add(method);
+            }
+        }
+
+        Method[] getters = new Method[list.size()];
+        for (int i = 0; i < list.size(); ++i) {
+            getters[i] = (Method) list.get(i);
+        }
+        return getters;
+    }
+
+    private static Document loadXml() throws ParserConfigurationException, IOException, SAXException {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder;
+        Document document;
+        builder = factory.newDocumentBuilder();
+        document = builder.parse(new File("src/litestruts/struts.xml"));
+        return document;
+    }
+
+    private static String execute(Object object)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        Method execute = object.getClass().getDeclaredMethod("execute");
+        return (String) execute.invoke(object);
+    }
+
+    private static void setParameters(Object object, Map<String, String> parameters)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            Method setter = object.getClass().getDeclaredMethod(getSetterName(entry.getKey()), String.class);
+            if (setter != null) {
+                setter.invoke(object, entry.getValue());
+            }
+        }
+    }
+
+    private static String getSetterName(String attributeName) {
+        return "set" + Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1);
+    }
+
+    private static String getAttributeName(String getterOrSetterName) {
+        String sub = getterOrSetterName.substring(3);
+        return Character.toLowerCase(sub.charAt(0)) + sub.substring(1);
+    }
+}
diff --git a/group01/895457260/code/src/litestruts/View.java b/group01/895457260/code/src/litestruts/View.java
new file mode 100644
index 0000000000..1eed614744
--- /dev/null
+++ b/group01/895457260/code/src/litestruts/View.java
@@ -0,0 +1,23 @@
+package litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group01/895457260/code/src/litestruts/action/LoginAction.java b/group01/895457260/code/src/litestruts/action/LoginAction.java
new file mode 100644
index 0000000000..9478c6931b
--- /dev/null
+++ b/group01/895457260/code/src/litestruts/action/LoginAction.java
@@ -0,0 +1,39 @@
+package litestruts.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java b/group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java
new file mode 100644
index 0000000000..f69309f7d0
--- /dev/null
+++ b/group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java
@@ -0,0 +1,14 @@
+package litestruts.exception;
+
+/**
+ * Created by Haochen on 2017/2/27.
+ * TODO:
+ */
+public class XmlElementNotFoundException extends RuntimeException {
+    public XmlElementNotFoundException() {
+    }
+
+    public XmlElementNotFoundException(String message) {
+        super(message);
+    }
+}
diff --git a/group01/895457260/code/src/litestruts/struts.xml b/group01/895457260/code/src/litestruts/struts.xml
new file mode 100644
index 0000000000..aad7e3f7fc
--- /dev/null
+++ b/group01/895457260/code/src/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="litestruts.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/895457260/code/src/litestruts/test/StrutsTest.java b/group01/895457260/code/src/litestruts/test/StrutsTest.java
new file mode 100644
index 0000000000..0129a8ad31
--- /dev/null
+++ b/group01/895457260/code/src/litestruts/test/StrutsTest.java
@@ -0,0 +1,41 @@
+package litestruts.test;
+
+import litestruts.Struts;
+import litestruts.View;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
\ No newline at end of file
diff --git a/group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java b/group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java
deleted file mode 100644
index 42b9144d38..0000000000
--- a/group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package test.datastructure.basic;
-
-import datastructure.basic.ArrayList;
-import datastructure.basic.Iterator;
-import datastructure.basic.List;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.Before;
-import org.junit.After;
-
-/**
- * ArrayList Tester.
- *
- * @author <Authors name>
- * @version 1.0
- * @since <pre>二月 24, 2017</pre>
- */
-public class ArrayListTest {
-
-    @Before
-    public void before() throws Exception {
-    }
-
-    @After
-    public void after() throws Exception {
-    }
-
-    protected final List getList() {
-        List list = createList();
-        init(list);
-        return list;
-    }
-
-    List createList() {
-        return new ArrayList(5);
-    }
-
-    private void init(List list) {
-        for (int i = 1; i <= 5; ++i) {
-            list.add(i);
-        }
-    }
-
-    protected final Object[] toArray(List list) {
-        Object[] array = new Object[list.size()];
-        Iterator iterator = list.iterator();
-        int pos = 0;
-        while (iterator.hasNext()) {
-            array[pos++] = iterator.next();
-        }
-        return array;
-    }
-
-    /**
-     * Method: add(Object o)
-     */
-    @Test
-    public void testAddO() throws Exception {
-//TODO: Test goes here...
-        List list = getList();
-        for (int i = 6; i <= 10; ++i) {
-            list.add(i);
-        }
-        Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
-        Assert.assertEquals(list.size(), 10);
-    }
-
-    /**
-     * Method: add(int index, Object o)
-     */
-    @Test
-    public void testAddForIndexO() throws Exception {
-//TODO: Test goes here...
-        List list = getList();
-        int nowSize = list.size();
-        int[] indexes = {nowSize + 1, -1, nowSize, nowSize, 0, 1};
-        Object[] values = {0, 0, 300, 400, 100, 200};
-        boolean[] exceptions = new boolean[indexes.length];
-        for (int i = 0; i < indexes.length; ++i) {
-            try {
-                list.add(indexes[i], values[i]);
-            } catch (IndexOutOfBoundsException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(toArray(list), new Object[]{100, 200, 1, 2, 3, 4, 5, 400, 300});
-        Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false});
-        Assert.assertEquals(list.size(), nowSize + 4);
-    }
-
-    /**
-     * Method: get(int index)
-     */
-    @Test
-    public void testGet() throws Exception {
-//TODO: Test goes here...
-        List list = getList();
-        int nowSize = list.size();
-        int[] indexes = {-1, nowSize, 0, 1, nowSize - 1, nowSize - 2};
-        Object[] values = new Object[indexes.length];
-        boolean[] exceptions = new boolean[indexes.length];
-        for (int i = 0; i < indexes.length; ++i) {
-            try {
-                values[i] = list.get(indexes[i]);
-            } catch (IndexOutOfBoundsException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(values, new Object[]{null, null, 1, 2, 5, 4});
-        Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false});
-        Assert.assertEquals(list.size(), nowSize);
-    }
-
-    /**
-     * Method: remove(int index)
-     */
-    @Test
-    public void testRemove() throws Exception {
-//TODO: Test goes here...
-        List list = getList();
-        int nowSize = list.size();
-        int[] indexes = {-1, nowSize, nowSize - 2, nowSize - 2, 1, 0};
-        Object[] values = new Object[indexes.length];
-        boolean[] exceptions = new boolean[indexes.length];
-        for (int i = 0; i < indexes.length; ++i) {
-            try {
-                values[i] = list.remove(indexes[i]);
-            } catch (IndexOutOfBoundsException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(values, new Object[]{null, null, 4, 5, 2, 1});
-        Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false});
-        Assert.assertEquals(list.size(), nowSize - 4);
-    }
-
-    /**
-     * Method: iterator()
-     */
-    @Test
-    public void testIterator() throws Exception {
-//TODO: Test goes here...
-        List list = getList();
-        Iterator iterator = list.iterator();
-        Object[] values = new Object[list.size()];
-        int pos = 0;
-        while (iterator.hasNext()) {
-            values[pos++] = iterator.next();
-        }
-        Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5});
-    }
-} 
diff --git a/group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java b/group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java
deleted file mode 100644
index 0ab03eb589..0000000000
--- a/group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package test.datastructure.basic;
-
-import datastructure.exception.EmptyListException;
-import datastructure.basic.LinkedList;
-import datastructure.basic.List;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * LinkedList Tester.
- *
- * @author <Authors name>
- * @version 1.0
- * @since <pre>二月 24, 2017</pre>
- */
-public class LinkedListTest extends ArrayListTest {
-
-    @Override
-    List createList() {
-        return new LinkedList();
-    }
-
-    /**
-     * Method: addFirst(Object o)
-     */
-    @Test
-    public void testAddFirst() throws Exception {
-//TODO: Test goes here...
-        LinkedList list = (LinkedList) getList();
-        list.addFirst(100);
-        Assert.assertArrayEquals(toArray(list), new Object[]{100, 1, 2, 3, 4, 5});
-    }
-
-    /**
-     * Method: addLast(Object o)
-     */
-    @Test
-    public void testAddLast() throws Exception {
-//TODO: Test goes here...
-        LinkedList list = (LinkedList) getList();
-        list.addLast(100);
-        Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 100});
-    }
-
-    /**
-     * Method: removeFirst()
-     */
-    @Test
-    public void testRemoveFirst() throws Exception {
-//TODO: Test goes here...
-        LinkedList list = (LinkedList) getList();
-        int count = list.size() + 2;
-        Object[] values = new Object[count];
-        boolean[] exceptions = new boolean[count];
-        for (int i = 0; i < count; ++i) {
-            try {
-                values[i] = list.removeFirst();
-            } catch (EmptyListException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null});
-        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
-        Assert.assertArrayEquals(toArray(list), new Object[0]);
-    }
-
-    /**
-     * Method: removeLast()
-     */
-    @Test
-    public void testRemoveLast() throws Exception {
-//TODO: Test goes here...
-        LinkedList list = (LinkedList) getList();
-        int count = list.size() + 2;
-        Object[] values = new Object[count];
-        boolean[] exceptions = new boolean[count];
-        for (int i = 0; i < count; ++i) {
-            try {
-                values[i] = list.removeLast();
-            } catch (EmptyListException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null});
-        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
-        Assert.assertArrayEquals(toArray(list), new Object[0]);
-    }
-}
diff --git a/group01/895457260/code/src/test/datastructure/basic/QueueTest.java b/group01/895457260/code/src/test/datastructure/basic/QueueTest.java
deleted file mode 100644
index df7587bd3c..0000000000
--- a/group01/895457260/code/src/test/datastructure/basic/QueueTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package test.datastructure.basic;
-
-import datastructure.exception.EmptyQueueException;
-import datastructure.basic.Queue;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.Before;
-import org.junit.After;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * Queue Tester.
- *
- * @author <Authors name>
- * @version 1.0
- * @since <pre>二月 24, 2017</pre>
- */
-public class QueueTest {
-
-    @Before
-    public void before() throws Exception {
-    }
-
-    @After
-    public void after() throws Exception {
-    }
-
-    private Queue getQueue() {
-        Queue queue = new Queue(5);
-        for (int i = 1; i <= 5; ++i) {
-            queue.enQueue(i);
-        }
-        return queue;
-    }
-
-    private void assertQueue(Queue queue, Object[] actual) {
-        Class<Queue> clazz = Queue.class;
-        Object[] array = null;
-        int head = 0;
-        int rear = 0;
-        Method mapIndex = null;
-        try {
-            Field arrayField = clazz.getDeclaredField("array");
-            Field headField = clazz.getDeclaredField("head");
-            Field rearField = clazz.getDeclaredField("rear");
-            mapIndex = clazz.getDeclaredMethod("mapIndex", int.class);
-            arrayField.setAccessible(true);
-            headField.setAccessible(true);
-            rearField.setAccessible(true);
-            mapIndex.setAccessible(true);
-            array = (Object[]) arrayField.get(queue);
-            head = (int) headField.get(queue);
-            rear = (int) rearField.get(queue);
-        } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
-            e.printStackTrace();
-        }
-        int size = queue.size();
-        Object[] excepted = new Object[size];
-        int pos = 0;
-        try {
-            while (head < rear) {
-                excepted[pos++] = array[(int) mapIndex.invoke(queue, head)];
-                head++;
-            }
-        } catch (IllegalAccessException | InvocationTargetException e) {
-            e.printStackTrace();
-        }
-        Assert.assertArrayEquals(excepted, actual);
-    }
-
-    /**
-     * Method: enQueue(Object o)
-     */
-    @Test
-    public void testEnQueue() throws Exception {
-//TODO: Test goes here...
-        Queue queue = getQueue();
-        for (int i = 6; i <= 10; ++i) {
-            queue.enQueue(i);
-        }
-        assertQueue(queue, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
-    }
-
-    /**
-     * Method: deQueue()
-     */
-    @Test
-    public void testDeQueue() throws Exception {
-//TODO: Test goes here...
-        Queue queue = getQueue();
-        int count = queue.size() + 2;
-        Object[] values = new Object[count];
-        boolean[] exceptions = new boolean[count];
-        for (int i = 0; i < count; ++i) {
-            try {
-                values[i] = queue.deQueue();
-            } catch (EmptyQueueException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null});
-        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
-        assertQueue(queue, new Object[0]);
-    }
-} 
diff --git a/group01/895457260/code/src/test/datastructure/basic/StackTest.java b/group01/895457260/code/src/test/datastructure/basic/StackTest.java
deleted file mode 100644
index ac2bd31a22..0000000000
--- a/group01/895457260/code/src/test/datastructure/basic/StackTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package test.datastructure.basic;
-
-import datastructure.basic.*;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.Before;
-import org.junit.After;
-
-import java.lang.reflect.Field;
-import java.util.EmptyStackException;
-
-/**
- * Stack Tester.
- *
- * @author <Authors name>
- * @version 1.0
- * @since <pre>二月 24, 2017</pre>
- */
-public class StackTest {
-
-    @Before
-    public void before() throws Exception {
-    }
-
-    @After
-    public void after() throws Exception {
-    }
-
-    private Stack getStack() {
-        Stack stack = new Stack();
-        for (int i = 1; i <= 5; ++i) {
-            stack.push(i);
-        }
-        return stack;
-    }
-
-    private void assertStack(Stack stack, Object[] actual) {
-        Class<Stack> clazz = Stack.class;
-        ArrayList elementData = null;
-        try {
-            Field field = clazz.getDeclaredField("elementData");
-            field.setAccessible(true);
-            elementData = (ArrayList) field.get(stack);
-        } catch (NoSuchFieldException | IllegalAccessException e) {
-            e.printStackTrace();
-        }
-
-        Object[] excepted = null;
-        if (elementData != null) {
-            int size = stack.size();
-            excepted = new Object[size];
-            for (int i = 0; i < size; ++i) {
-                excepted[i] = elementData.get(i);
-            }
-        }
-        Assert.assertArrayEquals(excepted, actual);
-    }
-
-    /**
-     * Method: push(Object o)
-     */
-    @Test
-    public void testPush() throws Exception {
-//TODO: Test goes here...
-        Stack stack = getStack();
-        for (int i = 6; i <= 10; ++i) {
-            stack.push(i);
-        }
-        assertStack(stack, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
-    }
-
-    /**
-     * Method: pop()
-     */
-    @Test
-    public void testPop() throws Exception {
-//TODO: Test goes here...
-        Stack stack = getStack();
-        int count = stack.size() + 2;
-        Object[] values = new Object[count];
-        boolean[] exceptions = new boolean[count];
-        for (int i = 0; i < count; ++i) {
-            try {
-                values[i] = stack.pop();
-            } catch (EmptyStackException e) {
-                exceptions[i] = true;
-            }
-        }
-        Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null});
-        Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
-        assertStack(stack, new Object[0]);
-    }
-} 
diff --git a/group01/895457260/journal/week1.md b/group01/895457260/journal/week1.md
new file mode 100644
index 0000000000..30e96532ab
--- /dev/null
+++ b/group01/895457260/journal/week1.md
@@ -0,0 +1,34 @@
+# 简略描述CPU的工作方式
+　　电脑，这个用法丰富而且功能异常强大的机器，也叫做计算机。计算机这个词听起来似乎并不能概括这种机器的功能，但它就是叫计算机。究其原因，无论多么复杂，多么神奇的功能，都能归结为大量的数据计算。加，减，乘，除，与，或，非……这些简单的计算经过组合，实现了令人眼花缭乱的效果。  
+　　那么计算机如何计算？这是第一个问题。  
+　　众所周知，计算机内部使用二进制，也就是0和1。而利用继电器（或晶体管）可以做成能处理二进制数的逻辑门（与/或/非门），用逻辑门可以组成加法器等各种器件（当然这些也是针对二进制的）。这些器件接受外部的二进制输入，再经过一系列变换，得到二进制的结果，最后传出外部。大学的“数字逻辑”这门课里已经花了大篇幅进行说明。  
+## 如何进行计算：ALU
+　　首先要有一个东西，能从外部接受2个数据，然后把它们加减乘除与或非，再传出一个结果，而且还能随意控制到底做加法还是减法，还是别的。这个东西叫“ALU”，就是Arithmetic Logic Unit，算术逻辑单元。它实际上除了能接受2个数据进行计算以外，还能接受一堆别的数据（信号），用来控制做哪种计算，这些额外的输入就叫做“控制信号”。  
+```
+　　　　ALU
+　　　　输入：进行计算的数据2个 + 控制信号若干
+　　　　输出：计算结果
+```  
+　　有了ALU，就可以做各种各样的计算。  
+## 数据的来源和去处：内存
+　　有一些数据来自你的内存条。内存实际上是存储器，可以保存二进制数，用于给ALU计算。这块存储器分为很多小格子，每个格子都有唯一编号称为“地址”，格子里能放一个数据。  
+　　存储器能接受至少3个输入：1地址、2数据、3读写控制端。有至少1个输出：1读出的数据。  
+　　举个例子：输入1表示了一个小格子，如果输入3为0表示读，那么就会输出这个格子里的数据，输入2会被忽略。如果输入3为1表示写，那么就会用输入2的数据覆盖掉格子里原有的数据，输出会被忽略。  
+## ALU和内存交互：组成CPU
+　　要有某块逻辑电路把地址、数据、读写控制送给内存，然后获得内存里的数据传给ALU计算，再把结果送回内存。但ALU只能计算，这块逻辑电路不属于ALU，于是我们可以把ALU和这块逻辑电路放在一起，叫做CPU，Central Processing Unit，中央处理器。  
+## 控制信号：指令译码
+　　控制信号有很多个（每个控制信号都是1位二进制），如果把需要的控制信号一个一个并排放到内存里，那么势必导致内存空间的浪费（因为内存里一个格子能存放很多位二进制数），为此，我们另拿一块逻辑电路，让它接受一个内存格子的二进制输入，产生若干输出（就是那些控制信号）。这个逻辑电路就叫做“指令译码器”，把它放进CPU里。应该放进指令译码器的数据，称为“指令”。  
+　　于是整个计算过程就变成了：  
+```
+　　　　1、从内存取出一个格子（是指令），放进指令译码器，得到若干组控制信号。
+　　　　2、再从内存取出2个格子（是数据），传给ALU进行计算。
+　　　　3、计算结果写回内存。
+```
+　　　　（这个过程假设所有数据都来自内存，实际上并非这样）  
+## 区分指令和数据
+　　这时又有新的问题产生了：1和2中同样是从内存取出格子，如何判断它是指令还是数据？CPU里还有一个东西叫“PC”，Program Counter，程序计数器。它能保存1个数，表示内存地址。从内存取指令，会把PC的地址送到内存，这时会控制内存的输出转向指令译码器。从内存取计算所用的数据，这个操作不使用PC的地址，那时内存的输出就不会指向指令译码器，而是直接传给ALU。  
+## 更大的存储空间：硬盘
+　　计算机通过某种方式不断重复上面的计算过程，只要内存里有正确排列的指令和数据，计算机就能自动工作，但是内存的容量比较小，不能存放过量的数据，于是就用到了硬盘。  
+　　硬盘的容量大，可以先把指令和数据放到硬盘里，需要时再由内存来取，读写硬盘和读写内存相似。  
+　　双击硬盘里的一个exe，exe中的指令和数据就会自动进入内存，然后由CPU做运算，结果还可以写回硬盘。  
+（这篇文章忽略了寄存器、缓存、总线等构造，假设所有数据都必须来自内存）  
diff --git a/group01/932573198/20170227/.classpath b/group01/932573198/20170227/.classpath
new file mode 100644
index 0000000000..cf68920d35
--- /dev/null
+++ b/group01/932573198/20170227/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.gitignore" b/group01/932573198/20170227/.gitignore
similarity index 100%
rename from "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.gitignore"
rename to group01/932573198/20170227/.gitignore
diff --git a/group01/932573198/20170227/.project b/group01/932573198/20170227/.project
new file mode 100644
index 0000000000..62c904d144
--- /dev/null
+++ b/group01/932573198/20170227/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>20170227</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs b/group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..bb35fa0a87
--- /dev/null
+++ b/group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java b/group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..a67618838a
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,225 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int l = origin.length, n;
+		for (int i = 0; i < l / 2; i++) {
+			n = origin[i];
+			origin[i] = origin[l - 1 - i];
+			origin[l - 1 - i] = n;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int n = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0)
+				n++;
+		}
+		int[] newArray = new int[oldArray.length - n];
+		for (int i = 0, j = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		int n = 0; // 重复的整数个数
+		for (int i = 0, j = 0; i < array1.length && j < array2.length;) {
+			int z = array1[i] - array2[j];
+			if (z < 0)
+				i++;
+			else if (z > 0)
+				j++;
+			else {
+				i++;
+				j++;
+				n++;
+			}
+		}
+		int[] newArray = new int[array1.length + array2.length - n];
+
+		for (int i = 0, j = 0, k = 0; i < array1.length && j < array2.length;) {
+			int z = array1[i] - array2[j];
+			if (z < 0) {
+				newArray[k] = array1[i];
+				k++;
+				i++;
+			} else if (z > 0) {
+				newArray[k] = array2[j];
+				k++;
+				j++;
+			} else {
+				newArray[k] = array1[i];
+				k++;
+				i++;
+				j++;
+			}
+			// 判断循环是否即将结束,若结束则将另外一个数组未比较的元素放入新数组
+			if (i >= array1.length) {
+				for (int a = j; a < array2.length; a++, k++) {
+					newArray[k] = array2[a];
+				}
+			}
+			if (j >= array2.length) {
+				for (int a = i; a < array1.length; a++, k++) {
+					newArray[k] = array1[a];
+				}
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		int n = 0;
+		for (int i = 1, j = 1, k; i < max; n++) {
+			k = i + j;
+			i = j;
+			j = k;
+		}
+		int[] newArray = new int[n];
+		if (n > 1) {
+			newArray[0] = 1;
+			newArray[1] = 1;
+		}
+		for (int i = 2; i < n; i++) {
+			newArray[i] = newArray[i - 1] + newArray[i - 2];
+		}
+		return newArray;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		int n = 0;
+		for (int i = 2; i < max; i++) {
+			if (primeNumber(i))
+				n++;
+		}
+
+		int[] newArray = new int[n];
+		for (int i = 2, j = 0; i < max; i++) {
+			if (primeNumber(i)) {
+				newArray[j++] = i;
+			}
+		}
+		return newArray;
+	}
+
+	// 判断是否为素数
+	public boolean primeNumber(int number) {
+		for (int i = 2; i < number; i++) {
+			if (number % i == 0)
+				return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		int n = 0;
+		for (int i = 6; i < max; i++) {
+			if (perfectNumber(i))
+				n++;
+		}
+
+		int[] newArray = new int[n];
+		for (int i = 6, j = 0; i < max; i++) {
+			if (perfectNumber(i)) {
+				newArray[j++] = i;
+			}
+		}
+		return newArray;
+	}
+
+	// 判断是否为完数
+	public boolean perfectNumber(int number) {
+		int n = 0;
+		for (int i = 1; i <= number / 2; i++) {
+			if (number % i == 0)
+				n += i;
+		}
+		if (number != n)
+			return false;
+		return true;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuffer s = new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			s.append(String.valueOf(array[i]));
+			s.append("-");
+		}
+		String str = s.substring(0, s.length() - 1);
+		return str;
+	}
+
+}
diff --git a/group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java b/group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..9f3a9ded22
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,83 @@
+package com.coderising.array;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	
+	ArrayUtil util = null;
+
+	@Before
+	public void setUp() throws Exception {
+		util = new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] a = {1,2,3,4};
+		int[] b = {4,3,2,1};
+		util.reverseArray(a);
+		Assert.assertArrayEquals(b, a);
+		int[] c = {1,2,3,4,5};
+		int[] d = {5,4,3,2,1};
+		util.reverseArray(c);
+		Assert.assertArrayEquals(d, c);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int[] oldArr = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArray = {1,3,4,5,6,6,5,4,7,6,7,5};
+		int[] newArr = util.removeZero(oldArr);
+		Assert.assertArrayEquals(newArray, newArr);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7, 8};
+		int[] a2 = {4, 5, 6, 7};
+		int[] newArray = {3,4,5,6,7,8};
+		int[] newArr = util.merge(a1, a2);
+		Assert.assertArrayEquals(newArray, newArr);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = {2,3,6};
+		int size = 3;
+		int[] newArray = {2,3,6,0,0,0};
+		int[] newArr = util.grow(oldArray, size);
+		Assert.assertArrayEquals(newArray, newArr);
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] arr1 = {1,1,2,3,5,8,13};
+		Assert.assertArrayEquals(arr1, util.fibonacci(15));
+		int[] arr2 = new int[0];
+		Assert.assertArrayEquals(arr2, util.fibonacci(1));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] arr1 = {2,3,5,7,11,13,17,19};
+		Assert.assertArrayEquals(arr1, util.getPrimes(23));
+		int[] arr2 = new int[0];
+		Assert.assertArrayEquals(arr2, util.getPrimes(2));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] arr = {6, 28, 496};
+		Assert.assertArrayEquals(arr, util.getPerfectNumbers(497));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] arr = {1,2,3,4,5};
+		String s = "1-2-3-4-5";
+		Assert.assertEquals(s, util.join(arr, "-"));
+	}
+
+}
diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java b/group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..5512045571
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,48 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	@Override
+	public String toString() {
+		return "LoginAction [name=" + name + ", password=" + password + ", message=" + message + "]";
+	}
+	
+}
diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/Struts.java b/group01/932573198/20170227/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..c69a3f6c3a
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,175 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+
+		View view = new View();
+		/*
+		 * 0、读取xml文件
+		 */
+		String path = "src/com/coderising/litestruts/struts.xml";
+		Document document = null;
+		try {
+			document = new SAXReader().read(path);
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+
+		/*
+		 * 1、 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 */
+		// 获取根节点
+		Element root = document.getRootElement();
+		// 遍历根节点下面的节点
+		Iterator<?> actionIt = root.elementIterator("action");
+		while (actionIt.hasNext()) {
+			Element action = (Element) actionIt.next();
+			if (action.attribute("name").getValue().equals(actionName)) {
+				String className = action.attribute("class").getValue();
+				Class<?> clazz = null;
+				try {
+					// 通过actionName找到className，并得到类
+					clazz = Class.forName(className);
+				} catch (ClassNotFoundException e) {
+					e.printStackTrace();
+				}
+
+				Object clazzObject = null;
+				try {
+					// 创建类的一个对象
+					clazzObject = clazz.newInstance();
+				} catch (InstantiationException e) {
+					e.printStackTrace();
+				} catch (IllegalAccessException e) {
+					e.printStackTrace();
+				}
+
+				// 遍历放参数的map
+				Set<String> keySet = parameters.keySet();
+				for (String key : keySet) {
+					// 拼接set方法的name
+					String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1, key.length());
+					// 得到set方法对象
+					Method setMethod = null;
+					try {
+						setMethod = clazz.getMethod(methodName, String.class);
+					} catch (NoSuchMethodException e) {
+						e.printStackTrace();
+					} catch (SecurityException e) {
+						e.printStackTrace();
+					}
+					try {
+						// 调用set方法，参数为parameters中对应的value
+						setMethod.invoke(clazzObject, parameters.get(key));
+					} catch (IllegalAccessException e) {
+						e.printStackTrace();
+					} catch (IllegalArgumentException e) {
+						e.printStackTrace();
+					} catch (InvocationTargetException e) {
+						e.printStackTrace();
+					}
+				}
+
+				/*
+				 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+				 */
+
+				Method executeMethod = null;
+				try {
+					// 得到exectue方法
+					executeMethod = clazz.getMethod("execute");
+				} catch (NoSuchMethodException e) {
+					e.printStackTrace();
+				} catch (SecurityException e) {
+					e.printStackTrace();
+				}
+				String string = null;
+				try {
+					// 调用exectue方法
+					string = (String) executeMethod.invoke(clazzObject);
+				} catch (IllegalAccessException e) {
+					e.printStackTrace();
+				} catch (IllegalArgumentException e) {
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					e.printStackTrace();
+				}
+
+				/*
+				 * 3、通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用，
+				 * 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
+				 * 放到View对象的parameters
+				 */
+
+				Map<String, Object> map = new HashMap<>();
+				Method[] methods = clazz.getMethods();
+				for (Method method : methods) {
+					if (method.getName().substring(0, 3).equals("get") && !method.getName().equals("getClass")) {
+						Object str = null;
+						try {
+							// 调用get方法
+							str = method.invoke(clazzObject);
+						} catch (IllegalAccessException e) {
+							e.printStackTrace();
+						} catch (IllegalArgumentException e) {
+							e.printStackTrace();
+						} catch (InvocationTargetException e) {
+							e.printStackTrace();
+						}
+						map.put(method.getName().substring(3).toLowerCase(), str);
+					}
+				}
+				view.setParameters(map);
+
+				/*
+				 * 4、根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+				 * 放到View对象的jsp字段中。
+				 */
+				@SuppressWarnings("unchecked")
+				List<Element> elements = action.elements();
+				for (Element element : elements) {
+					if (element.attribute("name").getValue().equals(string)) {
+						String jspName = element.getText();
+						view.setJsp(jspName);
+					}
+				}
+			}
+		}
+		return view;
+	}
+
+}
diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java b/group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a45f9c968c
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		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<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/View.java b/group01/932573198/20170227/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..2183aca2bd
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/litestruts/View.java
@@ -0,0 +1,29 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<?, ?> parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map<?, ?> getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map<?, ?> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+	
+	@Override
+	public String toString() {
+		return "View [jsp=" + jsp + ", parameters=" + parameters + "]";
+	}
+	
+}
diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/struts.xml b/group01/932573198/20170227/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..1370971a4b
--- /dev/null
+++ b/group01/932573198/20170227/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="com.coderising.litestruts.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+	<action name="logout" class="com.coderising.litestruts.LogoutAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java
index dcc45d792e..156eb638c7 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java
@@ -23,29 +23,29 @@ public void init() {
 
     @Test
     public void testAdd() {
-        Assert.assertEquals(arrayList.get(0), 1);
-        Assert.assertEquals(arrayList.get(1), 2);
-        Assert.assertEquals(arrayList.get(2), 3);
-        Assert.assertEquals(arrayList.size(), 3);
+        Assert.assertEquals(1, arrayList.get(0));
+        Assert.assertEquals(2, arrayList.get(1));
+        Assert.assertEquals(3, arrayList.get(2));
+        Assert.assertEquals(3, arrayList.size());
     }
 
     @Test
     public void testAddIndex() {
         arrayList.add(1, 4);
         arrayList.add(2, 5);
-        Assert.assertArrayEquals(arrayList.toArray(), new Object[]{1, 4, 5, 2, 3});
+        Assert.assertArrayEquals(new Object[]{1, 4, 5, 2, 3}, arrayList.toArray());
     }
 
     @Test
     public void testToArray() {
-        Assert.assertArrayEquals(arrayList.toArray(), new Object[]{1, 2, 3});
+        Assert.assertArrayEquals(new Object[]{1, 2, 3}, arrayList.toArray());
     }
 
     @Test
     public void testGet() {
-        Assert.assertEquals(arrayList.get(2), 3);
-        Assert.assertEquals(arrayList.get(0), 1);
-        Assert.assertEquals(arrayList.get(1), 2);
+        Assert.assertEquals(3, arrayList.get(2));
+        Assert.assertEquals(1, arrayList.get(0));
+        Assert.assertEquals(2, arrayList.get(1));
     }
 
     @Test
@@ -54,7 +54,7 @@ public void testRemove() {
         arrayList.remove(2);
         arrayList.add(4, 10);
         arrayList.add(3, 9);
-        Assert.assertArrayEquals(arrayList.toArray(), new Object[]{1, 4, 2, 9, 3, 10});
+        Assert.assertArrayEquals(new Object[]{1, 4, 2, 9, 3, 10}, arrayList.toArray());
     }
 
     @Test
@@ -64,6 +64,6 @@ public void testIterator() {
             iterator.next();
             iterator.remove();
         }
-        Assert.assertArrayEquals(arrayList.toArray(), new Object[]{});
+        Assert.assertArrayEquals(new Object[]{}, arrayList.toArray());
     }
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java
index 11fb7ad66b..ebc8a9193b 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java
@@ -26,13 +26,13 @@ public void init() {
     @Test
     public void testAdd() {
         int[] preorderDatas = binaryTree.traversal(BinaryTree.PREORDER);
-        Assert.assertArrayEquals(preorderDatas, new int[]{9, 4, 1, 2, 3, 5, 7, 10, 9, 17});
+        Assert.assertArrayEquals(new int[]{9, 4, 1, 2, 3, 5, 7, 10, 9, 17}, preorderDatas);
         int[] inorderDatas = binaryTree.traversal(BinaryTree.INORDER);
-        Assert.assertArrayEquals(inorderDatas, new int[]{1, 2, 3, 4, 5, 7, 9, 9, 10, 17});
+        Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5, 7, 9, 9, 10, 17}, inorderDatas);
         int[] postorderDatas = binaryTree.traversal(BinaryTree.POSTORDER);
-        Assert.assertArrayEquals(postorderDatas, new int[]{3, 2, 1, 7, 5, 4, 9, 17, 10, 9});
+        Assert.assertArrayEquals(new int[]{3, 2, 1, 7, 5, 4, 9, 17, 10, 9}, postorderDatas);
         int[] hierarchicalDatas = binaryTree.traversal(BinaryTree.HIERARCHICAL);
-        Assert.assertArrayEquals(hierarchicalDatas, new int[]{9, 4, 10, 1, 5, 9, 17, 2, 7, 3});
+        Assert.assertArrayEquals(new int[]{9, 4, 10, 1, 5, 9, 17, 2, 7, 3}, hierarchicalDatas);
     }
 
     @Test
@@ -63,26 +63,26 @@ public void testDelete() {
         // 删除叶子节点
         binaryTree.delete(11);
         int[] preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88});
+        Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}, preOrderDatas);
         binaryTree.delete(88);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82});
+        Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas);
 
         // 删除一个子节点的节点
         binaryTree.delete(70);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82});
+        Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas);
         binaryTree.delete(80);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82});
+        Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas);
 
         // 删除两个子节点的节点
         binaryTree.delete(40);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82});
+        Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas);
         binaryTree.delete(50);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new int[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82});
+        Assert.assertArrayEquals(new int[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas);
     }
 
     private void buildTree(int[] datas) {
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java
index b690c69c94..b1bfc6f1b8 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java
@@ -23,26 +23,26 @@ public void init() {
 
     @Test
     public void testAdd() {
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{1, 2, 3});
+        Assert.assertArrayEquals(new Object[]{1, 2, 3}, linkedList.toArray());
     }
 
     @Test
     public void testAddIndex() {
         linkedList.add(1, 10);
         linkedList.add(0, 8);
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{8, 1, 10, 2, 3});
+        Assert.assertArrayEquals(new Object[]{8, 1, 10, 2, 3}, linkedList.toArray());
     }
 
     @Test
     public void testAddFirst() {
         linkedList.addFirst(-1);
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{-1, 1, 2, 3});
+        Assert.assertArrayEquals(new Object[]{-1, 1, 2, 3}, linkedList.toArray());
     }
 
     @Test
     public void testAddLast() {
         linkedList.addLast(99);
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{1, 2, 3, 99});
+        Assert.assertArrayEquals(new Object[]{1, 2, 3, 99}, linkedList.toArray());
     }
 
     @Test
@@ -52,21 +52,21 @@ public void testRemove() {
         linkedList.remove(2);
         linkedList.add(3, 3);
         linkedList.add(1, 2);
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{8, 2, 10, 3, 3});
+        Assert.assertArrayEquals(new Object[]{8, 2, 10, 3, 3}, linkedList.toArray());
     }
 
     @Test
     public void testRemoveFirst() {
         linkedList.removeFirst();
         linkedList.removeFirst();
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{3});
+        Assert.assertArrayEquals(new Object[]{3}, linkedList.toArray());
     }
 
     @Test
     public void testRemoveLast() {
         linkedList.removeLast();
         linkedList.removeLast();
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{1});
+        Assert.assertArrayEquals(new Object[]{1}, linkedList.toArray());
     }
 
     @Test
@@ -76,6 +76,6 @@ public void testIterator() {
             iterator.next();
             iterator.remove();
         }
-        Assert.assertArrayEquals(linkedList.toArray(), new Object[]{});
+        Assert.assertArrayEquals(new Object[]{}, linkedList.toArray());
     }
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java
index 0035a353ec..273e1b9685 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java
@@ -21,13 +21,13 @@ public void init() {
 
     @Test
     public void testEnqueue() {
-        Assert.assertArrayEquals(queue.toArray(), new Object[]{1, 2, 3});
+        Assert.assertArrayEquals(new Object[]{1, 2, 3}, queue.toArray());
     }
 
     @Test
     public void testDequeue() {
         queue.deQueue();
         queue.deQueue();
-        Assert.assertArrayEquals(queue.toArray(), new Object[]{3});
+        Assert.assertArrayEquals(new Object[]{3}, queue.toArray());
     }
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java
index 3add6bcfdf..0fe5ca06b1 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java
@@ -22,25 +22,25 @@ public void init() {
 
     @Test
     public void testPush() {
-        Assert.assertArrayEquals(stack.toArray(), new Object[]{1, 2, 3});
+        Assert.assertArrayEquals(new Object[]{1, 2, 3}, stack.toArray());
     }
 
     @Test
     public void testPop() {
         Object element1 = stack.pop();
-        Assert.assertEquals(element1, 3);
+        Assert.assertEquals(3, element1);
         Object element2 = stack.pop();
-        Assert.assertEquals(element2, 2);
-        Assert.assertArrayEquals(stack.toArray(), new Object[]{1});
+        Assert.assertEquals(2, element2);
+        Assert.assertArrayEquals(new Object[]{1}, stack.toArray());
     }
 
     @Test
     public void testPeek() {
         Object element1 = stack.peek();
-        Assert.assertEquals(element1, 3);
+        Assert.assertEquals(3, element1);
         Object element2 = stack.peek();
-        Assert.assertEquals(element2, 3);
-        Assert.assertArrayEquals(stack.toArray(), new Object[]{1, 2, 3});
+        Assert.assertEquals(3, element2);
+        Assert.assertArrayEquals(new Object[]{1, 2, 3}, stack.toArray());
     }
 
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java
index 8f97cbd3ea..a6376ce1dd 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java
@@ -24,34 +24,34 @@ public void init() {
 
     @Test
     public void testAdd() {
-        Assert.assertEquals(arrayList.get(0), "1");
-        Assert.assertEquals(arrayList.get(1), "2");
-        Assert.assertEquals(arrayList.get(2), "3");
-        Assert.assertEquals(arrayList.size(), 3);
+        Assert.assertEquals("1", arrayList.get(0));
+        Assert.assertEquals("2", arrayList.get(1));
+        Assert.assertEquals("3", arrayList.get(2));
+        Assert.assertEquals(3, arrayList.size());
     }
 
     @Test
     public void testAddIndex() {
         arrayList.add(1, "4");
         arrayList.add(2, "5");
-        Assert.assertArrayEquals(arrayList.toArray(), new String[]{"1", "4", "5", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "4", "5", "2", "3" }, arrayList.toArray());
     }
 
     @Test
     public void testToArray() {
-        Assert.assertArrayEquals(arrayList.toArray(), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, arrayList.toArray());
     }
 
     @Test
     public void testToGenericArray() {
-        Assert.assertArrayEquals(arrayList.toArray(new String[0]), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, arrayList.toArray(new String[0]));
     }
 
     @Test
     public void testGet() {
-        Assert.assertEquals(arrayList.get(2), "3");
-        Assert.assertEquals(arrayList.get(0), "1");
-        Assert.assertEquals(arrayList.get(1), "2");
+        Assert.assertEquals("3", arrayList.get(2));
+        Assert.assertEquals("1", arrayList.get(0));
+        Assert.assertEquals("2", arrayList.get(1));
     }
 
     @Test
@@ -60,7 +60,7 @@ public void testRemove() {
         arrayList.remove(2);
         arrayList.add(4, "10");
         arrayList.add(3, "9");
-        Assert.assertArrayEquals(arrayList.toArray(), new String[]{"1", "4", "2", "9", "3", "10"});
+        Assert.assertArrayEquals(new String[]{"1", "4", "2", "9", "3", "10" }, arrayList.toArray());
     }
 
     @Test
@@ -70,7 +70,7 @@ public void testIterator() {
             genericIterator.next();
             genericIterator.remove();
         }
-        Assert.assertArrayEquals(arrayList.toArray(), new String[]{});
+        Assert.assertArrayEquals(new String[]{}, arrayList.toArray());
     }
 
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java
index 41adbf6706..6c39ab07e7 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java
@@ -13,7 +13,7 @@ public class GenericBinaryTreeTest {
 
     @Before
     public void init() {
-        String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9"};
+        String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9" };
         GenericBinaryTree<String> binaryTree = new GenericBinaryTree<>();
         for (String data : datas) {
             binaryTree.add(data);
@@ -22,19 +22,19 @@ public void init() {
 
     @Test
     public void testAdd() {
-        String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9"};
+        String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9" };
         GenericBinaryTree<String> binaryTree = new GenericBinaryTree<>();
         for (String data : datas) {
             binaryTree.add(data);
         }
         String[] preorderDatas = binaryTree.traversal(GenericBinaryTree.PREORDER, new String[0]);
-        Assert.assertArrayEquals(preorderDatas, new String[]{"9", "4", "1", "2", "10", "17", "3", "5", "7", "9" });
+        Assert.assertArrayEquals(new String[]{"9", "4", "1", "2", "10", "17", "3", "5", "7", "9" }, preorderDatas);
         String[] inorderDatas = binaryTree.traversal(GenericBinaryTree.INORDER, new String[0]);
-        Assert.assertArrayEquals(inorderDatas, new String[]{"1", "10", "17", "2", "3", "4", "5", "7", "9", "9" });
+        Assert.assertArrayEquals(new String[]{"1", "10", "17", "2", "3", "4", "5", "7", "9", "9" }, inorderDatas);
         String[] postorderDatas = binaryTree.traversal(GenericBinaryTree.POSTORDER, new String[0]);
-        Assert.assertArrayEquals(postorderDatas, new String[]{"17", "10", "3", "2", "1", "7", "5", "4", "9", "9" });
+        Assert.assertArrayEquals(new String[]{"17", "10", "3", "2", "1", "7", "5", "4", "9", "9" }, postorderDatas);
         String[] hierarchicalDatas = binaryTree.traversal(GenericBinaryTree.HIERARCHICAL, new String[0]);
-        Assert.assertArrayEquals(hierarchicalDatas, new String[]{"9", "4", "9", "1", "5", "2", "7", "10", "3", "17" });
+        Assert.assertArrayEquals(new String[]{"9", "4", "9", "1", "5", "2", "7", "10", "3", "17" }, hierarchicalDatas);
     }
 
     @Test
@@ -43,26 +43,26 @@ public void testDelete() {
         // 删除叶子节点
         binaryTree.delete(11);
         Object[] preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88});
+        Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}, preOrderDatas);
         binaryTree.delete(88);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82});
+        Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas);
 
         // 删除一个子节点的节点
         binaryTree.delete(70);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82});
+        Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas);
         binaryTree.delete(80);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82});
+        Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas);
 
         // 删除两个子节点的节点
         binaryTree.delete(40);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82});
+        Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas);
         binaryTree.delete(50);
         preOrderDatas = binaryTree.traversal();
-        Assert.assertArrayEquals(preOrderDatas, new Object[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82});
+        Assert.assertArrayEquals(new Object[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas);
     }
 
     private GenericBinaryTree<Integer> buildTree(int[] datas) {
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java
index 513119fa6e..50aaf13527 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java
@@ -22,26 +22,26 @@ public void init() {
 
     @Test
     public void testAdd() {
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, linkedList.toArray());
     }
 
     @Test
     public void testAddIndex() {
         linkedList.add(1, "10");
         linkedList.add(0, "8");
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"8", "1", "10", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"8", "1", "10", "2", "3" }, linkedList.toArray());
     }
 
     @Test
     public void testAddFirst() {
         linkedList.addFirst("-1");
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"-1", "1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"-1", "1", "2", "3" }, linkedList.toArray());
     }
 
     @Test
     public void testAddLast() {
         linkedList.addLast("99");
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1", "2", "3", "99"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3", "99" }, linkedList.toArray());
     }
 
     @Test
@@ -51,31 +51,31 @@ public void testRemove() {
         linkedList.remove(2);
         linkedList.add(3, "3");
         linkedList.add(1, "2");
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"8", "2", "10", "3", "3"});
+        Assert.assertArrayEquals(new String[]{"8", "2", "10", "3", "3" }, linkedList.toArray());
     }
 
     @Test
     public void testRemoveFirst() {
         linkedList.removeFirst();
         linkedList.removeFirst();
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"3"});
+        Assert.assertArrayEquals(new String[]{"3" }, linkedList.toArray());
     }
 
     @Test
     public void testRemoveLast() {
         linkedList.removeLast();
         linkedList.removeLast();
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1"});
+        Assert.assertArrayEquals(new String[]{"1" }, linkedList.toArray());
     }
 
     @Test
     public void testToArray() {
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, linkedList.toArray());
     }
 
     @Test
     public void testToGenericArray() {
-        Assert.assertArrayEquals(linkedList.toArray(new String[0]), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, linkedList.toArray(new String[0]));
     }
 
     @Test
@@ -85,6 +85,6 @@ public void testIterator() {
             genericIterator.next();
             genericIterator.remove();
         }
-        Assert.assertArrayEquals(linkedList.toArray(), new String[]{});
+        Assert.assertArrayEquals(new String[]{}, linkedList.toArray());
     }
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java
index 6b33a4b3e0..234cff5a02 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java
@@ -21,13 +21,13 @@ public void init() {
 
     @Test
     public void testEnqueue() {
-        Assert.assertArrayEquals(queue.toArray(), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, queue.toArray());
     }
 
     @Test
     public void testDequeue() {
         queue.deQueue();
         queue.deQueue();
-        Assert.assertArrayEquals(queue.toArray(), new String[]{"3"});
+        Assert.assertArrayEquals(new String[]{"3" }, queue.toArray());
     }
 }
diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java
index 0b4b587704..58ca230766 100644
--- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java
+++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java
@@ -22,25 +22,25 @@ public void init() {
 
     @Test
     public void testPush() {
-        Assert.assertArrayEquals(stack.toArray(), new String[]{"1", "2", "3"});
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, stack.toArray());
     }
 
     @Test
     public void testPop() {
         String element1 = stack.pop();
-        Assert.assertEquals(element1, "3");
+        Assert.assertEquals("3", element1);
         String element2 = stack.pop();
-        Assert.assertEquals(element2, "2");
-        Assert.assertArrayEquals(stack.toArray(), new String[]{"1"});
+        Assert.assertEquals("2", element2);
+        Assert.assertArrayEquals(new String[]{"1" }, stack.toArray());
     }
 
     @Test
     public void testPeek() {
         String element1 = stack.peek();
-        Assert.assertEquals(element1, "3");
+        Assert.assertEquals("3", element1);
         String element2 = stack.peek();
-        Assert.assertEquals(element2, "3");
-        Assert.assertArrayEquals(stack.toArray(), new String[]{"1", "2", "3"});
+        Assert.assertEquals("3", element2);
+        Assert.assertArrayEquals(new String[]{"1", "2", "3" }, stack.toArray());
     }
 
 }
diff --git a/group01/954958168/class02/ArrayUtil/pom.xml b/group01/954958168/class02/ArrayUtil/pom.xml
new file mode 100644
index 0000000000..4ef1e0c611
--- /dev/null
+++ b/group01/954958168/class02/ArrayUtil/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.aaront.exercise</groupId>
+    <artifactId>array-util</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+    </dependencies>
+    
+</project>
\ No newline at end of file
diff --git a/group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java b/group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java
new file mode 100644
index 0000000000..8e3112cd06
--- /dev/null
+++ b/group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java
@@ -0,0 +1,240 @@
+package com.aaront.exercise;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        if (origin == null || origin.length == 0) return;
+        int head = 0;
+        int tail = origin.length - 1;
+        while (head < tail) {
+            origin[head] = origin[head] ^ origin[tail];
+            origin[tail] = origin[head] ^ origin[tail];
+            origin[head] = origin[head] ^ origin[tail];
+            head++;
+            tail--;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        if (oldArray == null) return new int[0];
+        int size = oldArray.length;
+        for (int i = 0; i < size; i++) {
+            if (oldArray[i] != 0) continue;
+            int j = i + 1;
+            for (; j < size; j++) {
+                if (oldArray[j] != 0) break;
+            }
+            size -= (j - i);
+            move(oldArray, i, j - i, size);
+        }
+
+        int[] newArray = new int[size];
+        for (int i = 0; i < size; i++) {
+            newArray[i] = oldArray[i];
+        }
+        return newArray;
+    }
+
+    private void move(int[] array, int start, int moveLen, int size) {
+        for (int i = start; i < size; i++) {
+            array[i] = array[i + moveLen];
+        }
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        int len1 = array1.length;
+        int len2 = array2.length;
+        int[] mergeArray = new int[len1 + len2];
+        int i = 0;
+        int j = 0;
+        int k = 0;
+        for (; i < len1 && j < len2; ) {
+            if (array1[i] < array2[j]) {
+                mergeArray[k] = array1[i];
+                i++;
+            } else if (array1[i] > array2[j]) {
+                mergeArray[k] = array2[j];
+                j++;
+            } else {
+                mergeArray[k] = array1[i];
+                i++;
+                j++;
+            }
+            k++;
+        }
+        while (i < len1) {
+            mergeArray[k++] = array1[i++];
+        }
+        while (j < len2) {
+            mergeArray[k++] = array2[j++];
+        }
+        return resize(mergeArray, k);
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        if (oldArray == null) return new int[0];
+        int[] newArray = new int[oldArray.length + size];
+        int index = 0;
+        for (int len = oldArray.length; index < len; index++) {
+            newArray[index] = oldArray[index];
+        }
+        for (int len = newArray.length; index < len; index++) {
+            newArray[index] = 0;
+        }
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (max <= 1) return new int[0];
+        int[] elements = new int[10];
+        elements[0] = 1;
+        elements[1] = 1;
+        int index = 1;
+        int sum;
+        while ((sum = elements[index] + elements[index - 1]) < max) {
+            if (index + 1 >= elements.length) elements = dilatation(elements);
+            elements[++index] = sum;
+        }
+        if (index < elements.length - 1) {
+            elements = resize(elements, index + 1);
+        }
+        return elements;
+    }
+
+    private int[] dilatation(int[] origin) {
+        int len = origin.length;
+        int[] newArray = new int[len * 2];
+        for (int i = 0; i < len; i++) {
+            newArray[i] = origin[i];
+        }
+        return newArray;
+    }
+
+    private int[] resize(int[] origin, int size) {
+        int[] newArray = new int[size];
+        for (int i = 0; i < size; i++) {
+            newArray[i] = origin[i];
+        }
+        return newArray;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        int[] primes = new int[max];
+        int index = 0;
+        for (int i = 2; i < max; i++) {
+            if (isPrimes(i)) {
+                primes[index++] = i;
+            }
+        }
+        return resize(primes, index);
+    }
+
+    private boolean isPrimes(int num) {
+        for (int i = 2; i < num; i++) {
+            if (num % i == 0) return false;
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int[] perfectNumbers = new int[max];
+        int index = 0;
+        for (int i = 1; i < max; i++) {
+            int[] factors = getFactors(i);
+            int sum = 0;
+            for (int factor : factors) {
+                sum += factor;
+            }
+            if (sum == i) perfectNumbers[index++] = i;
+        }
+        return resize(perfectNumbers, index);
+    }
+
+    private int[] getFactors(int num) {
+        int[] factors = new int[num];
+        int index = 0;
+        for (int i = 1; i < num; i++) {
+            if (num % i == 0) {
+                factors[index++] = i;
+            }
+        }
+        return resize(factors, index);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        if (array == null) return "";
+        StringBuilder sb = new StringBuilder("");
+        for(int i = 0, len = array.length;i<len;i++) {
+            sb.append(array[i]);
+            if(i != len - 1) sb.append(seperator);
+        }
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/group01/954958168/class02/ArrayUtil/src/test/java/com/aaront/execrise/ArrayUtilTest.java b/group01/954958168/class02/ArrayUtil/src/test/java/com/aaront/execrise/ArrayUtilTest.java
new file mode 100644
index 0000000000..156f07fa52
--- /dev/null
+++ b/group01/954958168/class02/ArrayUtil/src/test/java/com/aaront/execrise/ArrayUtilTest.java
@@ -0,0 +1,71 @@
+package com.aaront.execrise;
+
+import com.aaront.exercise.ArrayUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author tonyhui
+ * @since 17/2/27
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil arrayUtil = new ArrayUtil();
+
+    @Test
+    public void testReverseArray() {
+        int[] origin = new int[]{7, 9, 30, 3};
+        arrayUtil.reverseArray(origin);
+        Assert.assertArrayEquals(new int[]{3, 30, 9, 7}, origin);
+        origin = new int[]{7, 9, 30, 3, 4};
+        arrayUtil.reverseArray(origin);
+        Assert.assertArrayEquals(new int[]{4, 3, 30, 9, 7}, origin);
+    }
+
+    @Test
+    public void testRemoveZero() {
+        int[] origin = new int[]{1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int[] newArray = arrayUtil.removeZero(origin);
+        Assert.assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, newArray);
+    }
+
+    @Test
+    public void testMerge() {
+        int[] a1 = new int[]{3, 5, 7, 8};
+        int[] a2 = new int[]{4, 5, 6, 7, 9, 10};
+        int[] merge = arrayUtil.merge(a1, a2);
+        Assert.assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8, 9, 10}, merge);
+    }
+
+    @Test
+    public void testGrow() {
+        int[] grow = arrayUtil.grow(new int[]{2, 3, 6}, 3);
+        Assert.assertArrayEquals(new int[]{2, 3, 6, 0, 0, 0}, grow);
+    }
+
+    @Test
+    public void testFibonacci() {
+        int[] fibonacci = arrayUtil.fibonacci(15);
+        Assert.assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, fibonacci);
+        fibonacci = arrayUtil.fibonacci(1);
+        Assert.assertArrayEquals(new int[]{}, fibonacci);
+    }
+
+    @Test
+    public void testGetPrimes() {
+        int[] primes = arrayUtil.getPrimes(23);
+        Assert.assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13, 17, 19}, primes);
+    }
+
+    @Test
+    public void testGetPerfectNumbers() {
+        int[] perfectNumbers = arrayUtil.getPerfectNumbers(1000);
+        Assert.assertArrayEquals(new int[]{6,28,496}, perfectNumbers);
+    }
+
+    @Test
+    public void testJoin() {
+        String join = arrayUtil.join(new int[]{3, 8, 9}, "-");
+        Assert.assertEquals("3-8-9", join);
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/pom.xml b/group01/954958168/class02/LiteStruts/pom.xml
new file mode 100644
index 0000000000..9a962fe54c
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/pom.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.aaront.exercise</groupId>
+    <artifactId>lite-struts</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-digester</groupId>
+            <artifactId>commons-digester</artifactId>
+            <version>2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java
new file mode 100644
index 0000000000..61bb4c1107
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java
@@ -0,0 +1,122 @@
+package com.aaront.exercise;
+
+import com.aaront.exercise.pojo.Action;
+import com.aaront.exercise.pojo.Result;
+import com.aaront.exercise.pojo.Structs;
+import org.apache.commons.digester.Digester;
+import org.apache.commons.lang3.StringUtils;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class LiteStruts {
+
+    private DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+
+    public View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的execute 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        URL resource = readProfiles("struts.xml");
+        Structs structs = parseXML(resource);
+        Action action = structs.getActions().stream().filter(a -> StringUtils.equals(a.getName(), actionName)).findAny().orElseThrow(() -> new RuntimeException("Action不存在"));
+
+        try {
+            Class<?> actionClass = Class.forName(action.getClazz());
+            Object instance = actionClass.newInstance();
+            parameters.entrySet().stream().filter(entry -> StringUtils.isNotBlank(entry.getKey())).forEach(entry -> {
+                String propertyName = entry.getKey();
+                String propertyValue = entry.getValue();
+                String setterMethodName = StringUtils.prependIfMissing(StringUtils.capitalize(propertyName), "set");
+                try {
+                    Class<?> propertyType = actionClass.getDeclaredField(propertyName).getType();
+                    Method method = actionClass.getMethod(setterMethodName, propertyType);
+                    method.invoke(instance, propertyValue);
+                } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            });
+            Method execute = actionClass.getMethod("execute");
+
+            Object methodReturnValue = execute.invoke(instance);
+            String viewPath = action.getResults().stream().filter(result -> result.getName().equals(methodReturnValue)).map(Result::getValue).findAny().orElseThrow(() -> new RuntimeException("没有对应的view"));
+            Map map = new HashMap();
+            Arrays.stream(actionClass.getDeclaredMethods()).filter(method -> method.getName().startsWith("get")).forEach(method -> {
+                try {
+                    Object result = method.invoke(instance);
+                    String propertyName = StringUtils.uncapitalize(method.getName().substring(3));
+                    map.put(propertyName, result);
+                } catch (IllegalAccessException | InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            });
+            View view = new View();
+            view.setJsp(viewPath);
+            view.setParameters(map);
+            return view;
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+            throw new RuntimeException("处理Action的类不存在");
+        } catch (InstantiationException | IllegalAccessException e) {
+            // TODO: 17/2/27 这里可以优化成遍历所有的构造函数之后再抛错
+            e.printStackTrace();
+            throw new RuntimeException("处理Action的类没有默认的构造函数");
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+            throw new RuntimeException("处理Action的类没有execute函数");
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+            throw new RuntimeException("调用execute方法出错");
+        }
+    }
+
+    private URL readProfiles(String filePath) {
+        ClassLoader classLoader = LiteStruts.class.getClassLoader();
+        URL resource = classLoader.getResource(filePath);
+        if (resource == null) throw new RuntimeException("文件不存在");
+        return resource;
+    }
+
+    private Structs parseXML(URL resource) {
+        Digester digester = new Digester();
+        digester.addObjectCreate("struts", Structs.class);
+        digester.addObjectCreate("struts/action", Action.class);
+        digester.addSetProperties("struts/action", new String[]{"name", "class" }, new String[]{"name", "clazz" });
+        digester.addSetNext("struts/action", "addAction");
+        digester.addObjectCreate("struts/action/result", Result.class);
+        digester.addSetProperties("struts/action/result");
+        digester.addBeanPropertySetter("struts/action/result", "value");
+        digester.addSetNext("struts/action/result", "addResult");
+        try {
+            return (Structs) digester.parse(resource);
+        } catch (IOException | SAXException e) {
+            e.printStackTrace();
+            throw new RuntimeException("解析XML文件出错");
+        }
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java
new file mode 100644
index 0000000000..050df9b79c
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java
@@ -0,0 +1,39 @@
+package com.aaront.exercise;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java
new file mode 100644
index 0000000000..f23425e5bd
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java
@@ -0,0 +1,26 @@
+package com.aaront.exercise;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java
new file mode 100644
index 0000000000..cc945a6614
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java
@@ -0,0 +1,38 @@
+package com.aaront.exercise.pojo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tonyhui
+ * @since 17/2/27
+ */
+public class Action {
+    private String name;
+    private String clazz;
+    private List<Result> results = new ArrayList<>();
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+
+    public void addResult(Result result) {
+        this.results.add(result);
+    }
+
+    public List<Result> getResults() {
+        return results;
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java
new file mode 100644
index 0000000000..bdc78b0037
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java
@@ -0,0 +1,26 @@
+package com.aaront.exercise.pojo;
+
+/**
+ * @author tonyhui
+ * @since 17/2/27
+ */
+public class Result {
+    private String name;
+    private String value;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java
new file mode 100644
index 0000000000..253a22d3e7
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java
@@ -0,0 +1,20 @@
+package com.aaront.exercise.pojo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tonyhui
+ * @since 17/2/27
+ */
+public class Structs {
+    private List<Action> actions = new ArrayList<>();
+
+    public void addAction(Action action) {
+        actions.add(action);
+    }
+
+    public List<Action> getActions() {
+        return actions;
+    }
+}
diff --git a/group01/954958168/class02/LiteStruts/src/main/resources/struts.xml b/group01/954958168/class02/LiteStruts/src/main/resources/struts.xml
new file mode 100644
index 0000000000..dcc7f41b61
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.aaront.exercise.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.aaront.exercise.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java b/group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java
new file mode 100644
index 0000000000..12318b16c8
--- /dev/null
+++ b/group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java
@@ -0,0 +1,48 @@
+package com.aaront.exercise;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class StrutsTest {
+
+    private LiteStruts liteStruts;
+
+    @Before
+    public void setUp() {
+        liteStruts = new LiteStruts();
+    }
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "1234");
+
+
+        View view = liteStruts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLoginActionFailed() {
+        String actionName = "login";
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = liteStruts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java"
new file mode 100644
index 0000000000..cd1fb6810c
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java"
@@ -0,0 +1,203 @@
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int tmp ;
+		int length = origin.length;
+		for (int i = 0 ;  i < length / 2 ; i++) {
+			tmp = origin[i];
+            origin[i] = origin[length - i - 1];
+            origin[length - i - 1] = tmp;
+        }
+	}
+
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray){
+        int size = oldArray.length;
+        int[] newArray = new int[size];
+        int repeatTime = 0;
+        int count = 0;
+        for (int i = 0 ; i < oldArray.length;i++) {
+            if (oldArray[i] != 0) {
+                newArray[count++] = oldArray[i];
+            }else{
+                repeatTime++;
+            }
+        }
+        return Arrays.copyOf(newArray,newArray.length - repeatTime);
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2){
+        int[] newArray = new int[array1.length + array2.length];
+        int count = 0;
+        int cursor = 0;
+        int last = 0;
+        int repeatTime = 0;
+        for (int i = 0 ; i < array1.length;i++) {
+            last = i;
+            int value1 = array1[i];
+            if (value1 < array2[cursor]) {
+                newArray[count++] = value1;
+            }else{
+                newArray[count++] = array2[cursor];
+                if (value1 != array2[cursor]) {
+                    i--;
+                }else{
+                    repeatTime++;
+                }
+                cursor++;
+                if (cursor == array2.length) {
+                    break;
+                }
+            }
+        }
+        for (int i = cursor ; i < array2.length ;i++) {
+            if (newArray[count - 1] == array2[i]) {
+                continue;
+            }
+            newArray[count++] = array2[i];
+        }
+
+        for (int i = last;i < array1.length;i++) {
+            if (newArray[count - 1] == array1[i]) {
+                continue;
+            }
+            newArray[count++] = array1[i];
+        }
+        return Arrays.copyOf(newArray,newArray.length - repeatTime);
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+        int[] newArray = new int[oldArray.length + size];
+        System.arraycopy(oldArray,0,newArray,0,oldArray.length);
+        return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+        if (max == 1) {
+            return new int[]{};
+        }
+        int num1 = 1;
+        int num2 = 1;
+        int next = 2;
+        int [] array = new int[max + 1];
+        array[0] = num1;
+        int count = 1;
+        while (next <= max) {
+            array[count++] = num2;
+            next = num1 + num2;
+            num1 = num2;
+            num2 = next;
+        }
+        return Arrays.copyOf(array,count);
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+        int[] primes = new int[max];
+        int count = 0;
+        boolean isPrime = true;
+        for (int i = 2 ; i < max ;i ++) {
+            for (int j = 2 ; j < Math.sqrt(i);j++) {
+                if (i % j == 0){
+                    isPrime = false;
+                    break;
+                }
+            }
+
+            if (isPrime) {
+                primes[count++] = i;
+            }
+
+            isPrime = true;
+        }
+        return Arrays.copyOf(primes,count);
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+        int[] array = new int[max];
+        int count = 0;
+        for (int i = 1 ; i < max ; i++) {
+            int sum = 0;
+            for (int j = 1 ; j < i;j++) {
+                if (i % j == 0) {
+                    sum += j;
+                }
+            }
+            if (sum == i) {
+                array[count++] = i;
+            }
+        }
+        return Arrays.copyOf(array, count);
+    }
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0 ; i < array.length;i++) {
+            sb.append(array[i]);
+            if (i != array.length - 1) {
+                sb.append(seperator);
+            }
+        }
+        return sb.toString();
+	}
+
+
+}
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java"
new file mode 100644
index 0000000000..cc9a7dcf4e
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java"
@@ -0,0 +1,38 @@
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java"
new file mode 100644
index 0000000000..05ee388d2b
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java"
@@ -0,0 +1,161 @@
+
+import com.byhieg.utils.bexception.UncheckedException;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.*;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		("name"="test" ,  "password"="1234") ,
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+
+        */
+
+        //创建文件对象，ClassName，view对象等必备的对象以及得到params参数中所有的key-value
+        String fileName = "/Users/byhieg/IdeaProjects/learnjava/src/com/byhieg/coding2017/homework305/struts.xml";
+        String className;
+        List<String> keys = new ArrayList<>();
+        List<String> values = new ArrayList<>();
+        Iterator iterator = parameters.entrySet().iterator();
+        String[] methodNames = new String[parameters.size()];
+        int i = 0;
+
+        View view = new View();
+        Map map = new HashMap();
+        // 得到set方法的方法名
+        while (iterator.hasNext()) {
+            Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();
+            String key = entry.getKey();
+            keys.add(key);
+            values.add(entry.getValue());
+            methodNames[i++] = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
+        }
+
+        try {
+            //反射得到对象
+            Element element = getTargetElement(actionName, fileName);
+            className = getClassName(element);
+            Class clz = Class.forName(className);
+            Object obj = clz.newInstance();
+
+            //根据上面的set方法名的数组，依次调用，
+            for (int j = 0; j < methodNames.length; j++) {
+                Method method = clz.getMethod(methodNames[j], String.class);
+                method.invoke(obj, values.get(j));
+            }
+
+            //执行execute方法
+            Method method = clz.getMethod("execute");
+            String result = (String) method.invoke(obj);
+
+            //得到所有方法，判断哪些是get方法，是的话，生成需要的map
+            Method[] methods = clz.getMethods();
+            for (Method item : methods) {
+                if (item.getName().contains("get")) {
+                    String key = item.getName().substring(3).toLowerCase();
+                    Object value = item.invoke(obj);
+                    map.put(key, value);
+                }
+            }
+
+            view.setParameters(map);
+
+            //根据result得到jsp，放入view对象中
+            String jsp = getJsp(element, result);
+            view.setJsp(jsp);
+
+            return view;
+
+        } catch (DocumentException e) {
+            System.out.println("文件找不到");
+        } catch (ClassNotFoundException e) {
+            System.out.println("找不到指定的类");
+        } catch (InstantiationException | IllegalAccessException e) {
+            System.out.println("创建对象失败");
+        } catch (NoSuchMethodException e) {
+            System.out.println("方法创建失败");
+        } catch (InvocationTargetException e) {
+            System.out.println("方法执行失败");
+        }
+
+
+        return view;
+    }
+
+
+    /**
+     *
+     * @param element 指定的的节点
+     * @return 返回该节点对应的ClassName的值
+     * @throws DocumentException 文件异常
+     */
+
+    private static String getClassName(Element element) throws DocumentException {
+        return element.attribute(1).getValue();
+
+
+    }
+
+    /**
+     *
+     * @param actionName actionName
+     * @param fileName xml文件路径
+     * @return 指定actionName对应的节点元素
+     * @throws DocumentException 文件异常
+     */
+    private static Element getTargetElement(String actionName, String fileName) throws DocumentException {
+        SAXReader reader = new SAXReader();
+        Document document = reader.read(new File(fileName));
+        Element rootNode = document.getRootElement();
+        List<Element> elements = rootNode.elements();
+        for (Element item : elements) {
+            if (actionName.equals(item.attribute(0).getValue())) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 通过result，得到指定的JSP
+     * @param element actionName对象的节点
+     * @param result result标签的name
+     * @return result标签的值
+     */
+    private static String getJsp(Element element,String result) {
+        List<Element> elements = element.elements();
+        for (Element e : elements) {
+            if (result.equals(e.attribute(0).getValue())){
+                return e.getTextTrim();
+            }
+        }
+
+        return null;
+    }
+
+
+}
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java"
new file mode 100644
index 0000000000..beca61aa9a
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java"
@@ -0,0 +1,42 @@
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java"
new file mode 100644
index 0000000000..12ae000ab0
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java"
@@ -0,0 +1,22 @@
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml"
new file mode 100644
index 0000000000..ae0ce37fd8
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml"
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java"
new file mode 100644
index 0000000000..df9ab466b1
--- /dev/null
+++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java"
@@ -0,0 +1,81 @@
+package com.byhieg.coding2017.homework305;
+
+import com.byhieg.utils.bprint.FullPrint;
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+/**
+ * Created by byhieg on 17/3/1.
+ * Mail to byhieg@gmail.com
+ */
+public class ArrayUtilTest extends TestCase {
+    public void testReverseArray() throws Exception {
+        int[] array = new int[]{1, 2, 4, 5};
+        ArrayUtil util = new ArrayUtil();
+        util.reverseArray(array);
+        for (int i = 0 ; i < array.length;i++) {
+            System.out.print(array[i]);
+        }
+
+    }
+
+    public void testRemoveZero() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        ArrayUtil util = new ArrayUtil();
+        int [] newArray = util.removeZero(oldArr);
+        for (int i = 0 ; i < newArray.length;i++) {
+            System.out.print(newArray[i] + " ");
+        }
+    }
+
+    public void testMerge() throws Exception {
+        int [] a1 = new int[]{3, 5,7,8,10,11};
+        int [] a2 = new int[]{4, 5, 6,7};
+        int[] newArray = new ArrayUtil().merge(a1,a2);
+        for (int i = 0 ; i < newArray.length;i++) {
+            System.out.print(newArray[i] + " ");
+        }
+
+    }
+
+    public void testGrow() throws Exception {
+        int[] a = new int[]{1, 2, 3, 4, 5};
+        int [] newArray = new ArrayUtil().grow(a,3);
+        for (int i = 0 ; i < newArray.length;i++) {
+            System.out.print(newArray[i] + " ");
+        }
+
+    }
+
+
+    public void testFibonacci()throws Exception {
+        int[] newArray = new ArrayUtil().fibonacci(2);
+        for (int i = 0 ; i < newArray.length;i++) {
+            System.out.print(newArray[i] + " ");
+        }
+
+    }
+
+    public void testgetPrimes() throws Exception {
+        int[] newArray = new ArrayUtil().getPrimes(23);
+        for (int i = 0 ; i < newArray.length;i++) {
+            System.out.print(newArray[i] + " ");
+        }
+
+    }
+
+    public void testgetPerfectNumbers() throws Exception {
+        int [] newArray = new ArrayUtil().getPerfectNumbers(100);
+        for (int i = 0 ; i < newArray.length;i++) {
+            System.out.print(newArray[i] + " ");
+        }
+
+    }
+
+    public void testJoin() throws Exception {
+        int[] a = new int[]{3, 8, 9};
+        System.out.println(new ArrayUtil().join(a,"-"));
+
+    }
+
+}
\ No newline at end of file
diff --git a/group03/1196051822/README b/group03/1196051822/README
deleted file mode 100644
index c7b21c2ef0..0000000000
--- a/group03/1196051822/README
+++ /dev/null
@@ -1,2 +0,0 @@
-# 作业文件夹说明
-src文件夹存放是的作业源码的文件，test文件夹存放的是源码相应的测试文件
diff --git a/group03/1196051822/readme.md b/group03/1196051822/readme.md
new file mode 100644
index 0000000000..fa4ad63f02
--- /dev/null
+++ b/group03/1196051822/readme.md
@@ -0,0 +1,5 @@
+# 说明
+这个文件夹是QQ：119601822 学员的代码文件夹。
+在每个作业代码包含src文件夹和test文件夹
+src文件夹内容均是Java代码，无执行的class文件。
+test文件夹内容时src文件夹代码的测试类的文件夹。
\ No newline at end of file
diff --git a/group03/1360464792/pom.xml b/group03/1360464792/pom.xml
index 5fed7b15ab..fc16664c23 100644
--- a/group03/1360464792/pom.xml
+++ b/group03/1360464792/pom.xml
@@ -20,6 +20,13 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
         </dependency>
 
     </dependencies>
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java b/group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java
deleted file mode 100644
index 4040049ed8..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package rui.study.coding2017;
-
-
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-public class ArrayList implements List {
-
-    private int size;
-
-    private Object[] elementData;
-
-    private static Object[] emptyObjects={};
-
-    private static int defaultCapacity=10;
-
-    public void add(Object o){
-        ensureCapacity(this.size+1);
-        elementData[size++]=o;
-    }
-
-    public void add(int index, Object o){
-        rangeCheckForAdd(index);
-        if(elementData[index]!=null){
-            ensureCapacity(this.size+1);
-            //执行数组拷贝
-            System.arraycopy(elementData,index,elementData,index+1,size-index);
-            size++;
-        }
-        elementData[index]=o;
-    }
-
-    public Object get(int index){
-        rangeCheck(index);
-        return elementData[index];
-    }
-
-    public Object remove(int index){
-        rangeCheck(index);
-        Object object=elementData[index];
-
-        int numMoved=size-index-1;
-        //如果是最后一位remove ，无需进行数组拷贝
-        if(numMoved>0){
-            System.arraycopy(elementData, index+1, elementData, index,numMoved);
-        }
-        elementData[--size]=null;
-        return object;
-    }
-
-    public int size(){
-        return this.size;
-    }
-
-    public Iterator iterator(){
-        return new ArrayListIterator();
-    }
-
-    public ArrayList(){
-        this.size=0;
-        this.elementData=emptyObjects;
-    }
-
-    public ArrayList(int size){
-        this.size=size;
-        if(size>0){
-            this.elementData=new Object[size];
-        }else if(size==0){
-            this.elementData=emptyObjects;
-        }else{
-            throw new IllegalArgumentException("非法容器大小 "+size);
-        }
-
-    }
-
-    /**
-     * 判断索引是否合法
-     * @param index 索引
-     */
-    private void rangeCheckForAdd(int index) {
-        if(index>size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为："+size);
-    }
-
-    /**
-     * 判断索引是否合法 ,
-     * @param index 索引
-     */
-    private void rangeCheck(int index) {
-        if(index>=size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为："+size);
-    }
-
-
-    /**
-     * 确保当前数组能够长度能够容纳新的对象，如果不够，就自行增长
-     * @param needLength 需要的数组长度
-     */
-    private void ensureCapacity(int needLength) {
-        if(elementData==emptyObjects){
-            needLength = Math.max(defaultCapacity, needLength);
-        }
-
-        if(needLength-elementData.length>0){
-            this.grow(needLength);
-        }
-    }
-
-    /**
-     * 数组扩容
-     * @param needLength 需要的长度
-     */
-    private void grow(int needLength) {
-        int elementLength=elementData.length;
-        //扩容1.5倍
-        int newLength=elementLength+(elementLength>>1);
-
-        if(needLength-newLength>0){
-            newLength=needLength;
-        }
-        this.elementData= Arrays.copyOf(this.elementData,newLength);
-    }
-
-    private class ArrayListIterator implements Iterator{
-        //游标，当前迭代器执行到何处了
-        private int cursor=0;
-
-        @Override
-        public boolean hasNext() {
-            return cursor!=size;
-        }
-
-        @Override
-        public Object next() {
-            if (cursor >= size)throw new NoSuchElementException();
-            Object[] elementData = ArrayList.this.elementData;
-            return elementData[cursor++];
-        }
-    }
-
-
-
-
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java b/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java
deleted file mode 100644
index 7d63153ffb..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package rui.study.coding2017;
-
-/**
- * 二叉树
- * Created by 赵睿 on 2017/2/25.
- */
-public class BinaryTree {
-    private BinaryTreeNode root;
-
-    private int size;
-
-    public void insert(Comparable comparable){
-        BinaryTreeNode binaryTreeNode=new BinaryTreeNode(comparable);
-
-        if(this.root==null){
-            this.root=binaryTreeNode;
-        }else {
-            boolean flag=false;
-            BinaryTreeNode cursorNode=root;
-            while(!flag){
-                if(comparable.compareTo(cursorNode.getData())<0){
-                    if(cursorNode.getLeft()==null){
-                        cursorNode.setLeft(binaryTreeNode);
-                        flag=true;
-                    }else{
-                        cursorNode=cursorNode.getLeft();
-                    }
-                }else {
-                    if(cursorNode.getRight()==null){
-                        cursorNode.setRight(binaryTreeNode);
-                        flag=true;
-                    }else{
-                        cursorNode=cursorNode.getRight();
-                    }
-                }
-
-            }
-        }
-        size++;
-    }
-
-    public LinkedList inorder(){
-        LinkedList linkedList=new LinkedList();
-        sortLeft(linkedList,root);
-        sortRight(linkedList,root);
-        return linkedList;
-    }
-
-    private void sortRight(LinkedList linkedList,BinaryTreeNode binaryTreeNode){
-        Queue queue=getRightList(binaryTreeNode);
-        while(!queue.isEmpty()){
-            BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue();
-            sortLeft(linkedList,queueNode);
-        }
-
-    }
-
-    private void sortLeft(LinkedList linkedList,BinaryTreeNode binaryTreeNode){
-        Stack stack=getLeftList(binaryTreeNode);
-        while(!stack.isEmpty()) {
-            BinaryTreeNode stackNode = (BinaryTreeNode) stack.pop();
-            linkedList.add(stackNode.getData());
-            Queue queue = getRightList(stackNode);
-            while (!queue.isEmpty()) {
-                BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue();
-                sortLeft(linkedList,queueNode);
-            }
-        }
-        linkedList.add(binaryTreeNode.getData());
-    }
-
-
-    private Stack getLeftList(BinaryTreeNode binaryTreeNode){
-        Stack stack=new Stack();
-        while(binaryTreeNode.getLeft()!=null){
-            binaryTreeNode=binaryTreeNode.getLeft();
-            stack.push(binaryTreeNode);
-        }
-        return stack;
-    }
-
-    private Queue getRightList(BinaryTreeNode binaryTreeNode){
-        Queue queue=new Queue();
-        while(binaryTreeNode.getRight()!=null){
-            binaryTreeNode=binaryTreeNode.getRight();
-            queue.enQueue(binaryTreeNode);
-        }
-        return queue;
-    }
-
-
-
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java b/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java
deleted file mode 100644
index 3895133f17..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package rui.study.coding2017;
-
-public class BinaryTreeNode {
-
-    private Comparable data;
-    private BinaryTreeNode left;
-    private BinaryTreeNode right;
-
-    public Comparable getData() {
-        return data;
-    }
-    public void setData(Comparable data) {
-        this.data = data;
-    }
-    public BinaryTreeNode getLeft() {
-        return left;
-    }
-    public void setLeft(BinaryTreeNode left) {
-        this.left = left;
-    }
-    public BinaryTreeNode getRight() {
-        return right;
-    }
-    public void setRight(BinaryTreeNode right) {
-        this.right = right;
-    }
-
-    public BinaryTreeNode() {
-    }
-
-    public BinaryTreeNode(Comparable data) {
-        this.data = data;
-    }
-
-    public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) {
-        this.data = data;
-        this.left = left;
-        this.right = right;
-    }
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java b/group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java
deleted file mode 100644
index dddde983c6..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package rui.study.coding2017;
-
-
-public interface Iterator {
-    public boolean hasNext();
-    public Object next();
-
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java b/group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java
deleted file mode 100644
index f0a04cd32f..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package rui.study.coding2017;
-
-/**
- * 单向链表
- */
-public class LinkedList {
-    private Node head;
-
-    private Node current;
-
-    private int size;
-
-    public LinkedList(){
-    }
-
-    public int size(){
-        return size;
-    }
-
-    public void add(Object o){
-        Node newNode=new Node(o,null);
-        if(size==0){
-            head=current=newNode;
-        }
-        current.next=newNode;
-        current=newNode;
-        size++;
-    }
-
-    public void add(int index , Object o){
-        checkIndexForAdd(index);
-        if(index==size){
-           add(o);
-        }else{
-           Node newNode=new Node(o,null);
-            if(index==0){
-                newNode.next=head;
-                head=newNode;
-            }else{
-                Node after=getIndexNode(index);
-                Node before=getIndexNode(index-1);
-                before.next=newNode;
-                newNode.next=after;
-            }
-            size++;
-       }
-    }
-
-
-    public Object get(int index){
-        return getIndexNode(index).data;
-    }
-
-    public void addFirst(Object obj){
-        add(0,obj);
-    }
-    public void addLast(Object obj){
-        if(size==0){
-            add(obj);
-        }else {
-            add(size,obj);
-        }
-    }
-
-    public Object remove(int index){
-        checkIndex(index);
-        Node needRemove;
-        if(index==0){
-            needRemove=head;
-            if(size==1){
-                head=null;
-            }else{
-                head=head.next;
-            }
-        }else{
-            needRemove=getIndexNode(index);
-            Node before=getIndexNode(index-1);
-            before.next=needRemove.next;
-            if(index==size-1){
-                current=before;
-            }
-        }
-        size--;
-        return needRemove.data;
-    }
-    public Object removeFirst(){
-        return remove(0);
-    }
-    public Object removeLast(){
-        return remove(size-1);
-    }
-    public Iterator iterator(){
-        return new LinkedListIterator();
-    }
-
-
-    public class LinkedListIterator implements Iterator{
-
-       private int cursor=0;
-
-       private Node cursorNode=head;
-
-        @Override
-        public boolean hasNext() {
-            return cursor!=size;
-        }
-
-        @Override
-        public Object next() {
-            Object object=cursorNode.data;
-            cursorNode=cursorNode.next;
-            cursor++;
-            return object;
-        }
-    }
-
-    private void checkIndexForAdd(int index){
-        if(!(index>=0&&index<=size)){
-            throw new IndexOutOfBoundsException("索引"+index+"越界！");
-        }
-    }
-    private void checkIndex(int index){
-        if(!(index>=0&&index<size)){
-            throw new IndexOutOfBoundsException("索引"+index+"越界！");
-        }
-    }
-
-    private Node getIndexNode(int index){
-        checkIndex(index);
-        if(index==0){
-            return head;
-        }else if(index+1==size){
-            return current;
-        }else{
-            boolean flag=false;
-            Node nodes=head;
-            int cursor=1;
-            while(!flag){
-                nodes=nodes.next;
-                flag=cursor==index;
-                cursor++;
-            }
-            return nodes;
-        }
-    }
-
-    private static class Node{
-        Object data;
-        Node next;
-
-        public Node(Object data, Node next) {
-            this.data = data;
-            this.next = next;
-        }
-    }
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/List.java b/group03/1360464792/src/main/java/rui/study/coding2017/List.java
deleted file mode 100644
index ef68407c78..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package rui.study.coding2017;
-
-public interface List {
-    public void add(Object o);
-    public void add(int index, Object o);
-    public Object get(int index);
-    public Object remove(int index);
-    public int size();
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/Queue.java b/group03/1360464792/src/main/java/rui/study/coding2017/Queue.java
deleted file mode 100644
index 4ab5d7e5c1..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/Queue.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package rui.study.coding2017;
-
-public class Queue {
-    LinkedList linkedList=new LinkedList();
-
-    public void enQueue(Object o){
-        linkedList.add(o);
-    }
-
-    public Object deQueue(){
-        return linkedList.removeFirst();
-    }
-
-    public boolean isEmpty(){
-        return linkedList.size()==0;
-    }
-
-    public int size(){
-        return linkedList.size();
-    }
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/Stack.java b/group03/1360464792/src/main/java/rui/study/coding2017/Stack.java
deleted file mode 100644
index 9ff78d6dca..0000000000
--- a/group03/1360464792/src/main/java/rui/study/coding2017/Stack.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package rui.study.coding2017;
-
-public class Stack {
-    private ArrayList elementData = new ArrayList();
-
-    public void push(Object o){
-        elementData.add(o);
-    }
-
-    public Object pop(){
-        return elementData.remove(size()-1);
-    }
-
-    public Object peek(){
-        return elementData.get(size()-1);
-    }
-    public boolean isEmpty(){
-        return elementData.size()==0;
-    }
-
-    public int size(){
-        return elementData.size();
-    }
-}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..031b14fcef
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java
@@ -0,0 +1,230 @@
+package rui.study.coding2017.coderising.array;
+
+import java.util.Arrays;
+
+/**
+ * 创建于 2017-03-01.
+ *
+ * @author 赵睿
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * @param origin
+     * @return
+     */
+    public int[] reverseArray(int[] origin){
+        int length=origin.length;
+
+        int[] result=new int[length];
+        int j=0;
+        for (int i = length-1; i >=0 ; i--) {
+            result[j]=origin[i];
+            j++;
+        }
+        return result;
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray){
+        int length=oldArray.length;
+        int notZero=0;
+        int[] temArray=new int[length];
+        for (int i = 0; i <length ; i++) {
+            if(oldArray[i]!=0){
+                temArray[notZero]=oldArray[i];
+                notZero++;
+            }
+        }
+        temArray=Arrays.copyOf(temArray,notZero);
+        return temArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2){
+        int tempSize=0;
+        int i=0;
+        int j=0;
+        boolean flag=false;
+        int tempArr[]=new int[array1.length+array2.length];
+        while(!flag){
+            if(array1[i]>array2[j]){
+                tempArr[tempSize]=array2[j];
+                j++;
+            }else if(array1[i]==array2[j]){
+                tempArr[tempSize]=array1[i];
+                i++;j++;
+            }else {
+                tempArr[tempSize]=array1[i];
+                i++;
+            }
+            tempSize++;
+            flag=j>array2.length-1||i>array1.length-1;
+        }
+        if(i<=j){
+            for (; i < array1.length ; i++) {
+                tempArr[tempSize]=array1[i];
+                tempSize++;
+            }
+        }else{
+            for (; j < array2.length ; i++) {
+                tempArr[tempSize]=array2[i];
+                tempSize++;
+            }
+        }
+        return Arrays.copyOf(tempArr,tempSize);
+    }
+
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int [] oldArray,  int size){
+        return Arrays.copyOf(oldArray,oldArray.length+size);
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max){
+        int[] empty={};
+        int tempSize=0;
+        int temp[]=new int[max];
+
+        if(max<=1){
+            return empty;
+        }else if(max==2){
+            temp[0]=1;
+            temp[1]=1;
+            return temp;
+        }else{
+            temp[0]=1;
+            temp[1]=1;
+            tempSize=2;
+        }
+        boolean flag=false;
+        while(!flag){
+            int tempMax=temp[tempSize-2]+temp[tempSize-1];
+            if(tempMax>max){
+                flag=true;
+            }else{
+                temp[tempSize++]=tempMax;
+            }
+        }
+        return Arrays.copyOf(temp,tempSize);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max){
+        int temp[]=new int[max];
+        int tempSize=0;
+        for (int i = 0; i < max; i++) {
+            if(isPrimes(i)){
+                temp[tempSize++]=i;
+            }
+        }
+        return Arrays.copyOf(temp,tempSize);
+    }
+
+    private boolean isPrimes(int num){
+        if(num<2) return false;
+        if(num==2) return true;
+        if(num==3) return true;
+        for (int i = 2; i *i<=num; i++) {
+            if(num%i==0) {
+                 return false;
+            }
+        }
+        return true;
+    }
+
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max){
+        int temp[] =new int[max];
+        int tempSize=0;
+
+        for (int i = 0; i < max; i++) {
+            if(isPerfectNumber(i)){
+                temp[tempSize++]=i;
+            }
+        }
+        return Arrays.copyOf(temp,tempSize);
+    }
+
+    private boolean isPerfectNumber(int num){
+        if(num<1)return false;
+        if(num==1)return true;
+        int temp[] =new int[num];
+        int tempSize=0;
+        temp[tempSize++]=1;
+        for (int i = 2; i < num; i++) {
+            if(num%i==0){
+                temp[tempSize++]=i;
+            }
+        }
+
+        int add=0;
+        for (int i = 0; i < tempSize; i++) {
+            add+=temp[i];
+        }
+        if(add==num)return true;
+        return false;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     * @param array
+     * @param
+     * @return
+     */
+    public String join(int[] array, String seperator){
+        StringBuilder stringBuilder=new StringBuilder();
+
+        for (int i = 0; i < array.length-1; i++) {
+            stringBuilder.append(array[i])
+                    .append(seperator);
+        }
+        stringBuilder.append(array[array.length-1]);
+        return stringBuilder.toString();
+    }
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java
new file mode 100644
index 0000000000..2feac1cd83
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java
@@ -0,0 +1,39 @@
+package rui.study.coding2017.coderising.liteststruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java
new file mode 100644
index 0000000000..c74632c2b6
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java
@@ -0,0 +1,39 @@
+package rui.study.coding2017.coderising.liteststruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LogoutAction {
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java
new file mode 100644
index 0000000000..0225b9ac36
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java
@@ -0,0 +1,106 @@
+package rui.study.coding2017.coderising.liteststruts;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        View view=new View();
+        try {
+            StrutsAction strutsAction= StrutsAction.getFormStrutsMap(actionName);
+
+            Class clazz=strutsAction.getaClass();
+            Object object=clazz.newInstance();
+
+            setActionValue(parameters,object);
+            String resultStr = execute(object);
+            getVlaue(view, object);
+            getJspPath(view, strutsAction, resultStr);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    	return view;
+    }
+
+    /**
+     *
+     1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+     据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+     ("name"="test" ,  "password"="1234") ,
+     那就应该调用 setName和setPassword方法
+
+     * @param parameters 请求参数
+     * @param object 对象
+     */
+    private static void setActionValue(Map<String, String> parameters, Object object) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+        for (Map.Entry<String,String> entry: parameters.entrySet()) {
+            String key=entry.getKey();
+            String methodName="set"+key.substring(0,1).toUpperCase()+key.substring(1,key.length());
+            Method method=object.getClass().getMethod(methodName,String.class);
+            method.invoke(object,entry.getValue());
+        }
+    }
+
+    /**
+     * 2. 通过反射调用对象的execute 方法， 并获得返回值，例如"success"
+     * @param object 反射生成的对象
+     * @return 执行结果表示
+     */
+    private static String execute(Object object) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException {
+        Method executeMethod=object.getClass().getMethod("execute");
+        Object returnObj=executeMethod.invoke(object);
+        if(returnObj.getClass()!=String.class) throw new IOException("不支持非页面跳转类型");
+        return (String) returnObj;
+    }
+
+
+    /**
+     *
+     3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+     通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+     放到View对象的parameters
+     * @param view 视图
+     * @param object 反射之后的action类
+     */
+    private static void getVlaue(View view, Object object) throws IllegalAccessException, InvocationTargetException {
+        Map<String,Object> resultMap=new HashMap<String,Object>();
+        Method[] methods=object.getClass().getDeclaredMethods();
+        for (Method getMethod:methods) {
+            String methodName=getMethod.getName();
+            if(methodName.contains("get")){
+                Object o=getMethod.invoke(object);
+                String fileName=methodName.replace("get","");
+                fileName=fileName.substring(0,1).toLowerCase()+fileName.substring(1,fileName.length());
+                resultMap.put(fileName,o);
+            }
+        }
+        view.setParameters(resultMap);
+    }
+
+    /**
+     4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+     放到View对象的jsp字段中。
+     * @param view 视图
+     * @param strutsAction xml解析后的存储类
+     * @param resultStr 结果表示
+     */
+    private static void getJspPath(View view, StrutsAction strutsAction, String resultStr) {
+        for (StrutsAction.Result result:strutsAction.getResults()) {
+            if(result.name.equals(resultStr))view.setJsp(result.jspPath);
+        }
+    }
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java
new file mode 100644
index 0000000000..3f41707dcb
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java
@@ -0,0 +1,127 @@
+package rui.study.coding2017.coderising.liteststruts;
+
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 读取struct.xml.解析xml
+ * Created by 赵睿 on 2017/3/4.
+ */
+public class StrutsAction {
+    private String name;
+    private Class aClass;
+    private List<Result> results;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Class getaClass() {
+        return aClass;
+    }
+
+    public void setaClass(Class aClass) {
+        this.aClass = aClass;
+    }
+
+    class Result{
+        String name;
+        String jspPath;
+    }
+
+    public List<Result> getResults() {
+        return results;
+    }
+
+    public void setResults(List<Result> results) {
+        this.results = results;
+    }
+    public void setResult(Result result) {
+        this.results.add(result);
+    }
+
+    private static volatile Map<String ,Object> strutsMap=new HashMap<String,Object>();
+
+    static void putStrutsMap(String key,Object obj){
+        if(strutsMap.get(key)==null){
+            synchronized (key){
+                if(strutsMap.get(key)==null){
+                    synchronized (key){
+                        strutsMap.put(key,obj);
+                    }
+                }
+            }
+        }
+    }
+
+    static StrutsAction getFormStrutsMap(String key){
+        return (StrutsAction) strutsMap.get(key);
+    }
+
+    //0. 读取配置文件struts.xml
+    static {
+        try {
+            File strutsFile=new File(Struts.class.getResource("/struts.xml").getPath());
+            Document document= new SAXReader().read(strutsFile);
+            Element element=document.getRootElement();
+            if(!element.getName().equals("struts")) throw new IOException("不是一个struts.xml的配置文件");
+            StrutsAction.listNodes(element,null);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    static void listNodes(Element element, Object object) throws ClassNotFoundException {
+        List<Element> elements=element.elements();
+        for (Element childEle:elements) {
+            if(childEle.getName().equals("action")) dealAction(childEle);
+            if(childEle.getName().equals("result")) dealResult(childEle, (StrutsAction) object);
+        }
+
+    }
+
+    static void dealAction(Element action) throws ClassNotFoundException {
+        StrutsAction strutsAction=new StrutsAction();
+        List<Attribute> attributes=action.attributes();
+        for (Attribute attribute:attributes) {
+            if(attribute.getName().equals("name")) strutsAction.setName(attribute.getValue());
+            if(attribute.getName().equals("class")) strutsAction.setaClass(Class.forName(attribute.getValue()));
+        }
+        List<StrutsAction.Result> results=new ArrayList<Result>(action.elements().size());
+        strutsAction.setResults(results);
+        listNodes(action,strutsAction);
+        putStrutsMap(strutsAction.getName(),strutsAction);
+    }
+
+    static void dealResult(Element element,StrutsAction strutsAction) {
+        StrutsAction.Result result=strutsAction.new Result();
+        List<Attribute> attributes=element.attributes();
+        for (Attribute attribute:attributes) {
+            if(attribute.getName().equals("name")) result.name=attribute.getValue();
+        }
+        result.jspPath=element.getStringValue();
+        strutsAction.setResult(result);
+    }
+}
+
+
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java
new file mode 100644
index 0000000000..cb09758177
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java
@@ -0,0 +1,23 @@
+package rui.study.coding2017.coderising.liteststruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..ddf5e49be2
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java
@@ -0,0 +1,142 @@
+package rui.study.coding2017.coding.basic;
+
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+public class ArrayList implements List {
+
+    private int size;
+
+    private Object[] elementData;
+
+    private static Object[] emptyObjects={};
+
+    private static int defaultCapacity=10;
+
+    public void add(Object o){
+        ensureCapacity(this.size+1);
+        elementData[size++]=o;
+    }
+
+    public void add(int index, Object o){
+        rangeCheckForAdd(index);
+        if(elementData[index]!=null){
+            ensureCapacity(this.size+1);
+            //执行数组拷贝
+            System.arraycopy(elementData,index,elementData,index+1,size-index);
+            size++;
+        }
+        elementData[index]=o;
+    }
+
+    public Object get(int index){
+        rangeCheck(index);
+        return elementData[index];
+    }
+
+    public Object remove(int index){
+        rangeCheck(index);
+        Object object=elementData[index];
+
+        int numMoved=size-index-1;
+        //如果是最后一位remove ，无需进行数组拷贝
+        if(numMoved>0){
+            System.arraycopy(elementData, index+1, elementData, index,numMoved);
+        }
+        elementData[--size]=null;
+        return object;
+    }
+
+    public int size(){
+        return this.size;
+    }
+
+    public Iterator iterator(){
+        return new ArrayListIterator();
+    }
+
+    public ArrayList(){
+        this.size=0;
+        this.elementData=emptyObjects;
+    }
+
+    public ArrayList(int size){
+        this.size=size;
+        if(size>0){
+            this.elementData=new Object[size];
+        }else if(size==0){
+            this.elementData=emptyObjects;
+        }else{
+            throw new IllegalArgumentException("非法容器大小 "+size);
+        }
+
+    }
+
+    /**
+     * 判断索引是否合法
+     * @param index 索引
+     */
+    private void rangeCheckForAdd(int index) {
+        if(index>size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为："+size);
+    }
+
+    /**
+     * 判断索引是否合法 ,
+     * @param index 索引
+     */
+    private void rangeCheck(int index) {
+        if(index>=size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为："+size);
+    }
+
+
+    /**
+     * 确保当前数组能够长度能够容纳新的对象，如果不够，就自行增长
+     * @param needLength 需要的数组长度
+     */
+    private void ensureCapacity(int needLength) {
+        if(elementData==emptyObjects){
+            needLength = Math.max(defaultCapacity, needLength);
+        }
+
+        if(needLength-elementData.length>0){
+            this.grow(needLength);
+        }
+    }
+
+    /**
+     * 数组扩容
+     * @param needLength 需要的长度
+     */
+    private void grow(int needLength) {
+        int elementLength=elementData.length;
+        //扩容1.5倍
+        int newLength=elementLength+(elementLength>>1);
+
+        if(needLength-newLength>0){
+            newLength=needLength;
+        }
+        this.elementData= Arrays.copyOf(this.elementData,newLength);
+    }
+
+    private class ArrayListIterator implements Iterator{
+        //游标，当前迭代器执行到何处了
+        private int cursor=0;
+
+        @Override
+        public boolean hasNext() {
+            return cursor!=size;
+        }
+
+        @Override
+        public Object next() {
+            if (cursor >= size)throw new NoSuchElementException();
+            Object[] elementData = ArrayList.this.elementData;
+            return elementData[cursor++];
+        }
+    }
+
+
+
+
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java
new file mode 100644
index 0000000000..f306da9cf0
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java
@@ -0,0 +1,93 @@
+package rui.study.coding2017.coding.basic;
+
+/**
+ * 二叉树
+ * Created by 赵睿 on 2017/2/25.
+ */
+public class BinaryTree {
+    private BinaryTreeNode root;
+
+    private int size;
+
+    public void insert(Comparable comparable){
+        BinaryTreeNode binaryTreeNode=new BinaryTreeNode(comparable);
+
+        if(this.root==null){
+            this.root=binaryTreeNode;
+        }else {
+            boolean flag=false;
+            BinaryTreeNode cursorNode=root;
+            while(!flag){
+                if(comparable.compareTo(cursorNode.getData())<0){
+                    if(cursorNode.getLeft()==null){
+                        cursorNode.setLeft(binaryTreeNode);
+                        flag=true;
+                    }else{
+                        cursorNode=cursorNode.getLeft();
+                    }
+                }else {
+                    if(cursorNode.getRight()==null){
+                        cursorNode.setRight(binaryTreeNode);
+                        flag=true;
+                    }else{
+                        cursorNode=cursorNode.getRight();
+                    }
+                }
+
+            }
+        }
+        size++;
+    }
+
+    public LinkedList inorder(){
+        LinkedList linkedList=new LinkedList();
+        sortLeft(linkedList,root);
+        sortRight(linkedList,root);
+        return linkedList;
+    }
+
+    private void sortRight(LinkedList linkedList,BinaryTreeNode binaryTreeNode){
+        Queue queue=getRightList(binaryTreeNode);
+        while(!queue.isEmpty()){
+            BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue();
+            sortLeft(linkedList,queueNode);
+        }
+
+    }
+
+    private void sortLeft(LinkedList linkedList,BinaryTreeNode binaryTreeNode){
+        Stack stack=getLeftList(binaryTreeNode);
+        while(!stack.isEmpty()) {
+            BinaryTreeNode stackNode = (BinaryTreeNode) stack.pop();
+            linkedList.add(stackNode.getData());
+            Queue queue = getRightList(stackNode);
+            while (!queue.isEmpty()) {
+                BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue();
+                sortLeft(linkedList,queueNode);
+            }
+        }
+        linkedList.add(binaryTreeNode.getData());
+    }
+
+
+    private Stack getLeftList(BinaryTreeNode binaryTreeNode){
+        Stack stack=new Stack();
+        while(binaryTreeNode.getLeft()!=null){
+            binaryTreeNode=binaryTreeNode.getLeft();
+            stack.push(binaryTreeNode);
+        }
+        return stack;
+    }
+
+    private Queue getRightList(BinaryTreeNode binaryTreeNode){
+        Queue queue=new Queue();
+        while(binaryTreeNode.getRight()!=null){
+            binaryTreeNode=binaryTreeNode.getRight();
+            queue.enQueue(binaryTreeNode);
+        }
+        return queue;
+    }
+
+
+
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..1d535da5ee
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,40 @@
+package rui.study.coding2017.coding.basic;
+
+public class BinaryTreeNode {
+
+    private Comparable data;
+    private BinaryTreeNode left;
+    private BinaryTreeNode right;
+
+    public Comparable getData() {
+        return data;
+    }
+    public void setData(Comparable data) {
+        this.data = data;
+    }
+    public BinaryTreeNode getLeft() {
+        return left;
+    }
+    public void setLeft(BinaryTreeNode left) {
+        this.left = left;
+    }
+    public BinaryTreeNode getRight() {
+        return right;
+    }
+    public void setRight(BinaryTreeNode right) {
+        this.right = right;
+    }
+
+    public BinaryTreeNode() {
+    }
+
+    public BinaryTreeNode(Comparable data) {
+        this.data = data;
+    }
+
+    public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) {
+        this.data = data;
+        this.left = left;
+        this.right = right;
+    }
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java
new file mode 100644
index 0000000000..ee7dbc7683
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java
@@ -0,0 +1,8 @@
+package rui.study.coding2017.coding.basic;
+
+
+public interface Iterator {
+    public boolean hasNext();
+    public Object next();
+
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..67cd9d5b91
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java
@@ -0,0 +1,156 @@
+package rui.study.coding2017.coding.basic;
+
+/**
+ * 单向链表
+ */
+public class LinkedList {
+    private Node head;
+
+    private Node current;
+
+    private int size;
+
+    public LinkedList(){
+    }
+
+    public int size(){
+        return size;
+    }
+
+    public void add(Object o){
+        Node newNode=new Node(o,null);
+        if(size==0){
+            head=current=newNode;
+        }
+        current.next=newNode;
+        current=newNode;
+        size++;
+    }
+
+    public void add(int index , Object o){
+        checkIndexForAdd(index);
+        if(index==size){
+           add(o);
+        }else{
+           Node newNode=new Node(o,null);
+            if(index==0){
+                newNode.next=head;
+                head=newNode;
+            }else{
+                Node after=getIndexNode(index);
+                Node before=getIndexNode(index-1);
+                before.next=newNode;
+                newNode.next=after;
+            }
+            size++;
+       }
+    }
+
+
+    public Object get(int index){
+        return getIndexNode(index).data;
+    }
+
+    public void addFirst(Object obj){
+        add(0,obj);
+    }
+    public void addLast(Object obj){
+        if(size==0){
+            add(obj);
+        }else {
+            add(size,obj);
+        }
+    }
+
+    public Object remove(int index){
+        checkIndex(index);
+        Node needRemove;
+        if(index==0){
+            needRemove=head;
+            if(size==1){
+                head=null;
+            }else{
+                head=head.next;
+            }
+        }else{
+            needRemove=getIndexNode(index);
+            Node before=getIndexNode(index-1);
+            before.next=needRemove.next;
+            if(index==size-1){
+                current=before;
+            }
+        }
+        size--;
+        return needRemove.data;
+    }
+    public Object removeFirst(){
+        return remove(0);
+    }
+    public Object removeLast(){
+        return remove(size-1);
+    }
+    public Iterator iterator(){
+        return new LinkedListIterator();
+    }
+
+
+    public class LinkedListIterator implements Iterator{
+
+       private int cursor=0;
+
+       private Node cursorNode=head;
+
+        @Override
+        public boolean hasNext() {
+            return cursor!=size;
+        }
+
+        @Override
+        public Object next() {
+            Object object=cursorNode.data;
+            cursorNode=cursorNode.next;
+            cursor++;
+            return object;
+        }
+    }
+
+    private void checkIndexForAdd(int index){
+        if(!(index>=0&&index<=size)){
+            throw new IndexOutOfBoundsException("索引"+index+"越界！");
+        }
+    }
+    private void checkIndex(int index){
+        if(!(index>=0&&index<size)){
+            throw new IndexOutOfBoundsException("索引"+index+"越界！");
+        }
+    }
+
+    private Node getIndexNode(int index){
+        checkIndex(index);
+        if(index==0){
+            return head;
+        }else if(index+1==size){
+            return current;
+        }else{
+            boolean flag=false;
+            Node nodes=head;
+            int cursor=1;
+            while(!flag){
+                nodes=nodes.next;
+                flag=cursor==index;
+                cursor++;
+            }
+            return nodes;
+        }
+    }
+
+    private static class Node{
+        Object data;
+        Node next;
+
+        public Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/List.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/List.java
new file mode 100644
index 0000000000..efdbab7a77
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/List.java
@@ -0,0 +1,9 @@
+package rui.study.coding2017.coding.basic;
+
+public interface List {
+    public void add(Object o);
+    public void add(int index, Object o);
+    public Object get(int index);
+    public Object remove(int index);
+    public int size();
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Queue.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Queue.java
new file mode 100644
index 0000000000..e40782e26e
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Queue.java
@@ -0,0 +1,21 @@
+package rui.study.coding2017.coding.basic;
+
+public class Queue {
+    LinkedList linkedList=new LinkedList();
+
+    public void enQueue(Object o){
+        linkedList.add(o);
+    }
+
+    public Object deQueue(){
+        return linkedList.removeFirst();
+    }
+
+    public boolean isEmpty(){
+        return linkedList.size()==0;
+    }
+
+    public int size(){
+        return linkedList.size();
+    }
+}
diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Stack.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Stack.java
new file mode 100644
index 0000000000..00bb8b5881
--- /dev/null
+++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Stack.java
@@ -0,0 +1,24 @@
+package rui.study.coding2017.coding.basic;
+
+public class Stack {
+    private ArrayList elementData = new ArrayList();
+
+    public void push(Object o){
+        elementData.add(o);
+    }
+
+    public Object pop(){
+        return elementData.remove(size()-1);
+    }
+
+    public Object peek(){
+        return elementData.get(size()-1);
+    }
+    public boolean isEmpty(){
+        return elementData.size()==0;
+    }
+
+    public int size(){
+        return elementData.size();
+    }
+}
diff --git a/group03/1360464792/src/main/resources/struts.xml b/group03/1360464792/src/main/resources/struts.xml
new file mode 100644
index 0000000000..dd6152a234
--- /dev/null
+++ b/group03/1360464792/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="rui.study.coding2017.coderising.liteststruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="rui.study.coding2017.coderising.liteststruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/ArrayListTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/ArrayListTest.java
deleted file mode 100644
index e81d34d1c0..0000000000
--- a/group03/1360464792/src/test/java/rui/study/coding2017/ArrayListTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package rui.study.coding2017;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * 测试我的数组如何
- * Created by 赵睿 on 2017/2/24.
- */
-public class ArrayListTest {
-    @Test
-    public void newArrayList(){
-        System.out.println(new ArrayList().size());
-        System.out.println(new ArrayList(0).size());
-        System.out.println(new ArrayList(-1).size());
-    }
-
-    @Test
-    public void add() throws Exception {
-        ArrayList arrayList=new ArrayList(2);
-        arrayList.add(1);
-        arrayList.add(2);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList.get(0));
-        System.out.println(arrayList.get(1));
-        System.out.println(arrayList.get(2));
-        System.out.println(arrayList.get(3));
-    }
-
-    @Test
-    public void add1() throws Exception {
-        ArrayList arrayList=new ArrayList(2);
-        arrayList.add(0);
-        arrayList.add(0,1);
-        arrayList.add(1,2);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList.get(0));
-        System.out.println(arrayList.get(1));
-        System.out.println(arrayList.get(2));
-        System.out.println(arrayList.get(3));
-    }
-    @Test
-    public void add2() throws Exception {
-        java.util.ArrayList arrayList=new java.util.ArrayList(2);
-        arrayList.add(0);
-        arrayList.add(0,1);
-        arrayList.add(1,2);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList.get(0));
-        System.out.println(arrayList.get(1));
-        System.out.println(arrayList.get(2));
-        System.out.println(arrayList.get(3));
-    }
-
-    @Test
-    public void remove() throws Exception {
-        ArrayList arrayList=new ArrayList(2);
-        arrayList.add(0);
-        arrayList.add(0,1);
-        arrayList.add(1,2);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList.remove(1));
-        System.out.println(arrayList.size());
-        System.out.println(arrayList.get(0));
-        System.out.println(arrayList.get(1));
-        System.out.println(arrayList.get(2));
-    }
-
-    @Test
-    public void iterator() throws Exception {
-        ArrayList arrayList=new ArrayList(2);
-        arrayList.add(0);
-        arrayList.add(0,1);
-        arrayList.add(1,2);
-        Iterator iterator=arrayList.iterator();
-        while(iterator.hasNext()){
-            System.out.println(iterator.next());
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/BinaryTreeTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/BinaryTreeTest.java
deleted file mode 100644
index b2e4f76e24..0000000000
--- a/group03/1360464792/src/test/java/rui/study/coding2017/BinaryTreeTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package rui.study.coding2017;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * 二叉树测试
- * Created by 赵睿 on 2017/2/25.
- */
-public class BinaryTreeTest {
-    @Test
-    public void insert() throws Exception {
-        BinaryTree binaryTree=new BinaryTree();
-        binaryTree.insert(4);
-        binaryTree.insert(7);
-        binaryTree.insert(5);
-        binaryTree.insert(8);
-        binaryTree.insert(6);
-        binaryTree.insert(3);
-        binaryTree.insert(0);
-        binaryTree.insert(1);
-        binaryTree.insert(2);
-        LinkedList linkedList=binaryTree.inorder();
-
-        Iterator iterator=linkedList.iterator();
-        while (iterator.hasNext()){
-            System.out.println(iterator.next());
-        }
-    }
-
-
-
-}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/LinkedListTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/LinkedListTest.java
deleted file mode 100644
index 625582e67c..0000000000
--- a/group03/1360464792/src/test/java/rui/study/coding2017/LinkedListTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package rui.study.coding2017;
-
-import org.junit.Test;
-
-/**
- * 测试链表
- * Created by 赵睿 on 2017/2/24.
- */
-public class LinkedListTest {
-    @Test
-    public void add() throws Exception {
-        LinkedList linkedList=new LinkedList();
-        linkedList.add(1);
-        linkedList.add(2);
-        linkedList.add(3);
-        try {
-            System.out.println(linkedList.get(3));
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-        System.out.println(linkedList.get(2));
-        System.out.println(linkedList.get(1));
-        System.out.println(linkedList.get(0));
-        try {
-            System.out.println(linkedList.get(-1));
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    @Test
-    public void add1() throws Exception {
-        //当前位置是否移动
-        LinkedList linkedList=new LinkedList();
-        linkedList.add(0,0);
-        linkedList.add(1,1);
-
-        linkedList.add(0,-1);
-        System.out.println(linkedList.size());
-        linkedList.add(1,11);
-        System.out.println(linkedList.size());
-        linkedList.add(2,22);
-        linkedList.add(23);
-        System.out.println(linkedList.size());
-
-
-        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");
-        Iterator iterator=linkedList.iterator();
-        while (iterator.hasNext()){
-            System.out.println(iterator.next());
-        }
-    }
-
-
-    @Test
-    public void addFirst() throws Exception {
-        LinkedList linkedList=new LinkedList();
-        linkedList.add(0,0);
-        linkedList.add(1,1);
-        linkedList.addFirst(-1);
-
-        System.out.println(linkedList.size());
-
-        Iterator iterator=linkedList.iterator();
-        while (iterator.hasNext()){
-            System.out.println(iterator.next());
-        }
-    }
-
-    @Test
-    public void addLast() throws Exception {
-        LinkedList linkedList=new LinkedList();
-        linkedList.add(0,0);
-        linkedList.add(1,1);
-        linkedList.addLast(2);
-        System.out.println(linkedList.size());
-
-        Iterator iterator=linkedList.iterator();
-        while (iterator.hasNext()){
-            System.out.println(iterator.next());
-        }
-
-
-    }
-
-    @Test
-    public void remove() throws Exception {
-        LinkedList linkedList=new LinkedList();
-        linkedList.add(0,0);
-        linkedList.add(1,1);
-        System.out.println(linkedList.size());
-        try {
-            linkedList.remove(2);
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-        linkedList.remove(1);
-        System.out.println(linkedList.size());
-        linkedList.remove(0);
-        System.out.println(linkedList.size());
-        try {
-            linkedList.remove(0);
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    @Test
-    public void removeFirst() throws Exception {
-        LinkedList linkedList=new LinkedList();
-        try {
-            linkedList.removeFirst();
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-        linkedList.add(0,0);
-        linkedList.add(1,1);
-        linkedList.removeFirst();
-        System.out.println(linkedList.size());
-
-    }
-
-    @Test
-    public void removeLast() throws Exception {
-        LinkedList linkedList=new LinkedList();
-        try {
-            linkedList.removeLast();
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-
-        linkedList.add(0,0);
-        linkedList.add(1,1);
-        linkedList.removeLast();
-        System.out.println(linkedList.size());
-
-    }
-}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java
deleted file mode 100644
index baff49411c..0000000000
--- a/group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package rui.study.coding2017;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * 测试队列
- * Created by 赵睿 on 2017/2/25.
- */
-public class QueueTest {
-    @Test
-    public void enQueue() throws Exception {
-        Queue queue=new Queue();
-        queue.enQueue(1);
-        queue.enQueue(2);
-        System.out.println(queue.deQueue());
-        System.out.println(queue.deQueue());
-        System.out.println(queue.deQueue());
-    }
-
-
-    @Test
-    public void isEmpty() throws Exception {
-        Queue queue=new Queue();
-        System.out.println(queue.isEmpty());
-        queue.enQueue(1);
-        System.out.println(queue.isEmpty());
-    }
-
-    @Test
-    public void size() throws Exception {
-        Queue queue=new Queue();
-        System.out.println(queue.size());
-        queue.enQueue(1);
-        System.out.println(queue.size());
-    }
-
-}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java
deleted file mode 100644
index 115a16f1fc..0000000000
--- a/group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package rui.study.coding2017;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * 测试栈
- * Created by 赵睿 on 2017/2/25.
- */
-public class StackTest {
-    @Test
-    public void push() throws Exception {
-        Stack stack=new Stack();
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-        System.out.println(stack.pop());
-        System.out.println(stack.pop());
-        System.out.println(stack.pop());
-        System.out.println(stack.pop());
-
-    }
-
-    @Test
-    public void peek() throws Exception {
-        Stack stack=new Stack();
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-        System.out.println(stack.peek());
-        System.out.println(stack.peek());
-
-
-    }
-
-    @Test
-    public void isEmpty() throws Exception {
-        Stack stack=new Stack();
-        System.out.println(stack.isEmpty());
-        stack.push(1);
-        System.out.println(stack.isEmpty());
-
-    }
-
-    @Test
-    public void size() throws Exception {
-        Stack stack=new Stack();
-        System.out.println(stack.size());
-        stack.push(1);
-        System.out.println(stack.size());
-    }
-
-}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..9b5f3d8175
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,91 @@
+package rui.study.coding2017.coderising.array;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * 创建于 2017-03-01.
+ *
+ * @author 赵睿
+ */
+public class ArrayUtilTest {
+    ArrayUtil arrayUtil=new ArrayUtil();
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] origin={7, 9 , 30, 3};
+        origin=arrayUtil.reverseArray(origin);
+        for (Integer i:origin) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        oldArr=arrayUtil.removeZero(oldArr);
+        for (Integer i:oldArr) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int arr1[]={3, 5, 7,8};
+        int arr2[]={4, 5, 6,7};
+
+        int oldArr[]=arrayUtil.merge(arr1,arr2);
+        for (Integer i:oldArr) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int oldArr[]={2,3,6};
+        oldArr=arrayUtil.grow(oldArr,3);
+        for (Integer i:oldArr) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        for (Integer i:arrayUtil.fibonacci(0)) {
+            System.out.println(i);
+        }
+        for (Integer i:arrayUtil.fibonacci(1)) {
+            System.out.println(i);
+        }
+        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>");
+        for (Integer i:arrayUtil.fibonacci(2)) {
+            System.out.println(i);
+        }
+        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>");
+        for (Integer i:arrayUtil.fibonacci(15)) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        for (Integer i:arrayUtil.getPrimes(100)) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        for (Integer i:arrayUtil.getPerfectNumbers(1000)) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void join() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        System.out.println(arrayUtil.join(oldArr,"````"));
+    }
+
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java
new file mode 100644
index 0000000000..0f41c2ba4c
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java
@@ -0,0 +1,47 @@
+package rui.study.coding2017.coderising.liteststruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+/**
+ * 测试struts功能
+ * Created by 赵睿 on 2017/3/4.
+ */
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java
new file mode 100644
index 0000000000..7a753e14ce
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java
@@ -0,0 +1,80 @@
+package rui.study.coding2017.coding.basic;
+
+import org.junit.Test;
+
+/**
+ * 测试我的数组如何
+ * Created by 赵睿 on 2017/2/24.
+ */
+public class ArrayListTest {
+    @Test
+    public void newArrayList(){
+        System.out.println(new ArrayList().size());
+        System.out.println(new ArrayList(0).size());
+        System.out.println(new ArrayList(-1).size());
+    }
+
+    @Test
+    public void add() throws Exception {
+        ArrayList arrayList=new ArrayList(2);
+        arrayList.add(1);
+        arrayList.add(2);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList.get(0));
+        System.out.println(arrayList.get(1));
+        System.out.println(arrayList.get(2));
+        System.out.println(arrayList.get(3));
+    }
+
+    @Test
+    public void add1() throws Exception {
+        ArrayList arrayList=new ArrayList(2);
+        arrayList.add(0);
+        arrayList.add(0,1);
+        arrayList.add(1,2);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList.get(0));
+        System.out.println(arrayList.get(1));
+        System.out.println(arrayList.get(2));
+        System.out.println(arrayList.get(3));
+    }
+    @Test
+    public void add2() throws Exception {
+        java.util.ArrayList arrayList=new java.util.ArrayList(2);
+        arrayList.add(0);
+        arrayList.add(0,1);
+        arrayList.add(1,2);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList.get(0));
+        System.out.println(arrayList.get(1));
+        System.out.println(arrayList.get(2));
+        System.out.println(arrayList.get(3));
+    }
+
+    @Test
+    public void remove() throws Exception {
+        ArrayList arrayList=new ArrayList(2);
+        arrayList.add(0);
+        arrayList.add(0,1);
+        arrayList.add(1,2);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList.remove(1));
+        System.out.println(arrayList.size());
+        System.out.println(arrayList.get(0));
+        System.out.println(arrayList.get(1));
+        System.out.println(arrayList.get(2));
+    }
+
+    @Test
+    public void iterator() throws Exception {
+        ArrayList arrayList=new ArrayList(2);
+        arrayList.add(0);
+        arrayList.add(0,1);
+        arrayList.add(1,2);
+        Iterator iterator=arrayList.iterator();
+        while(iterator.hasNext()){
+            System.out.println(iterator.next());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java
new file mode 100644
index 0000000000..3c74302e47
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java
@@ -0,0 +1,32 @@
+package rui.study.coding2017.coding.basic;
+
+import org.junit.Test;
+
+/**
+ * 二叉树测试
+ * Created by 赵睿 on 2017/2/25.
+ */
+public class BinaryTreeTest {
+    @Test
+    public void insert() throws Exception {
+        BinaryTree binaryTree=new BinaryTree();
+        binaryTree.insert(4);
+        binaryTree.insert(7);
+        binaryTree.insert(5);
+        binaryTree.insert(8);
+        binaryTree.insert(6);
+        binaryTree.insert(3);
+        binaryTree.insert(0);
+        binaryTree.insert(1);
+        binaryTree.insert(2);
+        LinkedList linkedList=binaryTree.inorder();
+
+        Iterator iterator=linkedList.iterator();
+        while (iterator.hasNext()){
+            System.out.println(iterator.next());
+        }
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java
new file mode 100644
index 0000000000..5c78c9618f
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java
@@ -0,0 +1,138 @@
+package rui.study.coding2017.coding.basic;
+
+import org.junit.Test;
+
+/**
+ * 测试链表
+ * Created by 赵睿 on 2017/2/24.
+ */
+public class LinkedListTest {
+    @Test
+    public void add() throws Exception {
+        LinkedList linkedList=new LinkedList();
+        linkedList.add(1);
+        linkedList.add(2);
+        linkedList.add(3);
+        try {
+            System.out.println(linkedList.get(3));
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        System.out.println(linkedList.get(2));
+        System.out.println(linkedList.get(1));
+        System.out.println(linkedList.get(0));
+        try {
+            System.out.println(linkedList.get(-1));
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+    }
+
+    @Test
+    public void add1() throws Exception {
+        //当前位置是否移动
+        LinkedList linkedList=new LinkedList();
+        linkedList.add(0,0);
+        linkedList.add(1,1);
+
+        linkedList.add(0,-1);
+        System.out.println(linkedList.size());
+        linkedList.add(1,11);
+        System.out.println(linkedList.size());
+        linkedList.add(2,22);
+        linkedList.add(23);
+        System.out.println(linkedList.size());
+
+
+        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");
+        Iterator iterator=linkedList.iterator();
+        while (iterator.hasNext()){
+            System.out.println(iterator.next());
+        }
+    }
+
+
+    @Test
+    public void addFirst() throws Exception {
+        LinkedList linkedList=new LinkedList();
+        linkedList.add(0,0);
+        linkedList.add(1,1);
+        linkedList.addFirst(-1);
+
+        System.out.println(linkedList.size());
+
+        Iterator iterator=linkedList.iterator();
+        while (iterator.hasNext()){
+            System.out.println(iterator.next());
+        }
+    }
+
+    @Test
+    public void addLast() throws Exception {
+        LinkedList linkedList=new LinkedList();
+        linkedList.add(0,0);
+        linkedList.add(1,1);
+        linkedList.addLast(2);
+        System.out.println(linkedList.size());
+
+        Iterator iterator=linkedList.iterator();
+        while (iterator.hasNext()){
+            System.out.println(iterator.next());
+        }
+
+
+    }
+
+    @Test
+    public void remove() throws Exception {
+        LinkedList linkedList=new LinkedList();
+        linkedList.add(0,0);
+        linkedList.add(1,1);
+        System.out.println(linkedList.size());
+        try {
+            linkedList.remove(2);
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        linkedList.remove(1);
+        System.out.println(linkedList.size());
+        linkedList.remove(0);
+        System.out.println(linkedList.size());
+        try {
+            linkedList.remove(0);
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+    }
+
+    @Test
+    public void removeFirst() throws Exception {
+        LinkedList linkedList=new LinkedList();
+        try {
+            linkedList.removeFirst();
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        linkedList.add(0,0);
+        linkedList.add(1,1);
+        linkedList.removeFirst();
+        System.out.println(linkedList.size());
+
+    }
+
+    @Test
+    public void removeLast() throws Exception {
+        LinkedList linkedList=new LinkedList();
+        try {
+            linkedList.removeLast();
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+
+        linkedList.add(0,0);
+        linkedList.add(1,1);
+        linkedList.removeLast();
+        System.out.println(linkedList.size());
+
+    }
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java
new file mode 100644
index 0000000000..2b3631ad86
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java
@@ -0,0 +1,37 @@
+package rui.study.coding2017.coding.basic;
+
+import org.junit.Test;
+
+/**
+ * 测试队列
+ * Created by 赵睿 on 2017/2/25.
+ */
+public class QueueTest {
+    @Test
+    public void enQueue() throws Exception {
+        Queue queue=new Queue();
+        queue.enQueue(1);
+        queue.enQueue(2);
+        System.out.println(queue.deQueue());
+        System.out.println(queue.deQueue());
+        System.out.println(queue.deQueue());
+    }
+
+
+    @Test
+    public void isEmpty() throws Exception {
+        Queue queue=new Queue();
+        System.out.println(queue.isEmpty());
+        queue.enQueue(1);
+        System.out.println(queue.isEmpty());
+    }
+
+    @Test
+    public void size() throws Exception {
+        Queue queue=new Queue();
+        System.out.println(queue.size());
+        queue.enQueue(1);
+        System.out.println(queue.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java
new file mode 100644
index 0000000000..804510e85b
--- /dev/null
+++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java
@@ -0,0 +1,52 @@
+package rui.study.coding2017.coding.basic;
+
+import org.junit.Test;
+
+/**
+ * 测试栈
+ * Created by 赵睿 on 2017/2/25.
+ */
+public class StackTest {
+    @Test
+    public void push() throws Exception {
+        Stack stack=new Stack();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        System.out.println(stack.pop());
+        System.out.println(stack.pop());
+        System.out.println(stack.pop());
+        System.out.println(stack.pop());
+
+    }
+
+    @Test
+    public void peek() throws Exception {
+        Stack stack=new Stack();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        System.out.println(stack.peek());
+        System.out.println(stack.peek());
+
+
+    }
+
+    @Test
+    public void isEmpty() throws Exception {
+        Stack stack=new Stack();
+        System.out.println(stack.isEmpty());
+        stack.push(1);
+        System.out.println(stack.isEmpty());
+
+    }
+
+    @Test
+    public void size() throws Exception {
+        Stack stack=new Stack();
+        System.out.println(stack.size());
+        stack.push(1);
+        System.out.println(stack.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group03/345943980/lite-struts-0226/pom.xml b/group03/345943980/lite-struts-0226/pom.xml
new file mode 100644
index 0000000000..92af8d801e
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/pom.xml
@@ -0,0 +1,50 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.lemon.cm</groupId>
+	<artifactId>lite-struts-0226</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>lite-struts-0226</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.10</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/commons-digester/commons-digester -->
+		<dependency>
+		    <groupId>commons-digester</groupId>
+		    <artifactId>commons-digester</artifactId>
+		    <version>2.1</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
+		<dependency>
+		    <groupId>dom4j</groupId>
+		    <artifactId>dom4j</artifactId>
+		    <version>1.6.1</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.7</source>
+					<target>1.7</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..a2fc003e17
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,258 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int[] target = new int[origin.length];
+		for (int i = origin.length - 1, j = 0; i >= 0; i--, j++) {
+			target[j] = origin[i];
+		}
+		System.out.println(Arrays.toString(target));
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int[] newArr = new int[5]; // 数组初始化，默认给10个位置
+		int size = 0;
+
+		for (int i = 0; i < oldArray.length; i++) {
+			if (size >= newArr.length) { // 大于初始长度，对新数组进行扩容
+				newArr = this.grow(newArr, 5);
+			}
+			if (oldArray[i] != 0) {
+				newArr[size] = oldArray[i];
+				size++;
+			}
+		}
+		// 对结果数组进行排0处理
+		int[] newArrary = new int[size];
+		for (int i = 0, j = 0; i < newArr.length; i++) {
+			if (newArr[i] != 0) {
+				newArrary[j] = newArr[i];
+				j++;
+			}
+		}
+		return newArrary;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3
+	 * 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		int[] array3 = new int[array1.length + array2.length];
+		System.arraycopy(array1, 0, array3, 0, array1.length);
+		System.arraycopy(array2, 0, array3, array1.length, array2.length);
+		int temp = 0;
+		// 冒泡排序
+		for (int i = array3.length - 1; i >= 0; i--) {
+			for (int j = 0; j < i; j++) {
+				if (array3[j] > array3[j + 1]) {
+					temp = array3[j + 1];
+					array3[j + 1] = array3[j];
+					array3[j] = temp;
+				}
+			}
+		}
+		// Arrays.sort(array3);
+		// System.out.println(Arrays.toString(array3));
+		// 消除重复
+		for (int i = array3.length - 1; i >= 0; i--) {
+			for (int j = 0; j < i; j++) {
+				if (array3[j] == array3[j + 1]) {
+					array3[j + 1] = 0;
+				}
+			}
+		}
+		// 去掉0值
+		return removeZero(array3);
+	}
+
+	/**
+	 * 方法实现二
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] mergeMethod(int[] array1, int[] array2) {
+		int[] array3 = new int[array1.length + array2.length];
+		System.arraycopy(array1, 0, array3, 0, array1.length);
+		System.arraycopy(array2, 0, array3, array1.length, array2.length);
+		int counts = 0; // 找出重复元素个数
+		for (int i = 0; i < array3.length - 1; i++) {
+			for (int j = i + 1; j < array3.length; j++) {
+				if (array3[i] == array3[j]) {
+					counts++;
+					break;
+				}
+			}
+		}
+		// 消除重复
+		int[] newArr = new int[array3.length - counts];
+		int index = 0;
+		for (int i = 0; i < array3.length; i++) {
+			boolean flag = false;
+			for (int j = 0; j < newArr.length; j++) {
+				if (array3[i] == newArr[j]) {
+					flag = true;
+					break;
+				}
+			}
+			if (!flag) {
+				newArr[index++] = array3[i];
+			}
+		}
+		// 排序
+		Arrays.sort(newArr);
+		return newArr;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size =
+	 * 3,则返回的新数组为 [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		int a = 1, b = 1, c = 0, size = 2;
+		int[] array = new int[0];
+		if (max <= 1)
+			return array;
+		array = new int[] { a, b };
+		while (true) {
+			c = a + b;
+			a = b;
+			b = c;
+			if (c > max)
+				break;
+			// 对数组进行扩容
+			array = ensureCapacity(size + 1, array);
+			array[size] = c;
+			size++;
+		}
+		return removeZero(array);
+	}
+
+	private int[] ensureCapacity(int minCapacity, int[] array) {
+		if (minCapacity > array.length) {
+			int newCapacity = Math.max(minCapacity, array.length * 2);
+			int[] newDataArray = new int[newCapacity];
+			System.arraycopy(array, 0, newDataArray, 0, array.length);
+			return newDataArray;
+		}
+		return array;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		int size = 0;
+		int[] array = new int[0];
+		if (max < 2) {
+			return array;
+		}
+		for (int i = 2; i < max; i++) {
+			for (int j = 2; j <= i; j++) {
+				if (i % j == 0 && i != j) {
+					break;
+				}
+				if (i % j == 0 && i == j) {
+					array = this.ensureCapacity(size + 1, array);
+					array[size] = i;
+					size++;
+				}
+			}
+		}
+		return this.removeZero(array);
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		int size = 0;
+		int[] array = new int[0];
+		if (max < 1) {
+			return array;
+		}
+		for (int i = 1; i <= max; i++) {
+			int sum = 0;
+			for (int j = 1; j < i / 2 + 1; j++) {
+				if (i % j == 0) {
+					sum += j;
+				}
+			}
+			if (i == sum) {
+				array = this.ensureCapacity(size + 1, array);
+				array[size] = i;
+				size++;
+			}
+		}
+		return this.removeZero(array);
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuilder sb = new StringBuilder();
+		if (array == null || array.length == 0) {
+			return null;
+		}
+		for (int i = 0; i < array.length; i++) {
+			if (i == array.length - 1) {
+				sb.append(array[i]);
+			} else {
+				sb.append(array[i]).append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+
+}
diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..614f4053f0
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coderising.litestruts;
+
+public class LoginAction {
+
+	private String name;
+	private String password;
+	private String mssage;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMssage() {
+		return mssage;
+	}
+
+	public void setMssage(String mssage) {
+		this.mssage = mssage;
+	}
+
+	public String execute() {
+		if (this.getName().equals("test") && this.getPassword().equals("1234")) {
+			this.setMssage("login successful");
+			return "success";
+		} else {
+			this.setMssage("login failed,please check your user/pwd");
+			return "fail";
+		}
+	}
+}
diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..f4cc579b96
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,139 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+
+	@SuppressWarnings("unchecked")
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象） 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		 * ("name"="test" , "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
+		 * 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。
+		 */
+		View view = new View();
+		Map<String, String> map = new HashMap<String, String>();
+		SAXReader reader = new SAXReader();
+		try {
+			Object obj = null;
+			Document document = reader.read(Struts.class.getResourceAsStream("/struts.xml"));
+			Element root = document.getRootElement();
+			List<Element> elements = root.elements();
+			Class<?> clz = null;
+			for (Element element : elements) {
+				if (element.attributeValue("name").trim().equalsIgnoreCase(actionName)) {
+					String classStr = element.attributeValue("class");
+					clz = Class.forName(classStr);
+					obj = clz.newInstance();
+					for (Map.Entry<String, String> entry : parameters.entrySet()) {
+						String key = entry.getKey();
+						String setMethod = "set" + key.substring(0, 1).toUpperCase()
+								+ key.substring(1);
+						Method method = clz.getDeclaredMethod(setMethod, String.class);
+						method.invoke(obj, entry.getValue());
+					}
+					List<Element> listElement = element.elements("result");
+					for (Element subElement : listElement) {
+						map.put(subElement.attribute("name").getText(), subElement.getTextTrim());
+					}
+				}
+			}
+			Method execMethod = clz.getDeclaredMethod("execute");
+			String result = execMethod.invoke(obj).toString();
+			Method msgMethod = clz.getDeclaredMethod("getMssage");
+			String message = msgMethod.invoke(obj).toString();
+			Map<String, String> msgs = new HashMap<String, String>();
+			msgs.put("message", message);
+			view.setJsp(map.get(result));
+			view.setParameters(msgs);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return view;
+	}
+
+	public static void main(String[] args) {
+		// Digester digester = new Digester();
+		// // 指定它不要用DTD验证XML文档的合法性——这是因为我们没有为XML文档定义DTD
+		// digester.setValidating(false);
+		// digester.addObjectCreate("struts", Struts.class);
+		// digester.addObjectCreate("struts/action", LoginAction.class);
+		// digester.addBeanPropertySetter("struts/action/name");
+		// //digester.addBeanPropertySetter("struts/action/class");
+		// digester.addObjectCreate("struts/action/result", Result.class);
+		// digester.addBeanPropertySetter("struts/action/result/name");
+		// digester.addBeanPropertySetter("struts/action/result/value");
+		// Struts struts = null;
+		// try {
+		// struts = (Struts)digester.parse(Struts.class.getResourceAsStream("/struts.xml"));
+		// System.out.println(struts.actions.get(0).getName());
+		// // /System.out.println(struts.actions.get(0).getActionClass());
+		// } catch (IOException e) {
+		// e.printStackTrace();
+		// } catch (SAXException e) {
+		// e.printStackTrace();
+		// }
+		SAXReader reader = new SAXReader();
+		try {
+			Document document = reader.read(Struts.class.getResourceAsStream("/struts.xml"));
+			Element root = document.getRootElement();
+			// 获取某个节点的子节点
+			Element element = root.element("action");
+			String classStr = element.attributeValue("class");
+			Class<?> clz = Class.forName(classStr);
+			Object obj = clz.newInstance();
+			Method medName = clz.getDeclaredMethod("setName", String.class);
+			medName.invoke(obj, "test");
+			Method medPwd = clz.getDeclaredMethod("setPassword", String.class);
+			medPwd.invoke(obj, "123456");
+
+			Method medGetName = clz.getDeclaredMethod("getName");
+			String username = medGetName.invoke(obj).toString();
+			Method medGetPwd = clz.getDeclaredMethod("getPassword");
+			String password = medGetPwd.invoke(obj).toString();
+			System.out.println(username + "\t" + password);
+
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..3ddc1be52c
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,27 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+@SuppressWarnings("rawtypes")
+public class View {
+	private String jsp;
+	private Map parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group03/345943980/lite-struts-0226/src/main/resources/struts.xml b/group03/345943980/lite-struts-0226/src/main/resources/struts.xml
new file mode 100644
index 0000000000..c3a3756f71
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java
new file mode 100644
index 0000000000..c24d4147e9
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java
@@ -0,0 +1,79 @@
+package com.coderising.litestruts;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.array.ArrayUtil;
+
+public class ArrayUtilTest {
+
+	private ArrayUtil arrayUtil = null;
+
+	@Before
+	public void init() {
+		arrayUtil = new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] origin = { 7, 9, 30, 3 };
+		arrayUtil.reverseArray(origin);
+		origin = new int[] { 7, 9, 30, 3, 4 };
+		arrayUtil.reverseArray(origin);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
+		assertArrayEquals(new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 },
+				arrayUtil.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] array1 = { 3, 5, 7, 8 };
+		int[] array2 = { 4, 5, 6, 7 };
+		int[] array3 = { 3, 4, 5, 6, 7, 8 };
+		assertArrayEquals(array3, arrayUtil.merge(array1, array2));
+		assertArrayEquals(array3, arrayUtil.mergeMethod(array1, array2));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = { 2, 3, 6 };
+		int[] newArray = arrayUtil.grow(oldArray, 3);
+		assertArrayEquals(new int[] { 2, 3, 6, 0, 0, 0 }, newArray);
+	}
+
+	@Test
+	public void testFibonacci() {
+		assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, arrayUtil.fibonacci(15));
+		assertArrayEquals(new int[0], arrayUtil.fibonacci(1));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		System.out.println(Arrays.toString(arrayUtil.getPrimes(23)));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		assertArrayEquals(new int[]{6}, arrayUtil.getPerfectNumbers(6));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = { 3, 8, 9 };
+		Assert.assertEquals("3-8-9", arrayUtil.join(array, "-"));
+	}
+	@Test
+	public void main(){
+		System.out.println(3 / 2 + 1);
+	}
+}
diff --git a/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..505e2afbfa
--- /dev/null
+++ b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		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<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd",
+				view.getParameters().get("message"));
+	}
+}
diff --git a/group03/569045298/pom.xml b/group03/569045298/pom.xml
index 338f3870aa..c2a9dd870e 100644
--- a/group03/569045298/pom.xml
+++ b/group03/569045298/pom.xml
@@ -1,5 +1,5 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.ztc</groupId>
@@ -10,12 +10,6 @@
     <url>http://maven.apache.org</url>
     
     <dependencies>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>3.8.1</version>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
@@ -25,11 +19,27 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
         </dependency>
     </dependencies>
     
     <build>
         <finalName>JavaLevelUp</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
     </build>
 
 </project>
diff --git a/group03/569045298/src/main/com/coderising/array/ArrayUtil.java b/group03/569045298/src/main/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..992e0652fb
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,175 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     */
+    public int[] reverseArray(int[] origin) {
+        for (int i = 0; i < origin.length / 2; i++) {
+            int temp = origin[i];
+            origin[i] = origin[origin.length - i - 1];
+            origin[origin.length - i - 1] = temp;
+        }
+        return origin;
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     */
+    public int[] removeZero(int[] oldArray) {
+        int[] newArray = new int[oldArray.length];
+        int index = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                newArray[index] = oldArray[i];
+                index++;
+            }
+        }
+        int[] result = new int[index];
+        System.arraycopy(newArray, 0, result, 0, index);
+        return result;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     */
+    public int[] merge(int[] array1, int[] array2) {
+        Set<Integer> set = new TreeSet<>();
+        for (int i = 0; i < array1.length; i++) {
+            set.add(array1[i]);
+        }
+        for (int i = 0; i < array2.length; i++) {
+            set.add(array2[i]);
+        }
+        return set2Array(set);
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     */
+    public int[] fibonacci(int max) {
+        List<Integer> list = new ArrayList<>();
+        for (int i = 1; i < max; i++) {
+            int f = fibonacci2(i);
+            if (f >= max) {
+                break;
+            } else {
+                list.add(f);
+            }
+        }
+        return list2Array(list);
+    }
+
+    public int fibonacci2(int n) {
+        if (n == 0) {
+            return 0;
+        } else if (n == 1) {
+            return 1;
+        }
+        return fibonacci2(n - 1) + fibonacci2(n - 2);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     */
+    public int[] getPrimes(int max) {
+        List<Integer> list = new ArrayList<>();
+        for (int i = 2; i < max; i++) {
+            if (isPrime(i)) {
+                list.add(i);
+            }
+        }
+        return list2Array(list);
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     */
+    public int[] getPerfectNumbers(int max) {
+        List<Integer> list = new ArrayList<>();
+        for (int i = 1; i <= max; i++) {
+            int temp = 0;
+            for (int n = 1; n < i / 2 + 1; n++) {
+                if (i % n == 0) {
+                    temp += n;
+                }
+            }
+            if (temp == i) {
+                list.add(i);
+            }
+        }
+        return list2Array(list);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     */
+    public String join(int[] array, String seperator) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            if (i != 0) {
+                stringBuilder.append(seperator);
+            }
+            stringBuilder.append(array[i]);
+        }
+        return stringBuilder.toString();
+    }
+
+    private int[] list2Array(List<Integer> list) {
+        int[] result = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            result[i] = list.get(i);
+        }
+        return result;
+    }
+
+    private int[] set2Array(Set<Integer> set) {
+        int[] result = new int[set.size()];
+        Iterator<Integer> iterator = set.iterator();
+        int index = 0;
+        while (iterator.hasNext()) {
+            result[index++] = iterator.next();
+        }
+        return result;
+    }
+
+    private boolean isPrime(int num) {
+        for (int i = 2; i < num; i++) {
+            if (num % i == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java b/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..3c3de8ba91
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,47 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ */
+public class LoginAction {
+
+    private String name;
+
+    private String password;
+
+    private String message;
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java b/group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..3cee1f3824
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,11 @@
+package com.coderising.litestruts;
+
+/**
+ * Created by zt on 2017/3/1.
+ */
+public class LogoutAction {
+
+    public String execute() {
+        return "success";
+    }
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/Struts.java b/group03/569045298/src/main/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..7ec84c9a2d
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/Struts.java
@@ -0,0 +1,156 @@
+package com.coderising.litestruts;
+
+import com.coderising.litestruts.StrutsBean.Action;
+import com.coderising.litestruts.StrutsBean.Result;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 模拟struts执行
+ * 读取类似struts.xml文件，根据xml的定义创建相关的Action类来执行
+ */
+public class Struts {
+
+    private static final String FILE_PATH = "src/main/com/coderising/litestruts/struts.xml";
+
+    public View runAction(String actionName, Map<String, String> parameters) {
+        // 视图
+        View view = new View();
+        // 读取配置文件struts.xml
+        Map<String, Action> actions = this.xmlToList();
+        if (null == actions || actions.size() == 0) {
+            return null;
+        }
+        try {
+            // 根据actionName找到相对应的class
+            Action action = actions.get(actionName);
+            Class clazz = Class.forName(action.getClassName());
+            // 通过反射实例化
+            Object newInstance = clazz.newInstance();
+            // 获得所有方法
+            Map<String, Method> methodMap = new HashMap<>();
+            Method[] methods = clazz.getDeclaredMethods();
+            for (Method method : methods) {
+                methodMap.put(method.getName(), method);
+            }
+            // 根据parameters中的数据，调用对象的setter方法
+            for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                String key = entry.getKey();
+                String value = entry.getValue();
+                Method setterMethod = methodMap.get(settterMethodName(key));
+                setterMethod.invoke(newInstance, value);
+            }
+            // 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+            Method executeMethod = clazz.getMethod("execute");
+            Object object = executeMethod.invoke(newInstance);
+            // 通过反射找到对象的所有getter方法
+            Map<Object, Object> map = new HashMap<>();
+            Field[] fields = clazz.getDeclaredFields();
+            if (fields != null && fields.length > 0) {
+                // 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+                for (int i = 0; i < fields.length; i++) {
+                    Field field = fields[i];
+                    String fieldName = field.getName();
+                    Method getterMethod = methodMap.get(gettterMethodName(fieldName));
+                    Object value = getterMethod.invoke(newInstance);
+                    map.put(fieldName, value);
+                }
+            }
+            // 放到View对象的parameters中
+            view.setParameters(map);
+            // 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，放到View对象的jsp字段中
+            List<Result> resultList = action.getResult();
+            for (Result result : resultList) {
+                if (result.getName().equals(object)) {
+                    view.setJsp(result.getValue());
+                }
+            }
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        }
+        return view;
+    }
+
+    private Map<String, Action> xmlToList() {
+        Map<String, Action> map = new HashMap<>();
+        SAXReader saxReader = new SAXReader();
+        Document document;
+        try {
+            document = saxReader.read(new File(FILE_PATH));
+            Element rootElement = document.getRootElement();
+            Iterator<Element> iterator = rootElement.elementIterator("action");
+            while (iterator.hasNext()) {
+                Action action = new Action();
+                List<Result> results = new ArrayList<>();
+                action.setResult(results);
+                Element element = iterator.next();
+                List<Attribute> attributes = element.attributes();
+                for (Attribute attribute : attributes) {
+                    String attributeName = attribute.getName();
+                    if (attributeName.equals("name")) {
+                        action.setName(attribute.getStringValue());
+                    } else if (attributeName.equals("class")) {
+                        action.setClassName(attribute.getStringValue());
+                    }
+                }
+                Iterator<Element> iterator1 = element.elementIterator();
+                while (iterator1.hasNext()) {
+                    Result result = new Result();
+                    Element element1 = iterator1.next();
+                    List<Attribute> attributes1 = element1.attributes();
+                    for (Attribute attribute : attributes1) {
+                        String attributeName = attribute.getName();
+                        if (attributeName.equals("name")) {
+                            result.setName(attribute.getStringValue());
+                        }
+                    }
+                    result.setValue(element1.getStringValue());
+                    results.add(result);
+                }
+                map.put(action.getName(), action);
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    private String gettterMethodName(String fieldName) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("get");
+        stringBuilder.append(fieldName.substring(0, 1).toUpperCase());
+        stringBuilder.append(fieldName.substring(1));
+        return stringBuilder.toString();
+    }
+
+    private String settterMethodName(String fieldName) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("set");
+        stringBuilder.append(fieldName.substring(0, 1).toUpperCase());
+        stringBuilder.append(fieldName.substring(1));
+        return stringBuilder.toString();
+    }
+
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java
new file mode 100644
index 0000000000..1f7e5eea05
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts.StrutsBean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by zt on 2017/3/1.
+ */
+public class Action implements Serializable {
+
+    private String name;
+
+    private String className;
+
+    private List<Result> result;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public List<Result> getResult() {
+        return result;
+    }
+
+    public void setResult(List<Result> result) {
+        this.result = result;
+    }
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java
new file mode 100644
index 0000000000..ef4c73b2bd
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java
@@ -0,0 +1,29 @@
+package com.coderising.litestruts.StrutsBean;
+
+import java.io.Serializable;
+
+/**
+ * Created by zt on 2017/3/1.
+ */
+public class Result implements Serializable {
+
+    private String name;
+
+    private String value;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/View.java b/group03/569045298/src/main/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..258285e4f3
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/View.java
@@ -0,0 +1,28 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+
+    private String jsp;
+
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group03/569045298/src/main/com/coderising/litestruts/struts.xml b/group03/569045298/src/main/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..561e9693c1
--- /dev/null
+++ b/group03/569045298/src/main/com/coderising/litestruts/struts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+
+</struts>
\ No newline at end of file
diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java b/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java
index dee00342d2..8d3de85e34 100644
--- a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java
+++ b/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java
@@ -56,7 +56,7 @@ public int size() {
     }
 
     private void checkRange(int index) {
-        if (index < 0 || index > elementData.length) {
+        if (index < 0 || index >= size) {
             throw new IndexOutOfBoundsException();
         }
     }
@@ -76,8 +76,8 @@ public Iterator iterator() {
 
     private class ArrayListIterator implements Iterator {
 
-        ArrayList arrayList = null;
-        int pos = 0;
+        private ArrayList arrayList = null;
+        private int position = 0;
 
         private ArrayListIterator(ArrayList arrayList) {
             this.arrayList = arrayList;
@@ -85,24 +85,18 @@ private ArrayListIterator(ArrayList arrayList) {
 
         @Override
         public boolean hasNext() {
-            // TODO
-            pos++;
-            if (pos > size) {
-                return false;
-            }
-            return true;
+            return position < size();
         }
 
         @Override
         public Object next() {
-            // TODO
-            return elementData[pos];
+            return get(position++);
         }
 
         @Override
         public Object remove() {
             // TODO
-            return null;
+            return this.arrayList.remove(position--);
         }
     }
 }
diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java b/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java
index 8814ea82e8..0f4ac3231b 100644
--- a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java
+++ b/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java
@@ -62,14 +62,16 @@ public Object get(int index) {
     public Object remove(int index) {
         checkRange(index);
         checkNodeNotNull();
+        Object object;
         if (index == 0) {
-            removeFirst();
-            return head;
+            object = removeFirst();
+            return object;
         }
         Node pre = node(index - 1);
+        object = pre.next.data;
         pre.next = pre.next.next;
         size--;
-        return head;
+        return object;
     }
 
     @Override
@@ -92,20 +94,25 @@ public void addFirst(Object object) {
 
     public Object removeFirst() {
         checkNodeNotNull();
+        Object oldValue = head.data;
         head = head.next;
         size--;
-        return head;
+        return oldValue;
     }
 
     public Object removeLast() {
         checkNodeNotNull();
+        Object oldValue;
         if (size == 1) {
+            oldValue = head.data;
             head = null;
+            return oldValue;
         }
         Node pre = node(size() - 2);
+        oldValue = pre.next.data;
         pre.next = null;
         size--;
-        return head;
+        return oldValue;
     }
 
     private void checkRange(int index) {
diff --git a/group03/569045298/src/test/coderising/array/ArrayUtilTest.java b/group03/569045298/src/test/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..52638781aa
--- /dev/null
+++ b/group03/569045298/src/test/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,86 @@
+package coderising.array;
+
+import com.coderising.array.ArrayUtil;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by zt on 2017/2/27.
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil arrayUtil = null;
+
+    @Before
+    public void setUp() {
+        arrayUtil = new ArrayUtil();
+    }
+
+    @Test
+    public void testReverseArray() {
+        int[] a = {7, 9, 30, 3};
+        int[] expectedReversedA = {3, 30, 9, 7};
+        Assert.assertArrayEquals(expectedReversedA, arrayUtil.reverseArray(a));
+        int[] b = {7, 9, 30, 3, 4};
+        int[] expectedReversedB = {4, 3, 30, 9, 7};
+        Assert.assertArrayEquals(expectedReversedB, arrayUtil.reverseArray(b));
+    }
+
+    @Test
+    public void testRemoveZero() {
+        int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int[] expected = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5};
+        Assert.assertArrayEquals(expected, arrayUtil.removeZero(oldArr));
+    }
+
+    @Test
+    public void testFibonacci() {
+        int max = 1;
+        int[] expected = {};
+        Assert.assertArrayEquals(expected, arrayUtil.fibonacci(max));
+        int max2 = 15;
+        int[] expected2 = {1, 1, 2, 3, 5, 8, 13};
+        Assert.assertArrayEquals(expected2, arrayUtil.fibonacci(max2));
+    }
+
+    @Test
+    public void testGetPrimes() {
+        int[] expected = {2, 3, 5, 7, 11, 13, 17, 19};
+        int max = 23;
+        Assert.assertArrayEquals(expected, arrayUtil.getPrimes(max));
+    }
+
+    @Test
+    public void testMerge() {
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        int[] expected = {3, 4, 5, 6, 7, 8};
+        Assert.assertArrayEquals(expected, arrayUtil.merge(a1, a2));
+    }
+
+    @Test
+    public void testGetPerfectNumbers() {
+        int max = 6;
+        arrayUtil.getPerfectNumbers(max);
+    }
+
+    @Test
+    public void testGrow() {
+        int[] oldArray = {2, 3, 6};
+        int size = 3;
+        int[] newArray = arrayUtil.grow(oldArray, size);
+        int[] expected = {2, 3, 6, 0, 0, 0};
+        Assert.assertArrayEquals(expected, newArray);
+    }
+
+    @Test
+    public void testJoin() {
+        int[] array = {3, 8, 9};
+        String seperator = "-";
+        String joinedString = arrayUtil.join(array, seperator);
+        Assert.assertEquals("3-8-9", joinedString);
+    }
+
+}
diff --git a/group03/569045298/src/test/coderising/litestruts/StrutsTest.java b/group03/569045298/src/test/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..61c25c3648
--- /dev/null
+++ b/group03/569045298/src/test/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,46 @@
+package coderising.litestruts;
+
+import com.coderising.litestruts.Struts;
+import com.coderising.litestruts.View;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class StrutsTest {
+
+    private Struts struts;
+
+    @Before
+    public void setUp() {
+        struts = new Struts();
+    }
+
+    @Test
+    public void testLoginActionSuccess() {
+        String actionName = "login";
+        Map<String, String> 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<String, String> params = new HashMap<>();
+        params.put("name", "test");
+        // 密码和预设的不一致
+        params.put("password", "123456");
+        View view = struts.runAction(actionName, params);
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+
+}
diff --git a/group03/58555264/.idea/compiler.xml b/group03/58555264/.idea/compiler.xml
new file mode 100644
index 0000000000..d4d178c429
--- /dev/null
+++ b/group03/58555264/.idea/compiler.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="58555264" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel target="1.7">
+      <module name="58555264" target="1.7" />
+    </bytecodeTargetLevel>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group03/58555264/.idea/encodings.xml b/group03/58555264/.idea/encodings.xml
new file mode 100644
index 0000000000..b26911bd02
--- /dev/null
+++ b/group03/58555264/.idea/encodings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/group03/58555264/.idea/inspectionProfiles/Project_Default.xml b/group03/58555264/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000..8d66637cb9
--- /dev/null
+++ b/group03/58555264/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,5 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+  </profile>
+</component>
\ No newline at end of file
diff --git a/group03/58555264/.idea/libraries/Maven__junit_junit_4_11.xml b/group03/58555264/.idea/libraries/Maven__junit_junit_4_11.xml
new file mode 100644
index 0000000000..f33320d8e7
--- /dev/null
+++ b/group03/58555264/.idea/libraries/Maven__junit_junit_4_11.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: junit:junit:4.11">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group03/58555264/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/group03/58555264/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000000..f58bbc1127
--- /dev/null
+++ b/group03/58555264/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.hamcrest:hamcrest-core:1.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group03/58555264/.idea/misc.xml b/group03/58555264/.idea/misc.xml
new file mode 100644
index 0000000000..e199196115
--- /dev/null
+++ b/group03/58555264/.idea/misc.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="EclipseCodeFormatter">
+    <option name="defaultSettings" value="true" />
+    <option name="id" value="1483335811507" />
+    <option name="name" value="default" />
+  </component>
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectInspectionProfilesVisibleTreeState">
+    <entry key="Project Default">
+      <profile-state>
+        <expanded-state>
+          <State>
+            <id />
+          </State>
+          <State>
+            <id>Android &gt; Lint &gt; Correctness</id>
+          </State>
+          <State>
+            <id>Android &gt; Lint &gt; Performance</id>
+          </State>
+          <State>
+            <id>Android &gt; Lint &gt; Security</id>
+          </State>
+          <State>
+            <id>Android &gt; Lint &gt; Usability &gt; Icons</id>
+          </State>
+          <State>
+            <id>Android Lint for Kotlin</id>
+          </State>
+          <State>
+            <id>Code style issuesJava</id>
+          </State>
+          <State>
+            <id>Compiler issuesJava</id>
+          </State>
+          <State>
+            <id>Finalization issuesJava</id>
+          </State>
+          <State>
+            <id>GeneralJavaScript</id>
+          </State>
+          <State>
+            <id>Groovy</id>
+          </State>
+          <State>
+            <id>Inheritance issuesJava</id>
+          </State>
+          <State>
+            <id>J2ME issuesJava</id>
+          </State>
+          <State>
+            <id>JSP Inspections</id>
+          </State>
+          <State>
+            <id>Java</id>
+          </State>
+          <State>
+            <id>Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>JavaBeans issuesJava</id>
+          </State>
+          <State>
+            <id>JavaScript</id>
+          </State>
+          <State>
+            <id>Kotlin</id>
+          </State>
+          <State>
+            <id>Numeric issuesJava</id>
+          </State>
+          <State>
+            <id>OtherGroovy</id>
+          </State>
+          <State>
+            <id>Performance issuesJava</id>
+          </State>
+          <State>
+            <id>Probable bugsJava</id>
+          </State>
+          <State>
+            <id>Security issuesJava</id>
+          </State>
+          <State>
+            <id>Serialization issuesJava</id>
+          </State>
+          <State>
+            <id>Verbose or redundant code constructsJava</id>
+          </State>
+        </expanded-state>
+        <selected-state>
+          <State>
+            <id>Android</id>
+          </State>
+        </selected-state>
+      </profile-state>
+    </entry>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/group03/58555264/.idea/modules.xml b/group03/58555264/.idea/modules.xml
new file mode 100644
index 0000000000..3acbd95495
--- /dev/null
+++ b/group03/58555264/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/58555264.iml" filepath="$PROJECT_DIR$/58555264.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group03/58555264/.idea/sonarIssues.xml b/group03/58555264/.idea/sonarIssues.xml
new file mode 100644
index 0000000000..766ed3fe03
--- /dev/null
+++ b/group03/58555264/.idea/sonarIssues.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="issues">
+    <option name="index">
+      <map>
+        <entry key="$PROJECT_DIR$/pom.xml">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/ArrayList.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/BinaryTree.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/Iterator.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/LinkedList.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/List.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/Queue.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/main/java/com/circle/collection/Stack.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/test/java/com/circle/collection/ArrayListTest.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/test/java/com/circle/collection/BinaryTreeTest.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/test/java/com/circle/collection/LinkedListTest.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/test/java/com/circle/collection/QueueTest.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/src/test/java/com/circle/collection/StackTest.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+        <entry key="/fragment.java">
+          <value>
+            <set />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group05/1094051862/test01/src/com/coding/basic/.gitignore b/group03/58555264/.idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec
similarity index 100%
rename from group05/1094051862/test01/src/com/coding/basic/.gitignore
rename to group03/58555264/.idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec
diff --git a/group03/58555264/.idea/sonarlint/issuestore/7/5/75b2bc528306e8fb4b899cc781e70fe6a351737c b/group03/58555264/.idea/sonarlint/issuestore/7/5/75b2bc528306e8fb4b899cc781e70fe6a351737c
new file mode 100644
index 0000000000..bc41e6c43e
--- /dev/null
+++ b/group03/58555264/.idea/sonarlint/issuestore/7/5/75b2bc528306e8fb4b899cc781e70fe6a351737c
@@ -0,0 +1,2 @@
+
+Wsquid:S2094"BRemove this empty class, write its code or make it an "interface".(����
\ No newline at end of file
diff --git a/group03/58555264/.idea/sonarlint/issuestore/index.pb b/group03/58555264/.idea/sonarlint/issuestore/index.pb
new file mode 100644
index 0000000000..279a4cb36d
--- /dev/null
+++ b/group03/58555264/.idea/sonarlint/issuestore/index.pb
@@ -0,0 +1,5 @@
+
+7
+pom.xml,4/4/442292b8a7efeabbe4cc176709b833b1792140ec
+b
+2src/main/java/com/circle/collection/ArrayList.java,7/5/75b2bc528306e8fb4b899cc781e70fe6a351737c
\ No newline at end of file
diff --git a/group03/58555264/.idea/workspace.xml b/group03/58555264/.idea/workspace.xml
new file mode 100644
index 0000000000..bd847f163f
--- /dev/null
+++ b/group03/58555264/.idea/workspace.xml
@@ -0,0 +1,1175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="306e3256-a07e-4975-a3af-3f50f35c7070" name="Default" comment="" />
+    <ignored path="$PROJECT_DIR$/out/" />
+    <ignored path="$PROJECT_DIR$/target/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="CompilerWorkspaceConfiguration">
+    <option name="PARALLEL_COMPILATION" value="true" />
+  </component>
+  <component name="CreatePatchCommitExecutor">
+    <option name="PATCH_PATH" value="" />
+  </component>
+  <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file leaf-file-name="BinaryTree.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/BinaryTree.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="431">
+              <caret line="139" column="43" lean-forward="false" selection-start-line="139" selection-start-column="43" selection-end-line="139" selection-end-column="43" />
+              <folding>
+                <element signature="e#6119#6120#0" expanded="true" />
+                <element signature="e#6154#6155#0" expanded="true" />
+                <element signature="e#6198#6199#0" expanded="true" />
+                <element signature="e#6238#6239#0" expanded="true" />
+                <element signature="e#6276#6277#0" expanded="true" />
+                <element signature="e#6316#6317#0" expanded="true" />
+                <element signature="e#6368#6369#0" expanded="true" />
+                <element signature="e#6418#6419#0" expanded="true" />
+                <element signature="e#6457#6458#0" expanded="true" />
+                <element signature="e#6498#6499#0" expanded="true" />
+                <element signature="e#6552#6553#0" expanded="true" />
+                <element signature="e#6604#6605#0" expanded="true" />
+                <element signature="e#6634#6635#0" expanded="true" />
+                <element signature="e#6667#6668#0" expanded="true" />
+                <element signature="e#6704#6705#0" expanded="true" />
+                <element signature="e#6740#6741#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="BinaryTreeTest.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/collection/BinaryTreeTest.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="45">
+              <caret line="5" column="0" lean-forward="true" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Interface" />
+        <option value="JUnit3 Test Class" />
+        <option value="Class" />
+        <option value="JUnit4 Test Class" />
+      </list>
+    </option>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>add</find>
+      <find>peek</find>
+      <find>removeFirst</find>
+    </findStrings>
+  </component>
+  <component name="GradleLocalSettings">
+    <option name="externalProjectsViewState">
+      <projects_view />
+    </option>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/List.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/Iterator.java" />
+        <option value="$PROJECT_DIR$/pom.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/ArrayList.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/circle/collection/ArrayListTest.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/LinkedList.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/circle/collection/LinkedListTest.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/Queue.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/circle/collection/QueueTest.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/Stack.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/circle/collection/StackTest.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/circle/collection/BinaryTree.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/circle/collection/BinaryTreeTest.java" />
+      </list>
+    </option>
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="importingSettings">
+      <MavenImportingSettings>
+        <option name="importAutomatically" value="true" />
+      </MavenImportingSettings>
+    </option>
+  </component>
+  <component name="ProjectFrameBounds">
+    <option name="x" value="47" />
+    <option name="y" value="23" />
+    <option name="width" value="1280" />
+    <option name="height" value="714" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource ProjectPane="true" />
+      <sortByType />
+      <manualOrder />
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="Scope" />
+      <pane id="Scratches" />
+      <pane id="PackagesPane" />
+      <pane id="ProjectPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="58555264" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="58555264" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="settings.editor.selected.configurable" value="settings.github" />
+    <property name="project.structure.last.edited" value="Global Libraries" />
+    <property name="project.structure.proportion" value="0.15" />
+    <property name="project.structure.side.proportion" value="0.2" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="aspect.path.notification.shown" value="true" />
+    <property name="js.eslint.eslintPackage" value="" />
+    <property name="com.intellij.testIntegration.createTest.CreateTestDialog.defaultLibrary" value="JUnit4" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CreateTestDialog.RecentsKey">
+      <recent name="com.circle.collection" />
+    </key>
+    <key name="CreateTestDialog.Recents.Supers">
+      <recent name="" />
+      <recent name="junit.framework.TestCase" />
+    </key>
+  </component>
+  <component name="RunManager" selected="JUnit.BinaryTreeTest.delete">
+    <configuration default="false" name="BinaryTreeTest" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="com.circle.collection.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="58555264" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.circle.collection" />
+      <option name="MAIN_CLASS_NAME" value="com.circle.collection.BinaryTreeTest" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="false" name="BinaryTreeTest.preOrder" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="com.circle.collection.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="58555264" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.circle.collection" />
+      <option name="MAIN_CLASS_NAME" value="com.circle.collection.BinaryTreeTest" />
+      <option name="METHOD_NAME" value="preOrder" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="false" name="BinaryTreeTest.inOrder" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="com.circle.collection.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="58555264" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.circle.collection" />
+      <option name="MAIN_CLASS_NAME" value="com.circle.collection.BinaryTreeTest" />
+      <option name="METHOD_NAME" value="inOrder" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="false" name="BinaryTreeTest.postOrder" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="com.circle.collection.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="58555264" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.circle.collection" />
+      <option name="MAIN_CLASS_NAME" value="com.circle.collection.BinaryTreeTest" />
+      <option name="METHOD_NAME" value="postOrder" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="false" name="BinaryTreeTest.delete" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="com.circle.collection.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="58555264" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.circle.collection" />
+      <option name="MAIN_CLASS_NAME" value="com.circle.collection.BinaryTreeTest" />
+      <option name="METHOD_NAME" value="delete" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
+      <module name="" />
+      <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
+      <option name="PROGRAM_PARAMETERS" />
+      <predefined_log_file id="idea.log" enabled="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android App">
+      <module name="" />
+      <option name="DEPLOY" value="true" />
+      <option name="ARTIFACT_NAME" value="" />
+      <option name="PM_INSTALL_OPTIONS" value="" />
+      <option name="ACTIVITY_EXTRA_FLAGS" value="" />
+      <option name="MODE" value="default_activity" />
+      <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
+      <option name="PREFERRED_AVD" value="" />
+      <option name="CLEAR_LOGCAT" value="false" />
+      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
+      <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
+      <option name="FORCE_STOP_RUNNING_APP" value="true" />
+      <option name="DEBUGGER_TYPE" value="Java" />
+      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+      <option name="PREFERRED_AVD" value="" />
+      <Java />
+      <Profilers>
+        <option name="ENABLE_ADVANCED_PROFILING" value="true" />
+        <option name="GAPID_ENABLED" value="false" />
+        <option name="GAPID_DISABLE_PCS" value="false" />
+        <option name="SUPPORT_LIB_ENABLED" value="true" />
+        <option name="INSTRUMENTATION_ENABLED" value="true" />
+      </Profilers>
+      <option name="DEEP_LINK" value="" />
+      <option name="ACTIVITY_CLASS" value="" />
+      <method />
+    </configuration>
+    <configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests">
+      <module name="" />
+      <option name="TESTING_TYPE" value="0" />
+      <option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="CLASS_NAME" value="" />
+      <option name="PACKAGE_NAME" value="" />
+      <option name="EXTRA_OPTIONS" value="" />
+      <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
+      <option name="PREFERRED_AVD" value="" />
+      <option name="CLEAR_LOGCAT" value="false" />
+      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
+      <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
+      <option name="FORCE_STOP_RUNNING_APP" value="true" />
+      <option name="DEBUGGER_TYPE" value="Java" />
+      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+      <option name="PREFERRED_AVD" value="" />
+      <Java />
+      <Profilers>
+        <option name="ENABLE_ADVANCED_PROFILING" value="true" />
+        <option name="GAPID_ENABLED" value="false" />
+        <option name="GAPID_DISABLE_PCS" value="false" />
+        <option name="SUPPORT_LIB_ENABLED" value="true" />
+        <option name="INSTRUMENTATION_ENABLED" value="true" />
+      </Profilers>
+      <method />
+    </configuration>
+    <configuration default="true" type="Applet" factoryName="Applet">
+      <option name="HTML_USED" value="false" />
+      <option name="WIDTH" value="400" />
+      <option name="HEIGHT" value="300" />
+      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
+      <module />
+      <method />
+    </configuration>
+    <configuration default="true" type="Application" factoryName="Application">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="ArquillianJUnit" factoryName="" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="arquillianRunConfiguration">
+        <value>
+          <option name="containerStateName" value="" />
+        </value>
+      </option>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="true" type="ArquillianTestNG" factoryName="">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="arquillianRunConfiguration">
+        <value>
+          <option name="containerStateName" value="" />
+        </value>
+      </option>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SUITE_NAME" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="GROUP_NAME" />
+      <option name="TEST_OBJECT" value="CLASS" />
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="OUTPUT_DIRECTORY" />
+      <option name="ANNOTATION_TYPE" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <option name="USE_DEFAULT_REPORTERS" value="false" />
+      <option name="PROPERTIES_FILE" />
+      <envs />
+      <properties />
+      <listeners />
+      <method />
+    </configuration>
+    <configuration default="true" type="Cold Fusion runner description" factoryName="Cold Fusion" custom_browser="" web_path="">
+      <method />
+    </configuration>
+    <configuration default="true" type="CucumberJavaRunConfigurationType" factoryName="Cucumber java">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="myFilePath" />
+      <option name="GLUE" />
+      <option name="myNameFilter" />
+      <option name="myGeneratedName" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="FlashRunConfigurationType" factoryName="Flash App">
+      <option name="BCName" value="" />
+      <option name="IOSSimulatorSdkPath" value="" />
+      <option name="adlOptions" value="" />
+      <option name="airProgramParameters" value="" />
+      <option name="appDescriptorForEmulator" value="Android" />
+      <option name="debugTransport" value="USB" />
+      <option name="debuggerSdkRaw" value="BC SDK" />
+      <option name="emulator" value="NexusOne" />
+      <option name="emulatorAdlOptions" value="" />
+      <option name="fastPackaging" value="true" />
+      <option name="fullScreenHeight" value="0" />
+      <option name="fullScreenWidth" value="0" />
+      <option name="launchUrl" value="false" />
+      <option name="launcherParameters">
+        <LauncherParameters>
+          <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" />
+          <option name="launcherType" value="OSDefault" />
+          <option name="newPlayerInstance" value="false" />
+          <option name="playerPath" value="/Applications/Flash Player Debugger.app" />
+        </LauncherParameters>
+      </option>
+      <option name="mobileRunTarget" value="Emulator" />
+      <option name="moduleName" value="" />
+      <option name="overriddenMainClass" value="" />
+      <option name="overriddenOutputFileName" value="" />
+      <option name="overrideMainClass" value="false" />
+      <option name="runTrusted" value="true" />
+      <option name="screenDpi" value="0" />
+      <option name="screenHeight" value="0" />
+      <option name="screenWidth" value="0" />
+      <option name="url" value="http://" />
+      <option name="usbDebugPort" value="7936" />
+      <method />
+    </configuration>
+    <configuration default="true" type="FlexUnitRunConfigurationType" factoryName="FlexUnit" appDescriptorForEmulator="Android" class_name="" emulatorAdlOptions="" method_name="" package_name="" scope="Class">
+      <option name="BCName" value="" />
+      <option name="launcherParameters">
+        <LauncherParameters>
+          <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" />
+          <option name="launcherType" value="OSDefault" />
+          <option name="newPlayerInstance" value="false" />
+          <option name="playerPath" value="/Applications/Flash Player Debugger.app" />
+        </LauncherParameters>
+      </option>
+      <option name="moduleName" value="" />
+      <option name="trusted" value="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="GradleRunConfiguration" factoryName="Gradle">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list />
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="true" type="GrailsRunConfigurationType" factoryName="Grails">
+      <setting name="vmparams" value="" />
+      <setting name="cmdLine" value="run-app" />
+      <setting name="passParentEnv" value="true" />
+      <setting name="launchBrowser" value="true" />
+      <setting name="launchBrowserUrl" value="" />
+      <setting name="depsClasspath" value="false" />
+      <method />
+    </configuration>
+    <configuration default="true" type="JUnit" factoryName="JUnit">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="true" type="JarApplication" factoryName="JAR Application">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="Java Scratch" factoryName="Java Scratch">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="SCRATCH_FILE_ID" value="0" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="JavaScriptTestRunnerProtractor" factoryName="Protractor">
+      <config-file value="" />
+      <node-interpreter value="project" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
+      <method />
+    </configuration>
+    <configuration default="true" type="JetRunConfigurationType" factoryName="Kotlin">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="58555264" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="KotlinStandaloneScriptRunConfigurationType" factoryName="Kotlin script">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="filePath" />
+      <option name="vmParameters" />
+      <option name="alternativeJrePath" />
+      <option name="programParameters" />
+      <option name="passParentEnvs" value="true" />
+      <option name="workingDirectory" />
+      <option name="isAlternativeJrePathEnabled" value="false" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="Remote" factoryName="Remote">
+      <option name="USE_SOCKET_TRANSPORT" value="true" />
+      <option name="SERVER_MODE" value="false" />
+      <option name="SHMEM_ADDRESS" value="javadebug" />
+      <option name="HOST" value="localhost" />
+      <option name="PORT" value="5005" />
+      <method />
+    </configuration>
+    <configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="TestNG" factoryName="TestNG">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SUITE_NAME" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="GROUP_NAME" />
+      <option name="TEST_OBJECT" value="CLASS" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="OUTPUT_DIRECTORY" />
+      <option name="ANNOTATION_TYPE" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <option name="USE_DEFAULT_REPORTERS" value="false" />
+      <option name="PROPERTIES_FILE" />
+      <envs />
+      <properties />
+      <listeners />
+      <method />
+    </configuration>
+    <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
+      <node-interpreter>project</node-interpreter>
+      <node-options />
+      <gulpfile />
+      <tasks />
+      <arguments />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="js.build_tools.npm" factoryName="npm">
+      <command value="run" />
+      <scripts />
+      <node-interpreter value="project" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="osgi.bnd.run" factoryName="Run Launcher">
+      <method />
+    </configuration>
+    <configuration default="true" type="osgi.bnd.run" factoryName="Test Launcher (JUnit)">
+      <method />
+    </configuration>
+    <list size="5">
+      <item index="0" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest" />
+      <item index="1" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.preOrder" />
+      <item index="2" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.inOrder" />
+      <item index="3" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.postOrder" />
+      <item index="4" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.delete" />
+    </list>
+    <recent_temporary>
+      <list size="5">
+        <item index="0" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.delete" />
+        <item index="1" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.postOrder" />
+        <item index="2" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.inOrder" />
+        <item index="3" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest.preOrder" />
+        <item index="4" class="java.lang.String" itemvalue="JUnit.BinaryTreeTest" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false">
+    <option name="remove_strategy" value="false" />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="306e3256-a07e-4975-a3af-3f50f35c7070" name="Default" comment="" />
+      <created>1487924915857</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1487924915857</updated>
+      <workItem from="1487924918018" duration="429000" />
+      <workItem from="1487981480895" duration="16456000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TestHistory">
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 31m 27s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 34m 29s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 36m 25s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 38m 38s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 38m 49s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 43m 46s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 46m 24s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 46m 53s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_delete - 2017.02.25 at 15h 47m 19s.xml">
+      <configuration name="BinaryTreeTest.delete" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="BinaryTreeTest_postOrder - 2017.02.25 at 15h 43m 39s.xml">
+      <configuration name="BinaryTreeTest.postOrder" configurationId="JUnit" />
+    </history-entry>
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="16885000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="47" y="23" width="1280" height="714" extended-state="0" />
+    <editor active="false" />
+    <layout>
+      <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Nl-Palette" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Properties" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="SonarQube" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.39871383" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32852563" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.46976745" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="CheckStyle" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Run with VisualVM" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.390625" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="SonarLint" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Debug with VisualVM" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+    </layout>
+    <layout-to-restore>
+      <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Nl-Palette" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Properties" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="SonarQube" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.39903846" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32852563" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
+      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3762058" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
+      <window_info id="CheckStyle" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="12" side_tool="false" content_ui="tabs" />
+      <window_info id="Run with VisualVM" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="13" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25282714" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="SonarLint" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="14" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Debug with VisualVM" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="15" side_tool="false" content_ui="tabs" />
+    </layout-to-restore>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="processedProjectFiles" value="true" />
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/circle/collection/ArrayList.java</url>
+          <line>37</line>
+          <properties />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/test/java/com/circle/collection/ArrayListTest.java</url>
+          <line>34</line>
+          <properties />
+          <option name="timeStamp" value="3" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/test/java/com/circle/collection/LinkedListTest.java</url>
+          <line>87</line>
+          <properties />
+          <option name="timeStamp" value="5" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/circle/collection/Stack.java</url>
+          <line>47</line>
+          <properties />
+          <option name="timeStamp" value="6" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/circle/collection/BinaryTree.java</url>
+          <line>147</line>
+          <properties />
+          <option name="timeStamp" value="8" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/test/java/com/circle/collection/BinaryTreeTest.java</url>
+          <line>69</line>
+          <properties />
+          <option name="timeStamp" value="11" />
+        </line-breakpoint>
+      </breakpoints>
+      <option name="time" value="12" />
+    </breakpoint-manager>
+    <watches-manager />
+  </component>
+  <component name="antWorkspaceConfiguration">
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
+    <option name="FILTER_TARGETS" value="false" />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/App.java" />
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/AppTest.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/List.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="210">
+          <caret line="14" column="15" lean-forward="false" selection-start-line="14" selection-start-column="15" selection-end-line="14" selection-end-column="15" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/Iterator.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="60">
+          <caret line="4" column="34" lean-forward="false" selection-start-line="4" selection-start-column="34" selection-end-line="4" selection-end-column="34" />
+          <folding>
+            <marker date="1487981661000" expanded="true" signature="32:113" ph="/**...*/" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pom.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="86">
+          <caret line="23" column="0" lean-forward="false" selection-start-line="23" selection-start-column="0" selection-end-line="23" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MavenHelperPluginDependencyAnalyzer">
+        <state />
+      </provider>
+    </entry>
+    <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/src.zip!/java/lang/System.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-1220">
+          <caret line="402" column="49" lean-forward="false" selection-start-line="402" selection-start-column="49" selection-end-line="402" selection-end-column="49" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/src.zip!/java/util/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-7">
+          <caret line="232" column="17" lean-forward="false" selection-start-line="232" selection-start-column="17" selection-end-line="232" selection-end-column="17" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/collection/ArrayListTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="570">
+          <caret line="76" column="47" lean-forward="false" selection-start-line="76" selection-start-column="47" selection-end-line="76" selection-end-column="47" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-563">
+          <caret line="53" column="25" lean-forward="true" selection-start-line="53" selection-start-column="25" selection-end-line="53" selection-end-column="25" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/LinkedList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="103">
+          <caret line="167" column="29" lean-forward="false" selection-start-line="167" selection-start-column="18" selection-end-line="167" selection-end-column="29" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/Queue.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="240">
+          <caret line="18" column="36" lean-forward="false" selection-start-line="18" selection-start-column="36" selection-end-line="18" selection-end-column="36" />
+          <folding>
+            <element signature="e#339#340#0" expanded="false" />
+            <element signature="e#385#386#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/collection/QueueTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="255">
+          <caret line="19" column="42" lean-forward="false" selection-start-line="19" selection-start-column="42" selection-end-line="19" selection-end-column="42" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/src.zip!/java/util/Stack.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="253">
+          <caret line="101" column="40" lean-forward="false" selection-start-line="101" selection-start-column="40" selection-end-line="101" selection-end-column="40" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/collection/LinkedListTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1582">
+          <caret line="147" column="26" lean-forward="false" selection-start-line="147" selection-start-column="26" selection-end-line="147" selection-end-column="26" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/Stack.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-135">
+          <caret line="30" column="49" lean-forward="false" selection-start-line="30" selection-start-column="49" selection-end-line="30" selection-end-column="49" />
+          <folding>
+            <element signature="e#946#947#0" expanded="true" />
+            <element signature="e#992#993#0" expanded="true" />
+            <element signature="e#1017#1018#0" expanded="true" />
+            <element signature="e#1058#1059#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/src.zip!/com/sun/source/tree/BinaryTree.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="300">
+          <caret line="43" column="27" lean-forward="false" selection-start-line="43" selection-start-column="27" selection-end-line="43" selection-end-column="27" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/collection/StackTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="92">
+          <caret line="11" column="0" lean-forward="true" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11.jar!/org/junit/runners/ParentRunner.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="115">
+          <caret line="155" column="0" lean-forward="false" selection-start-line="155" selection-start-column="0" selection-end-line="155" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11.jar!/org/junit/internal/runners/model/ReflectiveCallable.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="210">
+          <caret line="17" column="0" lean-forward="false" selection-start-line="17" selection-start-column="0" selection-end-line="17" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/circle/collection/BinaryTree.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="431">
+          <caret line="139" column="43" lean-forward="false" selection-start-line="139" selection-start-column="43" selection-end-line="139" selection-end-column="43" />
+          <folding>
+            <element signature="e#6119#6120#0" expanded="true" />
+            <element signature="e#6154#6155#0" expanded="true" />
+            <element signature="e#6198#6199#0" expanded="true" />
+            <element signature="e#6238#6239#0" expanded="true" />
+            <element signature="e#6276#6277#0" expanded="true" />
+            <element signature="e#6316#6317#0" expanded="true" />
+            <element signature="e#6368#6369#0" expanded="true" />
+            <element signature="e#6418#6419#0" expanded="true" />
+            <element signature="e#6457#6458#0" expanded="true" />
+            <element signature="e#6498#6499#0" expanded="true" />
+            <element signature="e#6552#6553#0" expanded="true" />
+            <element signature="e#6604#6605#0" expanded="true" />
+            <element signature="e#6634#6635#0" expanded="true" />
+            <element signature="e#6667#6668#0" expanded="true" />
+            <element signature="e#6704#6705#0" expanded="true" />
+            <element signature="e#6740#6741#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/circle/collection/BinaryTreeTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="45">
+          <caret line="5" column="0" lean-forward="true" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ArquillianSettingsConfigurable.UI">
+        <settings>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ArtifactsStructureConfigurable.UI">
+        <settings>
+          <artifact-editor />
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="FacetStructureConfigurable.UI">
+        <settings>
+          <last-edited>No facets are configured</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="GlobalLibrariesConfigurable.UI">
+        <settings>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="JdkListConfigurable.UI">
+        <settings>
+          <last-edited>1.7</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ModuleStructureConfigurable.UI">
+        <settings>
+          <last-edited>58555264</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+                <option value="0.6" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ProjectJDKs.UI">
+        <settings>
+          <last-edited>1.7</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ProjectLibrariesConfigurable.UI">
+        <settings>
+          <last-edited>Maven: junit:junit:4.11</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+    </states>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group03/58555264/58555264.iml b/group03/58555264/58555264.iml
new file mode 100644
index 0000000000..6f2092a3ac
--- /dev/null
+++ b/group03/58555264/58555264.iml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: junit:junit:4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+  </component>
+  <component name="sonarModuleSettings">
+    <option name="alternativeWorkingDirPath" value="" />
+    <option name="localAnalysisScripName" value="&lt;PROJECT&gt;" />
+    <option name="serverName" value="&lt;PROJECT&gt;" />
+    <option name="useAlternativeWorkingDir" value="false" />
+    <option name="workingDirSelection" value="&lt;MODULE&gt;" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group03/58555264/pom.xml b/group03/58555264/pom.xml
new file mode 100644
index 0000000000..ede0dc4997
--- /dev/null
+++ b/group03/58555264/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.circle</groupId>
+  <artifactId>58555264</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>58555264</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <!-- https://mvnrepository.com/artifact/junit/junit -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java b/group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java
new file mode 100644
index 0000000000..3bfae82039
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java
@@ -0,0 +1,151 @@
+package com.circle.algorithm;
+
+import java.util.Arrays;
+
+/**
+ * Created by keweiyang on 2017/3/1.
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a，对该数组的值进行置换
+     * 例如：a=[7,9,30,3],置换后为[3,30,9,7]
+     * 如果 a=[7,9,30,3,4],置换后为【4，3，30，9，7】
+     *
+     * @param origin
+     */
+    public void reverseArray(int[] origin) {
+        int first = 0;
+        int last = origin.length - 1;
+
+        while (first < last) {
+            swap(origin, first, last);
+            first++;
+            last--;
+        }
+
+    }
+
+    private void swap(int[] origin, int first, int last) {
+        int temp = origin[last];
+        origin[last] = origin[first];
+        origin[first] = temp;
+    }
+
+
+    /**
+     * 现有如下一个数组：int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1，3，4，5，6，6，5，4，7，6，7，5}
+     *
+     * @param oldArray
+     * @return
+     */
+    public int[] removeZero(int[] oldArray) {
+        int size = 0;
+        for (int i : oldArray) {
+            if (i != 0) {
+
+                size++;
+            }
+        }
+        int[] newArray = new int[size];
+
+        int currentIndex = 0;
+        for (int i : oldArray) {
+            if (i != 0) {
+
+                newArray[currentIndex++] = i;
+            }
+        }
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21.。。。,给定一个最大值，返回小于该值的数列
+     * 例如：max=15,则返回的数组应该为[1,1,2,3,5,8,13]
+     * max =1,则返回孔数组[]
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+
+        int[] array = new int[max];
+        int i = 1;
+        while (max > fun(i)) {
+
+            array[i] = fun(i);
+            i++;
+        }
+
+
+        return removeZero(array);
+    }
+
+    private int fun(int i) {
+        if (i == 1 || i == 2) {
+            return 1;
+        }
+        return fun(i - 1) + fun(i - 2);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数(质数)数组
+     * 例如max=23，返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        int[] arr = new int[max];
+        int k = 0;
+        if (max < 2) {
+            return null;
+        } else {
+            for (int i = 2; i < max; i++) {
+                boolean flag = false;
+                int j = i-1;
+                while (j > 1) {
+                    if (i % j == 0) {
+                        flag = true;
+                        break;
+                    }
+                    j--;
+
+                }
+                if (!flag) {
+                    arr[k++] = i;
+                }
+
+
+            }
+        }
+       /* for (int i : arr) {
+            System.out.println(i);
+        }*/
+        return removeZero(arr);
+    }
+
+    /**
+     * 用seperator把数组array给连接起来
+     * 例如array=[3,8,9],seperator="-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        StringBuilder builder = new StringBuilder();
+
+        for (int i = 0; i < array.length; i++) {
+            builder.append(array[i]);
+            builder.append(seperator);
+        }
+        builder.deleteCharAt(builder.length() - 1);
+        return builder.toString();
+    }
+
+
+}
diff --git a/group03/58555264/src/main/java/com/circle/algorithm/Reverse.java b/group03/58555264/src/main/java/com/circle/algorithm/Reverse.java
new file mode 100644
index 0000000000..387fd863b5
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/algorithm/Reverse.java
@@ -0,0 +1,30 @@
+package com.circle.algorithm;
+
+/**
+ * Created by keweiyang on 2017/3/1.
+ * Problem:
+   Given an input string, reverse the string word by word.
+   For example,
+   Given s = “the sky is blue”,
+   return “blue is sky the”.
+ */
+public class Reverse {
+
+    public void reverse(String string) {
+
+        char[] cs = string.toCharArray();
+        char[] newChar = new char[cs.length];
+        for(int i=0;i<cs.length;i++) {
+            if (cs[i] == '0') {
+
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        Reverse reverse = new Reverse();
+        String string = "the sky is blue";
+
+    }
+
+}
diff --git a/group03/58555264/src/main/java/com/circle/algorithm/Sum.java b/group03/58555264/src/main/java/com/circle/algorithm/Sum.java
new file mode 100644
index 0000000000..c4c56c5423
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/algorithm/Sum.java
@@ -0,0 +1,66 @@
+package com.circle.algorithm;
+
+import java.util.*;
+
+/**
+ * Created by keweiyang on 2017/3/1.
+ * Problem:
+ * Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
+ * Note:
+ * Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
+ * The solution set must not contain duplicate triplets.
+ * For example, given array S = {-1 0 1 2 -1 -4},
+ * A solution set is:
+ * (-1, 0, 1)
+ * (-1, -1, 2)
+ */
+public class Sum {
+
+    public void sum(int[] as, int target) {
+        List<List<Integer>> list = new ArrayList<>();
+
+        for (int i = 0; i < as.length; i++) {
+            for (int j = i + 1; j < as.length; j++) {
+                int k = as.length - 1;
+
+
+                while (target != as[i] + as[j] + as[k]) {
+                    if (target < as[i] + as[j] + as[k]) {
+                        k--;
+                        if (j > k) {
+                            break;
+                        }
+                    } else if (target > as[i] + as[j] + as[k]) {
+                        break;
+                    }
+                }
+
+                if (target == as[i] + as[j] + as[k]) {
+                    Integer[] arr = new Integer[3];
+                    arr[0] = as[i];
+                    arr[1] = as[j];
+                    arr[2] = as[k];
+                    list.add(Arrays.asList(arr));
+                }
+
+
+
+            }
+        }
+
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+    }
+
+    public static void main(String[] args) {
+        Sum sum = new Sum();
+        int[] as = new int[]{-1, 0, 1, 2, -1, -4};
+        Arrays.sort(as);
+
+        sum.sum(as, 0);
+
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/ArrayList.java b/group03/58555264/src/main/java/com/circle/collection/ArrayList.java
new file mode 100644
index 0000000000..26ac64b863
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/ArrayList.java
@@ -0,0 +1,168 @@
+package com.circle.collection;
+
+import java.util.Arrays;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ * 自定义ArrayList
+ */
+public class ArrayList implements List {
+    java.util.ArrayList list;
+    private Object[] elementData = null;
+    private int currentIndex = -1;
+
+    public ArrayList(int length) {
+        if (length < 0) {
+            throw new RuntimeException("数组初始化大小必须大于0");
+        }
+        elementData = new Object[length];
+    }
+
+    /**
+     * 在数组最后一位插入数据
+     *
+     * @param object
+     */
+    public void add(Object object) {
+        //1：先判断数组是否越界，由于其他函数也会用到，所以提取为一个函数
+        ensureCapacity();
+        //2:执行插入操作
+        currentIndex++;
+        elementData[currentIndex] = object;
+    }
+
+
+    /**
+     * 给数组动态扩容
+     */
+    public void ensureCapacity() {
+        if (currentIndex + 2 > elementData.length) {
+//            Object[] newObjects = new Object[elementData.length * 2 + 2];
+            elementData = Arrays.copyOf(elementData, elementData.length * 2 + 2);
+            //System.arraycopy(elementData, 0, newObjects, 0, newObjects.length);
+        }
+    }
+
+    /**
+     * 在数组指定位置(任意位置)插入数据
+     *
+     * @param index
+     * @param object
+     */
+    public void add(int index, Object object) {
+
+        rangeCheck(index);
+        ensureCapacity();
+        //如果index>currentIndex,并且在数组范围内，则插入
+        if (index > currentIndex && index <= elementData.length) {
+            currentIndex = index;
+            elementData[currentIndex] = object;
+            currentIndex++;
+
+        } else if (index >= 0 && index < currentIndex) {
+            //如果0<=index< currentIndex,则将index和之后的数据往后面移动
+
+            for (int i = currentIndex; i >= index; i--) {
+                elementData[i + 1] = elementData[i];
+            }
+            elementData[index] = object;
+            currentIndex++;
+        } else {
+            //如果index=currentIndex,则调用add(Object o)
+            add(object);
+        }
+
+
+    }
+
+    public Object[] toArray() {
+        Object[] array = new Object[currentIndex];
+        System.arraycopy(elementData, 0, array, 0, currentIndex);
+        return array;
+    }
+
+    private void rangeCheck(int index) {
+        if (index < 0 || index > elementData.length - 1) {
+            throw new ArrayIndexOutOfBoundsException("输入索引位置越界");
+        }
+    }
+
+    /**
+     * 获取指定位置数据
+     *
+     * @param index
+     * @return
+     */
+    public Object get(int index) {
+        rangeCheck(index);
+        return elementData[index];
+    }
+
+    /**
+     * 删除指定位置数据
+     *
+     * @param index
+     * @return 返回要删除的数据
+     */
+    public Object remove(int index) {
+
+        rangeCheck(index);
+        Object temp = elementData[index];
+        for (int i = index + 1; i <= currentIndex; i++) {
+            elementData[i - 1] = elementData[i];
+        }
+
+        elementData[currentIndex] = null;
+        currentIndex--;
+        return temp;
+    }
+
+    /**
+     * 防止内存泄露
+     */
+    public void clear() {
+        for(int i=0;i<=currentIndex;i++) {
+            elementData[i] = null;
+        }
+        currentIndex = -1;
+    }
+
+    /**
+     * 返回数组长度
+     *
+     * @return
+     */
+    public int size() {
+        return currentIndex + 1;
+    }
+
+    /**
+     * 遍历ArrayList
+     *
+     * @return
+     */
+    public Iterator iterator() {
+
+        return new Iterator() {
+
+            int pos = -1;
+
+            public boolean hasNext() {
+                if (pos + 1 <= currentIndex) {
+                    return true;
+                }
+                return false;
+            }
+
+            public Object next() {
+                if (hasNext()) {
+                    pos++;
+                    return elementData[pos];
+                }
+                return null;
+            }
+        };
+    }
+
+
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/BinaryTree.java b/group03/58555264/src/main/java/com/circle/collection/BinaryTree.java
new file mode 100644
index 0000000000..ccb05b965f
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/BinaryTree.java
@@ -0,0 +1,280 @@
+package com.circle.collection;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ * 自定义二叉树
+ */
+public class BinaryTree {
+
+    private Node root;
+
+    /**
+     * 查找某个节点
+     *
+     * @param key
+     * @return
+     */
+    public Node get(int key) {
+        Node currentNode = root;
+
+        if (currentNode == null) {
+            throw new RuntimeException("这棵二叉树为空二叉树");
+        } else {
+            while (currentNode.getId()!= key) {
+                if (currentNode.getId() > key) {
+                    currentNode = currentNode.getLeftChild();
+                } else {
+                    currentNode.getRightChild();
+                }
+
+                if (currentNode == null) {
+                    return null;
+                }
+            }
+        }
+
+        return currentNode;
+    }
+
+    /**
+     * 插入一个节点
+     *
+     * @param id
+     * @param data
+     */
+    public void insert(int id, Object data) {
+        Node newNode = new Node(id, data);
+        //1:先找到插入位置
+        Node parentNode = null;
+        Node currentNode = root;
+        if (root == null) {
+            root = newNode;
+        } else {
+            while (true) {
+                parentNode = currentNode;
+                if (currentNode.getId() > id) {
+                    currentNode = currentNode.getLeftChild();
+                    if (currentNode == null) {
+                        //如果没有左子节点，则插入
+                        parentNode.setLeftChild(newNode);
+                        return;
+                    }
+                } else {
+                    currentNode = currentNode.getRightChild();
+                    if (currentNode == null) {
+                        //如果没有右子节点，则插入
+                        parentNode.setRightChild(newNode);
+                        return;
+                    }
+
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除节点
+     * @param key
+     */
+    public boolean delete(int key) {
+        //根据key找到对应的节点
+        // 1、如果该节点不存在就抛出异常
+        Node parentNode = null;
+        Node currentNode = root;
+        boolean isLeftNode = false;
+        if (currentNode == null) {
+            throw new RuntimeException("二叉树为空");
+        }else{
+            while (currentNode.getId() != key) {
+                parentNode = currentNode;
+                if (currentNode.getId() < key) {
+                    currentNode = currentNode.getRightChild();
+                    isLeftNode = false;
+                }else{
+                    currentNode = currentNode.getLeftChild();
+                    isLeftNode = true;
+                }
+
+                if (currentNode == null) {
+                    return false;
+                }
+            }
+        }
+
+
+        //2、下面讨论该节点存在
+        // 2.1如果该节点的左右子节点都不存在，则直接删除该节点
+        if (currentNode.getRightChild() == null && currentNode.getLeftChild() == null) {
+            this.noChild(currentNode, parentNode, isLeftNode);
+        }
+        // 2.2如果该节点的只存在一个子节点
+        //2.2.1 如果存在左节点
+        if (currentNode.getRightChild() == null) {
+            this.oneLeftChild(currentNode,parentNode,isLeftNode);
+        }
+        //2.2.2 如果存在右节点
+        if (currentNode.getLeftChild() == null) {
+            this.oneRightChild(currentNode, parentNode, isLeftNode);
+        }
+        //2.3 如果左右孩子都存在，则直接拿右孩子中最小的节点替换该节点
+        if (currentNode.getLeftChild() != null && currentNode.getRightChild() != null) {
+            this.bothChild(currentNode, parentNode, isLeftNode);
+        }
+        return false;
+
+    }
+
+    private void bothChild(Node currentNode, Node parentNode, boolean flag) {
+        //找到中序后继节点
+        if (flag) {
+            Node node = this.successor(currentNode);
+            node.setLeftChild(currentNode.getLeftChild());
+
+            parentNode.setLeftChild(node);
+
+
+        }else{
+            Node node = this.successor(currentNode);
+            node.setRightChild(currentNode.getRightChild());
+
+            parentNode.setRightChild(node);
+
+        }
+    }
+
+    private Node successor(Node currentNode) {
+        //由于当前节点的左右子节点都存在，所以current一定存在
+        Node parent = currentNode;
+        Node current = currentNode.getRightChild();
+
+        while (current != null) {
+            parent = current;
+            current = current.getLeftChild();
+        }
+
+        return parent;
+
+    }
+
+    private void oneRightChild(Node currentNode, Node parentNode, boolean flag) {
+        if (flag) {
+            parentNode.setRightChild(currentNode.getLeftChild());
+
+        }else{
+            parentNode.setRightChild(currentNode.getRightChild());
+
+        }
+    }
+
+    private void oneLeftChild(Node currentNode, Node parentNode, boolean flag) {
+        if (flag) {
+            parentNode.setLeftChild(currentNode.getLeftChild());
+
+        }else{
+            parentNode.setLeftChild(currentNode.getRightChild());
+
+        }
+    }
+
+    private void noChild(Node currentNode, Node parentNode, boolean flag) {
+        if (flag) {
+            parentNode.setLeftChild(null);
+
+        }else{
+            parentNode.setRightChild(null);
+
+        }
+    }
+
+    /**
+     * 前序
+     *
+     * @param node
+     */
+    public void preOrder(Node node) {
+        if (node != null) {
+            System.out.println(node.getId() + "--- ");
+            preOrder(node.getLeftChild());
+            preOrder(node.getRightChild());
+
+        }
+    }
+
+    /**
+     * 中序
+     *
+     * @param node
+     */
+    public void inOrder(Node node) {
+        if (node != null) {
+            inOrder(node.getLeftChild());
+            System.out.println(node.getId() + "--");
+            inOrder(node.getRightChild());
+
+        }
+    }
+
+    /**
+     * 后序
+     *
+     * @param node
+     */
+    public void postOrder(Node node) {
+        if (node != null) {
+            postOrder(node.getLeftChild());
+            postOrder(node.getRightChild());
+            System.out.println(node.getId() + "---");
+        }
+    }
+
+    private class Node {
+        private int id;
+        private Object data;
+        private Node leftChild;
+        private Node rightChild;
+
+
+        public Node(int id, Object data) {
+            this.id = id;
+            this.data = data;
+        }
+
+        public Object getData() {
+            return data;
+        }
+
+        public void setData(Object data) {
+            this.data = data;
+        }
+
+        public Node getLeftChild() {
+            return leftChild;
+        }
+
+        public void setLeftChild(Node leftChild) {
+            this.leftChild = leftChild;
+        }
+
+        public Node getRightChild() {
+            return rightChild;
+        }
+
+        public void setRightChild(Node rightChild) {
+            this.rightChild = rightChild;
+        }
+
+        public int getId() {
+            return id;
+        }
+
+        public void setId(int id) {
+            this.id = id;
+        }
+
+        @Override
+        public String toString() {
+
+            return "id= " + id + " , data= " + data;
+        }
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/Iterator.java b/group03/58555264/src/main/java/com/circle/collection/Iterator.java
new file mode 100644
index 0000000000..52616dfc27
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/Iterator.java
@@ -0,0 +1,11 @@
+package com.circle.collection;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ * Iterator对外暴露2个接口，隐藏了具体实现（数组or链表）
+ */
+public interface Iterator {
+    boolean hasNext();
+
+    Object next();
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/LinkedList.java b/group03/58555264/src/main/java/com/circle/collection/LinkedList.java
new file mode 100644
index 0000000000..328414aa88
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/LinkedList.java
@@ -0,0 +1,218 @@
+package com.circle.collection;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class LinkedList implements List{
+    java.util.LinkedList list;
+
+    private Node first = null;
+
+    private int currentIndex = -1;//主要用于统计链表长度
+
+    //注意Node是静态内部类
+    private static class Node {
+
+        Object data;
+        Node nextNode;
+
+        public Node(Object obj) {
+            this.data = obj;
+        }
+
+        public Node getNextNode() {
+            return nextNode;
+        }
+
+        public void setNextNode(Node nextNode) {
+            this.nextNode = nextNode;
+        }
+
+        @Override
+        public String toString() {
+            return "data= " + data;
+        }
+    }
+
+    /**
+     * 插入
+     *
+     * @param o
+     */
+    public void add(Object o) {
+        //1:生成一个Node
+        Node newNode = new Node(o);
+        Node currentNode = first;
+        //2:插入Node
+        if (currentNode == null) {
+            first = newNode;
+        } else {
+            while (currentNode.getNextNode() != null) {
+                currentNode = currentNode.getNextNode();
+            }
+            currentNode.setNextNode(newNode);
+
+        }
+        currentIndex++;
+    }
+
+    /**
+     * 在指定位置插入节点
+     *
+     * @param index
+     * @param o
+     */
+    public void add(int index, Object o) {
+
+        Node newNode = new Node(o);
+
+        if (index < 0 || index > currentIndex + 1) {
+            throw new RuntimeException("索引不正确");
+        }
+
+        Node currentNode = first;
+        Node previousNode = currentNode;
+        int pos = 0;
+        while (currentNode != null && pos != index) {
+            previousNode = currentNode;
+            currentNode = currentNode.getNextNode();
+            pos++;
+        }
+
+        previousNode.setNextNode(newNode);
+        newNode.setNextNode(currentNode);
+        currentIndex++;
+
+    }
+
+    public Object get(int index) {
+
+        rangeCheck(index);
+        Node node = first;
+        int pos = 0;
+
+        while (node != null && pos != index) {
+
+            node = node.getNextNode();
+            pos++;
+        }
+        return node;
+    }
+
+    private void rangeCheck(int index) {
+        if (index < 0 || index > currentIndex) {
+            throw new RuntimeException("索引不正确");
+        }
+    }
+
+    public Object remove(int index) {
+
+        //1:获取要删除的节点
+        rangeCheck(index);
+        Node currentNode = first;
+
+
+        if (index == 0) {
+
+            currentNode = first;
+            first = first.getNextNode();
+        }else{
+            Node previousNode = first;
+            int pos = 0;
+            while (currentNode != null && pos != index) {
+                previousNode = currentNode;
+                currentNode = currentNode.getNextNode();
+                pos++;
+            }
+
+            //2:执行删除操作
+            previousNode.setNextNode(currentNode.getNextNode());
+        }
+
+        currentIndex--;
+
+        return currentNode;
+    }
+
+    public int size() {
+        return currentIndex + 1;
+    }
+
+    public void addFirst(Object o) {
+        Node newNode = new Node(o);
+        if (first == null) {
+            first = newNode;
+        } else {
+            newNode.setNextNode(first);
+            first = newNode;
+        }
+        currentIndex++;
+    }
+
+    public void addLast(Object o) {
+
+        Node newNode = new Node(o);
+        Node currentNode = first;
+        if (currentNode == null) {
+            first=newNode;
+        } else {
+            while (currentNode.getNextNode() != null) {
+                currentNode = currentNode.getNextNode();
+            }
+            currentNode.setNextNode(newNode);
+
+        }
+        currentIndex++;
+
+    }
+
+    public Object removeFirst() {
+
+        Node node = first;
+        if (first == null) {
+            throw new RuntimeException("链表长度为0，不能执行这步操作");
+        } else {
+            first = first.getNextNode();
+        }
+        currentIndex--;
+        return node;
+    }
+
+    public Object removeLast() {
+        Node currentNode = first;
+        Node previousNode = currentNode;
+        if (currentNode == null) {
+            throw new RuntimeException("链表长度为0，不能执行这步操作");
+        } else {
+            while (currentNode.getNextNode() != null) {
+                previousNode = currentNode;
+                currentNode = currentNode.getNextNode();
+            }
+            previousNode.setNextNode(null);
+
+        }
+        currentIndex--;
+        return currentNode;
+    }
+
+    public Iterator iterator() {
+        return new Iterator() {
+            int pos = -1;
+
+            public boolean hasNext() {
+                if (pos + 1 <= currentIndex) {
+                    return true;
+                }
+                return false;
+            }
+
+            public Object next() {
+                if (hasNext()) {
+                    pos++;
+                    return get(pos);
+                }
+                return null;
+            }
+        };
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/List.java b/group03/58555264/src/main/java/com/circle/collection/List.java
new file mode 100644
index 0000000000..3c15767b48
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/List.java
@@ -0,0 +1,17 @@
+package com.circle.collection;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public interface List {
+    void add(Object o);
+
+    void add(int index, Object o);
+
+    Object get(int index);
+
+    Object remove(int index);
+
+    int size();
+
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/Queue.java b/group03/58555264/src/main/java/com/circle/collection/Queue.java
new file mode 100644
index 0000000000..6e67a1c524
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/Queue.java
@@ -0,0 +1,25 @@
+package com.circle.collection;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class Queue {
+    private LinkedList elementData = new LinkedList();
+
+    public void enQueue(Object o) {
+
+        elementData.addLast(o);
+    }
+
+    public Object deQueue() {
+        return elementData.removeFirst();
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() <= 0;
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/collection/Stack.java b/group03/58555264/src/main/java/com/circle/collection/Stack.java
new file mode 100644
index 0000000000..d57bac0841
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/collection/Stack.java
@@ -0,0 +1,58 @@
+package com.circle.collection;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ * 自定义Stack，此Stack是基于ArrayList实现的
+ */
+public class Stack {
+
+    private ArrayList elementData = new ArrayList(4);
+
+    /**
+     * 入栈
+     *
+     * @param o
+     */
+    public void push(Object o) {
+
+        elementData.add(o);
+    }
+
+    /**
+     * 出栈
+     *
+     * @return
+     */
+    public Object pop() {
+        Object ret = null;
+        if (elementData.size() > 0) {
+            ret = elementData.remove(elementData.size() - 1);
+        }else{
+            throw new RuntimeException("栈中没有元素");
+        }
+        return ret;
+    }
+
+    /**
+     * 获取栈顶元素
+     *
+     * @return
+     */
+    public Object peek() {
+        Object ret = null;
+        if (elementData.size() > 0) {
+            ret = elementData.get(elementData.size() - 1);
+        } else {
+            throw new RuntimeException("栈中没有元素");
+        }
+        return ret;
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() <= 0;
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/struts/ActionEntity.java b/group03/58555264/src/main/java/com/circle/struts/ActionEntity.java
new file mode 100644
index 0000000000..8326e7c81a
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/struts/ActionEntity.java
@@ -0,0 +1,59 @@
+package com.circle.struts;
+
+import java.util.*;
+
+/**
+ * Created by keweiyang on 2017/3/2.
+ */
+class ActionEntity {
+
+    private String name;
+    private String className;
+
+    private Map<String, String> resultMap = new HashMap<>();
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Map<String, String> getResultMap() {
+        return resultMap;
+    }
+
+    public void setResultMap(Map<String, String> resultMap) {
+        this.resultMap = resultMap;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("name= ");
+        builder.append(this.name);
+        builder.append(" ,className= ");
+        builder.append(this.className);
+
+
+        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
+            builder.append(" , resultName= ");
+            builder.append(entry.getKey());
+            builder.append(" , jsp= ");
+            builder.append(entry.getValue());
+        }
+
+
+        return builder.toString();
+    }
+
+}
diff --git a/group03/58555264/src/main/java/com/circle/struts/LoginAction.java b/group03/58555264/src/main/java/com/circle/struts/LoginAction.java
new file mode 100644
index 0000000000..8fb042c28a
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/struts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.circle.struts;
+
+/**
+ * Created by keweiyang on 2017/3/5.
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/struts/Struts.java b/group03/58555264/src/main/java/com/circle/struts/Struts.java
new file mode 100644
index 0000000000..7424a9bb6a
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/struts/Struts.java
@@ -0,0 +1,233 @@
+package com.circle.struts;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by keweiyang on 2017/3/2.
+ */
+public class Struts {
+
+    private final static String D = "1234";
+
+    private List<ActionEntity> actionEntityList = new ArrayList<>();
+
+    private ActionEntity actionEntity = null;
+
+    /**
+     * @param actionName action方法名称 例如：LoginAction
+     * @param parameters 参数map,例如：name->liuxin,password->1234
+     * @param pathName   文件路径
+     * @return
+     */
+    public View runAction(String actionName, Map<String, String> parameters, String pathName) {
+        /**
+         * 0.读取配置文件struts.xml
+         *
+         * 1.根据actionName找到对应的class，例如LoginActon,通过反射实例化（创建对象），然后根据parameters中的数据，调用
+         * 对象的setter方法，例如parameters中的数据是（"name"="liuxin","password"="1234"）,那就调用setName和setPassword方法
+         *
+         * 2.通过反射调用对象的execute方法，并获得返回值，例如："success"
+         *
+         * 3. 通过反射找到对象的所有getter方法（例如getMessage）,通过反射调用，把值和属性形成一个HashMap,例如{"message":"登录成功"}，
+         * 放到View对象的parameters
+         *
+         * 4. 根据struts.xml中的<result>配置，以及execute的返回值，确定哪一个jsp，放到View对象的jsp对象中
+         *
+         */
+
+        try {
+            //1:读取struts.xml
+            this.getActionEntityList(pathName);
+            //2:获取对应的classpath
+            String classPath = initParameter(actionName, parameters);
+            //3:反射
+            View view = createClass(classPath, parameters);
+            return view;
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+    /**
+     * 将map中的key值修改为setxxx，并且获取classpath
+     *
+     * @param actionName
+     * @param mapParameters
+     * @return
+     */
+    private String initParameter(String actionName, Map<String, String> mapParameters) {
+        if (actionName == null || actionName.trim().length() == 0) {
+
+            throw new IllegalStateException("actionName为空");
+        }
+        if (mapParameters == null || mapParameters.size() == 0) {
+            throw new IllegalStateException("参数为空");
+        }
+
+        String classpath = "";
+        for (ActionEntity entity : this.actionEntityList) {
+            if (entity.getName().equals(actionName)) {
+                this.actionEntity = entity;
+                classpath = entity.getClassName();
+                break;
+
+            }
+        }
+
+
+        Map<String, String> map = new HashMap<>();
+        for (Map.Entry<String, String> entry : mapParameters.entrySet()) {
+            String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1);
+            map.put(methodName, entry.getValue());
+        }
+
+        mapParameters.clear();
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            mapParameters.put(entry.getKey(), entry.getValue());
+        }
+
+
+        return classpath;
+    }
+
+    private View createClass(String classpath, Map<String, String> mapParameters) throws Exception {
+        View view = null;
+        if (classpath.equals("")) {
+
+            throw new IllegalStateException("classPath为空");
+        }
+
+        Class<?> clazz = Class.forName(classpath);
+        Object obj = clazz.newInstance();
+        Method[] methods = clazz.getDeclaredMethods();
+        Field[] fields = clazz.getDeclaredFields();
+
+        //  先调用setter方法
+        for (Map.Entry<String, String> entry : mapParameters.entrySet()) {
+            Method method = clazz.getDeclaredMethod(entry.getKey(), String.class);
+            if (method != null) {
+                method.invoke(obj, entry.getValue());
+            }
+
+        }
+
+        // 再调用execute方法
+//        if (obj instanceof LoginAction) {
+        Method method = clazz.getDeclaredMethod("execute");
+        String ret = (String) method.invoke(obj, null);
+
+        Map<String, String> retMap = this.actionEntity.getResultMap();
+        for (Map.Entry<String, String> result : retMap.entrySet()) {
+            if (ret.equals(result.getKey())) {
+                Map<String, String> map = new HashMap<>();
+                System.out.println(result.getValue());
+
+                this.showView(methods, fields, obj, clazz, map);
+                view = new View();
+                view.setJsp(result.getValue());
+                view.setParameters(map);
+                System.out.println(view.toString());
+                break;
+            }
+//            }
+
+        }
+        return view;
+    }
+
+    private void showView(Method[] methods, Field[] fields, Object object, Class<?> clazz, Map<String, String> map) throws Exception {
+
+
+        String[] ss = new String[fields.length];
+        Method[] ms = new Method[methods.length];
+        for (int i = 0; i < fields.length; i++) {
+            ss[i] = fields[i].getName();
+        }
+
+        for (int i = 0; i < ss.length; i++) {
+            String str = ss[i];
+            ss[i] = "get" + ss[i].substring(0, 1).toUpperCase() + ss[i].substring(1);
+
+
+            ms[i] = clazz.getDeclaredMethod(ss[i], null);
+            String returnType = (String) ms[i].invoke(object, null);
+            map.put(str, returnType);
+//            System.out.println(returnType.toString());
+        }
+
+
+    }
+
+    /**
+     * 读取指定路径
+     *
+     * @param pathName 文件路径
+     * @return
+     */
+    private List<ActionEntity> getActionEntityList(String pathName) {
+        //读取struts.xml配置文件
+        if (pathName == null || pathName.trim().length() == 0) {
+            throw new IllegalStateException("pathName为空");
+        }
+        Document document = XmlUtil.getDocument(pathName);
+        Map<String, String> resultMap = null;
+
+        if (document.hasChildNodes()) {
+            NodeList nodeList = document.getElementsByTagName("struts");
+            for (int i = 0; i < nodeList.getLength(); i++) {
+                Element rootEle = (Element) nodeList.item(i);
+
+                if (rootEle.hasChildNodes()) {
+                    NodeList childList = rootEle.getElementsByTagName("action");
+
+                    for (int j = 0; j < childList.getLength(); j++) {
+                        Element childEle = (Element) childList.item(j);
+                        ActionEntity actionEntity = new ActionEntity();
+
+                        String name = childEle.getAttribute("name");
+                        String className = childEle.getAttribute("class");
+                        actionEntity.setClassName(className);
+                        actionEntity.setName(name);
+
+                        if (childEle.hasChildNodes()) {
+                            NodeList grandSonList = childEle.getElementsByTagName("result");
+                            resultMap = new HashMap<>();
+                            for (int k = 0; k < grandSonList.getLength(); k++) {
+                                Element resultEle = (Element) grandSonList.item(k);
+                                String resultName = resultEle.getAttribute("name");
+                                String value = resultEle.getTextContent();
+                                resultMap.put(resultName, value);
+                            }
+                        }
+                        actionEntity.setResultMap(resultMap);
+
+                        actionEntityList.add(actionEntity);
+                    }
+                }
+            }
+        }
+        return actionEntityList;
+    }
+
+
+}
diff --git a/group03/58555264/src/main/java/com/circle/struts/View.java b/group03/58555264/src/main/java/com/circle/struts/View.java
new file mode 100644
index 0000000000..d1bf62c405
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/struts/View.java
@@ -0,0 +1,44 @@
+package com.circle.struts;
+
+import java.util.Map;
+
+/**
+ * Created by keweiyang on 2017/3/2.
+ */
+public class View {
+    private String jsp;
+    private Map<String, String> parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public void setJsp(String jsp) {
+        this.jsp = jsp;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public void setParameters(Map parameters) {
+        this.parameters = parameters;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("jsp= ");
+        builder.append(this.jsp);
+
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            builder.append(" , ");
+            builder.append(entry.getKey());
+            builder.append(" = ");
+            builder.append(entry.getValue());
+        }
+
+
+        return builder.toString();
+    }
+}
diff --git a/group03/58555264/src/main/java/com/circle/struts/XmlUtil.java b/group03/58555264/src/main/java/com/circle/struts/XmlUtil.java
new file mode 100644
index 0000000000..aeb43d5bb8
--- /dev/null
+++ b/group03/58555264/src/main/java/com/circle/struts/XmlUtil.java
@@ -0,0 +1,43 @@
+package com.circle.struts;
+
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+
+/**
+ * Created by keweiyang on 2017/3/5.
+ *  解析XML文件，向外提供Docuemnt对象
+ */
+public class XmlUtil {
+
+    private XmlUtil() {
+
+    }
+
+    public static Document getDocument(String fileName) {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        try {
+            DocumentBuilder builder = factory.newDocumentBuilder();
+
+            //读当前文件路径下的
+            Document doc = builder.parse(fileName);
+
+            //去掉document的空格
+            doc.normalize();
+            return doc;
+        } catch (ParserConfigurationException e) {
+            e.printStackTrace();
+        } catch (SAXException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
+
+
diff --git a/group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java b/group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java
new file mode 100644
index 0000000000..8df45c15b6
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java
@@ -0,0 +1,57 @@
+package com.circle.algorithm;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/3/5.
+ */
+public class ArrayUtilTest {
+
+    ArrayUtil util = new ArrayUtil();
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] origin = new int[]{7, 9, 30, 3, 4};
+        util.reverseArray(origin);
+        for (int i : origin) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int[]  origin = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        int[] newArray = util.removeZero(origin);
+        for (int i : newArray) {
+            System.out.println(i);
+
+        }
+
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        int[] newArray = util.fibonacci(15);
+        for (int i : newArray) {
+            System.out.println(i);
+        }
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int[] newArray = util.getPrimes(23);
+        for (int i : newArray) {
+            System.out.println(i);
+        }
+
+    }
+
+    @Test
+    public void join() throws Exception {
+        int[]  origin = new int[]{3,8,9};
+        System.out.println(util.join(origin, "-"));
+    }
+
+}
\ No newline at end of file
diff --git a/group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java b/group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java
new file mode 100644
index 0000000000..7a31fc5590
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java
@@ -0,0 +1,80 @@
+package com.circle.collection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class ArrayListTest {
+    private ArrayList list = null;
+
+//    @Test
+    public void add() throws Exception {
+        list = new ArrayList(3);
+        list.add(1);
+        list.add(2);
+        list.add(3);
+        //测试自动扩容
+        list.add(4);
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+
+//    @Test
+    public void add1() throws Exception {
+        list = new ArrayList(10);
+        list.add(1);
+        list.add(2);
+        list.add(3);
+        //测试自动扩容
+        list.add(4);
+        list.add(5, 5);
+        list.add(4, 6);
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+
+    }
+
+//    @Test
+    public void get() throws Exception {
+        list = new ArrayList(10);
+        list.add(1);
+        list.add(2);
+        list.add(3);
+
+        System.out.println(list.get(1));
+
+    }
+
+//    @Test
+    public void remove() throws Exception {
+        list = new ArrayList(10);
+        list.add(1);
+        list.add(2);
+        list.add(3);
+
+        System.out.println(list.remove(1));
+        System.out.println("------------>");
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+
+    @Test
+    public void size() throws Exception {
+        list = new ArrayList(10);
+        list.add(1);
+        list.add(2);
+        list.add(3);
+
+        System.out.println("size= "+list.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java b/group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java
new file mode 100644
index 0000000000..7db0f9dc96
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java
@@ -0,0 +1,74 @@
+package com.circle.collection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class BinaryTreeTest {
+
+    private BinaryTree tree;
+
+    @Test
+    public void get() throws Exception {
+        tree = new BinaryTree();
+        tree.insert(5, 5);
+        tree.insert(6, 6);
+        System.out.println(tree.get(5));
+
+    }
+
+    @Test
+    public void insert() throws Exception {
+        tree = new BinaryTree();
+        tree.insert(5, 5);
+        tree.insert(6, 6);
+
+    }
+
+    @Test
+    public void preOrder() throws Exception {
+        tree = new BinaryTree();
+        tree.insert(5, 5);
+        tree.insert(6, 6);
+        tree.preOrder(tree.get(5));
+
+    }
+
+    @Test
+    public void inOrder() throws Exception {
+        tree = new BinaryTree();
+        tree.insert(5, 5);
+        tree.insert(6, 6);
+        tree.insert(4, 4);
+        tree.inOrder(tree.get(5));
+    }
+
+    @Test
+    public void postOrder() throws Exception {
+        tree = new BinaryTree();
+        tree.insert(5, 5);
+        tree.insert(6, 6);
+        tree.insert(4, 4);
+        tree.postOrder(tree.get(5));
+    }
+
+    @Test
+    public void delete() throws Exception {
+        tree = new BinaryTree();
+        tree.insert(7, 7);
+        tree.insert(5, 5);
+        tree.insert(10, 10);
+        tree.insert(2, 2);
+        tree.insert(6, 6);
+        tree.insert(11, 11);
+        tree.insert(13, 13);
+        tree.inOrder(tree.get(7));
+
+       tree.delete(10);
+        tree.inOrder(tree.get(7));
+
+    }
+}
\ No newline at end of file
diff --git a/group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java b/group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java
new file mode 100644
index 0000000000..05d99641c1
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java
@@ -0,0 +1,160 @@
+package com.circle.collection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class LinkedListTest {
+    private LinkedList list = null;
+
+//    @Test
+    public void add() throws Exception {
+
+        list = new LinkedList();
+
+        list.add(1);
+        list.add(2);
+
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+    }
+
+    @Test
+    public void add1() throws Exception {
+        list = new LinkedList();
+        list.add(1);
+        list.add(2);
+        list.add(1, 3);
+
+        list.add(3, 4);
+        //索引不正确情况
+        list.add(6,6);
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+
+    }
+
+    @Test
+    public void get() throws Exception {
+        list = new LinkedList();
+        list.add(1);
+        list.add(2);
+
+        System.out.println(list.get(0));
+        System.out.println(list.get(1));
+
+    }
+
+    @Test
+    public void remove() throws Exception {
+        list = new LinkedList();
+        list.add(1);
+        list.add(2);
+        list.remove(1);
+
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+
+
+    }
+
+    @Test
+    public void size() throws Exception {
+        list = new LinkedList();
+        list.add(1);
+        list.add(2);
+        System.out.println("size= "+ list.size());
+    }
+
+    @Test
+    public void addFirst() throws Exception {
+        list = new LinkedList();
+        list.add(1);
+        list.add(2);
+        list.addFirst("123");
+
+
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+
+        list.remove(0);
+        System.out.println("---------------");;
+        it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+    }
+
+    @Test
+    public void addLast() throws Exception {
+        list = new LinkedList();
+        list.addFirst(1);
+        list.addLast(2);
+        list.add(3);
+        list.addLast(4);
+        list.addFirst(0);
+
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+
+        }
+
+    }
+
+    @Test
+    public void removeFirst() throws Exception {
+
+        list = new LinkedList();
+        list.addFirst(1);
+        list.addLast(2);
+        list.add(3);
+        list.addLast(4);
+        list.addFirst(0);
+        list.removeFirst();
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+
+
+
+    @Test
+    public void removeLast() throws Exception {
+        list = new LinkedList();
+        list.addFirst(1);
+        list.addLast(2);
+        list.add(3);
+        list.addLast(4);
+        list.addFirst(0);
+        list.removeLast();
+        list.removeLast();
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+
+    @Test
+    public void iterator() throws Exception {
+
+    }
+
+}
\ No newline at end of file
diff --git a/group03/58555264/src/test/java/com/circle/collection/QueueTest.java b/group03/58555264/src/test/java/com/circle/collection/QueueTest.java
new file mode 100644
index 0000000000..6c35605e18
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/collection/QueueTest.java
@@ -0,0 +1,49 @@
+package com.circle.collection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class QueueTest {
+
+    private Queue queue = null;
+
+    @Test
+    public void enQueue() throws Exception {
+        queue = new Queue();
+        queue.enQueue(1);
+        queue.enQueue(2);
+        queue.enQueue(4);
+        System.out.println(queue.deQueue());
+    }
+
+    @Test
+    public void deQueue() throws Exception {
+
+        queue = new Queue();
+        queue.enQueue(1);
+        queue.enQueue(2);
+        System.out.println(queue.deQueue());
+    }
+
+    @Test
+    public void isEmpty() throws Exception {
+        queue = new Queue();
+//        queue.enQueue(1);
+//        queue.enQueue(2);
+        System.out.println(queue.isEmpty());
+    }
+
+    @Test
+    public void size() throws Exception {
+
+        queue = new Queue();
+        queue.enQueue(1);
+        queue.enQueue(2);
+        System.out.println(queue.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group03/58555264/src/test/java/com/circle/collection/StackTest.java b/group03/58555264/src/test/java/com/circle/collection/StackTest.java
new file mode 100644
index 0000000000..6ec7a3c4ca
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/collection/StackTest.java
@@ -0,0 +1,63 @@
+package com.circle.collection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/2/25.
+ */
+public class StackTest {
+    private Stack stack = null;
+
+
+    @Test
+    public void push() throws Exception {
+        stack = new Stack();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+        System.out.println(stack.pop());
+    }
+
+    @Test
+    public void pop() throws Exception {
+        stack = new Stack();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+        stack.pop();
+        System.out.println(stack.pop());
+    }
+
+    @Test
+    public void peek() throws Exception {
+
+        stack = new Stack();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+        System.out.println(stack.peek());
+
+    }
+
+    @Test
+    public void isEmpty() throws Exception {
+
+        stack = new Stack();
+        System.out.println(stack.isEmpty());
+
+    }
+
+    @Test
+    public void size() throws Exception {
+
+        stack = new Stack();
+        stack.push(1);
+        System.out.println(stack.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group03/58555264/src/test/java/com/circle/struts/StrutsTest.java b/group03/58555264/src/test/java/com/circle/struts/StrutsTest.java
new file mode 100644
index 0000000000..d5dcb972cd
--- /dev/null
+++ b/group03/58555264/src/test/java/com/circle/struts/StrutsTest.java
@@ -0,0 +1,51 @@
+package com.circle.struts;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by keweiyang on 2017/3/5.
+ */
+public class StrutsTest {
+    Map<String, String> map = null;
+    Struts struts = null;
+    String pathName = null;
+    String actionName = null;
+
+
+
+    @Test
+    public void runAction() throws Exception {
+        map = new HashMap<>();
+        struts = new Struts();
+        map.put("name", "test");
+        map.put("password", "1234");
+        actionName = "login";
+        pathName = "src/main/resources/struts.xml";
+
+        View view = struts.runAction(actionName, map, pathName);
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLoginActionFailed() throws Exception {
+        map = new HashMap<>();
+        struts = new Struts();
+        map.put("name", "test");
+        map.put("password", "12345");
+        actionName = "login";
+        pathName = "src/main/resources/struts.xml";
+
+        View view = struts.runAction(actionName, map, pathName);
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+
+}
\ No newline at end of file
diff --git a/group03/617187912/Learning02/.classpath b/group03/617187912/Learning02/.classpath
index fceb4801b5..07c9acc328 100644
--- a/group03/617187912/Learning02/.classpath
+++ b/group03/617187912/Learning02/.classpath
@@ -2,5 +2,11 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="C:/Users/Feaskm/GitHub/dom4j-1.6.1.jar" sourcepath="C:/Users/Feaskm/GitHub/dom4j-1.6.1.zip">
+		<attributes>
+			<attribute name="source_encoding" value="UTF-8"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..28f7f0ccc0
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,197 @@
+package com.coderising.array;
+
+import java.awt.Dialog.ModalExclusionType;
+import java.awt.Dimension;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.TreeSet;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin) {
+		int length = origin.length;
+		int[] nArr = new int[length];
+		for (int i = 0; i < length; i++) {
+			nArr[i] = origin[length - i - 1];
+		}
+		return nArr;
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		int[] newArray = new int[oldArray.length];
+		int size = 0;
+		for (int i : oldArray) {
+			if (i != 0) {
+				newArray[size] = i;
+				size++;
+			}
+		}
+		return Arrays.copyOf(newArray, size);
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+		Set<Integer> set = new TreeSet<Integer>();
+		for (int i = 0; i < array1.length; i++) {
+			set.add(array1[i]);
+		}
+		for (int i = 0; i < array2.length; i++) {
+			set.add(array2[i]);
+		}
+		int[] newArray = new int[set.size()];
+		int j = 0;
+		for (Integer i : set) {
+			newArray[j++] = i;
+		}
+		return newArray;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+		if (max <= 1) {
+			return null;
+		}
+		int[] arrFib = new int[max / 2 + 2];
+		int current = 0;
+		int temp = 1;
+		int pre = 1;
+		int next = 2;
+		arrFib[current++] = 1;
+		arrFib[current++] = 1;
+		do {
+			arrFib[current++] = next;
+			temp = pre;
+			pre = next;
+			next = next + temp;
+		} while (next <= max);
+		return Arrays.copyOf(arrFib, current);
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		if (max < 2) {
+			return null;
+		}
+		int[] arrPrimes = new int[max];
+		int current = 0;
+		arrPrimes[current++] = 2;
+		Boolean isPrime = true;
+		for (int i = 3; i < max; i++) {
+			isPrime = true;
+			for (Integer j : arrPrimes) {
+				if (j == 0) {
+					break;
+				}
+				if (i % j == 0) {
+					isPrime = false;
+					break;
+				}
+			}
+			if (isPrime == true) {
+				arrPrimes[current++] = i;
+			}
+		}
+		System.out.println(current);
+		return Arrays.copyOf(arrPrimes, current);
+
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) {
+		if (max < 6) {
+			return null;
+		}
+		int[] arrPerNums = new int[max / 6 + 1];
+		int current = 0;
+		arrPerNums[current++] = 6;
+		for (int i = 7; i < max; i++) {
+			int sum = 1;
+			for (int j = 2; j < i / 2+1; j++) {
+				if (i % j == 0) {
+					sum += j;
+				}
+			}
+			if (sum == i) {
+				arrPerNums[current++] = i;
+			}
+		}
+		return Arrays.copyOf(arrPerNums, current);
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			sb.append("-");
+			sb.append(array[i]);
+		}
+		return sb.toString().substring(1);
+	}
+
+}
diff --git a/group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..64a7bf9553
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,85 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+			int[] a = { 7, 9, 30, 3 };
+			int[] b = ArrayUtil.reverseArray(a);
+			int[] c = ArrayUtil.reverseArray(b);
+			assertArrayEquals(a, c);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		 int[] arrOld={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		 int[] arrTarget={1,3,4,5,6,6,5,4,7,6,7,5};
+		 int[] arrResult =ArrayUtil.removeZero(arrOld);
+		 assertArrayEquals(arrTarget,arrResult);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] arrTarget = {3,4,5,6,7,8};
+		int[] arrResult = ArrayUtil.merge(a1, a2);
+		assertArrayEquals(arrTarget, arrResult);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] arrOld = {2,3,6};
+		int[] arrTarget = {2,3,6,0,0,0};
+		int[] arrResult = ArrayUtil.grow(arrOld, 3);
+		assertArrayEquals(arrTarget, arrResult);
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 1;
+		assertNull(ArrayUtil.fibonacci(max));
+		max =15;
+		int[] arrTarget = {1,1,2,3,5,8,13};
+		int[] arrResult = ArrayUtil.fibonacci(max);
+		assertArrayEquals(arrTarget,arrResult);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max = 1;
+		assertNull(ArrayUtil.getPrimes(max));
+		max =23;
+		int[] arrTarget = {2,3,5,7,11,13,17,19};
+		int[] arrResult = ArrayUtil.getPrimes(max);
+		assertArrayEquals(arrTarget,arrResult);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max = 5;
+		assertNull(ArrayUtil.getPerfectNumbers(max));
+		max =8129;
+		int[] arrTarget = {6,28,496,8128};
+		int[] arrResult = ArrayUtil.getPerfectNumbers(max);
+		assertArrayEquals(arrTarget,arrResult);
+	}
+
+	@Test
+	public void testJoin() {
+		int[] arrOld ={3,8,9};
+		String target = "3-8-9";
+		String result = ArrayUtil.join(arrOld, "-");
+		assertEquals(target, result);
+	}
+
+}
diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java b/group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java b/group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..175bb2ecad
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,119 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters)
+			throws ClassNotFoundException, DocumentException, InstantiationException, IllegalAccessException,
+			NoSuchMethodException, InvocationTargetException {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+		String[] methodNames = createSetMethodNames(parameters);
+		Struts.class.getResourceAsStream("/struts.xml");
+		Element element = getTargetElement(actionName);
+		String className = element.attribute(1).getValue();
+		Class clz = Class.forName(className);
+		Object obj = clz.newInstance();
+		invokeObjectSetter(parameters, methodNames, clz, obj);
+		View view = new View();
+		view.setParameters(createGetterMap(clz, obj));
+		setViewJsp(view, element, clz, obj);
+		return view;
+	}
+
+	private static String[] createSetMethodNames(Map<String, String> parameters) {
+		String[] methodNames = new String[parameters.size()];
+		int i = 0;
+		for (String key : parameters.keySet()) {
+			methodNames[i++] = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
+		}
+		return methodNames;
+	}
+
+	private static void setViewJsp(View view, Element element, Class clz, Object obj)
+			throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+		view.setJsp(getJsp(element, executeToGetResult(clz, obj)));
+	}
+
+	private static Map createGetterMap(Class clz, Object obj) throws IllegalAccessException, InvocationTargetException {
+		Map map = new HashMap();
+		Method[] methods = clz.getMethods();
+		for (Method item : methods) {
+			if (item.getName().contains("get")) {
+				String key = item.getName().substring(3).toLowerCase();
+				Object value = item.invoke(obj);
+				map.put(key, value);
+			}
+		}
+		return map;
+	}
+
+	private static String executeToGetResult(Class clz, Object obj)
+			throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+		Method method = clz.getMethod("execute");
+		String result = (String) method.invoke(obj);
+		return result;
+	}
+
+	private static void invokeObjectSetter(Map<String, String> parameters, 
+			String[] methodNames, Class clz, Object obj)
+			throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+		for (String key : methodNames) {
+			Method method = clz.getMethod(key, String.class);
+			method.invoke(obj, parameters.get(key));
+		}
+	}
+
+	private static Element getTargetElement(String actionName) throws DocumentException {
+		SAXReader reader = new SAXReader();
+		InputStream inputStream =Struts.class.getResourceAsStream("/struts.xml");
+		Document document = reader.read(inputStream);
+		Element rootNode = document.getRootElement();
+		List<Element> elements = rootNode.elements();
+		for (Element item : elements) {
+			if (actionName.equals(item.attribute(0).getValue())) {
+				return item;
+			}
+		}
+		return null;
+	}
+
+	private static String getJsp(Element element, String result) {
+		List<Element> elements = element.elements();
+		for (Element e : elements) {
+			if (result.equals(e.attribute(0).getValue())) {
+				return e.getTextTrim();
+			}
+		}
+		return null;
+	}
+}
diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java b/group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..66dc565ed3
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,49 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws ClassNotFoundException,
+	InstantiationException, IllegalAccessException, NoSuchMethodException, 
+	InvocationTargetException, DocumentException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws ClassNotFoundException, 
+	InstantiationException, IllegalAccessException, NoSuchMethodException, 
+	InvocationTargetException, DocumentException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/View.java b/group03/617187912/Learning02/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml b/group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group03/619224754/.classpath b/group03/619224754/.classpath
index 373dce4005..310c94b783 100644
--- a/group03/619224754/.classpath
+++ b/group03/619224754/.classpath
@@ -3,5 +3,7 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar" sourcepath="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="lib/jaxen-1.1-beta-7.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group03/619224754/src/com/coderising/array/ArrayUtil.java b/group03/619224754/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..a3f51130f9
--- /dev/null
+++ b/group03/619224754/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,202 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+import com.coding.basic.ArrayList;
+import com.coding.basic.Iterator;
+
+public class ArrayUtil {
+
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û� ���磺 a = [7, 9 , 30, 3] , �û���Ϊ [3, 30, 9,7] ��� a =
+	 * [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int[] copy = Arrays.copyOf(origin, origin.length);
+		for (int i = 0; i < copy.length; i++) {
+			origin[i] = copy[origin.length - i];
+		}
+	}
+
+	/**
+	 * ���������µ�һ�����飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ�� {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		ArrayList list = new ArrayList();
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				list.add(oldArray[i]);
+			}
+		}
+
+		int[] newArray = new int[list.size()];
+		Iterator it = list.iterator();
+		for (int i = 0; i < newArray.length; i++) {
+			newArray[i] = Integer.parseInt(list.get(i).toString());
+		}
+
+		return null;
+	}
+
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 , ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ������� ���� a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] �� a3 Ϊ[3,4,5,6,7,8] , ע�⣺ �Ѿ��������ظ�
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		ArrayList list = new ArrayList();
+		int i = 0, j = 0;
+
+		while (i < array1.length && j < array2.length) {
+			if (array1[i] < array2[j]) {
+				list.add(array1[i]);
+				i++;
+			} else {
+				list.add(array1[j]);
+				j++;
+			}
+		}
+
+		if (i < array1.length) {
+			for (; i < array1.length; i++) {
+				list.add(array1[i]);
+			}
+		} else {
+			for (; j < array2.length; j++) {
+				list.add(array2[i]);
+			}
+		}
+
+		int[] mergedArr = new int[list.size()];
+		for (int m = 0; m < list.size(); m++) {
+			mergedArr[m] = Integer.parseInt(list.get(m).toString());
+		}
+
+		return null;
+	}
+
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ���� ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		for (int i = oldArray.length - 1; i < newArray.length - 1; i++) {
+			newArray[i] = 0;
+		}
+
+		return newArray;
+	}
+
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21...... ������һ�����ֵ�� ����С�ڸ�ֵ������ ���磬 max = 15 ,
+	 * �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13] max = 1, �򷵻ؿ����� []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if(max == 1) {
+			return new int[0];
+		}
+		
+		int a = 1;
+		int b = 1;
+		ArrayList list = new ArrayList();
+		list.add(a);
+		list.add(b);
+		int i = 2;
+		while (a < 15) {
+			int next = Integer.parseInt(list.get(i - 1).toString())
+					+ Integer.parseInt(list.get(i - 2).toString());
+			list.add(next);
+			i++;
+		}
+		
+		int[] arrInt = new int[list.size()];
+		for(int j = 0; j < list.size(); j++) {
+			arrInt[j] = Integer.parseInt(list.get(j).toString());
+		}
+		
+		return arrInt;
+	}
+
+	/**
+	 * ����С�ڸ������ֵmax�������������� ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		ArrayList list = new ArrayList();
+		for(int i = 0; i < max; i++) {
+			if(isPrime(i)) {
+				list.add(i);
+			}
+		}
+		
+		
+		return null;
+	}
+	
+	   
+    private static boolean isPrime(int n) {  
+        if (n <= 1) {  
+            return false;  
+        }  
+        int k = (int) Math.sqrt(n);  
+        for (int i = 2; i <= k; i++) {  
+            if(n % i == 0) {  
+                return false;  
+            }  
+        }  
+        return true;  
+    }  
+
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3 ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		return null;
+	}
+
+	/**
+	 * ��seperator ������ array���������� ����array= [3,8,9], seperator = "-" �򷵻�ֵΪ"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		String retString = "";
+		for (int i = 0; i < array.length; i++) {
+			retString += seperator + array[i];
+		}
+
+		retString = retString.substring(1);
+
+		return retString;
+	}
+
+}
\ No newline at end of file
diff --git a/group03/619224754/src/com/coderising/litestruts/LoginAction.java b/group03/619224754/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..43674ac7c8
--- /dev/null
+++ b/group03/619224754/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group03/619224754/src/com/coderising/litestruts/LogoutAction.java b/group03/619224754/src/com/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..5afc869c1c
--- /dev/null
+++ b/group03/619224754/src/com/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,5 @@
+package com.coderising.litestruts;
+
+public class LogoutAction {
+
+}
diff --git a/group03/619224754/src/com/coderising/litestruts/Struts.java b/group03/619224754/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..378fa96871
--- /dev/null
+++ b/group03/619224754/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,88 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	public static View runAction(String actionName,
+			Map<String, String> parameters) throws Exception {
+		View view = new View();
+		// InputStream inputStream = new FileInputStream(new
+		// File("D:/git/coding2017/group03/619224754/src/com/coderising/litestruts/struts.xml"));
+		SAXReader saxReader = new SAXReader();
+		Document document = saxReader
+				.read(new File(
+						"D:/git/coding2017/group03/619224754/src/com/coderising/litestruts/struts.xml"));
+
+		Element rootElement = document.getRootElement();
+		List<Node> lstAction = rootElement.selectNodes("action");
+		Iterator it = lstAction.iterator();
+		while (it.hasNext()) {
+			Element actionElement = (Element) it.next();
+			String name = actionElement.attributeValue("name");
+			if (name.equals(actionName)) {
+				String actionClass = actionElement.attributeValue("class");
+				Class classType = Class.forName(actionClass);
+				Object obj = classType.newInstance();
+				for (String key : parameters.keySet()) {
+					String value = parameters.get(key);
+					String strMethod = getFiledSetMethod(key);
+					Method setMethod = classType.getMethod(strMethod, String.class);
+					setMethod.invoke(obj, value);
+				}
+				Method excuteMethod = classType.getMethod("execute");
+				Object retValue = excuteMethod.invoke(obj);
+				Node resultNode = actionElement
+						.selectSingleNode("result[@name='" + retValue.toString() + "']");
+				view.setJsp(resultNode.getText());
+				Map<String, String> result = new HashMap<String, String> ();
+				
+				Method msessageMethod = classType.getMethod("getMessage");
+				Object message = msessageMethod.invoke(obj);
+				result.put("message", message.toString());
+				view.setParameters(result);
+			}
+		}
+
+		/*
+		 * 
+		 * 0. ��ȡ�����ļ�struts.xml
+		 * 
+		 * 1. ����actionName�ҵ����Ӧ��class �� ����LoginAction, ͨ������ʵ��������������
+		 * ��parameters�е����ݣ����ö����setter������ ����parameters�е������� ("name"="test" ,
+		 * "password"="1234") , �Ǿ�Ӧ�õ��� setName��setPassword����
+		 * 
+		 * 2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+		 * 
+		 * 3. ͨ�������ҵ����������getter���������� getMessage��, ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ����
+		 * {"message": "��¼�ɹ�"} , �ŵ�View�����parameters
+		 * 
+		 * 4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ�� ȷ����һ��jsp��
+		 * �ŵ�View�����jsp�ֶ��С�
+		 */
+
+		return view;
+	}
+
+	public static String getFiledSetMethod(String filedName) {
+		String methodName = "";
+		methodName = "set" + filedName.toUpperCase().substring(0, 1)
+				+ filedName.substring(1);
+		return methodName;
+	}
+}
\ No newline at end of file
diff --git a/group03/619224754/src/com/coderising/litestruts/StrutsTest.java b/group03/619224754/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..319168afbd
--- /dev/null
+++ b/group03/619224754/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+import com.coderising.litestruts.View;
+
+
+
+
+public class StrutsTest {
+
+//	@Test
+//	public void testLoginActionSuccess() throws Exception {
+//		
+//		String actionName = "login";
+//        
+//		Map<String,String> params = new HashMap<String,String>();
+//        params.put("name","test");
+//        params.put("password","1234");
+//        
+//        
+//        View view  = Struts.runAction(actionName,params);        
+//        
+//        Assert.assertEquals("/jsp/homepage.jsp",  view.getJsp());
+//        Assert.assertEquals("login successful", view.getParameters().get("message"));
+//	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //�����Ԥ��Ĳ�һ��
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
\ No newline at end of file
diff --git a/group03/619224754/src/com/coderising/litestruts/View.java b/group03/619224754/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f68a8c438b
--- /dev/null
+++ b/group03/619224754/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/group03/619224754/src/com/coderising/litestruts/struts.xml b/group03/619224754/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group03/619224754/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group03/619224754/src/test/BinaryTreeNodeTest.java b/group03/619224754/src/test/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..24d76fa271
--- /dev/null
+++ b/group03/619224754/src/test/BinaryTreeNodeTest.java
@@ -0,0 +1,25 @@
+package test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.coding.basic.BinaryTreeNode;
+
+public class BinaryTreeNodeTest {
+
+	@Test
+	public void test() {
+		BinaryTreeNode rootNode = new BinaryTreeNode();
+		rootNode.setData(6); 
+		rootNode.insert(5);
+		rootNode.insert(9);
+		rootNode.insert(7);
+		
+		Assert.assertEquals("Shoule be the same", 5, rootNode.getLeft().getData());
+		Assert.assertEquals("Shoule be the same", 9, rootNode.getRight().getData());
+		Assert.assertEquals("Shoule be the same", 7, rootNode.getRight().getLeft().getData());
+	}
+
+}
diff --git a/group03/619224754/src/test/LinkedListTest.java b/group03/619224754/src/test/LinkedListTest.java
new file mode 100644
index 0000000000..30727bbc1c
--- /dev/null
+++ b/group03/619224754/src/test/LinkedListTest.java
@@ -0,0 +1,103 @@
+package test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.LinkedList;
+
+public class LinkedListTest {
+
+	private LinkedList list = new LinkedList();
+	
+	@Test
+	public void testAddObject() {
+		list.add(1);
+		list.add(2);
+		Assert.assertEquals("Test", 1, list.get(0));
+		Assert.assertEquals("Test", 2, list.get(1));
+	}
+
+	@Test
+	public void testAddIntObject() {
+		list.add(1);
+		list.add(2);
+		list.add(1, 2);
+		list.add(1, 4);
+		Assert.assertEquals("Test", 4, list.get(1));
+		Assert.assertEquals("Test", 2, list.get(2));
+	}
+
+	@Test
+	public void testGet() {
+		list.add(1);
+		list.add(2);
+		Assert.assertEquals("Test", 1, list.get(0));
+		Assert.assertEquals("Test", 2, list.get(1));
+	}
+
+	@Test
+	public void testRemove() {
+		list.add(1);
+		list.add(2);
+		list.remove(0);
+		Assert.assertEquals("Test", 2, list.get(0));
+	}
+
+	@Test
+	public void testSize() {
+		list.add(1);
+		list.add(2);
+		list.remove(0);
+		Assert.assertEquals("Test", 1, list.size());
+	}
+
+	@Test
+	public void testAddFirst() {
+		list.add(1);
+		list.add(2);
+		list.addFirst(3);
+		Assert.assertEquals("Test", 3, list.get(0));
+	}
+
+	@Test
+	public void testAddLast() {
+		list.add(1);
+		list.add(2);
+		list.addLast(3);
+		Assert.assertEquals("Test", 3, list.get(2));
+	}
+
+	@Test
+	public void testRemoveFirst() {
+		list.add(1);
+		list.add(2);
+		list.removeFirst();
+		Assert.assertEquals("Test", 2, list.get(0));
+	}
+
+	@Test
+	public void testRemoveLast() {
+		list.add(1);
+		list.add(2);
+		list.removeLast();
+		Assert.assertEquals("Test", 1, list.size());
+	}
+
+	@Test
+	public void testIterator() {
+		int i = 0;
+		for (i = 0; i < 3; i++) {
+			list.add(i);
+		}
+		
+		Iterator iterator = list.iterator();
+		i = 0;
+		while(iterator.hasNext()) {
+			Assert.assertEquals("Shoule be the same", i, iterator.next());
+		}
+	}
+
+}
diff --git a/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java b/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java
index a529faef7b..0af37b9d4e 100644
--- a/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java
+++ b/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java
@@ -56,11 +56,28 @@ public int size(){
 		return size;
 	}
 	
+	public boolean contains(Object o){
+		for (int i = 0; i < elementData.length; i++) {
+			if(elementData[i] == o){
+				return true;
+			}
+		}
+		return false;
+	}
+	
 	public Iterator iterator(){
 		return null;
 //		return new ListIterator();
 	}
 	
+	public int[] listToArray(ArrayList arrayList){
+		int[] newArray = new int[arrayList.size()];
+		for (int k = 0; k < newArray.length; k++) {
+			newArray[k] = (int)arrayList.get(k);
+		}
+		return newArray;
+	}
+	
 	/*private class ListIterator implements Iterator{
 		private int index = 0;
 		
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java b/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java
new file mode 100644
index 0000000000..63b2fb0866
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java
@@ -0,0 +1,223 @@
+package com.ace.homework2;
+
+import java.util.Arrays;
+
+import com.ace.coding.ArrayList;
+
+public class ArrayUtil {
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+        for(int i = 0; i < origin.length/2; i++){
+            int temp = origin[i];
+            origin[i] = origin[origin.length - 1 - i];
+            origin[origin.length - 1 - i] = temp;
+        }
+
+    }
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int newLength = 0;
+		for(int i:oldArray){
+			if(i != 0){
+				newLength++;
+			}
+		}
+		int[] newArray = new int[newLength];
+		int newArrayIndex = 0;
+		for(int j = 0; j < oldArray.length; j++){
+			if(oldArray[j] != 0){
+				newArray[newArrayIndex] = oldArray[j];
+				newArrayIndex++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		ArrayList arrayList = new ArrayList();
+		for (int i = 0; i < array1.length; i++) {
+			arrayList.add(array1[i]);
+		}
+		for (int j = 0; j < array2.length; j++) {
+			if(!arrayList.contains(array2[j])){
+				arrayList.add(array2[j]);
+			}
+		}
+		int[] newArray = new int[arrayList.size()];
+		for (int k = 0; k < newArray.length; k++) {
+			newArray[k] = (int)arrayList.get(k);
+		}
+		Arrays.sort(newArray);
+		return newArray;
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int newLength = oldArray.length + size;
+		int[] newArray = new int[newLength];
+		for(int i = 0; i < newLength; i++){
+			if(i < oldArray.length){
+				newArray[i] = oldArray[i];
+			} else {
+				newArray[i] = 0;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��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 num = 1;
+		ArrayList arrayList = new ArrayList();
+		while(getFibonacci(num) < max){
+			arrayList.add(getFibonacci(num));
+			num++;
+		}
+		int[] newArray = toArray(arrayList);
+		return newArray;
+	}
+	
+	private int getFibonacci(int num){
+		if(num == 1){
+			return 1;
+		} else if(num == 2){
+			return 1;
+		} else {
+			return getFibonacci(num-1) + getFibonacci(num-2);
+		}
+	}
+	
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		ArrayList arrayList = new ArrayList();
+		arrayList.add(2);
+		for(int i = 3; i <= max; i++){
+			int temp = (int)Math.sqrt(i)+1;
+			for(int j = 2; j <= temp; j++){
+				if(i % j ==0){
+					break;
+				}
+				if(j == temp){
+					arrayList.add(i);
+				}
+			}
+		}
+		int[] newArray = toArray(arrayList);
+		return newArray;
+	}
+	
+	
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		ArrayList arrayList = new ArrayList();
+		for (int i = 2; i <= max; i++) {
+			if(getPerfectNumber(i)){
+				arrayList.add(i);
+			}
+		}
+		int[] newArray = toArray(arrayList);
+		return newArray;
+	}
+	
+	public boolean getPerfectNumber(int num){
+		ArrayList arrayList = new ArrayList();
+		for(int i = 1; i <= num/2 ; i++){
+			if(num % i == 0){
+				arrayList.add(i);
+			}
+		}
+		int sum = 0;
+		for(int j = 0; j < arrayList.size(); j++){
+			sum = sum + (int)arrayList.get(j);
+		}
+		return sum == num;
+	}
+	
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder stringBuilder = new StringBuilder();
+		for(int i = 0; i < array.length; i++){
+			if(i<array.length - 1){
+				stringBuilder.append(array[i]+seperator);
+			} else {
+				stringBuilder.append(array[i]);
+			}
+		}
+		return stringBuilder.toString();
+	}
+	
+	public void printArray(int[] origin){
+		for (int i = 0; i < origin.length; i++) {
+            if(i < origin.length - 1){
+                System.out.print(origin[i] + ", ");
+            } else {
+                System.out.println(origin[i]);
+            }
+        }
+	}
+	
+	private int[] toArray(ArrayList arrayList){
+		int[] newArray = new int[arrayList.size()];
+		for (int i = 0; i < newArray.length; i++) {
+			newArray[i] = (int)arrayList.get(i);
+		}
+		return newArray;
+		
+	}
+
+}
\ No newline at end of file
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtilTest.java b/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtilTest.java
new file mode 100644
index 0000000000..d248e61647
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtilTest.java
@@ -0,0 +1,29 @@
+package com.ace.homework2;
+
+
+public class ArrayUtilTest {
+	public static void main(String[] args) {
+		ArrayUtil util = new ArrayUtil();
+//		int[] arr = {7, 9 , 30, 3};
+//		util.reverseArray(arr);
+//		util.printArray(arr);
+		
+//		int arr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+//		util.printArray(util.removeZero(arr));
+		
+//		int[] arr1 = {3, 5, 7,8};
+//		int[] arr2 = {4, 5, 6,7};
+//		util.printArray(util.merge(arr1, arr2));
+		
+//		int[] arr = {2,3,6};
+//		util.printArray(util.grow(arr, 3));
+		
+//		util.printArray(util.fibonacci(15));
+		
+//		util.printArray(util.getPrimes(23));
+		
+//		util.printArray(util.getPerfectNumbers(100));
+		
+//		System.out.println(util.join(new int[]{1,5,3}, "-="));
+	}
+}
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/LoginAction.java b/group03/664269713/DataStructure/src/com/ace/homework2/LoginAction.java
new file mode 100644
index 0000000000..b6798b8067
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/LoginAction.java
@@ -0,0 +1,34 @@
+package com.ace.homework2;
+
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/Struts.java b/group03/664269713/DataStructure/src/com/ace/homework2/Struts.java
new file mode 100644
index 0000000000..175ce8a10c
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/Struts.java
@@ -0,0 +1,208 @@
+package com.ace.homework2;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+	/*
+	 * 0. ��ȡ�����ļ�struts.xml
+	 * 
+	 * 1. ����actionName�ҵ����Ӧ��class �� ����LoginAction, ͨ������ʵ��������������
+	 * ��parameters�е����ݣ����ö����setter������ ����parameters�е������� ("name"="test" ,
+	 * "password"="1234") , �Ǿ�Ӧ�õ��� setName��setPassword����
+	 * 
+	 * 2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+	 * 
+	 * 3. ͨ�������ҵ����������getter���������� getMessage��, ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ����
+	 * {"message": "��¼�ɹ�"} , �ŵ�View�����parameters
+	 * 
+	 * 4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ�� ȷ����һ��jsp�� �ŵ�View�����jsp�ֶ��С�
+	 */
+	private static final String STRUTS_XML = "struts.xml";
+	private static final String NAME = "name";
+	private static final String CLASS = "class";
+	private static final String EXECUTE = "execute";
+	private static final String GET = "get";
+	private static final String SET = "set";
+
+	private static List<StrutsObj> getStrutsList() {
+		List<StrutsObj> strutsObjList = new ArrayList<StrutsObj>();
+		URL path = Struts.class.getResource(STRUTS_XML);
+		File f = new File(path.getFile());
+		SAXReader saxReader = new SAXReader();
+		try {
+			Document document = saxReader.read(f);
+			Element strutsNode = document.getRootElement();
+			Iterator actionIterator = strutsNode.elementIterator();
+			while (actionIterator.hasNext()) {
+				Element actionNode = (Element) actionIterator.next();
+				StrutsObj strutsObj = new StrutsObj();
+				strutsObj.setName(actionNode.attributeValue(NAME));
+				strutsObj.setClassName(actionNode.attributeValue(CLASS));
+
+				Iterator resultIterator = actionNode.elementIterator();
+				Map<String, String> map = new HashMap<String, String>();
+				while (resultIterator.hasNext()) {
+					Element resultNode = (Element) resultIterator.next();
+					map.put(resultNode.attributeValue(NAME), resultNode.getStringValue());
+				}
+				strutsObj.setMap(map);
+				strutsObjList.add(strutsObj);
+			}
+		} catch (DocumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return strutsObjList;
+	};
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+		List<StrutsObj> lists = getStrutsList();
+		View view = new View();
+		for (int i = 0; i < lists.size(); i++) {
+			StrutsObj strutsObj = lists.get(i);
+
+			if (actionName.equals(strutsObj.getName())) {
+
+				try {
+					Class clazz = Class.forName(lists.get(i).getClassName());
+					Object obj = clazz.newInstance();
+					for (Map.Entry<String, String> entry : parameters.entrySet()) {
+						String methodName = SET + entry.getKey().substring(0, 1).toUpperCase()
+								+ entry.getKey().substring(1);
+						clazz.getMethod(methodName, String.class).invoke(obj, entry.getValue());
+					}
+
+					String status = (String) clazz.getMethod(EXECUTE).invoke(obj);
+					Map<String, String> strutsMap = strutsObj.getMap();
+					for (Map.Entry<String, String> entry : strutsMap.entrySet()) {
+						if (entry.getKey().equals(status)) {
+							view.setJsp(entry.getValue());
+							break;
+						}
+					}
+
+					Map<String, String> map = new HashMap<String, String>();
+					Method[] methods = clazz.getDeclaredMethods();
+					for (Method method : methods) {
+						if (method.getName().startsWith(GET)) {
+							String tempString = method.getName().substring(3);
+							String resultkey = tempString.substring(0, 1).toLowerCase() + tempString.substring(1);
+							String resultValue = (String) method.invoke(obj);
+							map.put(resultkey, resultValue);
+							break;
+						}
+
+					}
+					view.setParameters(map);
+				} catch (ClassNotFoundException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IllegalAccessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IllegalArgumentException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (NoSuchMethodException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (SecurityException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (InstantiationException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+		return view;
+	}
+	/*URL path = Struts.class.getResource(STRUTS_XML);
+	File f = new File(path.getFile());
+	SAXReader saxReader = new SAXReader();
+	View view = new View();
+	try {
+        Document document = saxReader.read(f);
+        Element strutsNode = document.getRootElement();
+        Iterator actionIterator = strutsNode.elementIterator();
+        while(actionIterator.hasNext()){
+        	Element actionNode = (Element)actionIterator.next();
+        	
+        	if(actionName.equals(actionNode.attributeValue("name"))){
+        		String className = actionNode.attributeValue("class");
+	    		Class clazz = Class.forName(className);
+	    		LoginAction loginAction = (LoginAction) clazz.newInstance();
+		    	for(Map.Entry<String, String> entry:parameters.entrySet()){
+		    		String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1);
+		    		clazz.getMethod(methodName, String.class).invoke(loginAction, entry.getValue());
+		    	}
+		    	
+		    	String status = (String) clazz.getMethod("execute").invoke(loginAction);
+		    	
+		    	Map<String,String> map = new HashMap<String,String>();
+		    	
+		    	Method[] methods = clazz.getDeclaredMethods();
+		    	for(Method method: methods){
+		    		if(method.getName().startsWith("get")){
+		    			String tempString = method.getName().substring(3);
+		    			String resultkey = tempString.substring(0, 1).toLowerCase() + tempString.substring(1);
+		    			String resultValue = (String)method.invoke(loginAction);
+		    			map.put(resultkey, resultValue);
+		    		}
+		    		
+		    	}
+		    	
+		    	view.setParameters(map);
+		    	Iterator resultIterator = actionNode.elementIterator();
+	        	while(resultIterator.hasNext()){
+	        		Element resultNode = (Element) resultIterator.next();
+	        		if(status.equals(resultNode.attributeValue("name"))){
+	        			view.setJsp(resultNode.getStringValue());
+	        			return view;
+	        		}
+	        	}
+        	} 
+        }
+    } catch (DocumentException e) {
+        System.out.println(e.getMessage());
+    } catch (ClassNotFoundException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	} catch (IllegalAccessException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	} catch (IllegalArgumentException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	} catch (InvocationTargetException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	} catch (NoSuchMethodException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	} catch (SecurityException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	} catch (InstantiationException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	}*/
+
+}
\ No newline at end of file
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java b/group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java
new file mode 100644
index 0000000000..f1db3ed2f8
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java
@@ -0,0 +1,29 @@
+package com.ace.homework2;
+
+import java.util.Map;
+
+public class StrutsObj {
+	private String name;
+	private String className;
+	private Map<String, String> map;
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getClassName() {
+		return className;
+	}
+	public void setClassName(String className) {
+		this.className = className;
+	}
+	public Map<String, String> getMap() {
+		return map;
+	}
+	public void setMap(Map<String, String> map) {
+		this.map = map;
+	}
+
+}
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/View.java b/group03/664269713/DataStructure/src/com/ace/homework2/View.java
new file mode 100644
index 0000000000..33304451d1
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/View.java
@@ -0,0 +1,23 @@
+package com.ace.homework2;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/struts.xml b/group03/664269713/DataStructure/src/com/ace/homework2/struts.xml
new file mode 100644
index 0000000000..7f4ca75bb3
--- /dev/null
+++ b/group03/664269713/DataStructure/src/com/ace/homework2/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.ace.homework2.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group03/894844916/coding2017-02/pom.xml b/group03/894844916/coding2017-02/pom.xml
new file mode 100644
index 0000000000..48498ad304
--- /dev/null
+++ b/group03/894844916/coding2017-02/pom.xml
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>nusubmarine</groupId>
+  <artifactId>coding2017-02</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>coding2017-02</name>
+  <url>http://maven.apache.org</url>
+  
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<junit.version>4.7</junit.version>
+		<dom4j.version>1.6.1</dom4j.version>
+	</properties>
+
+  <dependencies>
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>${dom4j.version}</version>
+		</dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${junit.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  
+  <build>
+  	<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<configuration>
+						<source>1.8</source>
+						<target>1.8</target>
+					</configuration>
+				</plugin>
+  	</plugins>
+  </build>
+</project>
diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java
new file mode 100644
index 0000000000..7e5c0356be
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java
@@ -0,0 +1,256 @@
+/**
+ * 
+ */
+package com.coderising.array;
+
+/**
+ * @author patchouli
+ *
+ */
+public class ArrayUntil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int size = origin.length;
+		if (size == 0 || size == 1) {
+			return;
+		}
+		int temp = 0;
+		for (int i = 0; i < size / 2; i++) {
+			temp = origin[i];
+			origin[i] = origin[size - 1 - i];
+			origin[size - 1 - i] = temp;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int size = oldArray.length;
+		if (size == 0) {
+			return new int[0];
+		}
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				size--;
+			}
+		}
+		if (size == 0) {
+			return new int[0];
+		}
+		int[] noZero = new int[size];
+		for (int i = 0, j = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				noZero[j] = oldArray[i];
+				j++;
+			}
+		}
+		return noZero;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3,5,7,8] a2 = [4,5,6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		if (array1.length == 0) {
+			return array2;
+		}
+		if (array2.length == 0) {
+			return array1;
+		}
+		int size = array1.length + array2.length;
+		int[] merged = new int[size];
+		int i=0,j=0,k=0;
+		while (i<array1.length&&j<array2.length) {
+			if (array1[i]<array2[j]) {
+				merged[k]=array1[i];
+				i++;
+			}
+			else if (array1[i]>array2[j]) {
+				merged[k]=array2[j];
+				j++;
+			}
+			else {
+				merged[k]=array1[i];
+				i++;
+				j++;
+			}
+			k++;
+		}
+		if (i==array1.length-1) {
+			System.arraycopy(array2, j, merged, k, array2.length-j);
+			k=k+array2.length-j;
+		}
+		if (i==array2.length-1) {
+			System.arraycopy(array1, i, merged, k, array1.length-i);
+			k=k+array1.length-i;
+		}
+		size = k;
+		int[] newArray = new int[size];
+		System.arraycopy(merged, 0, newArray, 0, size);
+		return newArray;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max == 1) {
+			return new int[0];
+		}
+		int[] fib = { 1, 1 };
+		int size = 2;
+		int capacity = 2;
+		int i = 1;
+		while (fib[i] < max) {
+			if (size == capacity) {
+				fib = grow(fib, capacity);
+				capacity = fib.length;
+			}
+			fib[i + 1] = fib[i - 1] + fib[i];
+			i++;
+			size++;
+		}
+		int[] newFib = new int[size-1];
+		System.arraycopy(fib, 0, newFib, 0, size-1);
+		return newFib;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		if (max < 2) {
+			return new int[0];
+		}
+		int[] primes = new int[] { 2 };
+		if (max ==3) {
+			return primes;
+		}
+		int size = 1;
+		int capacity = 1;
+		int number = 3;
+		boolean prime = true;
+		while (primes[size - 1] < max) {
+			for (int i = 2; i < number; i++) {
+				if (number % i == 0) {
+					prime = false;
+					break;
+				}
+			}
+			if (prime == true) {
+				if (size == capacity) {
+					primes = grow(primes, capacity);
+					capacity = primes.length;
+				}
+				primes[size] = number;
+				size++;
+			}
+			number++;
+			prime = true;
+		}
+		int[] newPrimes = new int[size - 1];
+		System.arraycopy(primes, 0, newPrimes, 0, size-1);
+		return newPrimes;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		int number = 2;
+		int size = 0;
+		int capacity = 10;
+		int[] perfectNumbers = new int[capacity];
+		while (number < max) {
+			int capa = 10;
+			int i = 0;
+			int[] factor = new int[capa];
+			int sum = 0;
+			for (int j = 1; j <= number / 2; j++) {
+				if (number % j == 0) {
+					if (i == capa) {
+						factor = grow(factor, capa);
+						capa = factor.length;
+					}
+					factor[i] = j;
+					sum += j;
+					i++;
+				}
+			}
+			if (sum == number && number != max) {
+				if (size == capacity) {
+					perfectNumbers = grow(perfectNumbers, capacity);
+					capacity = perfectNumbers.length;
+				}
+				perfectNumbers[size] = number;
+				size++;
+			}
+			number++;
+		}
+		int[] newPerfactNumber = new int[size];
+		System.arraycopy(perfectNumbers, 0, newPerfactNumber, 0, size);
+		return newPerfactNumber;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuffer stringBuffer = new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			stringBuffer.append(array[i]);
+			if (i != array.length - 1) {
+				stringBuffer.append(seperator);
+			}
+		}
+		return stringBuffer.toString();
+	}
+}
diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..5f41f42c62
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}
diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..ab39929f2a
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,118 @@
+package com.coderising.litestruts;
+
+/**
+ * @author patchouli
+ */
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+	private static final String ELEMENT_ACTION = "action";
+	private static final String ELEMENT_RESULT = "result";
+
+	/*
+	 * 
+	 * 0. 读取配置文件struts.xml
+	 * 
+	 * 1. 根据actionName找到相对应的class ， 例如LoginAction,通过反射实例化（创建对象）
+	 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+	 * ("name"="test","password"="1234"), 那就应该调用 setName和setPassword方法
+	 * 
+	 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+	 * 
+	 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+	 * {"message":"登录成功"} , 放到View对象的parameters
+	 * 
+	 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。
+	 * 
+	 */
+	public static View runAction(String actionName, Map<String, String> parameters)
+			throws FileNotFoundException, URISyntaxException, DocumentException, ClassNotFoundException {
+		SAXReader reader = new SAXReader();
+		URL url = ClassLoader.getSystemResource("struts.xml");
+		File file = new File(url.toURI());
+		if (!file.exists()) {
+			throw new FileNotFoundException("struts.xml");
+		}
+		Document document = reader.read(file);
+		Element strutsElement = document.getRootElement();
+		Map<String, String> viewParameters = new HashMap<>();
+		String jsp = "";
+		String result = "";
+		for (Element actionElement : (List<Element>) strutsElement.elements(ELEMENT_ACTION)) {
+			String name = actionElement.attribute("name").getText();
+			if (name.equals(actionName)) {
+				String className = actionElement.attribute("class").getText();
+				Class cls = Class.forName(className);
+				Object actionObject = null;
+				try {
+					actionObject = cls.newInstance();
+				} catch (InstantiationException | IllegalAccessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				for (Map.Entry<String, String> entry : parameters.entrySet()) {
+
+					try {
+						String str = entry.getKey();
+						str = str.replace(str.substring(0, 1), str.substring(0, 1).toUpperCase());
+						Method method = cls.getDeclaredMethod("set" + str, String.class);
+						try {
+							method.invoke(actionObject, entry.getValue());
+						} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+							// TODO Auto-generated catch block
+							e.printStackTrace();
+						}
+					} catch (NoSuchMethodException | SecurityException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+				}
+				try {
+					Method method = cls.getDeclaredMethod("execute");
+					try {
+						result = (String) method.invoke(actionObject);
+						Method[] methods = cls.getDeclaredMethods();
+						for (int i = 0; i < methods.length; i++) {
+							String methodName = methods[i].getName();
+							if (methodName.startsWith("get")) {
+								String value = (String) methods[i].invoke(actionObject);
+								String key = methodName.substring(3);
+								key = key.replace(key.substring(0, 1), key.substring(0, 1).toLowerCase());
+								viewParameters.put(key, value);
+							}
+						}
+					} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+				} catch (NoSuchMethodException | SecurityException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				for (Element resultElement : (List<Element>) actionElement.elements(ELEMENT_RESULT)) {
+					String resultName = resultElement.attribute("name").getText();
+					if (resultName.equals(result)) {
+						jsp = resultElement.getText();
+					}
+				}
+			}
+		}
+		View view = new View();
+		view.setJsp(jsp);
+		view.setParameters(viewParameters);
+		return view;
+	}
+}
diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..be50f467ed
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,29 @@
+package com.coderising.litestruts;
+
+/**
+ * @author patchouli
+ */
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<String, String> parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map<String, String> getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map<String, String> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group03/894844916/coding2017-02/src/main/resources/struts.xml b/group03/894844916/coding2017-02/src/main/resources/struts.xml
new file mode 100644
index 0000000000..ff7623e6e1
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="com.coderising.litestruts.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+	<action name="logout" class="com.coderising.litestruts.LogoutAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java b/group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java
new file mode 100644
index 0000000000..46fd229487
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java
@@ -0,0 +1,124 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ArrayUntilTest {
+
+	ArrayUntil arrayUntil=new ArrayUntil();
+	
+	@Test
+	public void testReverseArray() {
+		int[] arr1={7,9,30,3};
+		int[] reArr1={3,30,9,7};
+		int[] arr2={7,9,30,3,4};
+		int[] reArr2={4,3,30,9,7};
+		
+		arrayUntil.reverseArray(arr1);
+		arrayUntil.reverseArray(arr2);
+		assertArrayEquals(reArr1,arr1);
+		assertArrayEquals(reArr2,arr2);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr1[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int newArr1[]={1,3,4,5,6,6,5,4,7,6,7,5};
+		int oldArr2[]={0,0,0,0,0,0};
+		int newArr2[]={};
+		
+		assertArrayEquals(newArr1, arrayUntil.removeZero(oldArr1));
+		assertArrayEquals(newArr2, arrayUntil.removeZero(oldArr2));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1={3,5,7,8};
+		int[] b1={4,5,6,7};
+		int[] c1={3,4,5,6,7,8};
+
+		int[] a2={};
+		int[] b2={4,5,6,7};
+		int[] c2={4,5,6,7};
+
+		int[] a3={3,5,7,8};
+		int[] b3={};
+		int[] c3={3,5,7,8};
+		
+		int[] a4={};
+		int[] b4={};
+		int[] c4={};
+		
+		assertArrayEquals(c1, arrayUntil.merge(a1, b1));
+		assertArrayEquals(c2, arrayUntil.merge(a2, b2));
+		assertArrayEquals(c3, arrayUntil.merge(a3, b3));
+		assertArrayEquals(c4, arrayUntil.merge(a4, b4));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray={2,3,6};
+		int[] newArray={2,3,6,0,0,0};
+		int size=3;
+		
+		assertArrayEquals(newArray, arrayUntil.grow(oldArray, size));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max1=1;
+		int max2=15;
+		int max3=21;
+		
+		int[] fib1={};
+		int[] fib2={1,1,2,3,5,8,13};
+		int[] fib3={1,1,2,3,5,8,13};
+		
+		assertArrayEquals(fib1, arrayUntil.fibonacci(max1));
+		assertArrayEquals(fib2, arrayUntil.fibonacci(max2));
+		assertArrayEquals(fib3, arrayUntil.fibonacci(max3));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max1=1;
+		int max2=3;
+		int max3=7;
+		int max4=23;
+		
+		int[] primes1={};
+		int[] primes2={2};
+		int[] primes3={2,3,5};
+		int[] primes4={2,3,5,7,11,13,17,19};
+		
+		assertArrayEquals(primes1, arrayUntil.getPrimes(max1));
+		assertArrayEquals(primes2, arrayUntil.getPrimes(max2));
+		assertArrayEquals(primes3, arrayUntil.getPrimes(max3));
+		assertArrayEquals(primes4, arrayUntil.getPrimes(max4));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max1=6;
+		int max2=28;
+		int max3=500;
+		int[] perfectNumbers1={};
+		int[] perfectNumbers2={6};
+		int[] perfectNumbers3={6,28,496};
+		
+		assertArrayEquals(perfectNumbers1, arrayUntil.getPerfectNumbers(max1));
+		assertArrayEquals(perfectNumbers2, arrayUntil.getPerfectNumbers(max2));
+		assertArrayEquals(perfectNumbers3, arrayUntil.getPerfectNumbers(max3));
+	}
+
+	@Test
+	public void testJoin() {
+		String seperator="-";
+		int[] arr={3,8,9};
+		String string="3-8-9";
+		
+		assertEquals(string,arrayUntil.join(arr, seperator));
+	}
+
+}
diff --git a/group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java b/group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..47e41f8f89
--- /dev/null
+++ b/group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,41 @@
+package com.coderising.litestruts;
+
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws FileNotFoundException, URISyntaxException, DocumentException, ClassNotFoundException {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "1234");
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+		Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws FileNotFoundException, URISyntaxException, DocumentException, ClassNotFoundException {
+		String actionName = "login";
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group04/1020483199/SecondHomeWork/.classpath b/group04/1020483199/SecondHomeWork/.classpath
new file mode 100644
index 0000000000..3e0fb272a8
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group04/1020483199/SecondHomeWork/.project b/group04/1020483199/SecondHomeWork/.project
new file mode 100644
index 0000000000..53ed6ead25
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>SecondHomeWork</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs b/group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..8000cd6ca6
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml b/group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml
new file mode 100644
index 0000000000..8038c576e8
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<struts>
+
+    <action name="login" class="com.basic.litestruts.LoginAction">
+
+        <result name="success">/jsp/homepage.jsp</result>
+
+        <result name="fail">/jsp/showLogin.jsp</result>
+
+    </action>
+
+    <action name="logout" class="com.coderising.action.LogoutAction">
+
+    	<result name= "success">/jsp/welcome.jsp</result>
+
+    	<result name= "error">/jsp/error.jsp</result>
+
+    </action>
+
+</struts>
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java b/group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java
new file mode 100644
index 0000000000..95a5871afb
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java
@@ -0,0 +1,282 @@
+package com.basic.coding;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ArrayUtil {
+	/**
+
+	 * ����һ����������a , �Ը������ֵ�����û�
+
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+
+	 * @param origin
+
+	 * @return
+
+	 */
+
+	public void reverseArray(int[] origin){
+		/**
+		 * ����С�ڵ���һ���������ԭ���ĳ���
+		 */
+		if(origin.length>1){
+			int Arrlength = (origin.length%2==0)?origin.length/2:(origin.length-1)/2;
+			for(int i = 0;i<Arrlength;i++){
+				int a = origin[i];
+				int b = origin[origin.length-1-i];
+				origin[i] = b;
+				origin[origin.length-1-i] = a;
+			}
+		}
+	}
+
+	
+
+	/**
+
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+		134566547675
+	 * @param oldArray
+
+	 * @return
+
+	 */
+
+	
+
+	public int[] removeZero(int[] oldArray){
+		int len = 0;
+		int[] temp = new int[oldArray.length];
+		for(int x: oldArray){
+			if(x!=0){
+				temp[len++] = x;
+			}
+		}
+		oldArray = new int[len];
+		for(int i = 0;i < len;i ++){
+			oldArray[i] = temp[i];
+		}
+		
+		return oldArray;
+	}
+
+	
+
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	public 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);
+		
+		Set<Integer> set = new HashSet<Integer>();
+		for(int x:newArray){
+			set.add(x);
+		}
+		/**
+		 * ��ʱset�Ѿ���һ�������ظ����ݵļ���
+		 */
+		//int[] noRepeat =  (int[])set.toArray(new int[set.size()]);
+		//Object[] array = set.toArray();
+		Integer[] array = set.toArray(new Integer[set.size()]);
+		Arrays.sort(array);
+		int[] sortArray=new int[array.length];
+		for(int i=0;i<array.length;i ++)
+		{
+			sortArray[i]=array[i].intValue();
+		}
+		return sortArray;
+	}
+		
+	/**
+
+	 * ��һ���Ѿ��������ݵ����� 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;
+	}
+
+	
+
+	/**
+
+	 * 쳲���������Ϊ��0,1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [0,1��1��2��3��5��8��13]
+
+	 * max = 1, �򷵻ؿ����� []
+
+	 * @param max
+
+	 * @return
+
+	 */
+
+	public int[] fibonacci(int max){
+		int index = 0;
+		if(max>1){
+			for(int i = 1;i<max;i++){
+				if(getFibo(i,0,1)>=max){
+					index = i-1;
+					break;
+				}
+			}
+			int[] newArray = new int[index];
+			for(int j = 0;j<index;j++){
+				newArray[j] = getFibo(j+1,0,1);
+			}
+			return newArray;
+			
+		}
+		return null;
+
+	}
+	public static int[] record = null;
+	/**
+	 * 
+	 * @param i
+	 * @param result1 Ĭ��Ϊ0
+	 * @param result2 Ĭ��Ϊ1
+	 * @return223 135   212 123
+	 */
+	private static int getFibo(int i,int result1,int result2) {
+		if (i<=1)
+			return result1;
+		else{
+			return getFibo(i-1,result2,result1+result2);
+		}
+    }
+
+	
+
+	/**
+
+	 * ����С�ڸ������ֵmax��������������
+
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+
+	 * @param max
+
+	 * @return
+
+	 */
+
+	public int[] getPrimes(int max){
+		int size = 0;
+		boolean flag = false;
+		int[] oldArray = new int[max];
+		for(int i=2;i<max;i++){
+			flag = true;
+			for(int j =2;j<i;j++){
+				if(i%j==0){
+					flag = false;
+					break;
+				}
+			}
+			if(flag){
+				oldArray[size++]=i;
+			}
+		}
+		int[] newArray = new int[size];
+		for(int k = 0;k<size;k++){
+			newArray[k] = oldArray[k];
+		}
+		return newArray;
+
+	}
+
+	
+
+	/**
+
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+
+	 * @param max
+
+	 * @return
+
+	 */
+
+	public int[] getPerfectNumbers(int max){
+		int size = 0;
+		
+		int[] oldArray = new int[max];
+		for(int i = 1;i < max ;i++){
+			int num = 0;
+			for(int j = 1;j < i;j++){
+				if(i%j==0){
+					num+=j;
+				}
+			}
+			if(num==i){
+				oldArray[size++] = i;
+			}
+		}
+		int[] newArray = new int[size];
+		//System.out.println(size);
+		for(int k=0;k<size;k++){
+			newArray[k] = oldArray[k];
+		}
+		return newArray;
+	}
+
+	
+
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+
+	public String join(int[] array, String seperator){
+		if(array!=null){
+			String str = "";
+			for(int i = 0;i<array.length;i++){
+				if(i!=array.length-1){
+					str += (array[i]+seperator);
+				}else{
+					str += array[i];
+				}
+			}
+			return str;
+		}
+		return null;
+	}
+}
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/LoginAction.java b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/LoginAction.java
new file mode 100644
index 0000000000..33620a8d33
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/LoginAction.java
@@ -0,0 +1,75 @@
+package com.basic.litestruts;
+
+
+/**
+
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+
+ * @author liuxin
+
+ *
+
+ */
+
+public class LoginAction{
+
+    private String name ;
+
+    private String password;
+
+    private String message;
+
+
+
+    public String getName() {
+
+        return name;
+
+    }
+
+
+
+    public String getPassword() {
+
+        return password;
+
+    }
+
+
+
+    public String execute(){
+
+            if("test".equals(name) && "1234".equals(password)){
+
+                this.message = "login successful";
+
+                return "success";
+
+            }
+
+            this.message = "login failed,please check your user/pwd";
+
+            return "fail";
+
+    }
+
+
+
+    public void setName(String name){
+        this.name = name;
+
+    }
+
+    public void setPassword(String password){
+
+        this.password = password;
+
+    }
+
+    public String getMessage(){
+
+        return this.message;
+
+    }
+
+}
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/Struts.java b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/Struts.java
new file mode 100644
index 0000000000..10ff0a23ac
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/Struts.java
@@ -0,0 +1,155 @@
+package com.basic.litestruts;
+
+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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class Struts {
+	  
+	   public static View runAction(String actionName, Map<String,String> parameters){
+	        /*
+			0. ��ȡ�����ļ�struts.xml
+	 		1. ����actionName�ҵ����Ӧ��class����LoginAction,ͨ������ʵ��������������
+			��parameters�е����ݣ����ö����setter������ ����parameters�е������� 
+			("name"="test","password"="1234"),     	
+			�Ǿ�Ӧ�õ��� setName��setPassword����
+			2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+			3. ͨ�������ҵ����������getter���������� getMessage��,  
+			ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ���� {"message":  "��¼�ɹ�"} ,  
+			�ŵ�View�����parameters
+			4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+			�ŵ�View�����jsp�ֶ��С�
+	        */
+		   	   View v = new View();//����һ��view�������ڶ���ķ���
+		       //1.����һ��DocumentBuilderFactory����
+		       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		       //2.����һ��DocumentBuilder����
+		       DocumentBuilder db = null;
+		       
+		       
+			try {
+				db = dbf.newDocumentBuilder();
+			} catch (ParserConfigurationException e) {
+				e.printStackTrace();
+			}
+		       //3.ͨ��documentBuilder�������xml�ļ�
+		       Document document = null;
+			try {
+				document = db.parse("src/com/basic/litestruts/struts.xml");
+			} catch (SAXException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		       
+		       NodeList nodeList = document.getElementsByTagName("action");
+		       //System.out.println(nodeList.getLength());
+		       
+		       for(int i = 0;i<nodeList.getLength();i++){
+		    	   
+		    	   Node item = nodeList.item(i);//��ȡÿһ��action�ڵ�
+		    	   NamedNodeMap attrs = item.getAttributes();//��ȡaction�ڵ��µ���������
+		    	   
+		    	   Node currentAction = item;//��ŵ�ǰresult�ڵ�
+		    	   
+		    	   if(attrs.getNamedItem("name").getNodeValue().equals(actionName)){
+	    	   			  String className = attrs.getNamedItem("class").getNodeValue();//���login��Ӧ����·��
+	    	   			  try {
+	    	   				  Class<?> fn = Class.forName(className);
+							  Object obj = fn.newInstance();//��������Ķ���
+							  Method methodSetName = fn.getMethod("setName", String.class);
+							  Method methodSetPwd = fn.getMethod("setPassword", String.class);
+							  for(Map.Entry<String, String> m :parameters.entrySet()){
+								  if(m.getKey().equals("name")){
+									methodSetName.invoke(obj, m.getValue());
+								  }
+								  if(m.getKey().equals("password")){
+									  methodSetPwd.invoke(obj, m.getValue());
+								  }
+							  }
+							  /**
+							   * ����excute��������success
+							   */
+							  Object returnValue = fn.getMethod("execute", null).invoke(obj, null);
+							  System.out.println(returnValue.toString());//��ӡ����ֵ
+							  /**
+							   * ͨ�������ҵ�����getter����
+							   */
+							  //�Ȼ����������
+							  Field[] fd = fn.getDeclaredFields();
+							  
+							  Map newMap = new HashMap();
+							  for(int m = 0;m<fd.length;m++){
+								  String fieldName = fd[m].getName();
+								  String methodName = "get"+init(fieldName);
+								  Method method = fn.getMethod(methodName, null);
+								  System.out.println(method);//��������ÿһ��getter����
+								  String invoke = (String)method.invoke(obj, null);
+								  newMap.put(fieldName, invoke);
+							  }
+							  v.setParameters(newMap);
+							  System.out.println(v.getParameters());
+							  //fn.getMethod("get"+, parameterTypes)
+							  /**
+							   * ����struts.xml�е� <result> ����,
+							   * �Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+								  �ŵ�View�����jsp�ֶ���
+							   */
+							  NodeList childNodes = currentAction.getChildNodes();
+							  for(int q = 0;q<childNodes.getLength();q++){
+								  NamedNodeMap attributes = childNodes.item(q).getAttributes();//ÿ���ӽڵ���������
+								  if(attributes!=null){//����result�ڵ������
+									 for(int e = 0;e<attributes.getLength();e++){
+										 if(attributes.item(e).getNodeValue().equals(returnValue)){
+											 v.setJsp(childNodes.item(q).getTextContent());//��view������success��Ӧ����������
+										 }
+									 }
+								  }
+							  }
+						} catch (ClassNotFoundException e) {
+							e.printStackTrace();
+						} catch (InstantiationException e) {
+							e.printStackTrace();
+						} catch (IllegalAccessException e) {
+							e.printStackTrace();
+						} catch (NoSuchMethodException e) {
+							e.printStackTrace();
+						} catch (SecurityException e) {
+							e.printStackTrace();
+						} catch (IllegalArgumentException e) {
+							e.printStackTrace();
+						} catch (InvocationTargetException e) {
+							e.printStackTrace();
+						}
+	    	   		  }
+		    	   }
+		       
+		    
+	    	return v;
+	    }    
+	   /**
+	    * ������ĸ��д���������getter�����ķ�����
+	    * @param name
+	    * @return
+	    */
+	   private static String init(String name){
+		   name = name.substring(0,1).toUpperCase()+name.substring(1);
+		   return name;
+	   }
+}
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/StrutsTest.java b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..c9896467fe
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/StrutsTest.java
@@ -0,0 +1,63 @@
+package com.basic.litestruts;
+
+import java.lang.reflect.Field;
+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<String,String> params = new HashMap<String,String>();
+
+        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<String,String> params = new HashMap<String,String>();
+
+        params.put("name","test");
+
+        params.put("password","123456"); //�����Ԥ��Ĳ�һ��
+
+        View view  = Struts.runAction(actionName,params);        
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+
+	}
+	
+	@Test
+	public void testAccessible() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
+		View v = new View();
+		System.out.println(v.getJsp());
+		Class<? extends View> class1 = v.getClass();
+		Field declaredField = class1.getDeclaredField("jsp");
+		declaredField.setAccessible(true);
+		declaredField.set(v, "fff");
+		System.out.println(v.getJsp());
+		
+		
+	}
+}
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java
new file mode 100644
index 0000000000..b32c28b1bb
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java
@@ -0,0 +1,37 @@
+package com.basic.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+
+	private Map parameters;
+
+	public String getJsp() {
+
+		return jsp;
+
+	}
+
+	public View setJsp(String jsp) {
+
+		this.jsp = jsp;
+
+		return this;
+
+	}
+
+	public Map getParameters() {
+
+		return parameters;
+
+	}
+
+	public View setParameters(Map parameters) {
+
+		this.parameters = parameters;
+
+		return this;
+
+	}
+}
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml
new file mode 100644
index 0000000000..8038c576e8
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<struts>
+
+    <action name="login" class="com.basic.litestruts.LoginAction">
+
+        <result name="success">/jsp/homepage.jsp</result>
+
+        <result name="fail">/jsp/showLogin.jsp</result>
+
+    </action>
+
+    <action name="logout" class="com.coderising.action.LogoutAction">
+
+    	<result name= "success">/jsp/welcome.jsp</result>
+
+    	<result name= "error">/jsp/error.jsp</result>
+
+    </action>
+
+</struts>
diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java b/group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java
new file mode 100644
index 0000000000..efd34b873b
--- /dev/null
+++ b/group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java
@@ -0,0 +1,95 @@
+package com.basic.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import com.basic.coding.ArrayUtil;
+
+public class JavaTest {
+
+	@Test
+	public void test() {
+		ArrayUtil ary = new ArrayUtil();
+		int[] origin = {1,2,3,4,5};
+		ary.reverseArray(origin);
+		for(int i=0;i<origin.length;i++){
+			System.out.println(origin[i]);
+		}
+	}
+	//{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+
+	@Test
+	public void test1() {
+		ArrayUtil ary = new ArrayUtil();
+		int[] origin = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] removeZero = ary.removeZero(origin);
+		for(int x:removeZero){
+			System.out.print(x);
+		}
+	}
+	
+	@Test
+	public void test2() {
+		ArrayUtil ary = new ArrayUtil();
+		int[] array1 = {3,5,7,8};
+		int[] array2 = {4,5,6,7};
+		int[] merge = ary.merge(array1, array2);
+		for(int x:merge){
+			System.out.print(x);
+		}
+	}
+	
+	@Test
+	public void test3(){
+		//[2,3,6]
+		ArrayUtil ary = new ArrayUtil();
+		int[] oldArray = {2,3,6};
+		int[] grow = ary.grow(oldArray, 3);
+		for(int x:grow){
+			System.out.print(x);
+		}
+	}
+	
+	@Test
+	public void test4(){
+		ArrayUtil ary = new ArrayUtil();
+		int[] fibonacci = ary.fibonacci(15);
+		for(int x:fibonacci){
+			System.out.println(x);
+		}
+	}
+	
+	/**
+	 * jion��������
+	 */
+	@Test
+	public void test5(){
+		ArrayUtil ary = new ArrayUtil();
+		int[] array = {3,8,9};
+		String seperator = "-";
+		String join = ary.join(array, seperator);
+		System.out.println(join);
+	}
+	
+	/**
+	 * getPerfectNumbers���Է���
+	 */
+	@Test
+	public void test6(){
+		ArrayUtil ary = new ArrayUtil();
+		int[] perfectNumbers = ary.getPerfectNumbers(7);
+		for(int x:perfectNumbers){
+			System.out.println(x);
+		}
+	}
+	
+	@Test
+	public void test7(){
+		ArrayUtil ary = new ArrayUtil();
+		int[] primes = ary.getPrimes(23);
+		for(int x : primes){
+			System.out.println(x);
+		}
+	}
+}
diff --git a/group04/1299310140/src/com/coderising/array/ArrayUtil.java b/group04/1299310140/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..bd7904c5fb
--- /dev/null
+++ b/group04/1299310140/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,276 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		int temp;
+		for(int i = 0;i < origin.length;i++){
+			if(i >= origin.length-1-i){
+				break;
+			}
+			temp = origin[i];
+			origin[i] = origin[origin.length-1-i];
+			origin[origin.length-1-i] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero(int[] oldArray){
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		for(int i = 0;i < oldArray.length;i++){
+			if(oldArray[i] != 0){
+				list.add(oldArray[i]);
+			}
+		}
+		int[] result = listToArray(list);
+		return result;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */	
+	public static int[] merge(int[] array1, int[] array2){//参数数组均有序且无重复值
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		int i = 0;//array1
+		int j = 0;//array2
+		while(i < array1.length && j < array2.length){
+			if(array1[i] == array2[j]){
+				list.add(array1[i]);
+				i++;
+				j++;
+			}else if(array1[i] < array2[j]){
+				list.add(array1[i]);
+				i++;
+			}else{//array1[i] > array2[j]
+				list.add(array2[j]);
+				j++;
+			}
+		}//while结束 
+		
+	    //此时(i == array1.length && j == array2.length)or
+		   //(i == array1.length && j < array2.length)or
+		   //(i < array1.length && j == array2.length)
+		while(i < array1.length){
+			list.add(array1[i]);
+			i++;
+		}
+		while(j < array2.length){
+			list.add(array2[j]);
+			j++;
+		}
+		
+		int[] result = listToArray(list);
+		return result;
+	}
+	
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		return Arrays.copyOf(oldArray, oldArray.length + size);
+//		int[] result = new int[oldArray.length + size];
+//		System.arraycopy(oldArray, 0, result, 0, oldArray.length);
+//		return result;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max < 2){//max=1 特殊
+			return new int[0];
+		}
+		int one = 1;
+		int two = 1;
+		int temp = 0;
+		int i = 2;
+		while(one + two < max){
+			temp = two;
+			two = one + two;
+			one = temp;
+			i++;
+		}
+		int[] result = new int[i];
+		result[0] = 1;
+		result[1] = 1;
+		for(int j = 2;j < result.length;j++){
+			result[j] = result[j-1] + result[j-2];
+		}
+		return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){//max:3 return:[2]
+		if(max <= 2){
+			return new int[0];
+		}
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		for(int i = 2;i < max;i++){
+			if(isPrimes(i)){
+				list.add(i);
+			}
+		}
+		int[] result = listToArray(list);
+		return result;
+	}
+	
+	/*
+	 * 判断一个数是不是质数
+	 */
+	public static Boolean isPrimes(int data){
+		if(data < 2){
+			return false;
+		}
+		for(int i = 2;i < data;i++){
+			if(data % i == 0){
+				return false;
+			}
+			if(i * i > data){
+				break;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		for(int i = 6;i < max;i++){
+			if(isPerfectNumber(i)){
+				list.add(i);
+			}
+		}
+		int[] result = listToArray(list);
+		return result;
+	}
+	
+	/*
+	 * ArrayList<Integer>  --->  int[]
+	 */
+	public static int[] listToArray(ArrayList<Integer> list){
+		int[] result = new int[list.size()];
+		for(int j = 0;j < result.length;j++){
+			result[j] = (int) list.get(j);
+		}
+		return result;
+	}
+	
+	/*
+	 * 判断一个数是不是完数
+	 */
+	public static Boolean isPerfectNumber(int data){
+		if(data < 6){
+			return false;
+		}
+		int sum = 1;
+		for(int i = 2;i < data;i++){
+			if(i * i > data){
+				break;
+			}
+			if(data % i == 0){
+				if(i == data/i){
+					sum = sum + i;
+				}else{
+					sum = sum + i + data/i;					
+				}
+//				sum = sum + i;
+				if(sum > data){
+					return false;
+				}
+			}
+		}//for
+		if(sum == data){
+			return true;
+		}else{//sum < data
+			return false;
+		}
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuffer result = new StringBuffer();
+		for(int i = 0;i < array.length;i++){
+			result.append(array[i]);
+			result.append(seperator);
+		}
+		
+		String res = result.toString();
+		if(array.length > 0){
+			res = res.substring(0, result.length()-seperator.length());//删除最后一个seperator
+		}
+		return res;
+	}
+	
+	/*
+	 * 数组转字符串 格式：[]or[1]or[1 2]
+	 */
+	public static String arrayToString(int[] array){
+		StringBuffer result = new StringBuffer();
+		result.append("[");
+		for(int i = 0;i < array.length;i++){
+			result.append(array[i]);
+			result.append(" ");
+		}
+		String res = result.toString();
+		if(array.length > 0){
+			res = res.substring(0, result.length()-1);//删除最后一个空格
+		}
+		res = res + "]";
+		return res;
+	}
+	
+	public static void main(String[] args){
+		System.out.println(new Date());
+		int[] a1 = getPerfectNumbers(2000000);
+		System.out.println(arrayToString(a1));
+		System.out.println(new Date());
+	}
+}
diff --git a/group04/1299310140/src/com/coderising/litestruts/Struts.java b/group04/1299310140/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..5544cf7fde
--- /dev/null
+++ b/group04/1299310140/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,180 @@
+package com.coderising.litestruts;
+
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	View view = new View();
+    	
+    	//0.读取配置文件struts.xml，根据actionName找到相对应的class ， 例如LoginAction，
+    	Document document = getDocument("src/com/coderising/litestruts/struts.xml");
+    	String className = getAttrValue(document,"/struts/action[@name=\""+actionName+"\"]/@class");
+//    	System.out.println(className);
+    	
+    	//1.通过反射实例化（创建对象）
+    	Class<?> cla = null;
+    	Object obj = null;
+    	Method executeMethod = null;
+    	try {
+			cla = Class.forName(className);
+			obj = cla.newInstance();
+			//获得该类的所有属性
+			Field[] fields = cla.getDeclaredFields();
+			
+			//2.根据parameters中的数据，调用对象的setter方法
+			for(Field field:fields){
+				if(parameters.get(field.getName()) == null){
+					continue;
+				}
+				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cla);
+				//获得set方法
+				Method myset = pd.getWriteMethod();
+				myset.invoke(obj, parameters.get(field.getName()));
+			}
+			
+			//3.通过反射调用对象的exectue 方法， 并获得返回值
+			executeMethod = cla.getDeclaredMethod("execute");
+			String executeReturn = (String) executeMethod.invoke(obj);
+			
+			//4.通过反射找到对象的所有getter方法，通过反射来调用， 把值和属性形成一个HashMap，放到View对象的parameters
+			Map<String,String> viewparameters = new HashMap<String,String>();
+			for(Field field:fields){
+				//获得get方法
+//				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cla);
+//				Method myget = pd.getReadMethod();
+//				Object getValue = myget.invoke(obj);
+//				System.out.println("field:"+field.getName()+"---getValue:"+getValue);
+				
+				//因为没有setMessage，所以换一种方式实现
+				Method myget = cla.getDeclaredMethod("get"+captureName(field.getName()));
+				Object getValue = myget.invoke(obj);
+				viewparameters.put(field.getName(), (String) getValue);
+//				System.out.println("field:"+field.getName()+"---getValue:"+getValue);
+			}
+			view.setParameters(viewparameters);
+			
+			//5.根据struts.xml中的 <result> 配置，以及execute的返回值，  确定哪一个jsp，放到View对象的jsp字段中。
+			String viewjsp = getTextValue(document,"/struts/action[@name=\""+actionName+"\"]/result[@name=\""+executeReturn+"\"]");
+			view.setJsp(viewjsp);
+			
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (IntrospectionException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+    	
+    	return view;
+    }
+    
+    /*
+     * 根据xml文件的路径获取其Document
+     */
+    public static Document getDocument(String file){
+    	SAXReader saxReader = new SAXReader();
+    	Document document = null;
+    	try {
+			document = saxReader.read(new File(file));
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+    	return document;
+    }
+    
+    /*
+     * 获取给定属性节点的值
+     */
+    public static String getAttrValue(Document doc,String attrNode){   	
+    	List<?> list = doc.selectNodes(attrNode);
+    	Iterator<?> iterator = list.iterator();
+    	if(iterator.hasNext()){
+    		Attribute attr = (Attribute) iterator.next();
+    		return attr.getValue();
+    	}
+    	
+    	//没有找到给定的属性节点则返回null
+    	return null;
+    }
+    
+    /*
+     * 获取给定xml节点的文本值
+     */
+    public static String getTextValue(Document doc,String node){   	
+	    List<?> list = doc.selectNodes(node);
+	    Iterator<?> iterator = list.iterator();
+	    if(iterator.hasNext()){
+	    	Element element = (Element) iterator.next();
+	    	return element.getText();
+	    }
+	    
+	    //没有找到给定的xml节点则返回null
+    	return null;
+    }
+    
+    //首字母大写
+    public static String captureName(String name) {
+//        name = name.substring(0, 1).toUpperCase() + name.substring(1);
+//        return  name;
+        char[] cs=name.toCharArray();
+        cs[0]-=32;
+        return String.valueOf(cs);
+    }
+    
+    public static void main(String[] args){
+        String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        runAction(actionName,params);
+    }
+
+}
diff --git a/group04/1796244932/learn01/pom.xml b/group04/1796244932/learn01/pom.xml
index 5a00c4d139..06c26f00c8 100644
--- a/group04/1796244932/learn01/pom.xml
+++ b/group04/1796244932/learn01/pom.xml
@@ -15,12 +15,23 @@
   </properties>
 
   <dependencies>
+
+    <dependency>
+      <groupId>dom4j</groupId>
+      <artifactId>dom4j</artifactId>
+      <version>1.6</version>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.11</version>
       <scope>test</scope>
     </dependency>
+      <dependency>
+          <groupId>org.junit.jupiter</groupId>
+          <artifactId>junit-jupiter-api</artifactId>
+          <version>RELEASE</version>
+      </dependency>
   </dependencies>
 
 
diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java
new file mode 100644
index 0000000000..f5f6535e17
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java
@@ -0,0 +1,194 @@
+package com.dudy.learn01.base;
+
+import java.util.*;
+
+public class MyArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		//
+		for (int i = 0; i < origin.length / 2; i++) {
+			int temp = origin[i];
+			origin[i] = origin[origin.length-1-i];
+			origin[origin.length-1-i] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		int count = 0;
+
+
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] == 0){
+				count++;
+			}
+		}
+
+		int resArray[]  = new int[oldArray.length - count];
+		int j = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] > 0){
+				resArray[j++] = oldArray[i];
+			}
+		}
+
+		return resArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+
+		Set set = new HashSet();
+
+		for (int i = 0;i<array1.length; i++){
+			set.add(array1[i]);
+		}
+
+		for (int i = 0;i<array2.length; i++){
+			set.add(array2[i]);
+		}
+
+		int resArray[] = new int[set.size()];
+		int j = 0;
+		for (Iterator it= set.iterator();it.hasNext();){
+			resArray[j++] = (int)it.next();
+		}
+
+		return resArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 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[] dest = new int[oldArray.length + size];
+
+		System.arraycopy(oldArray,0,dest,0,oldArray.length);
+		return dest;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static Integer[] fibonacci(int max){
+	    if(max == 1){
+	        return  new Integer[0];
+        }
+
+        List<Integer> restList = new ArrayList();
+	    restList.add(1);
+	    restList.add(1);
+
+        while ((restList.get(restList.size() -2 ) + restList.get(restList.size() -1) )< max){
+            restList.add(restList.get(restList.size() -2) + restList.get(restList.size() -1) );
+        }
+
+		return restList.toArray(new Integer[]{});
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static Integer[] getPrimes(int max){
+
+	    List<Integer> list = new ArrayList<>();
+
+	    for (int i = 1; i< max;i++){
+	        if (isPrime(i)){
+	            list.add(i);
+            }
+        }
+		return list.toArray(new Integer[]{});
+	}
+
+    private static boolean isPrime(int num) {
+
+	    boolean flag = true;
+	    for (int i = 2; i< num ;i++){
+	        if(num % i == 0){
+	            flag = false;
+            }
+        }
+
+        return  flag;
+
+    }
+
+    /**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static Integer[] getPerfectNumbers(int max){
+
+	    List<Integer> list = new ArrayList();
+	    for (int i = 1; i< max; i++){
+	        int tmp = 0;
+	        for (int j = 1; j < i/2 + 1 ;j++){
+	            if (i % j == 0)
+	                tmp += j;
+            }
+
+            if(tmp == i){
+                list.add(i);
+            }
+        }
+
+
+		return list.toArray(new Integer[]{});
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuilder builder = new StringBuilder();
+		for (int i = 0; i< array.length - 1 ; i++){
+			builder.append(array[i]).append(seperator);
+		}
+		builder.append(array[array.length-1]);
+		return builder.toString();
+	}
+	
+
+}
diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java
new file mode 100644
index 0000000000..09b8b3a952
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java
@@ -0,0 +1,58 @@
+package com.dudy.learn01.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by dudy on 2017/3/1.
+ * 解析xml对象
+ *
+ *
+ */
+public class ActionPojoParseXML {
+
+    private  String  name;
+    private  String  classname;
+
+    private Map<String,String > childElement;
+
+
+    public ActionPojoParseXML(String name, String classname) {
+        this.name = name;
+        this.classname = classname;
+        childElement = new HashMap<>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassname() {
+        return classname;
+    }
+
+    public void setClassname(String classname) {
+        this.classname = classname;
+    }
+
+    public Map<String, String> getChildElement() {
+        return childElement;
+    }
+
+    public void setChildElement(Map<String, String> childElement) {
+        this.childElement = childElement;
+    }
+
+    @Override
+    public String toString() {
+        return "ActionPojoParseXML{" +
+                "name='" + name + '\'' +
+                ", classname='" + classname + '\'' +
+                ", childElement=" + childElement +
+                '}';
+    }
+}
diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java
new file mode 100644
index 0000000000..2e59390049
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java
@@ -0,0 +1,48 @@
+package com.dudy.learn01.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "error";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+
+    @Override
+    public String toString() {
+        return "LoginAction{" +
+                "name='" + name + '\'' +
+                ", password='" + password + '\'' +
+                ", message='" + message + '\'' +
+                '}';
+    }
+}
diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java
new file mode 100644
index 0000000000..bbe8c108ca
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java
@@ -0,0 +1,147 @@
+package com.dudy.learn01.litestruts;
+
+import com.dudy.learn01.utils.StringUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+
+         
+		//0. 读取配置文件struts.xml
+        Map<String, ActionPojoParseXML> parseXml = null;
+        try {
+           parseXml = parseXml();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+// 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+//		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+//		("name"="test" ,  "password"="1234") ,
+//		那就应该调用 setName和setPassword方法
+        ActionPojoParseXML actionPojoParseXML = parseXml.get(actionName);
+
+        Object result = null;
+
+        Map viewParameters = new HashMap();
+
+        try {
+            Class actionClass = Class.forName(actionPojoParseXML.getClassname());
+            Object base = actionClass.newInstance();
+
+
+            for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
+                // 这里 只能传递object吧
+                Method method = actionClass.getDeclaredMethod(methodNameconversion(entry.getKey()), String.class);
+                method.setAccessible(true);
+                method.invoke(base,entry.getValue());
+            }
+
+
+//		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+
+            Method method = actionClass.getDeclaredMethod("execute");
+            method.setAccessible(true);
+            result = method.invoke(base);
+//		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+//		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+//		放到View对象的parameters
+
+            Method[] methods = actionClass.getDeclaredMethods();
+
+            for(int i = 0; i< methods.length ; i++){
+                methods[i].setAccessible(true);
+                String methodName = methods[i].getName();
+                if (methodName.startsWith("get")){
+                    Object value = methods[i].invoke(base);
+                    viewParameters.put( StringUtils.lowerFirstLetter(methodName.substring(3)),
+                            value);
+                }
+
+            }
+
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        }
+
+//		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+//		放到View对象的jsp字段中。
+
+        View view = new View();
+        view.setJsp(actionPojoParseXML.getChildElement().get(result));
+
+        view.setParameters(viewParameters);
+        System.out.println(view);
+
+        return view;
+    }
+
+    /**
+     *
+     * @param key
+     * @return
+     */
+    private static String methodNameconversion(String key) {
+        return  "set" + StringUtils.upperFirstLetter(key);
+    }
+
+    /**
+     * 解析xml 获取解析对象
+     * @return
+     * @throws DocumentException
+     */
+    private static Map<String,ActionPojoParseXML> parseXml() throws DocumentException {
+        SAXReader reader = new SAXReader();
+        File file = new File("/Users/dudy/coding2017-1/group04/1796244932/learn01/src/main/resource/struts.xml");
+        Document document = reader.read(file);
+        Element root = document.getRootElement();
+        List<Element> childElements = root.elements();
+
+        Map<String,ActionPojoParseXML> result = new HashMap<>();
+
+
+        for (Element child : childElements) {
+
+            ActionPojoParseXML parseXML = new ActionPojoParseXML(
+                    child.attributeValue("name"),
+                    child.attributeValue("class"));
+
+            //未知子元素名情况下
+            List<Element> elementList = child.elements();
+            for (Element ele : elementList) {
+                parseXML.getChildElement().put(ele.attributeValue("name"),ele.getText());
+            }
+            result.put(parseXML.getName(),parseXML);
+        }
+//        System.out.println(result);
+        return  result;
+    }
+
+    public static void main(String[] args) throws DocumentException {
+        parseXml();
+    }
+
+}
diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java
new file mode 100644
index 0000000000..54ecc5e9d5
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java
@@ -0,0 +1,31 @@
+package com.dudy.learn01.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+
+	@Override
+	public String toString() {
+		return "View{" +
+				"jsp='" + jsp + '\'' +
+				", parameters=" + parameters +
+				'}';
+	}
+}
diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java
new file mode 100644
index 0000000000..78b9b7beda
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java
@@ -0,0 +1,174 @@
+package com.dudy.learn01.utils;
+
+/**
+ * <pre>
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/8/16
+ *     desc  : 字符串相关工具类
+ * </pre>
+ */
+public class StringUtils {
+
+    private StringUtils() {
+        throw new UnsupportedOperationException("u can't instantiate me...");
+    }
+
+    /**
+     * 判断字符串是否为null或长度为0
+     *
+     * @param s 待校验字符串
+     * @return {@code true}: 空<br> {@code false}: 不为空
+     */
+    public static boolean isEmpty(CharSequence s) {
+        return s == null || s.length() == 0;
+    }
+
+    /**
+     * 判断字符串是否为null或全为空格
+     *
+     * @param s 待校验字符串
+     * @return {@code true}: null或全空格<br> {@code false}: 不为null且不全空格
+     */
+    public static boolean isSpace(String s) {
+        return (s == null || s.trim().length() == 0);
+    }
+
+    /**
+     * 判断两字符串是否相等
+     *
+     * @param a 待校验字符串a
+     * @param b 待校验字符串b
+     * @return {@code true}: 相等<br>{@code false}: 不相等
+     */
+    public static boolean equals(CharSequence a, CharSequence b) {
+        if (a == b) return true;
+        int length;
+        if (a != null && b != null && (length = a.length()) == b.length()) {
+            if (a instanceof String && b instanceof String) {
+                return a.equals(b);
+            } else {
+                for (int i = 0; i < length; i++) {
+                    if (a.charAt(i) != b.charAt(i)) return false;
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断两字符串忽略大小写是否相等
+     *
+     * @param a 待校验字符串a
+     * @param b 待校验字符串b
+     * @return {@code true}: 相等<br>{@code false}: 不相等
+     */
+    public static boolean equalsIgnoreCase(String a, String b) {
+        return (a == b) || (b != null) && (a.length() == b.length()) && a.regionMatches(true, 0, b, 0, b.length());
+    }
+
+    /**
+     * null转为长度为0的字符串
+     *
+     * @param s 待转字符串
+     * @return s为null转为长度为0字符串，否则不改变
+     */
+    public static String null2Length0(String s) {
+        return s == null ? "" : s;
+    }
+
+    /**
+     * 返回字符串长度
+     *
+     * @param s 字符串
+     * @return null返回0，其他返回自身长度
+     */
+    public static int length(CharSequence s) {
+        return s == null ? 0 : s.length();
+    }
+
+    /**
+     * 首字母大写
+     *
+     * @param s 待转字符串
+     * @return 首字母大写字符串
+     */
+    public static String upperFirstLetter(String s) {
+        if (isEmpty(s) || !Character.isLowerCase(s.charAt(0))) return s;
+        return String.valueOf((char) (s.charAt(0) - 32)) + s.substring(1);
+    }
+
+    /**
+     * 首字母小写
+     *
+     * @param s 待转字符串
+     * @return 首字母小写字符串
+     */
+    public static String lowerFirstLetter(String s) {
+        if (isEmpty(s) || !Character.isUpperCase(s.charAt(0))) return s;
+        return String.valueOf((char) (s.charAt(0) + 32)) + s.substring(1);
+    }
+
+    /**
+     * 反转字符串
+     *
+     * @param s 待反转字符串
+     * @return 反转字符串
+     */
+    public static String reverse(String s) {
+        int len = length(s);
+        if (len <= 1) return s;
+        int mid = len >> 1;
+        char[] chars = s.toCharArray();
+        char c;
+        for (int i = 0; i < mid; ++i) {
+            c = chars[i];
+            chars[i] = chars[len - i - 1];
+            chars[len - i - 1] = c;
+        }
+        return new String(chars);
+    }
+
+    /**
+     * 转化为半角字符
+     *
+     * @param s 待转字符串
+     * @return 半角字符串
+     */
+    public static String toDBC(String s) {
+        if (isEmpty(s)) return s;
+        char[] chars = s.toCharArray();
+        for (int i = 0, len = chars.length; i < len; i++) {
+            if (chars[i] == 12288) {
+                chars[i] = ' ';
+            } else if (65281 <= chars[i] && chars[i] <= 65374) {
+                chars[i] = (char) (chars[i] - 65248);
+            } else {
+                chars[i] = chars[i];
+            }
+        }
+        return new String(chars);
+    }
+
+    /**
+     * 转化为全角字符
+     *
+     * @param s 待转字符串
+     * @return 全角字符串
+     */
+    public static String toSBC(String s) {
+        if (isEmpty(s)) return s;
+        char[] chars = s.toCharArray();
+        for (int i = 0, len = chars.length; i < len; i++) {
+            if (chars[i] == ' ') {
+                chars[i] = (char) 12288;
+            } else if (33 <= chars[i] && chars[i] <= 126) {
+                chars[i] = (char) (chars[i] + 65248);
+            } else {
+                chars[i] = chars[i];
+            }
+        }
+        return new String(chars);
+    }
+}
\ No newline at end of file
diff --git a/group04/1796244932/learn01/src/main/resource/struts.xml b/group04/1796244932/learn01/src/main/resource/struts.xml
new file mode 100644
index 0000000000..fdd28dd909
--- /dev/null
+++ b/group04/1796244932/learn01/src/main/resource/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.dudy.learn01.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="error">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java
new file mode 100644
index 0000000000..25fd306dc9
--- /dev/null
+++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java
@@ -0,0 +1,99 @@
+package com.dudy.learn01.base;
+
+import org.junit.Test;
+
+/**
+ * <pre>
+ *
+ * </pre>
+ *
+ * @author dudy;
+ * @version \$Id:  MyArrayUtilTest, v 1.0 2017/2/28 15:39 dudy Exp;
+ */
+public class MyArrayUtilTest {
+
+
+    public  void  print(int desArr[]){
+        for (int i = 0; i < desArr.length; i++) {
+            System.out.print(desArr[i] + ",");
+        }
+    }
+
+    public  void  print(Integer desArr[]){
+        for (int i = 0; i < desArr.length; i++) {
+            System.out.print(desArr[i] + ",");
+        }
+    }
+
+
+    @Test
+    public void testReverseArray() throws Exception {
+
+       int origin[]  = new int[]{7, 9, 30, 3, 4};
+
+        MyArrayUtil.reverseArray(origin);
+        for (int i = 0; i <origin.length; i++) {
+            System.out.print(origin[i] +" ,");
+        }
+    }
+
+    @Test
+    public void testRemoveZero() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+
+        int[] result = MyArrayUtil.removeZero(oldArr);
+
+        print(result);
+    }
+
+    @Test
+    public void testMerge() throws Exception {
+
+       int  a1[] =new int[] {3, 5, 7,8};
+        int a2[] =new int[] {4, 5, 6,7};
+
+        int[] a3 = MyArrayUtil.merge(a1, a2);
+        print(a3);
+    }
+
+    @Test
+    public void testGrow() throws Exception {
+
+        int  a1[] =new int[] {3, 5, 7,8};
+        int[] grow = MyArrayUtil.grow(a1, 3);
+        print(grow);
+
+
+    }
+
+    @Test
+    public void testFibonacci() throws Exception {
+
+        Integer[] integers = MyArrayUtil.fibonacci(15);
+        print(integers);
+    }
+
+    @Test
+    public void testGetPrimes() throws Exception {
+
+        Integer[] primes = MyArrayUtil.getPrimes(100);
+        print(primes);
+
+
+    }
+
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+
+        Integer[] numbers = MyArrayUtil.getPerfectNumbers(100);
+        print(numbers);
+    }
+
+    @Test
+    public void testJoin() throws Exception {
+        int  a1[] =new int[] {3, 5, 7,8};
+        String join = MyArrayUtil.join(a1, "-");
+        System.out.println(join);
+
+    }
+}
\ No newline at end of file
diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b28e79be6d
--- /dev/null
+++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java
@@ -0,0 +1,42 @@
+package com.dudy.learn01.litestruts;
+
+import com.dudy.learn01.litestruts.Struts;
+import com.dudy.learn01.litestruts.View;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group04/1906242834/.classpath b/group04/1906242834/.classpath
index fb5011632c..3e0fb272a8 100644
--- a/group04/1906242834/.classpath
+++ b/group04/1906242834/.classpath
@@ -2,5 +2,6 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group04/1906242834/src/com/coderising/array/ArrayUtil.java b/group04/1906242834/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..3090bb09b1
--- /dev/null
+++ b/group04/1906242834/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,327 @@
+package com.coderising.array;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int temp;
+		for (int i=0;i<origin.length/2;i++) {
+			temp = origin[i];
+			origin[i] = origin[origin.length-i-1];
+			origin[origin.length-i-1] = temp;
+		}
+		for(int i=0; i<origin.length;i++){
+			System.out.print(origin[i]+",");
+		}
+		System.out.print("\n");
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int count = 0;
+		for(int i=0;i<oldArray.length; i++){
+			if(oldArray[i]!=0){
+				count += 1;
+			}
+		}
+		int [] newArray = new int [count];
+		int i = 0;
+		for(int j=0;j<oldArray.length;j++){
+				if(oldArray[j]!=0){
+					newArray[i] = oldArray[j];
+					i += 1;
+			}
+			
+		}
+		for (int a : newArray) {
+			System.out.print(a+",");
+			
+		}	
+		System.out.print("\n");
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		//构造一个合并后无排序的包含重复元素的数组
+		int length = array1.length + array2.length;
+		int[] array_merge = new int[length];
+		for (int i = 0; i < array1.length; i++) {
+			array_merge[i] = array1[i];
+		}
+		for (int i = array1.length; i < array_merge.length; i++) {
+			array_merge[i] = array2[i-array1.length];
+		}
+		//打印合并后无序数包含重复元素的数组
+		System.out.print(array_merge[0]);
+		for (int j = 0; j < array_merge.length; j++) {
+			System.out.print(","+array_merge[j]);
+		} 
+		System.out.print("\n");
+		//将合并的元素去重复
+		Set<Integer> x = new HashSet<>();
+		for (int i = 0; i < array_merge.length; i++) {
+			x.add(array_merge[i]);
+		}
+		
+		Integer[] arr = x.toArray(new Integer[x.size()]);
+		//进行排序，采用插入排序
+		for (int i = 0; i < arr.length; i++) {
+			for (int j = i+1; j < arr.length; j++) {
+				if (arr[i]>arr[j]) {
+					int tmp = arr[i];
+					arr[i] = arr[j];
+					arr[j] = tmp;
+				}
+			}
+		}
+		int[] array_merger = new int[arr.length];
+		for (int i = 0; i < arr.length; i++) {
+			array_merger[i] = arr[i].intValue();
+		}
+		for (int i : array_merger) {
+			System.out.println(i);
+		}
+		return array_merger;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		//确定数组的长度
+		int length = oldArray.length + size;
+		int[] newArray = new int [length];
+		//对数组的原有元素进行赋值
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		//对扩容的元素进行赋值为0的操作
+		for (int i = oldArray.length; i < newArray.length; i++) {
+			newArray[i] = 0;
+		}
+		//打印数组
+		System.out.print(newArray[0]);
+		for (int j = 1; j < newArray.length; j++) {
+			System.out.print(","+newArray[j]);
+		}
+		System.out.print("\n");
+		return newArray;
+		
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int a = 1, b = 1, count = 0;
+		int c = 2;
+		while(c<max){
+			c = a + b;
+			a = b;
+			b = c;
+			count += 1;
+		}
+		System.out.println(count);
+		int [] array = new int [count+1];
+		if (max == 1) {
+			return null;
+		} else {
+			array[0] = 1;
+			array[1] = 1;
+			for (int i = 2; i < array.length; i++) {
+				array[i] = array[i-1] + array[i-2];
+			}
+			for (int i : array) {
+				System.out.println(i);
+			}
+			return array;
+		}
+		
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int number = 2, count = 0, b = 0;
+		//获取列表的长度
+		while(number<max){
+			boolean a = true;
+			for (int i = 2; i < number; i++) {
+				if(number%i==0){
+					a = false;
+				}
+			}
+			if(a == true){
+				count += 1;
+			}
+			number += 1;
+		}
+		System.out.println(count);
+		//给列表中的元素进行赋值
+		int [] array = new int [count];
+		int counter = 0, num=2;
+		while (counter<count) {
+			boolean a = true;
+			for (int i = 2; i < num; i++) {
+				if(num%i==0){
+					a = false;
+				}
+			}
+			if(a == true){
+				array[counter] = num;
+				counter += 1;
+			}
+			num ++;
+		}
+		for (int i : array) {
+			System.out.println(i);
+		}
+		return array;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		//先计算出小于max的所有完数的个数
+		int count=0, number=1, sum=0;
+		while(number<max){
+			for (int i = 1; i < number; i++) {
+				if(number%i==0){
+					sum += i;
+				}
+			}
+			if(sum==number){
+				count += 1;
+			}
+			sum = 0;
+			number += 1;	
+		}
+		int[] perfect_array = new int[count];
+		int index = 0, num=1, sum1;
+		while(num<max){
+			
+			sum1 = 0;
+			for (int i = 1; i < num; i++) {
+				if(num%i==0){
+					sum1 += i;
+				}
+			}
+			
+			if(sum1==num){
+				perfect_array[index] = num;
+				index+=1;
+			}
+			num += 1;
+		}
+		for (int i : perfect_array) {
+			System.out.println(i);
+		}
+		return perfect_array;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String[] str = new String[array.length];
+		for (int i = 0; i < str.length; i++) {
+			str[i] = String.valueOf(array[i]);
+		}
+		String a=str[0];
+		for (int i = 1; i < str.length; i++) {
+			a = a + seperator+str[i];
+		}
+		System.out.print(a+"\n");
+		return a;
+	}
+}
+
+class ArrayTest{
+	public static void main(String[] args){
+		ArrayUtil array = new ArrayUtil();
+		int []  list = {7, 9, 30, 3, 4};
+		array.reverseArray(list);
+		System.out.println("----reverseArray---end----");
+		
+		ArrayUtil oldArray = new ArrayUtil();
+		int []  arrays = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		oldArray.removeZero(arrays);
+		System.out.println("----removeZero-----end----");
+		
+		ArrayUtil array_merge = new ArrayUtil();
+		int []  array1 = {3, 5, 7, 8};
+		int []  array2 = {1, 3, 10, 100};
+		array_merge.merge(array1, array2);
+		System.out.println("----merge----------end----");
+		
+		
+		ArrayUtil growArray = new ArrayUtil();
+		int []  garray = {1,3,4};
+		growArray.grow(garray, 10);
+		System.out.println("----grow-----------end---");
+		
+		
+		ArrayUtil fib = new ArrayUtil();
+		fib.fibonacci(100);
+		System.out.println("----fib------------end---");
+		
+		ArrayUtil sushu = new ArrayUtil();
+		sushu.getPrimes(100);
+		System.out.println("----getPrimes------end----");
+		
+		ArrayUtil perfectnumber = new ArrayUtil();
+		perfectnumber.getPerfectNumbers(30);
+		System.out.println("----getPerfectNumbers---end-----------");
+		
+		ArrayUtil string_format = new ArrayUtil();
+		int[] a = {1,2,3,4,5,6,7,45,45,768};
+		string_format.join(a, "$");
+		System.out.println("----string_format------end---");
+		
+	}
+}
\ No newline at end of file
diff --git a/group04/1906242834/src/com/coderising/array/ArrayUtilTest.java b/group04/1906242834/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..b56b82c5b6
--- /dev/null
+++ b/group04/1906242834/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,14 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void test() {
+		fail("Not yet implemented");
+	}
+
+}
diff --git a/group04/1906242834/src/com/coderising/litestruts/LoginAction.java b/group04/1906242834/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..76547ac3b3
--- /dev/null
+++ b/group04/1906242834/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/group04/1906242834/src/com/coderising/litestruts/Struts.java b/group04/1906242834/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..99fec0d190
--- /dev/null
+++ b/group04/1906242834/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,36 @@
+﻿package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+
+}
+
diff --git a/group04/1906242834/src/com/coderising/litestruts/StrutsTest.java b/group04/1906242834/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..73a0d3d639
--- /dev/null
+++ b/group04/1906242834/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,47 @@
+﻿package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+}
+
+
+
diff --git a/group04/1906242834/src/com/coderising/litestruts/View.java b/group04/1906242834/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f68a8c438b
--- /dev/null
+++ b/group04/1906242834/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/group04/1906242834/src/com/coderising/litestruts/struts.xml b/group04/1906242834/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e64e8017a9
--- /dev/null
+++ b/group04/1906242834/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,14 @@
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
+
diff --git a/group04/1906242834/src/com/coding/basic/ArrayList.java b/group04/1906242834/src/com/coding/basic/ArrayList.java
index a4baff2fae..224bb70ab0 100644
--- a/group04/1906242834/src/com/coding/basic/ArrayList.java
+++ b/group04/1906242834/src/com/coding/basic/ArrayList.java
@@ -11,6 +11,7 @@ public void add(Object o){
 		if ((size()+1)>elementData.length) {
 			System.arraycopy(elementData, 0, elementData, 0, elementData.length+1);
 			elementData[size] = o;
+			size++;
 		}else {
 		//若插入元素后不出现溢出，则直接添加在末尾
 			elementData[size] = o;
diff --git a/group04/1906242834/src/com/coding/basic/BinaryTreeNode.java b/group04/1906242834/src/com/coding/basic/BinaryTreeNode.java
index dd29e233cc..d76474cc8a 100644
--- a/group04/1906242834/src/com/coding/basic/BinaryTreeNode.java
+++ b/group04/1906242834/src/com/coding/basic/BinaryTreeNode.java
@@ -1,5 +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;
+	}
+	
+}
\ No newline at end of file
diff --git a/group04/1906242834/src/com/coding/basic/Iterator.java b/group04/1906242834/src/com/coding/basic/Iterator.java
index 2cb041d8c1..7c02cc6e51 100644
--- a/group04/1906242834/src/com/coding/basic/Iterator.java
+++ b/group04/1906242834/src/com/coding/basic/Iterator.java
@@ -1,5 +1,7 @@
 package com.coding.basic;
 
-public class Iterator {
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
 
-}
+}
\ No newline at end of file
diff --git a/group04/1906242834/src/com/coding/basic/LinkedList.java b/group04/1906242834/src/com/coding/basic/LinkedList.java
index 83c9478b71..204ebd3362 100644
--- a/group04/1906242834/src/com/coding/basic/LinkedList.java
+++ b/group04/1906242834/src/com/coding/basic/LinkedList.java
@@ -1,5 +1,141 @@
 package com.coding.basic;
 
-public class LinkedList {
-
-}
+public class LinkedList implements List {
+	
+	private Node head;
+	private Node tail;
+	private int size;
+	//将最后一个节点的指针指向要插入的元素
+	public void add(Object o){
+		Node newnode = new Node();
+		newnode.setData(o);
+		//linkedList头元素为空的话，把此插入的新元素作为头元素
+		if (head==null) {
+			head = newnode;
+			size ++;
+		}else {
+		//若头元素不为空，则把插入的节点newnode设置为（LinkedList）的末节点
+			tail.setNext(newnode);
+			tail = newnode;
+			size ++;
+		}
+	}
+	//将index上一个索引的指针指向o，将o的指针指向原index元素
+	public void add(int index , Object o){
+		if(head==null){
+			System.out.println("LinkedList长度为0");
+		}
+		if(index>size()){
+			System.out.println("IndexOutOfBound");
+		}
+		Node temp = head;
+		Node newnode = new Node();
+		newnode.setData(o);
+		for (int i = 0; i < index-1; i++) {
+			temp = temp.getNext();
+		}
+		if(temp.getNext()==null){
+			temp.setNext(newnode);
+			size ++;
+		}else{
+			temp.setNext(newnode);
+			newnode.setNext(temp.getNext());
+			size ++;
+		}
+		
+	}
+	public Object get(int index){
+		Node temp = head;
+		int a =0;
+		while (a<=index) {
+			temp = temp.getNext();
+			a += 1;
+			return temp.getData();
+		}
+		return null;
+		
+	}
+	public Object remove(int index){
+		if(head==null){
+			return null;
+		}
+		Node temp = head;
+		Object i = get(index);
+		while(temp.getNext()!=i){
+			temp = temp.getNext();
+		}
+		
+		temp.setNext(temp.getNext().getNext());
+		size--;
+		
+		return i;
+	}
+	
+	public int size(){
+		size = 0;
+		if (head==null) {
+			System.out.println("LikedList长度为0");
+			return size;
+		}
+		Node temp = head;
+		while(temp.getNext()!=null){
+			size += 1;
+			temp = temp.getNext();
+		}
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node newnode = new Node();
+		newnode.setData(o);
+		newnode.setNext(head);
+		size++;
+	}
+	
+	public void addLast(Object o){
+		Node newnode = new Node();
+		newnode.setData(o);
+		tail.setNext(newnode);
+		newnode.setNext(null);
+		size++;
+	}
+	public Object removeFirst(){
+		if(head==null){
+			return null;
+		}
+		head.setNext(null);
+		return get(0);
+	}
+	public Object removeLast(){
+		Object i = get(size-1);
+		Node newnode = new Node();
+		newnode.setData(i);
+		newnode.setNext(null);
+		return i;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		//获取当前节点数据
+		public Object getData(){
+			return data;
+		}
+		//设置当前节点数据
+		public void setData(Object data){
+			this.data = data;
+		}
+		//返回下一个节点
+		public Node getNext(){
+			return next;
+		}
+		//设置下一个节点
+		public void setNext(Node next){
+			this.next = next;
+		}
+	}
+}
\ No newline at end of file
diff --git a/group04/1906242834/src/com/coding/basic/List.java b/group04/1906242834/src/com/coding/basic/List.java
index 75b56eb40e..c86b745572 100644
--- a/group04/1906242834/src/com/coding/basic/List.java
+++ b/group04/1906242834/src/com/coding/basic/List.java
@@ -1,5 +1,9 @@
 package com.coding.basic;
 
 public interface List {
-
-}
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
\ No newline at end of file
diff --git a/group04/1906242834/src/com/coding/basic/Queue.java b/group04/1906242834/src/com/coding/basic/Queue.java
index bf0c32a224..cda22180d7 100644
--- a/group04/1906242834/src/com/coding/basic/Queue.java
+++ b/group04/1906242834/src/com/coding/basic/Queue.java
@@ -1,5 +1,49 @@
 package com.coding.basic;
 
 public class Queue {
-
-}
+	private ArrayList elementData = new ArrayList();
+	
+	public void enQueue(Object o){
+		int length = elementData.size();
+		for (int i = 0; i < length; i++) {
+			if(elementData.get(i)==null){
+				elementData.add(i, o);
+			}
+		}
+		length = elementData.size()-1;
+	}
+	
+	public Object deQueue(){
+		for (int i = 0; i < elementData.size(); i++) {
+			if(elementData.get(i)!=null){
+				elementData.remove(i);
+				return elementData.get(i);
+			}
+		}
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		int a =0;
+		for (int i = 0; i < elementData.size(); i++) {
+			if(elementData.get(i)==null){
+				a+=1;
+			}
+		}
+		if(a==elementData.size()){
+			return true;
+		}else{
+			return false;
+		}
+	}
+	
+	public int size(){
+		int size=0;
+		for (int i = 0; i < elementData.size(); i++) {
+			if(elementData.get(i)==null){
+				size += 1;
+			}
+		}
+		return size;
+	}
+}
\ No newline at end of file
diff --git a/group04/1972376180/.classpath b/group04/1972376180/.classpath
index d171cd4c12..9b2ed0d520 100644
--- a/group04/1972376180/.classpath
+++ b/group04/1972376180/.classpath
@@ -2,5 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group04/1972376180/src/tong/java/two/ArrayUtil.java b/group04/1972376180/src/tong/java/two/ArrayUtil.java
new file mode 100644
index 0000000000..3385bc7ffd
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/ArrayUtil.java
@@ -0,0 +1,236 @@
+package tong.java.two;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		if(checkArrray(origin)){
+			return;
+		}
+		int length = origin.length;
+		for (int i = 0; i < length / 2; i++) {
+			int a = origin[length - 1 - i];
+			origin[length - 1 - i] = origin[i];
+			origin[i] = a;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		if(checkArrray(oldArray)){
+			return null;
+		}
+		List<Integer> newArrayList = new ArrayList<Integer>();
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArrayList.add(oldArray[i]);
+			}
+		}
+		int[] newArray = IntegerToIntArray(newArrayList);
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		return null;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max == 1) {
+			return new int[0];
+		} else {
+			ArrayList<Integer> newArrayList = new ArrayList<Integer>();
+			int i = 0;
+			while (fibo(i) < max) {
+				newArrayList.add(fibo(i));
+				i++;
+			}
+			int[] newArray = IntegerToIntArray(newArrayList);
+			return newArray;
+		}
+
+	}
+
+	/**
+	 * 返回索引为i处的斐波那契数
+	 * 
+	 * @param i
+	 * @return
+	 */
+	public int fibo(int i) {
+		if (i == 0) {
+			return 1;
+		} else if (i == 1) {
+			return 1;
+		} else {
+			return fibo(i - 1) + fibo(i - 2);
+		}
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		ArrayList<Integer> newArrayList = new ArrayList<Integer>();
+		newArrayList.add(2);
+		for (int i = 3; i < max; i++) {
+			for (int j = 2; j < i; j++) {
+				if (i % j == 0) {
+					break;
+				}
+				if (j + 1 >= i) {
+					newArrayList.add(i);
+				}
+			}
+		}
+		int[] newArray = IntegerToIntArray(newArrayList);
+		return newArray;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		ArrayList<Integer> newArrayList = new ArrayList<Integer>();
+		for (int i = 0; i < max; i++) {
+			if (isPerfectNumber(i)) {
+				newArrayList.add(i);
+			}
+		}
+		return IntegerToIntArray(newArrayList);
+	}
+
+	/**
+	 * 判断一个数是否为完数
+	 * 
+	 * @param num
+	 * @return
+	 */
+	public boolean isPerfectNumber(int num) {
+		int[] params = getPara(num);
+		int plus = 0;
+		for (int i = 0; i < params.length; i++) {
+			plus = plus + params[i];
+		}
+		if (num == plus) {
+			return true;
+		} else {
+			return false;
+
+		}
+	}
+
+	/**
+	 * 获取一个数的所有因子
+	 * 
+	 * @param num
+	 * @return
+	 */
+	public int[] getPara(int num) {
+		ArrayList<Integer> paras = new ArrayList<Integer>();
+		paras.add(1);
+		for (int i = 2; i < num / 2; i++) {
+			if (num % i == 0) {
+				if (!(paras.contains(i) && paras.contains(num / i))) {
+					paras.add(i);
+					paras.add(num / i);
+				}
+			}
+		}
+		int[] newArray = IntegerToIntArray(paras);
+		return newArray;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuffer result = new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			result.append(array[i]);
+			if (i != array.length - 1) {
+				result.append(seperator);
+			}
+		}
+		return result.toString();
+	}
+
+	/**
+	 * 将一个泛型为Integer的集合转为int[]数组
+	 * 
+	 * @param list
+	 * @return
+	 */
+	public int[] IntegerToIntArray(List<Integer> list) {
+		int[] newArray = new int[list.size()];
+		for (int j = 0; j < list.size(); j++) {
+			newArray[j] = list.get(j).intValue();
+		}
+		return newArray;
+	}
+
+	public boolean checkArrray(int[] origin) {
+		if (origin.length == 0 || origin.length == 1) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+}
diff --git a/group04/1972376180/src/tong/java/two/ArrayUtilTest.java b/group04/1972376180/src/tong/java/two/ArrayUtilTest.java
new file mode 100644
index 0000000000..7d28921aab
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/ArrayUtilTest.java
@@ -0,0 +1,96 @@
+package tong.java.two;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	ArrayUtil util = new ArrayUtil();
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] a = { 7, 9, 30, 3, 70 };
+		util.reverseArray(a);
+		for (int i = 0; i < a.length; i++) {
+			System.out.println(a[i]);
+		}
+	}
+
+	@Test
+	public void testRemoveZero() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a = { 2, 4, 7 };
+		int[] b = { 4, 8, 9 };
+		int[] c = util.merge(a, b);
+		for (int i = 0; i < c.length; i++) {
+			System.out.println(c[i]);
+		}
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = { 2, 4, 7 };
+		int[] newArray = util.grow(oldArray, 3);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] result = util.fibonacci(1);
+		for (int i = 0; i < result.length; i++) {
+			System.out.println(result[i]);
+		}
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] result = util.getPrimes(15);
+		for (int i = 0; i < result.length; i++) {
+			System.out.println(result[i]);
+		}
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] result = util.getPerfectNumbers(100);
+		for (int i = 0; i < result.length; i++) {
+			System.out.println(result[i]);
+		}
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = { 3, 2 };
+		System.out.println(util.join(array, "~"));
+	}
+
+	@Test
+	public void testFibo() {
+		System.out.println(util.fibo(5));
+	}
+
+	@Test
+	public void testGetParas() throws Exception {
+		int[] paras = util.getPara(20);
+		for (int i = 0; i < paras.length; i++) {
+			System.out.println(paras[i]);
+		}
+	}
+
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/Action.java b/group04/1972376180/src/tong/java/two/struts/Action.java
new file mode 100644
index 0000000000..b4a1d646c9
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/Action.java
@@ -0,0 +1,34 @@
+package tong.java.two.struts;
+
+import java.util.ArrayList;
+
+public class Action {
+	private String name;
+	private String className;
+	private ArrayList<Result> results;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+
+	public ArrayList<Result> getResults() {
+		return results;
+	}
+
+	public void setResults(ArrayList<Result> results) {
+		this.results = results;
+	}
+
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/LoginAction.java b/group04/1972376180/src/tong/java/two/struts/LoginAction.java
new file mode 100644
index 0000000000..182cc6d0f8
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/LoginAction.java
@@ -0,0 +1,39 @@
+package tong.java.two.struts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author tong
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/Result.java b/group04/1972376180/src/tong/java/two/struts/Result.java
new file mode 100644
index 0000000000..70fbd62648
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/Result.java
@@ -0,0 +1,23 @@
+package tong.java.two.struts;
+
+public class Result {
+	private String name;
+	private String page;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getPage() {
+		return page;
+	}
+
+	public void setPage(String page) {
+		this.page = page;
+	}
+
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/Root.java b/group04/1972376180/src/tong/java/two/struts/Root.java
new file mode 100644
index 0000000000..dbb88203c7
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/Root.java
@@ -0,0 +1,17 @@
+package tong.java.two.struts;
+
+import java.util.ArrayList;
+
+public class Root {
+	private ArrayList<Action> action;
+
+	public ArrayList<Action> getAction() {
+		return action;
+	}
+
+	public void setAction(ArrayList<Action> action) {
+		this.action = action;
+	}
+
+	
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/Struts.java b/group04/1972376180/src/tong/java/two/struts/Struts.java
new file mode 100644
index 0000000000..8495d6e08a
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/Struts.java
@@ -0,0 +1,120 @@
+package tong.java.two.struts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+	private static Root strutsRoot;
+	private static Action action = null;
+
+	public static View runAction(String actionName,
+			Map<String, String> parameters) {
+		View view = new View();
+
+		/*
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 */
+		
+		//读取配置文件
+		strutsRoot = readStruts();
+		for (Action a : strutsRoot.getAction()) {
+			if (actionName.contains(a.getName())) {
+				action = a;
+			}
+		}
+		if (action != null) {
+			try {
+				if (action.getName().equals("login")) {
+					//通过反射生成LoginAction实例
+					LoginAction loginAction = (LoginAction) Class.forName(
+							action.getClassName()).newInstance();
+					loginAction.setName(parameters.get("name"));
+					loginAction.setPassword(parameters.get("password"));
+					//通过反射，执行execute方法
+					Method method = LoginAction.class.getMethod("execute", null);//
+					String result = (String) method.invoke(loginAction, null);
+					HashMap<String, String> params = new HashMap();
+					params.put("message", loginAction.getMessage());
+					view.setParameters(params);
+					for (Result r : action.getResults()) {
+						if (result.equals(r.getName())) {
+							view.setJsp(r.getPage());
+						}
+					}
+
+				}
+
+			} catch (ClassNotFoundException e) {
+				e.printStackTrace();
+			} catch (InstantiationException e) {
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			} catch (NoSuchMethodException e) {
+				e.printStackTrace();
+			} catch (SecurityException e) {
+				e.printStackTrace();
+			} catch (IllegalArgumentException e) {
+				e.printStackTrace();
+			} catch (InvocationTargetException e) {
+				e.printStackTrace();
+			}
+
+		}
+		return view;
+	}
+
+	private static Root readStruts() {
+		SAXReader reader = new SAXReader();
+		try {
+			Document document = reader.read(new File(
+					"/tong/java/two/struts/struts.xml"));
+			Root strutsRoot = new Root();
+			Element root = document.getRootElement();
+			ArrayList<Action> actionList = new ArrayList<Action>();
+			List<Element> elements = root.elements("action");
+			for (Element e : elements) {
+				Action action = new Action();
+				action.setName(e.attributeValue("name"));
+				action.setClassName(e.attributeValue("class"));
+				List<Element> results = e.elements("result");
+				ArrayList<Result> resultList = new ArrayList<Result>();
+				for (Element e_result : results) {
+					Result result = new Result();
+					result.setName(e_result.attributeValue("name"));
+					result.setPage(e_result.getTextTrim());
+					resultList.add(result);
+				}
+				action.setResults(resultList);
+				actionList.add(action);
+			}
+			strutsRoot.setAction(actionList);
+			return strutsRoot;
+		} catch (DocumentException e) {
+			throw new RuntimeException();
+		}
+	}
+
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/StrutsTest.java b/group04/1972376180/src/tong/java/two/struts/StrutsTest.java
new file mode 100644
index 0000000000..be9c50c980
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/StrutsTest.java
@@ -0,0 +1,43 @@
+package tong.java.two.struts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/View.java b/group04/1972376180/src/tong/java/two/struts/View.java
new file mode 100644
index 0000000000..0665674d14
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/View.java
@@ -0,0 +1,23 @@
+package tong.java.two.struts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/1972376180/src/tong/java/two/struts/struts.xml b/group04/1972376180/src/tong/java/two/struts/struts.xml
new file mode 100644
index 0000000000..814406b206
--- /dev/null
+++ b/group04/1972376180/src/tong/java/two/struts/struts.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="com.coderising.action.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+
+	<action name="logout" class="com.coderising.action.LogoutAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/group14/630254746/2017Leaning/.gitignore b/group04/24658892/.gitignore
similarity index 100%
rename from group14/630254746/2017Leaning/.gitignore
rename to group04/24658892/.gitignore
diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties
new file mode 100644
index 0000000000..1e246d6631
--- /dev/null
+++ b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties
@@ -0,0 +1 @@
+#Sat Feb 25 00:50:00 CST 2017
diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties.lock b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties.lock
new file mode 100644
index 0000000000..3d46c4fdb6
Binary files /dev/null and b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties.lock differ
diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileHashes.bin b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileHashes.bin
new file mode 100644
index 0000000000..6c8a2ded55
Binary files /dev/null and b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileHashes.bin differ
diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileSnapshots.bin b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileSnapshots.bin
new file mode 100644
index 0000000000..74abf6ba34
Binary files /dev/null and b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileSnapshots.bin differ
diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/taskArtifacts.bin b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/taskArtifacts.bin
new file mode 100644
index 0000000000..ab6481b1b9
Binary files /dev/null and b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/taskArtifacts.bin differ
diff --git a/group04/24658892/learnjava/build.gradle b/group04/24658892/learnjava/build.gradle
index ffde26b681..95871ecbd7 100644
--- a/group04/24658892/learnjava/build.gradle
+++ b/group04/24658892/learnjava/build.gradle
@@ -3,12 +3,12 @@ version '1.0-SNAPSHOT'
 
 apply plugin: 'java'
 
-sourceCompatibility = 1.5
-
 repositories {
-    mavenCentral()
+    jcenter()
 }
 
 dependencies {
+    compile fileTree(dir: 'libs', include: '*.jar')
+    compile group: 'xmlpull', name: 'xmlpull', version: '1.1.3.1'
     testCompile group: 'junit', name: 'junit', version: '4.11'
 }
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java b/group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java
new file mode 100644
index 0000000000..d613ac1bbd
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java
@@ -0,0 +1,93 @@
+package com.coding.array;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     */
+    public void reverseArray(int[] origin) {
+        int[] reverse = new int[origin.length];
+        int k = 0;
+        for (int i = origin.length - 1; i >= 0; i--) {
+            reverse[k] = origin[i];
+            k++;
+        }
+        System.arraycopy(reverse, 0, origin, 0, reverse.length);
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        int[] tmp = new int[oldArray.length];
+        int k = 0;
+        for (int i : oldArray) {
+            if (i != 0) {
+                tmp[k] = i;
+                k++;
+            }
+        }
+        int[] newArray = new int[k];
+        System.arraycopy(tmp, 0, newArray, 0, k);
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        return null;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     */
+    public int[] grow(int[] oldArray, int size) {
+        return null;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     */
+    public int[] fibonacci(int max) {
+        return null;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     */
+    public int[] getPrimes(int max) {
+        return null;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     */
+    public int[] getPerfectNumbers(int max) {
+        return null;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     */
+    public String join(int[] array, String seperator) {
+        return null;
+    }
+
+}
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java
index e2c4e5e795..aec01c6cc6 100644
--- a/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java
+++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java
@@ -1,46 +1,119 @@
 package com.coding.basic;
 
 public class LinkedList implements List {
-	
-	private Node head;
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index , Object o){
-		
-	}
-	public Object get(int index){
-		return null;
-	}
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public void addFirst(Object o){
-		
-	}
-	public void addLast(Object o){
-		
-	}
-	public Object removeFirst(){
-		return null;
-	}
-	public Object removeLast(){
-		return null;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-		
-	}
+
+    private Node head;
+    private Node tail;
+    private int size;
+
+    public LinkedList() {
+        head = new Node(null, null);
+        tail = head;
+    }
+
+    public void add(Object o) {
+        tail = new Node(o, null);
+        if (head.next == null) {
+            head.next = tail;
+        }
+        else {
+            Node node = head.next;
+            int i = 0;
+            while (node.next != null && i < size) {
+                node = node.next;
+                i++;
+            }
+            node.next = tail;
+        }
+        size++;
+    }
+
+    public void add(int index, Object o) {
+        if (index > size) {
+            throw new IndexOutOfBoundsException();
+        }
+        if (index == 0) {
+            addFirst(o);
+        }
+        else if (index == size) {
+            addLast(o);
+        }
+        else {
+            Node node = head.next;
+            for (int i = 0; i < index; i++) {
+                node = node.next;
+            }
+            node.next = new Node(o, node.next);
+        }
+        size++;
+    }
+
+    public Object get(int index) {
+        return null;
+    }
+
+    public Object remove(int index) {
+        return null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public void addFirst(Object o) {
+        head.next = new Node(o, head.next);
+        size++;
+    }
+
+    public void addLast(Object o) {
+        Node node = tail;
+        tail = new Node(o, null);
+        node.next = tail;
+        size++;
+    }
+
+    public Object removeFirst() {
+        if (head.next == null) {
+            throw new IndexOutOfBoundsException();
+        }
+        Node node = head.next;
+        head.next = node.next;
+        node.next = null;
+        return node;
+    }
+
+    public Object removeLast() {
+        return null;
+    }
+
+    public Iterator iterator() {
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (size > 0) {
+            Node node = head.next;
+            int i = 0;
+            while (node.next != null && i < size) {
+                sb.append("index=").append(i).append(";value=").append(node.data).append("\n");
+                node = node.next;
+                i++;
+            }
+            sb.append("index=").append(i).append(";value=").append(node.data).append("\n");
+        }
+        return sb.toString();
+    }
+
+    private static class Node {
+
+        Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+
+        Object data;
+        Node next;
+    }
 }
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java
index 4c87d9cb16..90eb1fe9a6 100644
--- a/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java
+++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java
@@ -1,5 +1,7 @@
 package com.coding.basic;
 
+import java.util.EmptyStackException;
+
 public class Queue {
 
     private ArrayList elementData = new ArrayList();
@@ -11,6 +13,10 @@ public void enQueue(Object o) {
     }
 
     public Object deQueue() {
+        if (isEmpty()) {
+            throw new EmptyStackException();
+        }
+        size--;
         return elementData.remove(0);
     }
 
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java
new file mode 100644
index 0000000000..d2ba2d59fb
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java
@@ -0,0 +1,42 @@
+package com.coding.litestruts;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Action {
+
+    private String name;
+    private String clazz;
+    private List<Result> resultList = new ArrayList<>();
+
+    public Action(String name, String clazz) {
+
+        this.name = name;
+        this.clazz = clazz;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+
+    public List<Result> getResultList() {
+        return Collections.unmodifiableList(resultList);
+    }
+
+    public void addResultList(Result data) {
+        this.resultList.add(data);
+    }
+}
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java
new file mode 100644
index 0000000000..a049f42514
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java
@@ -0,0 +1,28 @@
+package com.coding.litestruts;
+
+public class Result {
+
+    private String name;
+    private String page;
+
+    public Result(String name, String page) {
+        this.name = name;
+        this.page = page;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPage() {
+        return page;
+    }
+
+    public void setPage(String page) {
+        this.page = page;
+    }
+}
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java
new file mode 100644
index 0000000000..af893c6b84
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java
@@ -0,0 +1,130 @@
+package com.coding.litestruts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Struts {
+
+    private static Struts instance = new Struts();
+
+    @SuppressWarnings("unchecked")
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        Map<String, Action> actions = instance.parseXml();
+        Action action = actions.get(actionName);
+        View view = new View();
+        view.setParameters(new HashMap<>());
+        if (action != null) {
+            try {
+                Class clazz = Class.forName(action.getClazz());
+                Object actionObj = clazz.newInstance();
+                for (String s : parameters.keySet()) {
+                    Method method = clazz.getDeclaredMethod("set" + captureName(s), String.class);
+                    method.invoke(actionObj, parameters.get(s));
+                }
+                Method method = clazz.getDeclaredMethod("execute");
+                Object o = method.invoke(actionObj);
+                if (o != null) {
+                    String flag = o.toString();
+                    for (Result res : action.getResultList()) {
+                        if (flag.equals(res.getName())) {
+                            view.setJsp(res.getPage());
+                        }
+                    }
+                }
+                Method[] methods = clazz.getDeclaredMethods();
+                for (Method m : methods) {
+                    if (m.getName().startsWith("get")) {
+                        view.getParameters().put(m.getName().substring(3).toLowerCase(), m.invoke(actionObj));
+                    }
+                }
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return view;
+    }
+
+    private Map<String, Action> parseXml() {
+        Map<String, Action> actionMap = new HashMap<>();
+        try {
+            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+            XmlPullParser pullParser = factory.newPullParser();
+            pullParser.setInput(getClass().getClassLoader().getResourceAsStream("struts.xml"), null);
+            int event = pullParser.getEventType();
+            String tag = null;
+            Action action = null;
+            Result result = null;
+            while (event != XmlPullParser.END_DOCUMENT) {
+                switch (event) {
+                    case XmlPullParser.TEXT:
+                        String s = pullParser.getText();
+                        if (result != null) {
+                            result.setPage(s);
+                        }
+                        break;
+                    case XmlPullParser.START_TAG:
+                        tag = pullParser.getName();
+                        if ("action".equals(tag)) {
+                            String name = pullParser.getAttributeValue(null, "name");
+                            String clazz = pullParser.getAttributeValue(null, "class");
+                            action = new Action(name, clazz);
+                            actionMap.put(name, action);
+                        }
+                        else if ("result".equals(tag)) {
+                            String name = pullParser.getAttributeValue(null, "name");
+                            result = new Result(name, "");
+                            if (action != null) {
+                                action.addResultList(result);
+                            }
+                        }
+                        break;
+                    case XmlPullParser.END_TAG:
+                        if ("action".equals(tag)) {
+                            action = null;
+                        }
+                        else if ("result".equals(tag)) {
+                            result = null;
+                        }
+                        tag = null;
+                        break;
+                }
+                event = pullParser.next();
+            }
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        return actionMap;
+    }
+
+    private static String captureName(String name) {
+        char[] cs = name.toCharArray();
+        cs[0] -= 32;
+        return String.valueOf(cs);
+    }
+}
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java
new file mode 100644
index 0000000000..9652971e01
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java
@@ -0,0 +1,27 @@
+package com.coding.litestruts;
+
+import java.util.Map;
+
+public class View {
+
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java
new file mode 100644
index 0000000000..dfc203c04b
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coding.litestruts.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group04/24658892/learnjava/src/main/resources/struts.xml b/group04/24658892/learnjava/src/main/resources/struts.xml
new file mode 100644
index 0000000000..221ee8d29c
--- /dev/null
+++ b/group04/24658892/learnjava/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.litestruts.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding.litestruts.action.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java b/group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..1037b30878
--- /dev/null
+++ b/group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java
@@ -0,0 +1,24 @@
+package com.coding.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class ArrayUtilTest {
+
+    @Test
+    public void reverseArray() throws Exception {
+        ArrayUtil arrayUtil = new ArrayUtil();
+        int[] origin = { 0, 1, 2, 3, 4 };
+        arrayUtil.reverseArray(origin);
+        Assert.assertEquals("[4, 3, 2, 1, 0]", Arrays.toString(origin));
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        ArrayUtil arrayUtil = new ArrayUtil();
+        int[] origin = { 0, 1, 2, 0, 4 };
+        Assert.assertEquals("[1, 2, 4]", Arrays.toString(arrayUtil.removeZero(origin)));
+    }
+}
\ No newline at end of file
diff --git a/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java b/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java
index 6acbb70d37..8df8e631bf 100644
--- a/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java
+++ b/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java
@@ -6,12 +6,25 @@ public class LinkedListTest {
 
     @Test
     public void add() throws Exception {
-
+        LinkedList linkedList = new LinkedList();
+        linkedList.add(0);
+        linkedList.add(1);
+        linkedList.add(2);
+        linkedList.add(3);
+        linkedList.add(4);
+        System.out.print(linkedList.toString());
     }
 
     @Test
     public void add1() throws Exception {
-
+        LinkedList linkedList = new LinkedList();
+        linkedList.add(0);
+        linkedList.add(1);
+        linkedList.add(2);
+        linkedList.add(3);
+        linkedList.add(4);
+        linkedList.add(2,21);
+        System.out.print(linkedList.toString());
     }
 
     @Test
@@ -31,17 +44,31 @@ public void size() throws Exception {
 
     @Test
     public void addFirst() throws Exception {
-
+        LinkedList linkedList = new LinkedList();
+        linkedList.addFirst(1);
+        linkedList.addFirst(2);
+        linkedList.addFirst(3);
+        System.out.print(linkedList.toString());
     }
 
     @Test
     public void addLast() throws Exception {
-
+        LinkedList linkedList = new LinkedList();
+        linkedList.addLast(1);
+        linkedList.addLast(2);
+        linkedList.addLast(3);
+        System.out.print(linkedList.toString());
     }
 
     @Test
     public void removeFirst() throws Exception {
-
+        LinkedList linkedList = new LinkedList();
+        linkedList.addLast(1);
+        linkedList.addLast(2);
+        linkedList.addLast(3);
+        linkedList.removeFirst();
+        linkedList.removeFirst();
+        System.out.print(linkedList.toString());
     }
 
     @Test
diff --git a/group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java b/group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..6c18c214e2
--- /dev/null
+++ b/group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.coding.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
\ No newline at end of file
diff --git a/group04/24658892/learnjava/src/test/resources/struts.xml b/group04/24658892/learnjava/src/test/resources/struts.xml
new file mode 100644
index 0000000000..221ee8d29c
--- /dev/null
+++ b/group04/24658892/learnjava/src/test/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.litestruts.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding.litestruts.action.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/312816708/coding/coding02/pom.xml b/group04/312816708/coding/coding02/pom.xml
new file mode 100644
index 0000000000..6785c854b4
--- /dev/null
+++ b/group04/312816708/coding/coding02/pom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.kevin</groupId>
+    <artifactId>coding02</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <!-- https://mvnrepository.com/artifact/junit/junit -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java
new file mode 100644
index 0000000000..b94a86c8b9
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java
@@ -0,0 +1,149 @@
+package com.kevin.coding02.array;
+
+import java.util.*;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        for (int start = 0, end = origin.length - 1; start < end; start++, end--) {
+            int temp = origin[end];
+            origin[end] = origin[start];
+            origin[start] = temp;
+        }
+    }
+
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        List list = new ArrayList();
+        for (int i = 0; i < oldArray.length; i++) {
+            int temp = oldArray[i];
+            if (temp != 0) {
+                list.add(temp);
+            }
+        }
+        int[] newArray = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            newArray[i] = (Integer) list.get(i);
+        }
+
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public int[] merge(int[] array1, int[] array2) {
+        Set set = new HashSet();
+        for (int i = 0; i < array1.length; i++) {
+            set.add(array1[i]);
+        }
+        for (int i = 0; i < array2.length; i++) {
+            set.add(array2[i]);
+        }
+
+        int[] newArray = new int[set.size()];
+        Iterator iterator = set.iterator();
+        int i = 0;
+        while (iterator.hasNext()) {
+            newArray[i++] = (Integer) iterator.next();
+        }
+
+        Arrays.sort(newArray);
+
+        return newArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+
+        return null;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        /**
+         * 判断是否是素数
+         * 素数：又称质数。大于1的自然数中，除了1和它本身以外不再有其他因数的数称为质数。
+         * 因数：假如a*b=c（a、b、c都是整数)，那么我们称a和b就是c的因数。
+         * 唯有被除数，除数，商皆为整数，余数为零时，此关系才成立。 反过来说，我们称c为a、b的倍数。在研究因数和倍数时，不考虑0。
+         */
+        return null;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        return null;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        return null;
+    }
+
+
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..491bfa8ae8
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java
@@ -0,0 +1,52 @@
+package com.kevin.coding02.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by YinWenBing on 2017/3/5.
+ */
+public class ArrayUtilTest {
+    ArrayUtil arrayUtil = new ArrayUtil();
+
+    public void testReverseArray() {
+        int[] origin = new int[]{7, 9, 30, 3, 4};
+        arrayUtil.reverseArray(origin);
+
+        Assert.assertEquals(4, origin[0]);
+    }
+
+    public void testRemoveZero() {
+        int[] oldArray = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int[] newArray = arrayUtil.removeZero(oldArray);
+
+        Assert.assertEquals(6, newArray[4]);
+    }
+
+
+    public void testMerge() {
+        int[] array1 = {3, 5, 7, 8};
+        int[] array2 = {4, 5, 6, 7};
+
+        int[] newArray = arrayUtil.merge(array1, array2);
+
+        Assert.assertEquals(8, newArray[newArray.length - 1]);
+    }
+
+
+    public void testGrow() {
+        int[] oldArray = {2, 3, 6};
+        int size = 3;
+
+        int[] newArray = arrayUtil.grow(oldArray, size);
+        Assert.assertEquals(0, newArray[newArray.length - 1]);
+    }
+
+    @Test
+    public void testGetPrimes() {
+        int max = 23;
+        int[] newArray = arrayUtil.getPrimes(max);
+
+        Assert.assertEquals(19, newArray[newArray.length - 1]);
+    }
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..4334c49b2d
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java
@@ -0,0 +1,41 @@
+package com.kevin.coding02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author liuxin
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java
new file mode 100644
index 0000000000..aec9cb3e07
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java
@@ -0,0 +1,95 @@
+package com.kevin.coding02.litestruts;
+
+import com.kevin.coding02.model.ActionModel;
+import com.kevin.coding02.model.ResultModel;
+import com.kevin.coding02.util.SaxUtil;
+import org.xml.sax.XMLReader;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        View view = new View();
+        try {
+            //创建sax解析工厂
+            SAXParserFactory factory = SAXParserFactory.newInstance();
+            //获取Sax解析器
+            SAXParser saxParser = factory.newSAXParser();
+            //获取xml读取器
+            XMLReader xmlReader = saxParser.getXMLReader();
+            //设置内容处理器
+            SaxUtil saxUtil = new SaxUtil();
+            xmlReader.setContentHandler(saxUtil);
+            //读取xml
+            xmlReader.parse("src/main/java/com/kevin/coding02/litestruts/struts.xml");
+
+            List<ActionModel> actions = saxUtil.getActions();
+            for (ActionModel action : actions) {
+                if (actionName.equals(action.getActionName())) {
+                    String actionClass = action.getActionClass();
+                    Class<?> clazz = Class.forName(actionClass);
+
+                    Object obj=clazz.newInstance();
+
+                    for (String key : parameters.keySet()) {
+                        if ("name".equals(key)) {
+                            Method setNameMethod = clazz.getDeclaredMethod("setName", String.class);
+                            setNameMethod.invoke(obj, parameters.get(key));
+                        }
+                        if ("password".equals(key)) {
+                            Method setPasswordMethod = clazz.getDeclaredMethod("setPassword", String.class);
+                            setPasswordMethod.invoke(obj, parameters.get(key));
+                        }
+                    }
+
+                    Method executeMethod = clazz.getDeclaredMethod("execute");
+
+                    String flag = (String) executeMethod.invoke(obj);
+
+                    Map<String, String> map = new HashMap<String, String>();
+
+                    for (ResultModel result : action.getResults()) {
+                        if (flag.equals(result.getName())) {
+                            view.setJsp(result.getValue());
+                            Method getMessage = clazz.getDeclaredMethod("getMessage");
+                            map.put("message", String.valueOf(getMessage.invoke(obj)));
+                            view.setParameters(map);
+                        }
+                    }
+
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return view;
+    }
+
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..d27aae176b
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.kevin.coding02.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsTest {
+
+//    @Test
+    public void testLoginActionSuccess() {
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java
new file mode 100644
index 0000000000..75a029b9fa
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.kevin.coding02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml
new file mode 100644
index 0000000000..5a5463b24a
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.kevin.coding02.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java
new file mode 100644
index 0000000000..7321b75482
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java
@@ -0,0 +1,36 @@
+package com.kevin.coding02.model;
+
+import java.util.List;
+
+/**
+ * Created by YinWenBing on 2017/2/28.
+ */
+public class ActionModel {
+    private String actionName;
+    private String actionClass;
+    private List<ResultModel> results;
+
+    public String getActionName() {
+        return actionName;
+    }
+
+    public void setActionName(String actionName) {
+        this.actionName = actionName;
+    }
+
+    public String getActionClass() {
+        return actionClass;
+    }
+
+    public void setActionClass(String actionClass) {
+        this.actionClass = actionClass;
+    }
+
+    public List<ResultModel> getResults() {
+        return results;
+    }
+
+    public void setResults(List<ResultModel> results) {
+        this.results = results;
+    }
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java
new file mode 100644
index 0000000000..568ca66c13
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java
@@ -0,0 +1,25 @@
+package com.kevin.coding02.model;
+
+/**
+ * Created by YinWenBing on 2017/2/28.
+ */
+public class ResultModel {
+    private String name;
+    private String value;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java
new file mode 100644
index 0000000000..0074d295d2
--- /dev/null
+++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java
@@ -0,0 +1,121 @@
+package com.kevin.coding02.util;
+
+import com.kevin.coding02.model.ActionModel;
+import com.kevin.coding02.model.ResultModel;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by YinWenBing on 2017/2/28.
+ */
+public class SaxUtil extends DefaultHandler {
+    private List<ActionModel> actions;
+    private ActionModel action;
+    private List<ResultModel> results;
+    private ResultModel result;
+
+    private String nodeName;
+
+
+    /**
+     * 开始解析文档
+     *
+     * @throws SAXException
+     */
+    @Override
+    public void startDocument() throws SAXException {
+        actions = new ArrayList<ActionModel>();
+    }
+
+    /**
+     * 解析开始节点
+     *
+     * @param uri
+     * @param localName
+     * @param qName
+     * @param attributes
+     * @throws SAXException
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+        if ("action".equals(qName)) {
+            action = new ActionModel();
+            results = new ArrayList<ResultModel>();
+            //获取action节点的name属性
+            action.setActionName(String.valueOf(attributes.getValue(0)));
+            //获取action节点的class属性
+            action.setActionClass(String.valueOf(attributes.getValue(1)));
+        }
+
+        if ("result".equals(qName)) {
+            result = new ResultModel();
+            //获取result节点的name属性
+            result.setName(String.valueOf(attributes.getValue(0)));
+        }
+        nodeName = qName;
+    }
+
+    /**
+     * 获取节点内容
+     *
+     * @param ch
+     * @param start
+     * @param length
+     * @throws SAXException
+     */
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        if (null != nodeName) {
+            String content = new String(ch, start, length);
+            if ("result".equals(nodeName)) {
+                result.setValue(content);
+            }
+        }
+    }
+
+    /**
+     * 解析结束节点
+     *
+     * @param uri
+     * @param localName
+     * @param qName
+     * @throws SAXException
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        if ("result".equals(qName)) {
+            results.add(result);
+            result = null;
+        }
+
+        if ("action".equals(qName)) {
+            action.setResults(results);
+            actions.add(action);
+            action = null;
+        }
+        nodeName = null;
+    }
+
+    /**
+     * 结束遍历文档
+     *
+     * @throws SAXException
+     */
+    @Override
+    public void endDocument() throws SAXException {
+        super.endDocument();
+    }
+
+
+    /**
+     * 返回解析结果
+     */
+    public List<ActionModel> getActions() throws Exception {
+        return actions;
+    }
+
+}
diff --git a/group04/349184132/Study/.classpath b/group04/349184132/Study/.classpath
new file mode 100644
index 0000000000..2a9fa78d5e
--- /dev/null
+++ b/group04/349184132/Study/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="E:/javalab/dom4j/dom4j-1.6.1/dom4j-1.6.1.jar" sourcepath="E:/javalab/dom4j/dom4j-1.6.1/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group04/349184132/Study/.project b/group04/349184132/Study/.project
new file mode 100644
index 0000000000..891c7f798c
--- /dev/null
+++ b/group04/349184132/Study/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Study</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group04/349184132/Study/.settings/org.eclipse.core.resources.prefs b/group04/349184132/Study/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..56bd34e44b
--- /dev/null
+++ b/group04/349184132/Study/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/com/first/ArrayList.java=UTF-8
+encoding//src/com/first/BinaryTreeNode.java=UTF-8
+encoding//src/com/second/Array/ArrayUtil.java=UTF-8
+encoding//src/com/second/LoginAction.java=UTF-8
+encoding//src/com/second/Struts.java=UTF-8
diff --git a/group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs b/group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..a698e59674
--- /dev/null
+++ b/group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs b/group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000000..b196c64a34
--- /dev/null
+++ b/group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/group04/349184132/Study/bin/com/second/struts.xml b/group04/349184132/Study/bin/com/second/struts.xml
new file mode 100644
index 0000000000..554dbbe227
--- /dev/null
+++ b/group04/349184132/Study/bin/com/second/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.second.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.second.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/349184132/Study/bin/com/test/student2.xml b/group04/349184132/Study/bin/com/test/student2.xml
new file mode 100644
index 0000000000..e21862ec75
--- /dev/null
+++ b/group04/349184132/Study/bin/com/test/student2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<student name="zhangsan">
+    <hello>hello text</hello>
+    <world>world text</world>
+</student>
diff --git a/group04/349184132/Study/bin/com/test/students.xml b/group04/349184132/Study/bin/com/test/students.xml
new file mode 100644
index 0000000000..0a503c9f6c
--- /dev/null
+++ b/group04/349184132/Study/bin/com/test/students.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<students name="zhangsan">
+	<hello name="lisi">hello Text1</hello>
+	<hello name="lisi2">hello Text2</hello>
+	<hello name="lisi3">hello Text3</hello>
+	<world name="wangwu">world text1</world>
+	<world name="wangwu2">world text2</world>
+	<world>world text3</world>
+</students>
\ No newline at end of file
diff --git a/group04/349184132/Study/src/com/first/ArrayList.java b/group04/349184132/Study/src/com/first/ArrayList.java
new file mode 100644
index 0000000000..721bf41ad0
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/ArrayList.java
@@ -0,0 +1,86 @@
+package com.first;
+
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData ;
+    
+	private final static int DefaultSize = 10;
+	
+	public ArrayList(){ this(DefaultSize); }
+	
+	public ArrayList(int capacity){
+		if(capacity<0)
+			throw new IllegalArgumentException();
+		elementData = new Object[capacity];
+	}
+	
+	public void add(Object o){
+		if(size==elementData.length)
+			ResizeCapacity();
+		elementData[size++] = o;
+	}
+	
+	private void ResizeCapacity(){
+		Object[] newDatas = new Object[size*2+1];
+		System.arraycopy(elementData,0,newDatas,0,size);
+		elementData = newDatas;
+	}
+	
+	private void rangeCheck(int index){
+		if(index<0 || index > size-1)
+			throw new IllegalArgumentException();
+	}
+	
+	public void add(int index, Object o){
+		rangeCheck(index);
+		//bug size++;
+		System.arraycopy(elementData,index,elementData,index+1,size-index);
+		elementData[index] = o;
+		size++;
+	}
+
+	
+	public Object get(int index){
+		rangeCheck(index);
+		return elementData[index];
+	}
+	
+	public Object remove(int index){
+		rangeCheck(index);
+		Object oldElement = elementData[index];
+		System.arraycopy(elementData,index+1,elementData,index,size-index-1);
+		size--;
+		return oldElement;
+	}
+	
+	public int size(){
+		return size;
+	}
+	public boolean isEmpty(){ return size==0; }
+	
+	public Iterator iterator(){
+		return new ArrayListIterator();
+	}
+
+	private class ArrayListIterator implements Iterator{
+		private int pos = 0;
+		@Override
+		public boolean hasNext() {
+			return pos<size;
+		}
+
+		@Override
+		public Object next() {
+			if(pos>size)
+				throw new IllegalArgumentException();
+			return elementData[pos++];
+		}
+
+	}
+
+	
+	
+}
diff --git a/group04/349184132/Study/src/com/first/BinaryTreeNode.java b/group04/349184132/Study/src/com/first/BinaryTreeNode.java
new file mode 100644
index 0000000000..31647f36dd
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/BinaryTreeNode.java
@@ -0,0 +1,75 @@
+package com.first;
+
+public class BinaryTreeNode {
+
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+
+	private BinaryTreeNode root;
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+	public BinaryTreeNode insert(Object o) {
+		BinaryTreeNode newNode = null; // 新結點
+		if (o == null)
+			throw new NullPointerException("element is not null");
+
+		if (root == null) {
+			root = new BinaryTreeNode();
+			root.setData(o);
+		} else {
+			newNode = new BinaryTreeNode(); 
+			BinaryTreeNode nowNode = root;  //當前結點
+			int val = (int) root.getData();
+			nowNode.setData(o);
+			while (true) {
+
+				if ((int) newNode.getData() < val) { // 新結點的值 ＜ 當前結點
+					if (nowNode.left == null) {
+						nowNode.setLeft(newNode);
+						break;
+					} else {
+						nowNode = nowNode.left;
+					}
+				} else if ((int) newNode.getData() > val) {
+					if (nowNode.right == null) {
+						nowNode.setRight(newNode);
+						break;
+					} else {
+						nowNode = newNode.right;
+
+					}
+				} else {
+
+					throw new IllegalArgumentException("element  exist");
+				}
+			}
+		}
+		return newNode;
+	}
+
+
+}
diff --git a/group04/349184132/Study/src/com/first/Iterator.java b/group04/349184132/Study/src/com/first/Iterator.java
new file mode 100644
index 0000000000..ea250e3cf5
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/Iterator.java
@@ -0,0 +1,7 @@
+package com.first;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group04/349184132/Study/src/com/first/LinkedList.java b/group04/349184132/Study/src/com/first/LinkedList.java
new file mode 100644
index 0000000000..cf9d274943
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/LinkedList.java
@@ -0,0 +1,168 @@
+package com.first;
+
+public class LinkedList implements List {
+
+	private Node head;
+	private Node now;
+	
+
+	private int size = 0;
+
+	public void add(Object o) {
+		if (head == null) {
+			head = new Node(o, null);
+			now = head;
+		} else {
+
+			Node node = new Node(o, null);
+			now.next = node;
+			now = node;
+		}
+		size++;
+
+	}
+
+	private void rangeCheck(int index) {
+		if (index < 0 || index > size - 1)
+			throw new IllegalArgumentException();
+	}
+
+	public void add(int index, Object o) {
+		rangeCheck(index);
+
+		if (index == 0) {
+			addFirst(o);
+		} else {
+			Node node = new Node(o, null);
+			Node now = head;
+			Node next = head;
+			for (int i = 1; i <= index; i++) {
+				next = next.next;
+				if (i == index) {
+					node.next = next;
+					now.next = node;
+				}
+				now = now.next;
+			}
+			size++;
+		}
+	}
+
+	public Object get(int index) {
+		Node indexNode = head;
+		if (index == 0)
+			return indexNode.data;
+		else {
+
+			for (int i = 1; i <= index; i++) {
+				indexNode = indexNode.next;
+				if (i == index)
+					return indexNode.data;
+			}
+		}
+		return null;
+	}
+
+	public Object remove(int index) {
+		rangeCheck(index);
+
+		if (index == 0) {
+			return removeFirst();
+		} else {
+			Node pre = head;
+			Node now = head;
+			for (int i = 1; i <= index; i++) {
+				now = now.next;
+				if (i == index) {
+					pre.next = now.next;
+				}
+				pre = pre.next;
+			}
+			size--;
+			return now.data;
+		}
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	public void addFirst(Object o) {
+		Node oldhead = head;
+		Node newhead = new Node(o, oldhead);
+		head = newhead;
+		size++;
+	}
+
+	public void addLast(Object o) {
+		Node node = head;
+		while (node != null) {
+			node = node.next;
+			if (node == null) {
+				Node lastnode = new Node(o, null);
+				node = lastnode;
+			}
+		}
+		size++;
+	}
+
+	public Object removeFirst() {
+		Node oldhead = head;
+		Node newhead = head.next;
+		oldhead.next = null;
+		head = newhead;
+		size--;
+		return oldhead.data;
+	}
+
+	public Object removeLast() {
+		Node node = head;
+		Node prev = head;
+		while (node != null) {
+			node = node.next;
+			if (node == null) {
+				prev.next = null;
+			}
+			prev = prev.next;
+		}
+		size--;
+		return node.data;
+	}
+
+	public Iterator iterator() {
+		return new LinkedListIterator();
+	}
+
+	private class LinkedListIterator implements Iterator {
+		int pos = 0;
+
+		@Override
+		public boolean hasNext() {
+			return pos < size;
+		}
+
+		@Override
+		public Object next() {
+			if (pos > size)
+				throw new IllegalArgumentException();
+			return get(pos++);
+		}
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+		private Node(Object data, Node next) {
+			this.data = data;
+			this.next = next;
+
+		}
+
+	}
+
+}
diff --git a/group04/349184132/Study/src/com/first/List.java b/group04/349184132/Study/src/com/first/List.java
new file mode 100644
index 0000000000..9c244deb3d
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/List.java
@@ -0,0 +1,9 @@
+package com.first;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group04/349184132/Study/src/com/first/Queue.java b/group04/349184132/Study/src/com/first/Queue.java
new file mode 100644
index 0000000000..130e16930e
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/Queue.java
@@ -0,0 +1,29 @@
+package com.first;
+
+public class Queue {
+	private LinkedList elementData = new LinkedList();
+	private int size = 0;
+	public void enQueue(Object o){
+		elementData.addLast(o);
+		size++;
+	}
+	
+	public Object deQueue(){
+		if(isEmpty())
+			try {
+				throw new IllegalAccessException();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			}
+		size--;
+		return elementData.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		return size==0;
+	}
+	
+	public int size(){
+		return size;
+	}
+}
diff --git a/group04/349184132/Study/src/com/first/Stack.java b/group04/349184132/Study/src/com/first/Stack.java
new file mode 100644
index 0000000000..7d8477b962
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/Stack.java
@@ -0,0 +1,34 @@
+package com.first;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int size = 0;
+	public void push(Object o){
+		elementData.add(o);
+		size++;
+	}
+
+	
+	public Object pop(){
+		if(isEmpty()){
+			try {
+				throw new IllegalAccessException();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			}
+		}
+		return elementData.get(--size);
+	}
+	
+	public Object peek(){
+		return elementData.get(size-1);
+	}
+
+	public boolean isEmpty(){
+		return size==0;
+	}
+
+	public int size(){
+		return size;
+	}
+}
diff --git a/group04/349184132/Study/src/com/first/test/TestArrayList.java b/group04/349184132/Study/src/com/first/test/TestArrayList.java
new file mode 100644
index 0000000000..af7ed55f0a
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/test/TestArrayList.java
@@ -0,0 +1,69 @@
+package com.first.test;
+
+import org.junit.Test;
+
+import com.first.ArrayList;
+import com.first.Iterator;
+
+public class TestArrayList {
+	private ArrayList al = new ArrayList();
+	@Test
+	public void testAddObject() {
+		al.add("1");
+		al.add(12);
+		al.add("wang");
+		
+	}
+
+	@Test
+	public void testAddIntObject() {
+		al.add("1");
+		al.add(12);
+		al.add("wang");
+		
+		al.add(1, 13);
+	}
+
+	@Test
+	public void testGet() {
+		al.add("1");
+		al.add(12);
+		al.add("wang");
+		
+		al.get(1);
+	}
+
+	@Test
+	public void testRemove() {
+		al.add("1");
+		al.add(12);
+		al.add("wang");
+		
+		al.remove(0);
+	}
+
+	@Test
+	public void testSize() {
+		al.size();
+	}
+	
+
+	@Test
+	public void testIsEmpty() {
+		al.isEmpty();
+	}
+
+	@Test
+	public void testIterator() {
+		al.add("1");
+		al.add(12);
+		al.add("wang");
+		
+		Iterator iterator = al.iterator();
+		while(iterator.hasNext()){
+			System.out.println(iterator.next());
+		}
+		
+	}
+
+}
diff --git a/group04/349184132/Study/src/com/first/test/TestLinkedList.java b/group04/349184132/Study/src/com/first/test/TestLinkedList.java
new file mode 100644
index 0000000000..2131e580ff
--- /dev/null
+++ b/group04/349184132/Study/src/com/first/test/TestLinkedList.java
@@ -0,0 +1,97 @@
+package com.first.test;
+
+import org.junit.Test;
+
+import com.first.Iterator;
+import com.first.LinkedList;
+
+public class TestLinkedList {
+	LinkedList link = new LinkedList();
+	@Test
+	public void testAddObject() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+	}
+
+	@Test
+	public void testAddIntObject() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		
+		link.add(2,4);
+	}
+
+	@Test
+	public void testGet() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		link.get(1);
+	}
+
+	@Test
+	public void testRemove() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		
+		link.remove(1);
+	}
+
+	@Test
+	public void testSize() {
+		link.size();
+	}
+
+	@Test
+	public void testIsEmpty() {
+		link.isEmpty();
+	}
+
+	@Test
+	public void testAddFirst() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		
+		link.addFirst(9);
+	}
+
+	@Test
+	public void testAddLast() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		
+		link.addLast(0);
+	}
+
+	@Test
+	public void testRemoveFirst() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		
+		link.removeFirst();
+	}
+
+	@Test
+	public void testRemoveLast() {
+		link.add(1);
+		link.add(2);
+		link.add(3);
+		
+		link.removeLast();
+	}
+
+	@Test
+	public void testIterator() {
+		Iterator iterator = link.iterator();
+		while(iterator.hasNext()){
+			System.out.println(iterator.next());
+		}
+	}
+
+}
diff --git a/group04/349184132/Study/src/com/second/Array/ArrayUtil.java b/group04/349184132/Study/src/com/second/Array/ArrayUtil.java
new file mode 100644
index 0000000000..cd99e201ab
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/Array/ArrayUtil.java
@@ -0,0 +1,257 @@
+package com.second.Array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin) {
+		for (int i = 0, j = origin.length - 1; i < origin.length / 2; i++, j--) {
+			int temp = origin[i];
+			origin[i] = origin[j];
+			origin[j] = temp;
+		}
+		return origin;
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		int count = 0;
+		int[] newArray = new int[oldArray.length];
+		for (int i = 0, j = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				count++;
+				continue;
+			} else
+				newArray[j++] = oldArray[i];
+		}
+		int[] temp = new int[newArray.length-count];
+		System.arraycopy(newArray, 0, temp, 0, temp.length);
+		newArray = temp;
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	// bug
+	public static int[] merge(int[] array1, int[] array2) {
+		int len1 = array1.length;
+		int len2 = array2.length;
+		int[] array3 = new int[len1 + len2];
+		int len3 = len1 + len2;
+		int a1 = 0;
+		int a2 = 0;
+		int a3 = 0;
+		while (len3 > 0) {
+			if (a1 == len1 || a2 == len2) {
+				break;
+			}
+			if (array1[a1] < array2[a2]) {
+				array3[a3] = array1[a1];
+				a1++;
+				a3++;
+			} else {
+				if (array1[a1] > array2[a2]) {
+					array3[a3] = array2[a2];
+					a2++;
+					a3++;
+				} else {
+					array3[a3] = array1[a1];
+					a1++;
+					a2++;
+					a3++;
+				}
+			}
+			len3--;
+		}
+		if (a1 == len1 && a2 == len2) {
+			return array3;
+		}
+		if (a1 == len1) {
+			for (int i = a2; i < len2; i++) {
+				array3[a3] = array2[a2];
+				a3++;
+			}
+		} else {
+			for (int i = a1; i < len1; i++) {
+				array3[a3] = array1[a1];
+				a3++;
+			}
+		}
+		int[] temp = new int[a3];
+		System.arraycopy(array3, 0, temp, 0, temp.length);
+		array3 = temp;
+		return array3;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+		if (max == 1)
+			return new int[0];
+		else {
+			int[] arr = new int[max];
+			arr[0] = 1;
+			arr[1] = 1;
+
+			int val = 0;
+			int f1 = 1;
+			int f2 = 1;
+
+			int index = 2;
+			
+			while (val < max) {
+				val = f1 + f2;
+				if(val>max){
+					break;
+				}
+				f1 = f2;
+				f2 = val;
+				arr[index++] = val;
+			}
+			int[] temp = new int[index];
+			System.arraycopy(arr, 0, temp, 0, temp.length);
+			arr = temp;
+			return arr;
+		}
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		int val = 2; // 数值增加
+		int index = 0; // 数组索引
+		int[] primes = new int[max]; // 存放素数数组
+		boolean flag = true;
+
+		while (val < max) {
+			
+			for (int i = 2; i <val; i++) { // 判定素数
+				if (val % i == 0) {
+					flag = false;
+					break;
+				}
+			}
+			if (flag) {
+				primes[index++] = val;
+			}
+			val++;
+			flag = true;
+		}
+		int[] temp = new int[index];
+		System.arraycopy(primes, 0, temp, 0, temp.length);
+		primes = temp;
+		return primes;
+	}
+
+	private static void rangeCheck(int max) {
+		if (max <= 0)
+			throw new IndexOutOfBoundsException(" max ");
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) {
+		rangeCheck(max);
+		int[] newArray = new int[max];
+		int count = 0;
+		for (int i = 1; i < max; i++) {
+			if (max % i == 0) {
+				newArray[count] = i;
+				count++;
+			}
+		}
+		int sum = 0;
+		for (int i = 0; i < max; i++) {
+			sum = sum + newArray[i];
+		}
+		if (sum == max) {
+			int [] temp = new int[count];
+			System.arraycopy(newArray, 0, temp, 0, temp.length);
+			newArray = temp;
+			System.out.println(sum);
+			return newArray;
+
+		} else {
+			System.out.println("max is not perfectNumber");
+			return null;
+		}
+
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		StringBuilder 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();
+	}
+	public static void main(String[] args) {
+		int i = 1;
+		while(true){
+			int[] temp = getPerfectNumbers(i++);
+			if(temp!=null){
+			System.out.println(Arrays.toString(temp));
+			}
+		}
+	}
+
+}
diff --git a/group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java b/group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java
new file mode 100644
index 0000000000..06944cd8b1
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java
@@ -0,0 +1,84 @@
+package com.second.Array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	
+	@Before
+	public void init(){
+
+	}
+	@Test
+	public void testReverseArray() {
+		int[] origin = {7,9,30,3};
+		int[] end = {3,30,9,7};
+		
+		int[] origin1 = {1,2,3,4,5};
+		int[] end1 = {5,4,3,2,1};
+		
+		
+		Assert.assertArrayEquals(end,ArrayUtil.reverseArray(origin));
+		Assert.assertArrayEquals(end1,ArrayUtil.reverseArray(origin1));
+	}
+
+	@Test
+	public void testRemoveZero() {
+		
+		int[] oldArr = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArr = {1,3,4,5,6,6,5,4,7,6,7,5};
+		Assert.assertArrayEquals(newArr, ArrayUtil.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3,5,7,8};
+		int[] a2 = {4,5,6,7};
+		int[] a3 ={3,4,5,6,7,8};
+		System.out.println(ArrayUtil.merge(a1, a2).length);
+		Assert.assertArrayEquals(a3, ArrayUtil.merge(a1, a2));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArr = {2,3,6};
+		int[] newArr = {2,3,6,0,0,0};
+		Assert.assertArrayEquals(newArr, ArrayUtil.grow(oldArr, 3));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] fibonacci ={1,1,2,3,5,8,13,21};
+		int max = 22;
+		Assert.assertArrayEquals(fibonacci, ArrayUtil.fibonacci(max));
+		int max1 = 1;
+		int[] fibonacci1 = {};
+		Assert.assertArrayEquals(fibonacci1, ArrayUtil.fibonacci(max1));
+		
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] primes = {2,3,5,7,11,13,17,19};
+		int max = 23;
+		Assert.assertArrayEquals(primes, ArrayUtil.getPrimes(max));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int perfectNumber = 6;
+		int[] perfectArr = {1,2,3};
+		Assert.assertArrayEquals(perfectArr, ArrayUtil.getPerfectNumbers(perfectNumber));
+	}
+
+	@Test
+	public void testJoin() {
+		String str = "1-2-4";
+		int[] array = {1,2,4};
+		Assert.assertEquals(str,ArrayUtil.join(array, "-"));
+	}
+
+}
diff --git a/group04/349184132/Study/src/com/second/LoginAction.java b/group04/349184132/Study/src/com/second/LoginAction.java
new file mode 100644
index 0000000000..6dd5deaaf6
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/LoginAction.java
@@ -0,0 +1,39 @@
+package com.second;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group04/349184132/Study/src/com/second/StringUtil.java b/group04/349184132/Study/src/com/second/StringUtil.java
new file mode 100644
index 0000000000..21a3de8e67
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/StringUtil.java
@@ -0,0 +1,33 @@
+package com.second;
+
+public class StringUtil {
+	public static String nameTogetName(String name){
+		String str = name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
+		StringBuilder sb = new StringBuilder(str);
+		sb.insert(0, "get");
+		return sb.toString();
+	}
+	
+	
+	public static String getNameToName(String getName){
+		String str = getName.substring(3, getName.length());
+		String s = str.substring(0, 1).toLowerCase()+str.substring(1, str.length());
+		
+		return s;
+	}
+	
+	public static String nameTosetName(String name){
+		String str = name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
+		StringBuilder sb = new StringBuilder(str);
+		sb.insert(0, "set");
+		return sb.toString();
+	}
+	
+	
+	public static String setnameToname(String getName){
+		
+		String s = getNameToName(getName);
+		
+		return s;
+	}
+}
diff --git a/group04/349184132/Study/src/com/second/Struts.java b/group04/349184132/Study/src/com/second/Struts.java
new file mode 100644
index 0000000000..77110a674c
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/Struts.java
@@ -0,0 +1,125 @@
+package com.second;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	@SuppressWarnings("unchecked")
+	public static View runAction(String actionName,
+			Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 */
+
+		View view = new View();
+		try {
+			// 读取struts.xml 使用dom4j
+			SAXReader saxReader = new SAXReader();
+			Document document = saxReader.read(new File(
+					"src/com/second/struts.xml"));
+
+			String classpath = null;
+			Element actionEle = null; // 存放actionName对应的action元素
+			// 获取根节点
+			Element root = document.getRootElement();
+			for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
+				Element action = it.next();
+				if (actionName.equals(action.attributeValue("name"))) {
+					actionEle = action;
+					classpath = action.attributeValue("class");
+
+				}
+			}
+
+			Class<?> clazz = Class.forName(classpath);
+
+			Object o = clazz.newInstance();
+
+			Set<String> set = parameters.keySet();
+
+			for (Iterator<String> name = set.iterator(); name.hasNext();) {
+				String para = name.next();
+
+				Method m = clazz.getDeclaredMethod(
+						StringUtil.nameTosetName(para), String.class);
+
+				m.invoke(o, parameters.get(para));
+			}
+
+			// 调用execute
+			Method exectue = clazz.getDeclaredMethod("execute", null);
+			String exResult = (String) exectue.invoke(o, null);
+
+			// 获取所有方法
+			Method[] methods = clazz.getDeclaredMethods();
+			for (Method method : methods) {
+				String methodName = method.getName();
+				// 正则过滤 获取getter方法
+				if (methodName.matches("get[a-zA-Z]+")) {
+
+					// 字符串处理 getName --> name
+					parameters.put(StringUtil.getNameToName(methodName),
+							(String) method.invoke(o, null));
+
+				}
+			}
+
+			for (Iterator<Element> iter = actionEle.elementIterator("result"); iter
+					.hasNext();) {
+				Element result = iter.next();
+				String name = result.attributeValue("name");
+				if (name.equals(exResult)) {
+					String jsp = result.getText();
+					view.setJsp(jsp); // 放入View jsp字段中
+				}
+			}
+			view.setParameters(parameters);
+
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+
+		return view;
+
+	}
+
+}
diff --git a/group04/349184132/Study/src/com/second/StrutsTest.java b/group04/349184132/Study/src/com/second/StrutsTest.java
new file mode 100644
index 0000000000..ff297c01ab
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.second;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group04/349184132/Study/src/com/second/View.java b/group04/349184132/Study/src/com/second/View.java
new file mode 100644
index 0000000000..647d88d5f0
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/View.java
@@ -0,0 +1,23 @@
+package com.second;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/349184132/Study/src/com/second/struts.xml b/group04/349184132/Study/src/com/second/struts.xml
new file mode 100644
index 0000000000..554dbbe227
--- /dev/null
+++ b/group04/349184132/Study/src/com/second/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.second.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.second.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/349184132/src/Collection/Onehomework/ArrayList.java b/group04/349184132/src/Collection/Onehomework/ArrayList.java
deleted file mode 100644
index cf1aa4f58e..0000000000
--- a/group04/349184132/src/Collection/Onehomework/ArrayList.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package Collection.Onehomework;
-
-import java.util.Date;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData ;
-
-	public ArrayList(){ this(10); }
-	public ArrayList(int capacity){
-		if(capacity<0)
-			throw new IllegalArgumentException();
-		elementData = new Object[capacity];
-	}
-	public void add(Object o){
-		if(size==elementData.length)
-			ResizeCapacity();
-		elementData[size++] = o;
-	}
-	private void ResizeCapacity(){
-		Object[] newDatas = new Object[size*2+1];
-		System.arraycopy(elementData,0,newDatas,0,size);
-		elementData = newDatas;
-	}
-	private void rangeCheck(int index){
-		if(index<0 || index > size-1)
-			throw new IllegalArgumentException();
-	}
-	public void add(int index, Object o){
-		rangeCheck(index);
-		System.arraycopy(elementData,index,elementData,index+1,size-index);
-		elementData[index] = o;
-		size++;
-	}
-
-	
-	public Object get(int index){
-		rangeCheck(index);
-		return elementData[index];
-	}
-	
-	public Object remove(int index){
-		rangeCheck(index);
-		Object oldElement = elementData[index];
-		System.arraycopy(elementData,index+1,elementData,index,size-index-1);
-		size--;
-		return oldElement;
-	}
-	
-	public int size(){
-		return size;
-	}
-	public boolean isEmpty(){ return size==0; }
-	
-	public Iterator iterator(){
-		return new ArrayListIterator();
-	}
-
-	private class ArrayListIterator implements Iterator{
-		private int pos = 0;
-		@Override
-		public boolean hasNext() {
-			return pos<size;
-		}
-
-		@Override
-		public Object next() {
-			if(pos>size)
-				throw new IllegalArgumentException();
-			return elementData[pos++];
-		}
-
-	}
-
-	public static void main(String[] args) {
-		ArrayList list = new ArrayList();
-		list.add(1);
-		list.add("str");
-		list.add(new Date());
-
-
-
-		Iterator iter = list.iterator();
-		while(iter.hasNext()){
-			System.out.println(iter.next());
-		}
-		list.add(2,123);
-		list.add(0,15);
-		Iterator iter2 = list.iterator();
-		while(iter2.hasNext()){
-			System.out.println(iter2.next());
-		}
-
-
-
-	}
-
-	
-}
diff --git a/group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java b/group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java
deleted file mode 100644
index d57fee396f..0000000000
--- a/group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package Collection.Onehomework;
-
-
-
-
-public class BinaryTreeNode {
-	
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-
-	private BinaryTreeNode root;
-
-	public Object getData() {
-		return data;
-	}
-	public void setData(Object data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-
-
-	public BinaryTreeNode insert(Object o){
-		BinaryTreeNode newNode =null;
-		if(o==null)
-			throw new NullPointerException("数据不能为空");
-
-		if(root==null){
-			root = new BinaryTreeNode();
-			root.setData(o);
-		}else {
-			 newNode = new BinaryTreeNode();
-			 BinaryTreeNode nowNode = root;
-			 int val = (int)root.getData();
-			 nowNode.setData(o);
-			while(true) {
-
-				if ((int)newNode.getData()< val) {
-					if(nowNode.left==null){
-						nowNode.setLeft(newNode);
-						break;
-					} else {
-						nowNode = nowNode.left;
-					}
-				} else if((int)newNode.getData()> val){
-					if (nowNode.right==null ) {
-					nowNode.setRight(newNode);
-						break;
-					} else{
-					nowNode = newNode.right;
-
-					}
-				}else {
-
-					throw new IllegalArgumentException("已存在元素结点");
-				}
-			}
-		}
-		return newNode;
-	}
-
-	public static void main(String[] args) {
-
-	}
-
-
-
-}
diff --git a/group04/349184132/src/Collection/Onehomework/Iterator.java b/group04/349184132/src/Collection/Onehomework/Iterator.java
deleted file mode 100644
index e7c8a4f6d2..0000000000
--- a/group04/349184132/src/Collection/Onehomework/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package Collection.Onehomework;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/group04/349184132/src/Collection/Onehomework/LinkedList.java b/group04/349184132/src/Collection/Onehomework/LinkedList.java
deleted file mode 100644
index e2cb4ca4b1..0000000000
--- a/group04/349184132/src/Collection/Onehomework/LinkedList.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package Collection.Onehomework;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	private Node now ;
-	private int size = 0;
-	public void add(Object o){
-		if(head == null) {
-			head = new Node(o, null);
-			now = head;
-		}
-		else{
-
-			Node node = new Node(o,null);
-			now.next = node;
-			now = node;
-		}
-		size++;
-
-	}
-	private void rangeCheck(int index) {
-		if (index < 0 || index > size - 1)
-			throw new IllegalArgumentException();
-	}
-	public void add(int index , Object o){
-		rangeCheck(index);
-
-		if(index==0){
-			addFirst(o);
-		}else {
-			Node node = new Node(o,null);
-			Node now = head;
-			Node next = head;
-			for (int i = 1; i <= index; i++) {
-				next = next.next;
-				if (i == index) {
-					node.next = next;
-					now.next = node;
-				}
-				now = now.next;
-			}
-			size++;
-		}
-	}
-
-	public Object get(int index){
-		Node indexNode = head;
-			if(index==0)
-				return indexNode.data;
-			else {
-
-				for (int i = 1; i <= index; i++) {
-					indexNode = indexNode.next;
-					if (i == index)
-					return indexNode.data;
-				}
-			}
-		return null;
-	}
-	public Object remove(int index){
-		rangeCheck(index);
-
-		if(index == 0){
-			return removeFirst();
-		}else {
-			Node pre = head;
-			Node now = head;
-			for (int i = 1; i <= index; i++) {
-				now = now.next;
-				if (i == index) {
-					pre.next = now.next;
-				}
-				pre = pre.next;
-			}
-			size--;
-			return now.data;
-		}
-	}
-	
-	public int size(){
-		return size ;
-	}
-
-	public boolean isEmpty(){ return size==0; }
-
-	public void addFirst(Object o){
-		Node oldhead = head;
-		Node newhead = new Node(o,oldhead);
-		head = newhead;
-		size++;
-	}
-	public void addLast(Object o){
-		Node node = head;
-		while(node !=null){
-			node = node.next;
-			if(node==null){
-				Node lastnode = new Node(o,null);
-				node.next = lastnode;
-			}
-		}
-		size++;
-	}
-	public Object removeFirst(){
-		Node oldhead = head;
-		Node newhead = head.next;
-		oldhead.next = null;
-		head = newhead;
-		size--;
-		return oldhead.data;
-	}
-	public Object removeLast(){
-		Node node = head;
-		Node prev = head;
-		while(node !=null){
-			node = node.next;
-			if(node==null){
-				prev.next = null;
-			}
-			prev = prev.next;
-		}
-		size--;
-		return node.data;
-	}
-	public Iterator iterator(){
-		return new LinkedListIterator();
-	}
-	
-	private class LinkedListIterator implements Iterator{
-		int pos = 0;
-		@Override
-		public boolean hasNext() {
-			return pos<size;
-		}
-
-		@Override
-		public Object next() {
-			if(pos>size)
-				throw new IllegalArgumentException();
-			return get(pos++);
-		}
-	}
-	private static  class Node{
-		Object data;
-		Node next;
-		private Node(Object data,Node next){
-			this.data = data;
-			this.next = next;
-
-		}
-
-		
-	}
-
-	public static void main(String[] args) {
-		LinkedList list = new LinkedList();
-		list.add(1);
-		list.add(2);
-		list.add(3);
-		list.add(0,15);
-		list.add(1,14);
-		list.removeLast();
-		list.addFirst(1);
-		list.removeFirst();
-		Iterator iter = list.iterator();
-		while(iter.hasNext()){
-			System.out.println(iter.next());
-		}
-	}
-}
diff --git a/group04/349184132/src/Collection/Onehomework/List.java b/group04/349184132/src/Collection/Onehomework/List.java
deleted file mode 100644
index 015dd06102..0000000000
--- a/group04/349184132/src/Collection/Onehomework/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package Collection.Onehomework;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/group04/349184132/src/Collection/Onehomework/Queue.java b/group04/349184132/src/Collection/Onehomework/Queue.java
deleted file mode 100644
index 341adeeec6..0000000000
--- a/group04/349184132/src/Collection/Onehomework/Queue.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package Collection.Onehomework;
-
-public class Queue {
-	private LinkedList elementData = new LinkedList();
-	private int size = 0;
-	public void enQueue(Object o){
-		elementData.addLast(o);
-		size++;
-	}
-	
-	public Object deQueue(){
-		if(isEmpty())
-			try {
-				throw new IllegalAccessException();
-			} catch (IllegalAccessException e) {
-				e.printStackTrace();
-			}
-		size--;
-		return elementData.removeFirst();
-	}
-	
-	public boolean isEmpty(){
-		return size==0;
-	}
-	
-	public int size(){
-		return size;
-	}
-}
diff --git a/group04/349184132/src/Collection/Onehomework/Stack.java b/group04/349184132/src/Collection/Onehomework/Stack.java
deleted file mode 100644
index a6a488cb05..0000000000
--- a/group04/349184132/src/Collection/Onehomework/Stack.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package Collection.Onehomework;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	private int size = 0;
-	public void push(Object o){
-		elementData.add(o);
-		size++;
-	}
-
-	
-	public Object pop(){
-		if(isEmpty()){
-			try {
-				throw new IllegalAccessException();
-			} catch (IllegalAccessException e) {
-				e.printStackTrace();
-			}
-		}
-		return elementData.get(--size);
-	}
-	
-	public Object peek(){
-		return elementData.get(size-1);
-	}
-
-	public boolean isEmpty(){
-		return size==0;
-	}
-
-	public int size(){
-		return size;
-	}
-}
diff --git a/group04/351121278/src/com/coding/array/ArrayUtil.java b/group04/351121278/src/com/coding/array/ArrayUtil.java
new file mode 100644
index 0000000000..5d494d692d
--- /dev/null
+++ b/group04/351121278/src/com/coding/array/ArrayUtil.java
@@ -0,0 +1,212 @@
+package com.coding.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin){
+        int length = origin.length;
+        int[] temp = new int[length];
+        for (int i = 0; i < length; i++) {
+            temp[i] = origin[length -1 - i];
+        }
+//        origin = Arrays.copyOf(temp, origin.length);
+        for (int i = 0; i< length; i++) {
+            origin[i] = temp[i];
+        }
+    }
+
+
+    /**
+     *  现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray){
+        int locationPointer = 0;//记录0出现位置的指针
+        int indexPonter = 0;//记录0后面的那个非零的数出现位置的指针
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] == 0) {
+                locationPointer = i;
+                for (int j = i; j < oldArray.length; j++) {
+                    if (oldArray[j] != 0) {
+                        indexPonter = j;
+                        break;
+                    }
+                }
+            }
+            oldArray[locationPointer] = oldArray[indexPonter];
+            if (indexPonter != 0) {
+                oldArray[indexPonter] = 0;
+            }
+        }
+        int i;
+        for (i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] == 0) {
+                break;
+            }
+        }
+        int[] newArray = new int[i];
+        System.arraycopy(oldArray, 0, newArray, 0, newArray.length);
+
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2){
+        int length = array1.length + array2.length;
+        int[] newArray = new int[length];
+        for (int i = 0; i < array1.length; i++) {
+            for (int j = 0; j < array2.length; j++) {
+                if (array1[i] < array2[j]) {
+                    newArray[i] = array1[i];
+                } else {
+                    newArray[i] = array2[j];
+                }
+            }
+        }
+        return  newArray;
+    }
+
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int [] oldArray,  int size){
+        int length = oldArray.length + size;
+        int[] newArray = new int[length];
+        System.arraycopy(oldArray, 0, newArray, 0, length);
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max){
+        if (max == 1) {
+            return new int[0];
+        }
+        int a = 0;
+        int b = 1;
+        int c;
+        int[] arr = new int[max];
+        arr[0] = 1;
+        int i = 0;
+        do {
+            c = a + b;
+            a = b;
+            b = c;
+            arr[i++] = c;
+        } while (c < max);
+        int[] result = new int[i];
+        System.arraycopy(arr, 0, result, 0, i);
+        return result;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max){
+         // 素数的定义： 只能被1和他本身整除的数
+        //因为1不是素数，所以循环从2开始
+        boolean flag = true;
+        int[] primesTemp = new int[max];
+        int index = 0;
+        for (int i = 2; i < max; i++) {
+            for (int j = 2; j < i; j++) {
+                if (i % j== 0) {
+                    flag = false;
+                    break;
+                }
+            }
+            if (flag) {
+                primesTemp[index] = i;
+                index++;
+            }
+            flag = true;
+        }
+        int[] primes= new int[index];
+        System.arraycopy(primesTemp, 0, primes, 0, primes.length);
+
+        return primes;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于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 / 2 + 1; j++) {
+                if (i % j == 0) {
+                    sum += j;
+                }
+            }
+            if (sum == i) {
+                temp[index] = i;
+                index++;
+            }
+        }
+        int[] result = new int[index];
+        System.arraycopy(temp, 0, result, 0, result.length);
+
+        return result;
+    }
+
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator){
+        String str = "";
+        for (int i = 0; i < array.length; i++) {
+            if (i != 0) {
+                str = str + seperator + array[i];
+            } else {
+                str = str + array[i];
+            }
+        }
+        return str;
+    }
+
+}
\ No newline at end of file
diff --git a/group04/351121278/351121278/src/com/coding/basic/ArrayList.java b/group04/351121278/src/com/coding/basic/ArrayList.java
similarity index 100%
rename from group04/351121278/351121278/src/com/coding/basic/ArrayList.java
rename to group04/351121278/src/com/coding/basic/ArrayList.java
diff --git a/group04/351121278/351121278/src/com/coding/basic/Iterator.java b/group04/351121278/src/com/coding/basic/Iterator.java
similarity index 100%
rename from group04/351121278/351121278/src/com/coding/basic/Iterator.java
rename to group04/351121278/src/com/coding/basic/Iterator.java
diff --git a/group04/351121278/351121278/src/com/coding/basic/LinkedList.java b/group04/351121278/src/com/coding/basic/LinkedList.java
similarity index 100%
rename from group04/351121278/351121278/src/com/coding/basic/LinkedList.java
rename to group04/351121278/src/com/coding/basic/LinkedList.java
diff --git a/group04/351121278/351121278/src/com/coding/basic/List.java b/group04/351121278/src/com/coding/basic/List.java
similarity index 100%
rename from group04/351121278/351121278/src/com/coding/basic/List.java
rename to group04/351121278/src/com/coding/basic/List.java
diff --git a/group04/351121278/351121278/src/com/coding/basic/Queue.java b/group04/351121278/src/com/coding/basic/Queue.java
similarity index 100%
rename from group04/351121278/351121278/src/com/coding/basic/Queue.java
rename to group04/351121278/src/com/coding/basic/Queue.java
diff --git a/group04/351121278/351121278/src/com/coding/basic/Stack.java b/group04/351121278/src/com/coding/basic/Stack.java
similarity index 100%
rename from group04/351121278/351121278/src/com/coding/basic/Stack.java
rename to group04/351121278/src/com/coding/basic/Stack.java
diff --git a/group04/351121278/src/com/coding/litestruts/LoginAction.java b/group04/351121278/src/com/coding/litestruts/LoginAction.java
new file mode 100644
index 0000000000..94ae9fccee
--- /dev/null
+++ b/group04/351121278/src/com/coding/litestruts/LoginAction.java
@@ -0,0 +1,41 @@
+package com.coding.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+//        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group04/351121278/src/com/coding/litestruts/Struts.java b/group04/351121278/src/com/coding/litestruts/Struts.java
new file mode 100644
index 0000000000..e1cc8d6add
--- /dev/null
+++ b/group04/351121278/src/com/coding/litestruts/Struts.java
@@ -0,0 +1,214 @@
+package com.coding.litestruts;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+		0. 读取配置文件struts.xml
+		dom4j 来读取
+		*/
+
+        List<Element> elements = null;
+        try {
+            elements = openStrutsXML("struts.xml");
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+        for (Element element: elements) {
+            String name = element.attribute("name").getValue();
+            String aClass = element.attribute("class").getValue();
+            /*
+            1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+            据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+             ("name"="test" ,  "password"="1234") ,那就应该调用 setName和setPassword方法
+             */
+
+            //此时的name等于传入的actionName
+            Class<?> clazz = null;
+            try {
+                clazz = Class.forName(aClass);
+            } catch (ClassNotFoundException e) {
+                e.printStackTrace();
+            }
+            Object obj = null;
+            try {
+                obj = clazz.newInstance();
+            } catch (InstantiationException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+            for (Map.Entry entry: parameters.entrySet()) {
+                String key = entry.getKey().toString();
+                String parSetName = parSetName(key);
+                Method method = null;
+                try {
+                    method = clazz.getMethod(parSetName, String.class);
+                } catch (NoSuchMethodException e) {
+                    e.printStackTrace();
+                }
+                try {
+                    method.invoke(obj, entry.getValue());
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                } catch (InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            //2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+            Method execute = null;
+            try {
+                execute = clazz.getMethod("execute", null);
+            } catch (NoSuchMethodException e) {
+                e.printStackTrace();
+            }
+            Object result = null;
+            try {
+                result = execute.invoke(obj, null);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+
+            Map resultParameters = new HashMap();
+
+            // 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+            // 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+            // 放到View对象的parameters
+            Field[] fields = clazz.getDeclaredFields();
+            //此处取到的方法是所有的public修饰的方法
+            Method[] methods = clazz.getMethods();
+            for (Field field: fields) {
+                String fieldName = field.getName();
+                String parGetName = parGetName(fieldName);
+                boolean isGetMethod = checkGetMethod(methods, parGetName);
+                if (!isGetMethod) {
+                    continue;
+                }
+                Method method = null;
+                try {
+                    method = clazz.getMethod(parGetName, null);
+                } catch (NoSuchMethodException e) {
+                    e.printStackTrace();
+                }
+                try {
+                    Object getResult = method.invoke(obj, null);
+                    if (getResult != null) {
+                        resultParameters.put(fieldName, getResult.toString());
+                    }
+                    //如果execute方法返回fail，添加错误信息到map中
+                    if ("fail".equals(result)) {
+                        resultParameters.put("message", "login failed,please check your user/pwd");
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                } catch (InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            //4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+            //放到View对象的jsp字段中。
+            List<Element> resultElements = element.elements("result");
+            for (Element resultElemnt: resultElements) {
+                Attribute resultNode = resultElemnt.attribute("name");
+                String resultValue = resultNode.getValue();
+                String resultJsp = resultElemnt.getTextTrim();
+                if (result.equals(resultValue)) {
+                    View view = new View();
+                    view.setJsp(resultJsp);
+                    view.setParameters(resultParameters);
+                    return view;
+                }
+            }
+
+        }
+
+        return null;
+    }
+
+    /**
+     * 打开struts.xml文件，
+     * @param strutsXMLPath struts.xml文件的位置
+     * @return List<Element>节点对象
+     * @throws DocumentException
+     */
+    public static List<Element> openStrutsXML(String strutsXMLPath) throws DocumentException {
+        InputStream in = View.class.getResourceAsStream(strutsXMLPath);
+        SAXReader reader = new SAXReader();
+        Document document = reader.read(in);
+        Element rootElement = document.getRootElement();
+        return (List<Element>) rootElement.elements("action");
+    }
+
+    /**
+     * 拼接属性的get方法
+     * @param fieldName
+     * @return
+     */
+    public static String parGetName(String fieldName) {
+        if (null == fieldName || "".equals(fieldName)) {
+            return null;
+        }
+        int startIndex = 0;
+        if (fieldName.charAt(0) == '_')
+            startIndex = 1;
+        return "get"
+                + fieldName.substring(startIndex, startIndex + 1).toUpperCase()
+                + fieldName.substring(startIndex + 1);
+    }
+
+    /**
+     * 拼接在某属性的 set方法
+     *
+     * @param fieldName
+     * @return String
+     */
+    public static String parSetName(String fieldName) {
+        if (null == fieldName || "".equals(fieldName)) {
+            return null;
+        }
+        int startIndex = 0;
+        if (fieldName.charAt(0) == '_')
+            startIndex = 1;
+        return "set"
+                + fieldName.substring(startIndex, startIndex + 1).toUpperCase()
+                + fieldName.substring(startIndex + 1);
+    }
+
+    /**
+     * 判断是否存在某属性的 get方法
+     *
+     * @param methods
+     * @param fieldGetMet
+     * @return boolean
+     */
+    public static boolean checkGetMethod(Method[] methods, String fieldGetMet) {
+        for (Method met : methods) {
+            if (fieldGetMet.equals(met.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+}
\ No newline at end of file
diff --git a/group04/351121278/src/com/coding/litestruts/StrutsTest.java b/group04/351121278/src/com/coding/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..6266e4872c
--- /dev/null
+++ b/group04/351121278/src/com/coding/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package com.coding.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String,String> 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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
diff --git a/group04/351121278/src/com/coding/litestruts/View.java b/group04/351121278/src/com/coding/litestruts/View.java
new file mode 100644
index 0000000000..70b1cfb584
--- /dev/null
+++ b/group04/351121278/src/com/coding/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coding.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+    public Map getParameters() {
+        return parameters;
+    }
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
\ No newline at end of file
diff --git a/group04/351121278/src/com/coding/litestruts/struts.xml b/group04/351121278/src/com/coding/litestruts/struts.xml
new file mode 100644
index 0000000000..b4e83a012a
--- /dev/null
+++ b/group04/351121278/src/com/coding/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/465034663/.classpath b/group04/465034663/.classpath
new file mode 100644
index 0000000000..d171cd4c12
--- /dev/null
+++ b/group04/465034663/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group04/465034663/.gitignore b/group04/465034663/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group04/465034663/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group04/465034663/.project b/group04/465034663/.project
new file mode 100644
index 0000000000..fa51ef6448
--- /dev/null
+++ b/group04/465034663/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>DataStruct</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group04/465034663/.settings/org.eclipse.core.resources.prefs b/group04/465034663/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..4824b80263
--- /dev/null
+++ b/group04/465034663/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/group04/465034663/.settings/org.eclipse.core.runtime.prefs b/group04/465034663/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000000..f8a67de1d4
--- /dev/null
+++ b/group04/465034663/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\r\n
diff --git a/group04/465034663/src/com/xusheng/arraylist/MyArrayList.java b/group04/465034663/src/com/xusheng/arraylist/MyArrayList.java
new file mode 100644
index 0000000000..5030a33f09
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/arraylist/MyArrayList.java
@@ -0,0 +1,130 @@
+package com.xusheng.arraylist;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public class MyArrayList<T> implements Iterable<T>{
+
+	private T[] item;
+	
+	private static final int DEFAULT_CAPACITY = 10;
+	
+	private int size;
+	
+	public int size(){
+		return size;
+	}
+	
+	private void doClear(){
+		this.size = 0;
+		ensureCapacity(DEFAULT_CAPACITY);
+	}
+	
+	/**
+	 * 此方法用于确定list的容量
+	 * @param newCapacity
+	 */
+	public void ensureCapacity(int newCapacity){
+		if(newCapacity < size){
+			return;
+		}
+		
+		T[] old = item;
+		item = (T[]) new Object[newCapacity];
+		for(int i=0;i<size();i++){
+			item[i] = old[i];
+		}
+	}
+	
+	public MyArrayList(){
+		doClear();
+	}
+	
+	public MyArrayList(int capacity){
+		doClear();
+		ensureCapacity(capacity);
+	}
+	
+	public boolean isEmpty(){
+		return size()==0;
+	}
+	
+	public void add(int index,T element){
+		if(index<0 || index > size){
+			throw new ArrayIndexOutOfBoundsException();
+		}
+		if(item.length == size){
+			ensureCapacity(size*2+1);
+		}
+		for(int i=size;i>index;i--){
+			item[i] = item[i-1];
+		}
+		item[index] = element;
+		size++;
+	}
+	
+	public boolean add(T element){
+		add(size,element);
+		return true;
+	}
+	
+	public T get(int index){
+		if(index<0 || index>=size){
+			throw new ArrayIndexOutOfBoundsException();
+		}
+		return item[index];
+	}
+
+	public T set(int index,T element){
+		if(index<0 || index>=size){
+			throw new ArrayIndexOutOfBoundsException();
+		}
+		T old = item[index];
+		item[index] = element;
+		return old;
+	}
+	
+	public T remove(int index){
+		if(index<0 || index>=size){
+			throw new ArrayIndexOutOfBoundsException();
+		}
+		T moved = item[index];
+		for(int i=size-1;i>index;i++){
+			item[i-1] = item[i];
+		}
+		size--;
+		return moved;
+	}
+	
+	public void trimToSize(){
+		ensureCapacity(size);
+	}
+	
+	@Override
+	public Iterator<T> iterator() {
+		return new ArrayListIterator();
+	}
+	
+	private class ArrayListIterator implements Iterator<T>{
+		
+		private int currentIndex = 0;
+
+		@Override
+		public boolean hasNext() {
+			return currentIndex<size;
+		}
+
+		@Override
+		public T next() {
+			if(!hasNext()){
+				throw new NoSuchElementException();
+			}
+			return item[currentIndex++];
+		}
+		
+		public void remove(){
+			MyArrayList.this.remove(--currentIndex);
+		}
+		
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/arraylist/MyCollection.java b/group04/465034663/src/com/xusheng/arraylist/MyCollection.java
new file mode 100644
index 0000000000..fb38db5967
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/arraylist/MyCollection.java
@@ -0,0 +1,19 @@
+package com.xusheng.arraylist;
+
+public interface MyCollection<T> extends MyIterator<T>{
+
+	int size();
+	
+	boolean isEmpty();
+	
+	void clear();
+	
+	boolean contains(T element);
+	
+	boolean add(T element);
+	
+	boolean remove(T element);
+	
+	MyIterator<T> myIterator();
+	
+}
diff --git a/group04/465034663/src/com/xusheng/arraylist/MyIterator.java b/group04/465034663/src/com/xusheng/arraylist/MyIterator.java
new file mode 100644
index 0000000000..e37d82cfb1
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/arraylist/MyIterator.java
@@ -0,0 +1,10 @@
+package com.xusheng.arraylist;
+
+public interface MyIterator<T> {
+
+	boolean hasNext();
+	
+	T next();
+	
+	void remove();
+}
diff --git a/group04/465034663/src/com/xusheng/arraylist/MyList.java b/group04/465034663/src/com/xusheng/arraylist/MyList.java
new file mode 100644
index 0000000000..e73a27e96b
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/arraylist/MyList.java
@@ -0,0 +1,14 @@
+package com.xusheng.arraylist;
+
+public interface MyList<T> extends MyCollection<T> {
+
+	T get(int index);
+	
+	T set(int index,T element);
+	
+	void add(int index,T element);
+	
+	void remove(int index,T element);
+	
+	MyListIterator<T> myListIterator();
+}
diff --git a/group04/465034663/src/com/xusheng/arraylist/MyListIterator.java b/group04/465034663/src/com/xusheng/arraylist/MyListIterator.java
new file mode 100644
index 0000000000..c6ca8604e9
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/arraylist/MyListIterator.java
@@ -0,0 +1,12 @@
+package com.xusheng.arraylist;
+
+public interface MyListIterator<T> extends MyIterator<T>{
+
+	boolean hasPrevious();
+	
+	T previous();
+	
+	void add(T element);
+	
+	void set(T element);
+}
diff --git a/group04/465034663/src/com/xusheng/arraylist/TestData.java b/group04/465034663/src/com/xusheng/arraylist/TestData.java
new file mode 100644
index 0000000000..c1f5f4c499
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/arraylist/TestData.java
@@ -0,0 +1,29 @@
+package com.xusheng.arraylist;
+
+import java.util.Iterator;
+
+public class TestData {
+
+	public static void main(String[] args) {
+		MyArrayList<String> mal = new MyArrayList<String>();
+		mal.add("haha");
+		mal.add("haha2");
+//		System.out.println(mal.size());
+//		for(int i=0;i<mal.size();i++){
+//			System.out.println(mal.get(i));
+//		}
+//		System.out.println(mal.set(1, "heihei"));
+//		System.out.println(mal.get(1));
+//		System.out.println(mal.size());
+//		System.out.println(mal.remove(1));
+//		for(int i=0;i<mal.size();i++){
+//			System.out.println(mal.get(i));
+//		}
+//		System.out.println(mal.size());
+		Iterator i = (Iterator) mal.iterator();
+		while(i.hasNext()){
+			System.out.println(i.next());
+			
+		}
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/linkedlist/MyLinkedList.java b/group04/465034663/src/com/xusheng/linkedlist/MyLinkedList.java
new file mode 100644
index 0000000000..c884cba1d3
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/linkedlist/MyLinkedList.java
@@ -0,0 +1,180 @@
+package com.xusheng.linkedlist;
+
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public class MyLinkedList<T> implements Iterable<T> {
+	private int size;
+	private int modCount=0;
+	private Node<T> beginMarker;
+	private Node<T> endMarker;
+	
+	public MyLinkedList() {
+		doClear();
+	}
+	
+	public void clear(){
+		doClear();
+	}
+
+	public void doClear(){
+		beginMarker = new Node<T>(null,null,null);
+		endMarker = new Node<T>(null,beginMarker,null);
+		beginMarker.next = endMarker;
+		
+		this.size = 0;
+		this.modCount++;
+	}
+
+	public int size(){
+		return this.size;
+	}
+	
+	public boolean isEmpty(){
+		return size==0;
+	}
+	
+	public void add(int index,T element){
+		addBefore(getNode(index),element);
+	}
+	
+	public boolean add(T element){
+		add(size,element);
+		return true;
+	}
+	
+	public T get(int index){
+		return getNode(index).data;
+	}
+	
+	public T set(int index,T element){
+		Node<T> node = getNode(index);
+		T oldElement = node.data;
+		node.data = element;
+		return oldElement;
+	}
+
+	public T remove(int index){
+		return remove(getNode(index));
+	}
+	
+	//此方法用于判断集合中是否含有输入的元素
+	public boolean contains(T element){
+		for(int i=0;i<size;i++){
+			if(element.equals(getNode(i).data)){
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	//该方法用于index对应的元素与后一个元素进行位置调换
+	public void change(int index){
+		Node<T> node = getNode(index);
+		Node<T> beforep,afterp;
+		beforep = node.prev;
+		afterp = node.next;
+		
+		beforep.next = afterp;
+		afterp.prev = beforep;
+		
+		node.next = afterp.next;
+		node.prev = afterp;
+		
+		afterp.next = node;
+		afterp.prev = beforep;
+		
+	}
+	
+	private T remove(Node<T> delNode){
+		delNode.next.prev = delNode.prev;
+		delNode.prev.next = delNode.next;
+		size--;
+		modCount++;
+		return delNode.data;
+	}
+	
+	private void addBefore(Node<T> p,T element){
+		Node<T> newNode = new Node<T>(element,p.prev,p);
+		newNode.prev.next = newNode;
+		p.prev = newNode;
+		this.size++;
+		this.modCount++;
+	}
+	
+	private Node<T> getNode(int index){
+		Node<T> p;
+		if(index>=0 && index<=size){
+			if(index<(size/2)){
+				p = beginMarker.next;
+				for(int i=0;i<index;i++){
+					p = p.next;
+				}
+			}else{
+				p = endMarker;
+				for(int i=size;i>index;i--){
+					p = p.prev;
+				}
+			}
+		}else{
+			throw new IndexOutOfBoundsException();
+		}
+		return p;
+	}
+	
+	@Override
+	public Iterator<T> iterator() {
+		return new LinkedListIterator();
+	}
+	
+	private class Node<T>{
+		public T data;
+		public Node<T> prev;
+		public Node<T> next;
+		public Node(T data, Node<T> prev, Node<T> next) {
+			this.data = data;
+			this.prev = prev;
+			this.next = next;
+		}
+	}
+	
+	private class LinkedListIterator implements Iterator<T>{
+
+		private Node<T> current = beginMarker.next;
+		private int expectedModCount = modCount;
+		private boolean okToRemove = false;
+		
+		@Override
+		public boolean hasNext() {
+			return current != endMarker;
+		}
+
+		@Override
+		public T next(){
+			if(modCount != expectedModCount){
+				throw new ConcurrentModificationException();
+			}
+			if(!hasNext()){
+				throw new NoSuchElementException();
+			}
+			T n = current.data;
+			current = current.next;
+			okToRemove = true;
+			return n;
+		}
+		
+		public void remove(){
+			if(modCount != expectedModCount){
+				throw new ConcurrentModificationException();
+			}
+			if(!okToRemove){
+				throw new IllegalStateException();
+			}
+			MyLinkedList.this.remove(current.prev);
+			size--;
+			expectedModCount++;
+			okToRemove = false;
+		}
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/linkedlist/TestMain.java b/group04/465034663/src/com/xusheng/linkedlist/TestMain.java
new file mode 100644
index 0000000000..1e4f735446
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/linkedlist/TestMain.java
@@ -0,0 +1,38 @@
+package com.xusheng.linkedlist;
+
+import java.util.Iterator;
+
+public class TestMain {
+
+	public static void main(String[] args) {
+		MyLinkedList<String> mll = new MyLinkedList<String>();
+		mll.add(0, "haha1");
+		mll.add(1,"haha2");
+		mll.add(2, "haha3");
+		mll.add(3,"haha4");
+		mll.add("haha5");
+		for(int i=0;i<mll.size();i++){
+			System.out.println(mll.get(i));
+		}
+		System.out.println(mll.isEmpty());
+		System.out.println(mll.size());
+		System.out.println(mll.set(3, "heihei"));
+		System.out.println("get:"+mll.get(4));
+		System.out.println("remove:"+mll.remove(3));
+		for(int i=0;i<mll.size();i++){
+			System.out.println(mll.get(i));
+		}
+		
+//		while(i.hasNext()){
+//			System.out.println("迭代器2："+i.next());
+//			i.remove();
+//		}
+		
+		System.out.println(mll.contains("haha0"));
+		mll.change(0);
+		Iterator i = mll.iterator();
+		while(i.hasNext()){
+			System.out.println("迭代器1："+i.next());
+		}
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/stack/MyLinkedStack.java b/group04/465034663/src/com/xusheng/stack/MyLinkedStack.java
new file mode 100644
index 0000000000..537e075f1b
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/stack/MyLinkedStack.java
@@ -0,0 +1,98 @@
+package com.xusheng.stack;
+
+/**
+ * 使用链表结构实现栈
+ * @author xusheng
+ *
+ */
+public class MyLinkedStack<T> {
+
+	private int size;
+	private int modCount;
+	private Node<T> beginMarker;
+	private Node<T> endMarker;
+	private int currentIndex = size;
+	
+	
+	
+	public MyLinkedStack() {
+		doClear();
+	}
+
+	private void doClear(){
+		this.size=0;
+		this.modCount=0;
+		beginMarker = new Node<T>(null,null,null);
+		endMarker = new Node<T>(null,beginMarker,null);
+		beginMarker.next = endMarker;
+	}
+	
+	public int size(){
+		return this.size;
+	}
+	
+	public T get(int index){
+		Node<T> n = get(index,0,size);
+		return n.data;
+	}
+	
+	public T pop(){
+		Node<T> n = get(this.size-1,0,size);
+		T old = n.data;
+		n.prev.next = n.next;
+		n.next.prev = n.prev;
+		this.size--;
+		return n.data;
+	}
+	
+	public void push(T element){
+		add(size,element);
+	}
+	
+	public void add(int index,T element){
+		addBefore(get(index,0,size),element);
+	}
+	
+	private void addBefore(Node<T> n,T element){
+		Node<T> newNode = new Node<T>(element,n.prev,n);
+		n.prev.next = newNode;
+		n.prev = newNode;
+		this.size++;
+		this.modCount++;
+	}
+	
+	private Node<T> get(int index,int low,int upper){
+		if(index<low || index>upper){
+			throw new IndexOutOfBoundsException();
+		}
+		Node<T> p;
+		if(index<(size/2)){
+			p = beginMarker.next;
+			for(int i=0;i<index;i++){
+				p = p.next;
+			}
+		}else{
+			p = endMarker;
+			for(int i=size;i>index;i--){
+				p = p.prev;
+			}
+		}
+		return p;
+	}
+	
+	private class Node<T>{
+		
+		private T data;
+		private Node<T> prev;
+		private Node<T> next;
+		public Node(T data, Node<T> prev, Node<T> next) {
+			super();
+			this.data = data;
+			this.prev = prev;
+			this.next = next;
+		}
+		
+		
+		
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java b/group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java
new file mode 100644
index 0000000000..1f9f722d46
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java
@@ -0,0 +1,52 @@
+package com.xusheng.stack;
+
+/**
+ * 此栈是用单链表实现
+ * @author xusheng
+ *
+ */
+public class MyLinkedStack2<T> {
+
+	private Node<T> beginNode;
+	private Node<T> endNode;
+	private int size;
+	
+	
+	
+	public MyLinkedStack2() {
+		size = 0;
+		doClear();
+	}
+
+	private void doClear(){
+		endNode = new Node<T>(null,null);
+		beginNode = new Node<T>(null,beginNode);
+	}
+	
+	private void insert(Node<T> p,T element){
+		Node<T> newNode = new Node<T>(element,p.next);
+		p.next = newNode;
+		this.size++;
+	}
+	
+	private Node getNode(int index){
+		Node<T> p;
+		p = beginNode.next;
+		for(int i=0;i<index;i++){
+			p = p.next;
+		}
+		return p;
+	}
+	
+	private class Node<T>{
+		public T data;
+		public Node<T> next;
+		public Node(T data, Node<T> next) {
+			this.data = data;
+			this.next = next;
+		}
+		
+		
+	}
+	
+}
diff --git a/group04/465034663/src/com/xusheng/stack/TestMain.java b/group04/465034663/src/com/xusheng/stack/TestMain.java
new file mode 100644
index 0000000000..eedb3e1354
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/stack/TestMain.java
@@ -0,0 +1,17 @@
+package com.xusheng.stack;
+
+public class TestMain {
+
+	public static void main(String[] args) {
+		MyLinkedStack<String> mls = new MyLinkedStack<String>();
+		mls.add(0,"haha1");
+		mls.add(1, "haha2");
+		mls.push("haha3");
+		System.out.println(mls.pop());
+		System.out.println(mls.size());
+		System.out.println(mls.pop());
+		System.out.println(mls.size());
+		System.out.println(mls.pop());
+		System.out.println(mls.size());
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/tree/AvlTree.java b/group04/465034663/src/com/xusheng/tree/AvlTree.java
new file mode 100644
index 0000000000..d4e1beb500
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/tree/AvlTree.java
@@ -0,0 +1,217 @@
+package com.xusheng.tree;
+
+/**
+ * 实现平衡二叉树
+ * @author xusheng
+ *
+ * @param <T>
+ */
+public class AvlTree<T extends Comparable<? super T>> {
+
+	private AvlNode<T> root;
+	
+	public AvlTree() {
+		this.root = null;
+	}
+	
+	/**
+	 * 对不平衡点的左儿子的左子树进行插入
+	 * 将二叉树围绕不平衡点的左子节点进行左旋转
+	 * @param k2
+	 * @return
+	 */
+	private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2){
+		AvlNode<T> k1 = k2.leftNode;
+		k2.leftNode = k1.rightNode;
+		k1.rightNode = k2;
+		k2.height = Math.max(height(k2.leftNode), height(k2.rightNode))+1;
+		k1.height = Math.max(height(k1.leftNode), k2.height)+1;
+		return k1;
+	}
+	
+	/**
+	 * 对不平衡点的右儿子的右子树进行插入
+	 * 将二叉树围绕不平衡点的右子节点进行旋转
+	 * @param k2
+	 * @return
+	 */
+	private AvlNode<T> rotateWithRightChild(AvlNode<T> k2){
+		AvlNode<T> k1 = k2.rightNode;
+		k2.rightNode = k1.leftNode;
+		k1.leftNode = k2;
+		k2.height = Math.max(height(k2.leftNode), height(k2.rightNode))+1;
+		k1.height = Math.max(height(k1.rightNode), k2.height)+1;
+		return k1;
+	}
+	
+	/**
+	 * 对不平衡点的左儿子的右子树进行插入
+	 * 先将二叉树不平衡点的左儿子围绕它的右子节点旋转
+	 * 后将二叉树围绕不平衡点的左儿子进行旋转
+	 * @param k3
+	 * @return
+	 */
+	private AvlNode<T> doubleRotateWithLeftChild(AvlNode<T> k3){
+		k3.leftNode = rotateWithRightChild(k3.leftNode);
+		return rotateWithLeftChild(k3);
+	}
+	
+	/**
+	 * 对不平衡点的右儿子的左子树进行插入
+	 * 先将二叉树不平衡点的右儿子围绕它的左子节点旋转
+	 * 后将二叉树围绕不平衡点的右儿子进行旋转
+	 * @param k3
+	 * @return
+	 */
+	private AvlNode<T> doubleRotateWithRightChild(AvlNode<T> k3){
+		k3.rightNode = rotateWithLeftChild(k3.rightNode);
+		return rotateWithRightChild(k3);
+	}
+	
+	private static final int ALLOW_IMBALANCE = 1;//该常量表示数的高度差最多为1
+	/**
+	 * 此方法用来对二叉树进行平衡
+	 * @param node
+	 * @return
+	 */
+	private AvlNode<T> balance(AvlNode<T> node){
+		
+		if(node == null){
+			return node;
+		}
+		
+		if(height(node.leftNode) - height(node.rightNode) > ALLOW_IMBALANCE){
+			if(height(node.leftNode.leftNode) >= height(node.leftNode.rightNode)){
+				node = rotateWithLeftChild(node);
+			}else{
+				node = doubleRotateWithLeftChild(node);
+			}
+		}else if(height(node.rightNode) - height(node.leftNode) > ALLOW_IMBALANCE){
+			if(height(node.rightNode.rightNode) >= height(node.rightNode.leftNode)){
+				node = rotateWithRightChild(node);
+			}else{
+				node = doubleRotateWithRightChild(node);
+			}
+		}
+		
+		node.height = Math.max(height(node.leftNode), height(node.rightNode))+1;
+		
+		return node;
+	}
+	private int height(AvlNode<T> t){
+		return t == null ? -1 : t.height;
+	}
+
+	public boolean isEmpty(){
+		return this.root == null;
+	}
+	
+	public void insert(T element){
+		root = insert(element,root);
+	}
+	
+	private AvlNode<T> insert(T element,AvlNode<T> node){
+		if(node == null){
+			return new AvlNode<T>(element,null,null); 
+		}
+		
+		int intCompare = element.compareTo(node.data);
+		
+		if(intCompare < 0){
+			node.leftNode = insert(element,node.leftNode);
+		}else if(intCompare > 0){
+			node.rightNode = insert(element,node.rightNode);
+		}
+		return node;
+	}
+	
+	
+	public boolean contains(T element){
+		return contains(element,root);
+	}
+	
+	private boolean contains(T element,AvlNode<T> node){
+		
+		if(node == null){
+			return false;
+		}
+		
+		int intCompare = element.compareTo(node.data);
+		
+		if(intCompare < 0){
+			return contains(element,node.leftNode);
+		}else if(intCompare > 0){
+			return contains(element,node.rightNode);
+		}else{
+			return true;
+		}
+	}
+	
+	public void remove(T element){
+		remove(element,root);
+	}
+	
+	private AvlNode<T> remove(T element,AvlNode<T> node){
+		if(node == null){
+			return node;
+		}
+		
+		int intCompare = element.compareTo(node.data);
+		
+		if(intCompare < 0){
+			node.leftNode = remove(element,node.leftNode);
+		}else if(intCompare > 0){
+			node.rightNode = remove(element,node.rightNode);
+		}
+		else if(node.leftNode != null && node.rightNode != null){
+			node.data = findMin(node).data;
+			node.rightNode = remove(node.data,node.rightNode);
+		}else{
+			node = (node.leftNode != null) ? node.leftNode : node.rightNode;
+		}
+		return node;
+	}
+	
+
+	private AvlNode<T> findMin(AvlNode<T> node){
+		if(node == null){
+			return null;
+		}else if(node.leftNode == null){
+			return node;
+		}else{
+			return findMin(node.leftNode);
+		}
+	}
+	
+	private AvlNode<T> findMax(AvlNode<T> node){
+		if(node == null){
+			return null;
+		}
+		
+		while(node.rightNode != null){
+			node = node.rightNode;
+		}
+		
+		return node;
+	}
+
+	private class AvlNode<T>{
+		
+		private T data;
+		private AvlNode<T> leftNode;
+		private AvlNode<T> rightNode;
+		private int height;
+		
+		public AvlNode(T data, AvlNode<T> leftNode,AvlNode<T> rightNode) {
+			this.data = data;
+			this.leftNode = leftNode;
+			this.rightNode = rightNode;
+		}
+		
+		public AvlNode(T element) {
+			this(element,null,null);
+		}
+		
+		
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/tree/BinarySearchTree.java b/group04/465034663/src/com/xusheng/tree/BinarySearchTree.java
new file mode 100644
index 0000000000..6a2799db72
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/tree/BinarySearchTree.java
@@ -0,0 +1,128 @@
+package com.xusheng.tree;
+
+/**
+ * 实现二叉查找树
+ * @author xusheng
+ *
+ * @param <T>
+ */
+public class BinarySearchTree<T extends Comparable<? super T>> {
+
+	private BinaryNode<T> root;
+	
+	public BinarySearchTree() {
+		this.root = null;
+	}
+
+	public boolean isEmpty(){
+		return this.root == null;
+	}
+	
+	public void insert(T element){
+		root = insert(element,root);
+	}
+	
+	private BinaryNode<T> insert(T element,BinaryNode<T> node){
+		if(node == null){
+			return new BinaryNode<T>(element,null,null); 
+		}
+		
+		int intCompare = element.compareTo(node.data);
+		
+		if(intCompare < 0){
+			node.leftNode = insert(element,node.leftNode);
+		}else if(intCompare > 0){
+			node.rightNode = insert(element,node.rightNode);
+		}
+		return node;
+	}
+	
+	
+	public boolean contains(T element){
+		return contains(element,root);
+	}
+	
+	private boolean contains(T element,BinaryNode<T> node){
+		
+		if(node == null){
+			return false;
+		}
+		
+		int intCompare = element.compareTo(node.data);
+		
+		if(intCompare < 0){
+			return contains(element,node.leftNode);
+		}else if(intCompare > 0){
+			return contains(element,node.rightNode);
+		}else{
+			return true;
+		}
+	}
+	
+	public void remove(T element){
+		remove(element,root);
+	}
+	
+	private BinaryNode<T> remove(T element,BinaryNode<T> node){
+		if(node == null){
+			return node;
+		}
+		
+		int intCompare = element.compareTo(node.data);
+		
+		if(intCompare < 0){
+			node.leftNode = remove(element,node.leftNode);
+		}else if(intCompare > 0){
+			node.rightNode = remove(element,node.rightNode);
+		}
+		else if(node.leftNode != null && node.rightNode != null){
+			node.data = findMin(node).data;
+			node.rightNode = remove(node.data,node.rightNode);
+		}else{
+			node = (node.leftNode != null) ? node.leftNode : node.rightNode;
+		}
+		return node;
+	}
+	
+
+	private BinaryNode<T> findMin(BinaryNode<T> node){
+		if(node == null){
+			return null;
+		}else if(node.leftNode == null){
+			return node;
+		}else{
+			return findMin(node.leftNode);
+		}
+	}
+	
+	private BinaryNode<T> findMax(BinaryNode<T> node){
+		if(node == null){
+			return null;
+		}
+		
+		while(node.rightNode != null){
+			node = node.rightNode;
+		}
+		
+		return node;
+	}
+
+	private class BinaryNode<T>{
+		
+		private T data;
+		private BinaryNode<T> leftNode;
+		private BinaryNode<T> rightNode;
+		
+		public BinaryNode(T data, BinaryNode<T> leftNode,BinaryNode<T> rightNode) {
+			this.data = data;
+			this.leftNode = leftNode;
+			this.rightNode = rightNode;
+		}
+		
+		public BinaryNode(T element) {
+			this(element,null,null);
+		}
+		
+		
+	}
+}
diff --git a/group04/465034663/src/com/xusheng/tree/TestMain.java b/group04/465034663/src/com/xusheng/tree/TestMain.java
new file mode 100644
index 0000000000..3f3af252dd
--- /dev/null
+++ b/group04/465034663/src/com/xusheng/tree/TestMain.java
@@ -0,0 +1,21 @@
+package com.xusheng.tree;
+
+public class TestMain {
+
+	public static void main(String[] args) {
+		BinarySearchTree<Integer> bst = new BinarySearchTree<Integer>();
+		bst.insert(8);
+		bst.insert(3);
+		bst.insert(7);
+		bst.insert(1);
+		bst.insert(10);
+		System.out.println(bst.contains(3));
+		bst.remove(4);
+		System.out.println(bst.contains(3));
+//		BinarySearchTree<String> bst = new BinarySearchTree<String>();
+//		bst.insert("haha1");
+//		bst.insert("haha2");
+//		bst.insert("haha3");
+//		System.out.println(bst.contains("haha3"));
+	}
+}
diff --git a/group04/498654356/one/.classpath b/group04/498654356/one/.classpath
index ebfd4f69f3..539b0a95fd 100644
--- a/group04/498654356/one/.classpath
+++ b/group04/498654356/one/.classpath
@@ -1,8 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="test"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry including="**/*.java" kind="src" output="target/classes" path="src">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="test">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="test_resource"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/group04/498654356/one/.project b/group04/498654356/one/.project
index 3cad565ebc..6aa4008936 100644
--- a/group04/498654356/one/.project
+++ b/group04/498654356/one/.project
@@ -10,8 +10,14 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
 </projectDescription>
diff --git a/group04/498654356/one/pom.xml b/group04/498654356/one/pom.xml
new file mode 100644
index 0000000000..b74298d33f
--- /dev/null
+++ b/group04/498654356/one/pom.xml
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>498654356Learning_one</groupId>
+  <artifactId>498654356Learning_one</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+    <testSourceDirectory>test</testSourceDirectory>
+    <resources>
+      <resource>
+        <directory>src</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.5.1</version>
+        <configuration>
+          <source/>
+          <target/>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  
+    
+    <dependencies>
+	    <dependency>
+	      <groupId>junit</groupId>
+	      <artifactId>junit</artifactId>
+	      <version>4.12</version>
+	      <scope>test</scope>
+	    </dependency>
+	   <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
+		<dependency>
+		    <groupId>dom4j</groupId>
+		    <artifactId>dom4j</artifactId>
+		    <version>1.6.1</version>
+		</dependency>
+
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java b/group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java
new file mode 100644
index 0000000000..a79dfb660c
--- /dev/null
+++ b/group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java
@@ -0,0 +1,66 @@
+package org.coding.two;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 封装 Struts.xml 中 action 标签
+ */
+public class ActionBeanDefinition {
+	public static final String TAG_ACTION = "action";
+	public static final String TAG_RESULT = "result";
+	public static final String TAG_ACTION_ATTR_NAME = "name";
+	public static final String TAG_ACTION_ATTR_CLASS = "class";
+	public static final String TAG_RESULT_ATTR_NAME = "name";
+	public static final String DEFAULT_RESOURCE = "org/coding/two/struts.xml";
+
+	private String name;
+	
+	private String className;
+	
+	private Map<String, String> resultMap;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+
+	public Map<String, String> getResultMap() {
+		return resultMap;
+	}
+
+	public ActionBeanDefinition(String name, String className) {
+		super();
+		this.name = name;
+		this.className = className;
+		this.resultMap = new HashMap<String, String>();
+	}
+
+	/**
+	 * 
+	 * @param name	result 标签的 name 属性值
+	 * @param viewPath	result 标签的视图路径
+	 */
+	public void putResult(String name, String viewPath) {
+		this.resultMap.put(name, viewPath);
+//		this.resultMap.put("name", name);
+//		this.resultMap.put("view", viewPath);
+	}
+
+	@Override
+	public String toString() {
+		return "ActionBeanDefinition [name=" + name + ", className=" + className + ", resultMap=" + resultMap + "]";
+	}
+	
+}
diff --git a/group04/498654356/one/src/org/coding/two/LoginAction.java b/group04/498654356/one/src/org/coding/two/LoginAction.java
new file mode 100644
index 0000000000..ccfac345f0
--- /dev/null
+++ b/group04/498654356/one/src/org/coding/two/LoginAction.java
@@ -0,0 +1,45 @@
+package org.coding.two;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+
+	@Override
+	public String toString() {
+		return "LoginAction [name=" + name + ", password=" + password + ", message=" + message + "]";
+	}
+    
+}
diff --git a/group04/498654356/one/src/org/coding/two/Struts.java b/group04/498654356/one/src/org/coding/two/Struts.java
new file mode 100644
index 0000000000..d2c518f108
--- /dev/null
+++ b/group04/498654356/one/src/org/coding/two/Struts.java
@@ -0,0 +1,150 @@
+package org.coding.two;	
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+	
+    private static final String METHOD_SET = "set";
+	private static final String METHOD_GET = "get";
+	private static Map<String, ActionBeanDefinition> actionDefinitionMap =  new HashMap<String, ActionBeanDefinition>();
+    
+    static {
+    	//0
+    	parseXml();
+    }
+    
+    @SuppressWarnings("unchecked")
+	public static void parseXml(){
+    	SAXReader reader = new SAXReader();
+    	Document document = null;
+		String path = Struts.class.getClassLoader().getResource("").getPath();
+		try {
+			document = reader.read(path + ActionBeanDefinition.DEFAULT_RESOURCE);
+		} catch (DocumentException e) {
+			throw new RuntimeException(e);
+		}
+    	Element struts = document.getRootElement();
+    	List<Element> actions = struts.elements(ActionBeanDefinition.TAG_ACTION);
+    	for (Element element : actions) {
+    		String name = element.attributeValue(ActionBeanDefinition.TAG_ACTION_ATTR_NAME);
+    		String className = element.attributeValue(ActionBeanDefinition.TAG_ACTION_ATTR_CLASS);
+    		List<Element> results = element.elements(ActionBeanDefinition.TAG_RESULT);
+    		ActionBeanDefinition beanDefinition = new ActionBeanDefinition(name, className);
+    		for (Element result : results) {
+    			beanDefinition.putResult(result.attributeValue(ActionBeanDefinition.TAG_RESULT_ATTR_NAME), result.getTextTrim());
+			}
+    		actionDefinitionMap.put(name, beanDefinition);
+		}
+//    	System.out.println(actionDefinitionMap);
+    }
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	if(!actionDefinitionMap.containsKey(actionName)) {
+    		throw new RuntimeException("does not exist action : " + actionName);
+    	}
+    	ActionBeanDefinition beanDefinition = actionDefinitionMap.get(actionName);
+    	try {
+    		//1
+			Class<?> bean = Class.forName(beanDefinition.getClassName());
+			Object instance = bean.newInstance();
+			Set<String> keySet = parameters.keySet();
+			for (String key : keySet) {
+				Method method = bean.getMethod(getSetMethodName(key), new Class[]{String.class});
+				method.invoke(instance, parameters.get(key));
+			}
+//			System.out.println(instance);
+			//2
+			Method method = bean.getMethod("execute");
+			Object result = method.invoke(instance);
+			
+			//3
+			Method[] methods = bean.getMethods();
+			Map<String, Object> parameterss = new HashMap<String, Object>(); 
+			for (Method m : methods) {
+				String methodName = m.getName();
+				if(methodName.contains(METHOD_GET)) {
+					String para = getPropNameByMethoedName(methodName);
+					parameterss.put(para, m.invoke(instance));
+				}
+			}
+			View view = new View();
+			view.setParameters(parameterss);
+//			System.out.println(parameterss);
+			//4
+			String jsp = actionDefinitionMap.get(actionName).getResultMap().get(result);
+			view.setJsp(jsp);
+			return view;
+			
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	
+    	
+    	return null;
+    }    
+    
+
+    private static String getPropNameByMethoedName(String methodName) {
+    	String prop = null;
+    	if(methodName.contains(METHOD_GET)){
+    		String s = methodName.substring(3);
+    		prop = s.substring(0, 1).toLowerCase() + s.substring(1);
+    	}
+		return prop;
+	}
+
+	private static String getSetMethodName(String para) {
+		return METHOD_SET + para.substring(0, 1).toUpperCase() + para.substring(1);
+	}
+}
diff --git a/group04/498654356/one/src/org/coding/two/View.java b/group04/498654356/one/src/org/coding/two/View.java
new file mode 100644
index 0000000000..59156ce2af
--- /dev/null
+++ b/group04/498654356/one/src/org/coding/two/View.java
@@ -0,0 +1,23 @@
+package org.coding.two;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/498654356/one/src/org/coding/two/array/ArrayUtil.java b/group04/498654356/one/src/org/coding/two/array/ArrayUtil.java
new file mode 100644
index 0000000000..f2f57ba145
--- /dev/null
+++ b/group04/498654356/one/src/org/coding/two/array/ArrayUtil.java
@@ -0,0 +1,292 @@
+package org.coding.two.array;
+
+/**
+ * 数组定长：考虑长度问题；排序之后的数组操作起来更方便；
+ * @author Administrator
+ *
+ */
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin == null || origin.length < 2) {
+			return;
+		}
+		int headIndex = 0;
+		int lastIndex = origin.length - 1;
+		while (headIndex < lastIndex) {
+			int temp = origin[headIndex];
+			origin[headIndex] = origin[lastIndex];
+			origin[lastIndex] = temp;
+			headIndex++;
+			lastIndex--;
+		}
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	public int[] removeZero(int[] oldArray){
+		if(oldArray == null || oldArray.length == 0) {
+			return new int[]{};
+		}
+//		int[] newArray = removeZero1(oldArray);
+		int[] newArray = removeZero2(oldArray);
+		return newArray;
+	}
+
+	private int[] removeZero2(int[] oldArray) {
+		int[] indexArray = new int [oldArray.length];
+		int index = 0;
+		for(int i = 0, size = oldArray.length; i < size ; i++) {
+			if(oldArray[i] != 0) {
+				indexArray[index] = oldArray[i];
+				index++;
+			}
+		}
+		if(index == 0) {
+			return new int[]{};
+		}
+		int[] newArray = new int[index];
+		System.arraycopy(indexArray, 0, newArray, 0, index);
+		return newArray;
+	}
+	
+	private int[] removeZero1(int[] oldArray) {
+		int length = 0;
+		for(int i = 0, size = oldArray.length; i < size ; i++) {
+			if(oldArray[i] != 0) {
+				length++;
+			}
+		}
+		if(length == 0) {
+			return new int[]{};
+		}
+		int[] newArray = new int[length];
+		for(int i = 0, size = oldArray.length, index = 0; i < size ; i++) {
+			if(oldArray[i] != 0) {
+				newArray[index] = oldArray[i];
+				index++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		boolean flag1 = (array1 == null || array1.length == 0);
+		boolean flag2 = (array2 == null || array2.length == 0);
+		if(flag1 && ! flag2) {	//array1 为空
+			return array2;
+		}
+		if(flag2 && !flag1) {	//array2 为空
+			return array1;
+		}
+		if(flag1 && flag2){		//array1 和 array2 为空
+			return new int[0];
+		}
+		// array1 和 array2 都不为空
+		int length1 = array1.length;
+		int length2 = array2.length;
+		int index1 = 0;
+		int index2 = 0;
+		int newLength = length1 + length2;
+		int[] newArray = new int[newLength];
+		int newIndex = 0;
+		while (index1 < length1 && index2 < length2) {
+			int val1 = array1[index1];
+			int val2 = array2[index2];
+			if(val1 < val2) {	//小于
+				newArray[newIndex] = val1;
+				newIndex++;
+				index1++;
+			} else if(val1 == val2) {	//等于
+				newArray[newIndex] = val1;
+				newIndex++;
+				index1++;
+				index2++;
+			} else {	//大于
+				newArray[newIndex] = val2;
+				newIndex++;
+				index2++;
+			}
+		}
+		//剩余的
+		while(index1 < length1) {
+			newArray[newIndex] = array1[index1];
+			newIndex++;
+			index1++;
+		}
+		while(index2 < length2) {
+			newArray[newIndex] = array2[index1];
+			newIndex++;
+			index2++;
+		}
+		//
+		if(newIndex == newLength) {
+			return newArray;
+		}
+		int[] resutlArray = new int[newIndex];
+		System.arraycopy(newArray, 0, resutlArray, 0, newIndex);
+		return  resutlArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		boolean flag = (oldArray == null || oldArray.length == 0);
+		boolean flag2 = (size == 0);
+		if(flag) {
+			return new int[0];
+		}
+		if(flag2 && !flag) {
+			return oldArray;
+		}
+		int length = oldArray.length;
+		int[] newArray = new int[length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max < 2) {
+			return new int[0];
+		}
+//		return fibonacci1(max);
+		return fibonacci2(new int[]{1, 1}, max);
+	}
+
+	/**
+	 * 递归
+	 * @param array
+	 * @param max
+	 * @return
+	 */
+	private int[] fibonacci2(int[] array, int max) {
+		int length = array.length;
+		if((array[length - 1] + array[length -2]) >= max) {
+			return array;
+		}
+		array = grow(array, 1);
+		length = array.length;
+		array[ length - 1] = array[length -2] + array[length -3];
+		return fibonacci2(array, max);
+	}
+	
+	/**
+	 * 循环
+	 * @param max
+	 * @return
+	 */
+	private int[] fibonacci1(int max) {
+		int[] array = new int[]{1, 1};
+		int length = array.length;
+		while((array[length - 1] + array[length -2]) < max) {
+			array = grow(array, 1);
+			length = array.length;
+			array[ length - 1] = array[length -2] + array[length -3];
+		}
+		return array;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max < 3) {
+			return new int[0];
+		}
+		int[] array = new int[]{2};
+		int length = array.length;
+		int val = array[length - 1] + 1;
+		while(val < max) {
+			if(isPrime(val)){
+				array = grow(array, 1);
+				length++;
+				array[length - 1] = val;
+			}
+			val++;
+		}
+		return array;
+	}
+	
+	private boolean isPrime(int val) {
+		for(int i = 2; i < val; i++) {
+			if(val % i == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if(array == null) {
+			return null;
+		}
+		if(array.length == 0) {
+			return "";
+		}
+		if(seperator == null) {
+			seperator = "";
+		}
+		StringBuilder sb = new StringBuilder();
+		for (int i : array) {
+			sb.append(i).append(seperator);
+		}
+		return sb.substring(0, sb.length() - seperator.length());
+	}
+	
+
+}
diff --git a/group04/498654356/one/src/org/coding/two/struts.xml b/group04/498654356/one/src/org/coding/two/struts.xml
new file mode 100644
index 0000000000..53681a9288
--- /dev/null
+++ b/group04/498654356/one/src/org/coding/two/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.coding.two.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.coding.two.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/498654356/one/test/org/coding/two/StrutsTest.java b/group04/498654356/one/test/org/coding/two/StrutsTest.java
new file mode 100644
index 0000000000..35dd0fe125
--- /dev/null
+++ b/group04/498654356/one/test/org/coding/two/StrutsTest.java
@@ -0,0 +1,43 @@
+package org.coding.two;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java b/group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..208df3f35e
--- /dev/null
+++ b/group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java
@@ -0,0 +1,218 @@
+package org.coding.two.array;
+
+import static org.junit.Assert.fail;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class ArrayUtilTest {
+
+	private ArrayUtil arrayUtil;
+	
+	@Before
+	public void setUp() throws Exception {
+		arrayUtil = new ArrayUtil();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		arrayUtil = null;
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] origin = null;
+		arrayUtil.reverseArray(origin);
+		Assert.assertNull(origin);
+		
+		origin = new int[]{};
+		arrayUtil.reverseArray(origin);
+		Assert.assertArrayEquals(origin, origin);
+		
+		origin = new int[]{1};
+		arrayUtil.reverseArray(origin);
+		Assert.assertArrayEquals(origin, origin);
+		
+		origin = new int[]{1, 2};
+		arrayUtil.reverseArray(origin);
+		int[] dest = new int[]{2, 1};
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = new int[]{1, 2, 3};
+		arrayUtil.reverseArray(origin);
+		dest = new int[]{3, 2, 1};
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = new int[]{1, 2, 3, 4};
+		arrayUtil.reverseArray(origin);
+		dest = new int[]{4, 3, 2, 1};
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = new int[]{7, 9 , 30, 3};
+		arrayUtil.reverseArray(origin);
+		dest = new int[]{3, 30, 9,7};
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = new int[]{7, 9, 30, 3, 4};
+		arrayUtil.reverseArray(origin);
+		dest = new int[]{4,3, 30 , 9,7};
+		Assert.assertArrayEquals(dest, origin);
+		
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int[] origin = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] dest = new int[]{1,3,4,5,6,6,5,4,7,6,7,5};
+		origin = arrayUtil.removeZero(origin);
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = null;
+		dest = new int[]{};
+		origin = arrayUtil.removeZero(origin);
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = new int[]{};
+		dest = new int[]{};
+		origin = arrayUtil.removeZero(origin);
+		Assert.assertArrayEquals(dest, origin);
+		
+		origin = new int[]{1};
+		dest = new int[]{1};
+		origin = arrayUtil.removeZero(origin);
+		Assert.assertArrayEquals(dest, origin);
+		
+	}
+
+	@Test
+	public void testMerge() {
+		int[] array1 = new int[]{3, 5, 7,8};
+		int[] array2 = new int[]{4, 5, 6,7};
+		int[] expecteds = new int[]{3,4,5,6,7,8};
+		int[] actuals = arrayUtil.merge(array1, array2);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		array1 = new int[]{};
+		array2 = new int[]{4, 5, 6,7};
+		expecteds = new int[]{4, 5, 6,7};
+		actuals = arrayUtil.merge(array1, array2);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		array1 = new int[]{3, 5, 7,8};
+		array2 = new int[]{};
+		expecteds = new int[]{3, 5, 7,8};
+		actuals = arrayUtil.merge(array1, array2);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		array1 = new int[]{};
+		array2 = new int[]{};
+		expecteds = new int[]{};
+		actuals = arrayUtil.merge(array1, array2);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		array1 = new int[]{1, 2, 8,9};
+		array2 = new int[]{4, 5, 6,7};
+		expecteds = new int[]{1, 2, 4, 5, 6, 7, 8, 9};
+		actuals = arrayUtil.merge(array1, array2);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = new int[]{2,3,6};
+		int size = 3;
+		int[] expecteds = new int[]{2,3,6,0,0,0};
+		int[] actuals = arrayUtil.grow(oldArray, size);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		oldArray = new int[]{};
+		size = 3;
+		expecteds = new int[]{};
+		actuals = arrayUtil.grow(oldArray, size);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		oldArray = new int[]{};
+		size = 0;
+		expecteds = new int[]{};
+		actuals = arrayUtil.grow(oldArray, size);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		oldArray = new int[]{2,3,6};
+		size = 0;
+		expecteds = new int[]{2,3,6};
+		actuals = arrayUtil.grow(oldArray, size);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15;
+		int[] expecteds = new int[]{1,1,2,3,5,8,13};
+		int[] actuals = arrayUtil.fibonacci(max);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		max = 1;
+		expecteds = new int[]{};
+		actuals = arrayUtil.fibonacci(max);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		max = 2;
+		expecteds = new int[]{1,1};
+		actuals = arrayUtil.fibonacci(max);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max = 23;
+		int[] expecteds = new int[]{2,3,5,7,11,13,17,19};
+		int[] actuals = arrayUtil.getPrimes(max);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		max = 2;
+		expecteds = new int[]{};
+		actuals = arrayUtil.getPrimes(max);
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+		max = 3;
+		expecteds = new int[]{2};
+		actuals = arrayUtil.getPrimes(max);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = new int[]{3,8,9};
+		String seperator = "-";
+		String expected = "3-8-9";
+		String actual = arrayUtil.join(array, seperator);
+		Assert.assertEquals(expected, actual);
+		
+		array = null;
+		seperator = "-";
+		expected = null;
+		actual = arrayUtil.join(array, seperator);
+		Assert.assertNull(actual);
+		
+		array = new int[]{};
+		seperator = "-";
+		expected = "";
+		actual = arrayUtil.join(array, seperator);
+		Assert.assertEquals(expected, actual);
+		
+		array = new int[]{1,2,3};
+		seperator = "@-@";
+		expected = "1@-@2@-@3";
+		actual = arrayUtil.join(array, seperator);
+		Assert.assertEquals(expected, actual);
+	}
+
+}
diff --git a/group04/498654356/one/test_resource/org/coding/two/struts.xml b/group04/498654356/one/test_resource/org/coding/two/struts.xml
new file mode 100644
index 0000000000..53681a9288
--- /dev/null
+++ b/group04/498654356/one/test_resource/org/coding/two/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.coding.two.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.coding.two.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/564451732/.classpath b/group04/564451732/.classpath
deleted file mode 100644
index 2bdfdc1bf0..0000000000
--- a/group04/564451732/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/group04/564451732/.project b/group04/564451732/.project
deleted file mode 100644
index 23af4c7791..0000000000
--- a/group04/564451732/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>564451732</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/group04/564451732/hw1/.classpath b/group04/564451732/hw1/.classpath
new file mode 100644
index 0000000000..5c5f8efc0b
--- /dev/null
+++ b/group04/564451732/hw1/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group04/564451732/hw1/.gitignore b/group04/564451732/hw1/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group04/564451732/hw1/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group04/564451732/hw1/.project b/group04/564451732/hw1/.project
new file mode 100644
index 0000000000..8d18c102de
--- /dev/null
+++ b/group04/564451732/hw1/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>564451732</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group04/564451732/src/DataStructureTest.java b/group04/564451732/hw1/src/DataStructureTest.java
similarity index 96%
rename from group04/564451732/src/DataStructureTest.java
rename to group04/564451732/hw1/src/DataStructureTest.java
index 2f5cc27a94..85837a6f98 100644
--- a/group04/564451732/src/DataStructureTest.java
+++ b/group04/564451732/hw1/src/DataStructureTest.java
@@ -1,114 +1,114 @@
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-import hw1.ArrayListImpl;
-import hw1.BinaryTreeNode;
-import hw1.LinkedList;
-import hw1.QueueImpl;
-import hw1.StackImpl;
-
-public class DataStructureTest {
-
-	@Test
-	public void ArrayListTest() {
-		ArrayListImpl al = new ArrayListImpl();
-		Object o1 = new Object();
-		Object o2 = new Object();
-		Object o3 = new Object();
-		al.add(new Object());
-		al.add(new Object());
-		assertTrue(al.size() == 2);
-		al.add(5);
-		assertFalse(al.size() == 2);
-		assertTrue(al.size() == 3);
-		al.add(2, 3);
-		//System.out.println((int)al.get(2));
-		assertTrue((int)al.get(2) == 3);
-		assertTrue((int)al.get(3) == 5);
-	}
-	
-	@Test
-	public void LinkedListTest() {
-		LinkedList ll = new LinkedList();
-		Object o1 = new Object();
-		Object o2 = new Object();
-		Object o3 = new Object();
-		Object o4 = new Object();
-		Object o5 = new Object();
-		Object o6 = new Object();
-		ll.add(o1);
-		ll.add(o2);
-		//System.out.println(ll.size());
-		assertTrue(ll.size() == 2);
-		ll.add(o3);
-		ll.add(1,1);
-		assertTrue((int)ll.get(1) == 1);
-		assertTrue(ll.size() == 4);
-		ll.addFirst(2);
-		ll.addLast(4);
-		assertTrue((int)ll.get(0) == 2);
-		assertTrue((int)ll.get(ll.size() - 1) == 4);
-		assertTrue((int)ll.get(2) == 1);
-		ll.remove(2);
-		assertTrue(ll.get(2) == o2);
-		//System.out.print((int)ll.remove(2));
-		//System.out.println((int)ll.get(2));
-		//assertFalse((int)ll.get(2) == 1);
-		assertTrue(ll.size() == 5);
-		assertTrue((int)ll.removeFirst() == 2);
-		assertTrue(ll.size() == 4);
-		assertTrue((int)ll.removeLast() == 4);
-		assertTrue(ll.size() == 3);
-	}
-	
-	@Test
-	public void QueueTest(){
-		QueueImpl qi = new QueueImpl();
-		assertTrue(qi.isEmpty());
-		qi.enQueue(1);
-		qi.enQueue(2);
-		qi.enQueue(3);
-		assertTrue(qi.size() == 3);
-		assertTrue((int)qi.deQueue() == 1);
-		assertTrue(qi.size() == 2);
-		assertFalse(qi.isEmpty());
-	}
-	
-	@Test
-	public void StackTest() {
-		StackImpl stack = new StackImpl();
-		assertTrue(stack.isEmpty());
-		stack.push(1);
-		stack.push(2);
-		stack.push(3);
-		assertTrue(stack.size() == 3);
-		assertTrue((int)stack.pop() == 3);
-		assertTrue(stack.size() == 2);
-		assertTrue((int)stack.peek() == 2);
-		assertFalse(stack.isEmpty());
-	}
-	
-	@Test
-	public void BinaryTreeTest() {
-		BinaryTreeNode bt = new BinaryTreeNode();
-		Integer i1 = 1;
-		Integer i2 = 3;
-		Integer i3 = 4;
-		Integer i4 = 6;
-		Integer i5 = -1;
-		bt.insert(i3);
-		bt.insert(i1);
-		bt.insert(i4);
-		bt.insert(i2);
-		bt.insert(i5);
-		assertTrue((int)bt.getRoot().getData() == 4);
-		assertTrue((int)bt.getRoot().getLeft().getData() == 1);
-		assertTrue((int)bt.getRoot().getRight().getData() == 6);
-		assertTrue((int)bt.getRoot().getLeft().getLeft().getData() == -1);
-		assertTrue((int)bt.getRoot().getLeft().getRight().getData() == 3);
-		
-	}
-
-}
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import hw1.ArrayListImpl;
+import hw1.BinaryTreeNode;
+import hw1.LinkedList;
+import hw1.QueueImpl;
+import hw1.StackImpl;
+
+public class DataStructureTest {
+
+	@Test
+	public void ArrayListTest() {
+		ArrayListImpl al = new ArrayListImpl();
+		Object o1 = new Object();
+		Object o2 = new Object();
+		Object o3 = new Object();
+		al.add(new Object());
+		al.add(new Object());
+		assertTrue(al.size() == 2);
+		al.add(5);
+		assertFalse(al.size() == 2);
+		assertTrue(al.size() == 3);
+		al.add(2, 3);
+		//System.out.println((int)al.get(2));
+		assertTrue((int)al.get(2) == 3);
+		assertTrue((int)al.get(3) == 5);
+	}
+	
+	@Test
+	public void LinkedListTest() {
+		LinkedList ll = new LinkedList();
+		Object o1 = new Object();
+		Object o2 = new Object();
+		Object o3 = new Object();
+		Object o4 = new Object();
+		Object o5 = new Object();
+		Object o6 = new Object();
+		ll.add(o1);
+		ll.add(o2);
+		//System.out.println(ll.size());
+		assertTrue(ll.size() == 2);
+		ll.add(o3);
+		ll.add(1,1);
+		assertTrue((int)ll.get(1) == 1);
+		assertTrue(ll.size() == 4);
+		ll.addFirst(2);
+		ll.addLast(4);
+		assertTrue((int)ll.get(0) == 2);
+		assertTrue((int)ll.get(ll.size() - 1) == 4);
+		assertTrue((int)ll.get(2) == 1);
+		ll.remove(2);
+		assertTrue(ll.get(2) == o2);
+		//System.out.print((int)ll.remove(2));
+		//System.out.println((int)ll.get(2));
+		//assertFalse((int)ll.get(2) == 1);
+		assertTrue(ll.size() == 5);
+		assertTrue((int)ll.removeFirst() == 2);
+		assertTrue(ll.size() == 4);
+		assertTrue((int)ll.removeLast() == 4);
+		assertTrue(ll.size() == 3);
+	}
+	
+	@Test
+	public void QueueTest(){
+		QueueImpl qi = new QueueImpl();
+		assertTrue(qi.isEmpty());
+		qi.enQueue(1);
+		qi.enQueue(2);
+		qi.enQueue(3);
+		assertTrue(qi.size() == 3);
+		assertTrue((int)qi.deQueue() == 1);
+		assertTrue(qi.size() == 2);
+		assertFalse(qi.isEmpty());
+	}
+	
+	@Test
+	public void StackTest() {
+		StackImpl stack = new StackImpl();
+		assertTrue(stack.isEmpty());
+		stack.push(1);
+		stack.push(2);
+		stack.push(3);
+		assertTrue(stack.size() == 3);
+		assertTrue((int)stack.pop() == 3);
+		assertTrue(stack.size() == 2);
+		assertTrue((int)stack.peek() == 2);
+		assertFalse(stack.isEmpty());
+	}
+	
+	@Test
+	public void BinaryTreeTest() {
+		BinaryTreeNode bt = new BinaryTreeNode();
+		Integer i1 = 1;
+		Integer i2 = 3;
+		Integer i3 = 4;
+		Integer i4 = 6;
+		Integer i5 = -1;
+		bt.insert(i3);
+		bt.insert(i1);
+		bt.insert(i4);
+		bt.insert(i2);
+		bt.insert(i5);
+		assertTrue((int)bt.getRoot().getData() == 4);
+		assertTrue((int)bt.getRoot().getLeft().getData() == 1);
+		assertTrue((int)bt.getRoot().getRight().getData() == 6);
+		assertTrue((int)bt.getRoot().getLeft().getLeft().getData() == -1);
+		assertTrue((int)bt.getRoot().getLeft().getRight().getData() == 3);
+		
+	}
+
+}
diff --git a/group04/564451732/hw1/src/Test.java b/group04/564451732/hw1/src/Test.java
new file mode 100644
index 0000000000..1ffabf0878
--- /dev/null
+++ b/group04/564451732/hw1/src/Test.java
@@ -0,0 +1,8 @@
+
+public class Test {
+
+	public static void main(String[] args) {
+		
+	}
+
+}
diff --git a/group04/564451732/src/hw1/ArrayListImpl.java b/group04/564451732/hw1/src/hw1/ArrayListImpl.java
similarity index 95%
rename from group04/564451732/src/hw1/ArrayListImpl.java
rename to group04/564451732/hw1/src/hw1/ArrayListImpl.java
index fe42bfc4f7..4f27d5d59c 100644
--- a/group04/564451732/src/hw1/ArrayListImpl.java
+++ b/group04/564451732/hw1/src/hw1/ArrayListImpl.java
@@ -1,88 +1,88 @@
-package hw1;
-
-//import java.util.ArrayList;
-import java.util.Iterator;
-//import java.util.List;
-
-import com.sun.xml.internal.ws.api.pipe.ThrowableContainerPropertySet;
-
-public class ArrayListImpl implements List {
-
-private int size = 0;
-	
-	private Object[] elementData = new Object[100];
-	
-	public void add(Object o){
-		//size++;
-		try{
-			if (size < elementData.length) {
-				elementData[size] = o;
-			} else {
-				elementData = grow(elementData, elementData.length);
-				elementData[size] = o;
-			}
-			size++;
-		} catch (IndexOutOfBoundsException e) {
-			System.out.println("The added index is out of bound");
-		}
-	}
-	public void add(int index, Object o){
-		if (index < 0) {
-			throw new IndexOutOfBoundsException("Index cannot be less than 0");
-		}
-		while (index >= elementData.length) {
-			elementData = grow(elementData, elementData.length);
-		}
-		if (index >= size) {
-			elementData[index] = o;
-			size++;
-		} else {
-			if (size + 1 >= elementData.length) {
-				elementData = grow(elementData, elementData.length);
-			}
-				for (int i = size-1; i >= index;i--) {
-					elementData[i+1] = elementData[i];
-				}
-				elementData[index] = o;
-				size++;
-			
-		}
-	}
-	
-	public Object get(int index){
-		if (index >= size ||index < 0) {
-			throw new IndexOutOfBoundsException("Index entered is out of bounds");
-		} else {
-			return elementData[index];
-		}
-		
-	}
-	
-	public Object remove(int index){
-		if (index >= size ||index < 0) {
-			throw new IndexOutOfBoundsException("Index entered is out of bounds");
-		} else {
-			Object result = elementData[index];
-			for (int i = index; i < size - 1; i++) {
-				elementData[i] = elementData[i+1];
-			}
-			elementData[size - 1] = 0;
-			size--;
-			return result;
-		}
-	}
-	
-	public int size(){
-		return size;
-	}
-	
-	public Iterator iterator(){
-		return null;
-	}
-	
-	private Object[] grow (Object[] src, int increase) {
-		Object[] target = new Object[src.length + increase];
-		System.arraycopy(src, 0, target, 0, src.length);
-		return target;
-	}
-}
+package hw1;
+
+//import java.util.ArrayList;
+import java.util.Iterator;
+//import java.util.List;
+
+import com.sun.xml.internal.ws.api.pipe.ThrowableContainerPropertySet;
+
+public class ArrayListImpl implements List {
+
+private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		//size++;
+		try{
+			if (size < elementData.length) {
+				elementData[size] = o;
+			} else {
+				elementData = grow(elementData, elementData.length);
+				elementData[size] = o;
+			}
+			size++;
+		} catch (IndexOutOfBoundsException e) {
+			System.out.println("The added index is out of bound");
+		}
+	}
+	public void add(int index, Object o){
+		if (index < 0) {
+			throw new IndexOutOfBoundsException("Index cannot be less than 0");
+		}
+		while (index >= elementData.length) {
+			elementData = grow(elementData, elementData.length);
+		}
+		if (index >= size) {
+			elementData[index] = o;
+			size++;
+		} else {
+			if (size + 1 >= elementData.length) {
+				elementData = grow(elementData, elementData.length);
+			}
+				for (int i = size-1; i >= index;i--) {
+					elementData[i+1] = elementData[i];
+				}
+				elementData[index] = o;
+				size++;
+			
+		}
+	}
+	
+	public Object get(int index){
+		if (index >= size ||index < 0) {
+			throw new IndexOutOfBoundsException("Index entered is out of bounds");
+		} else {
+			return elementData[index];
+		}
+		
+	}
+	
+	public Object remove(int index){
+		if (index >= size ||index < 0) {
+			throw new IndexOutOfBoundsException("Index entered is out of bounds");
+		} else {
+			Object result = elementData[index];
+			for (int i = index; i < size - 1; i++) {
+				elementData[i] = elementData[i+1];
+			}
+			elementData[size - 1] = 0;
+			size--;
+			return result;
+		}
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+	private Object[] grow (Object[] src, int increase) {
+		Object[] target = new Object[src.length + increase];
+		System.arraycopy(src, 0, target, 0, src.length);
+		return target;
+	}
+}
diff --git a/group04/564451732/hw1/src/hw1/BinaryTreeNode.java b/group04/564451732/hw1/src/hw1/BinaryTreeNode.java
new file mode 100644
index 0000000000..e01de2d56f
--- /dev/null
+++ b/group04/564451732/hw1/src/hw1/BinaryTreeNode.java
@@ -0,0 +1,71 @@
+package hw1;
+
+public class BinaryTreeNode {
+	private Comparable data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	private BinaryTreeNode root;
+	
+	public BinaryTreeNode (Comparable data) {
+		this.data = data;
+	}
+	public BinaryTreeNode () {
+		
+	}
+	public Object getData() {
+		return data;
+	}
+	public void setData(Comparable data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+		return;
+	}
+	
+	
+	
+	public BinaryTreeNode getRoot() {
+		return root;
+	}
+	public void setRoot(BinaryTreeNode root) {
+		this.root = root;
+	}
+	public BinaryTreeNode insert(Comparable o){
+		BinaryTreeNode result = new BinaryTreeNode(o);
+		if (root == null) {
+			root = result;
+		} else {
+			BinaryTreeNode dummy = root;
+			insertHelper(o,dummy);
+			
+		}
+		return result;
+	}
+	
+	private void insertHelper (Comparable o, BinaryTreeNode root) {
+		if (o.compareTo(root.data) < 0) {
+			if (root.left == null) {
+				root.left = new BinaryTreeNode(o);
+			} else {
+				insertHelper (o, root.left);
+			}
+		} else {
+			if (root.right == null) {
+				root.right = new BinaryTreeNode(o);
+				
+			} else {
+				insertHelper (o, root.right);
+			}
+		}
+	}
+}
diff --git a/group04/564451732/hw1/src/hw1/Iterator.java b/group04/564451732/hw1/src/hw1/Iterator.java
new file mode 100644
index 0000000000..7cd5bcd75a
--- /dev/null
+++ b/group04/564451732/hw1/src/hw1/Iterator.java
@@ -0,0 +1,7 @@
+package hw1;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group04/564451732/hw1/src/hw1/LinkedList.java b/group04/564451732/hw1/src/hw1/LinkedList.java
new file mode 100644
index 0000000000..583aaaef5e
--- /dev/null
+++ b/group04/564451732/hw1/src/hw1/LinkedList.java
@@ -0,0 +1,117 @@
+package hw1;
+
+import java.util.Iterator;
+
+public class LinkedList implements List {
+private Node head;
+private Node tail;
+	
+	public void add(Object o){
+		if (head != null) {
+			Node dummy = new Node(new Object());
+			dummy.next = head;
+			Node nextNode = head;
+			
+			while (nextNode != null) {
+				dummy = dummy.next;
+				nextNode = nextNode.next;
+			}
+			dummy.next = new Node(o);
+			tail = dummy.next;
+		} else {
+			head = new Node(o);
+			tail = head;
+		}
+		
+	}
+	public void add(int index , Object o){
+		if (index < 0 || index > size()) {
+			throw new IndexOutOfBoundsException("Index entered is out of bounds");
+		}
+		Node dummy = head;
+		for (int i = 1; i < index; i++) {
+			dummy = dummy.next;
+		}
+		Node temp = dummy.next;
+		dummy.next = new Node(o);
+		dummy.next.next = temp;
+		if (index == size()) {
+			tail = dummy.next;
+		}
+	}
+	public Object get(int index){
+		if (index < 0 || index >= size()) {
+			throw new IndexOutOfBoundsException("Index entered is out of bounds");
+		}
+		Node dummy = head;
+		for (int i = 0; i < index;i++) {
+			dummy = dummy.next;
+		}
+		return dummy.data;
+	}
+	public Object remove(int index){
+		if (index < 0 || index >= size()) {
+			throw new IndexOutOfBoundsException("Index entered is out of bounds");
+		}
+		Node dummy = head;
+		for (int i = 1; i < index;i++) {
+			dummy = dummy.next;
+		}
+		Node result = dummy.next;
+		dummy.next = dummy.next.next;
+		if (dummy.next == null) {
+			tail = dummy;
+		}
+		return result.data;
+	}
+	
+	public int size(){
+		Node dummy = head;
+		int size = 0;
+		while (dummy != null) {
+			dummy = dummy.next;
+			size++;
+		}
+		
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node first = new Node(o);
+		first.next = head;
+		head = first;
+	}
+	public void addLast(Object o){
+		tail.next = new Node(o);
+		tail = tail.next;
+	}
+	public Object removeFirst(){
+		Node temp = head;
+		head = head.next;
+		return temp.data;
+	}
+	public Object removeLast(){
+		Node dummy = head;
+		for (int i = 1; i < size()-1; i++) {
+			dummy = dummy.next;
+		}
+		Node result = dummy.next;
+		tail = dummy;
+		dummy.next  = null;
+		return result.data;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+		public Node(Object data) {
+			this.data = data;
+		}
+		
+	}
+}
diff --git a/group04/564451732/hw1/src/hw1/List.java b/group04/564451732/hw1/src/hw1/List.java
new file mode 100644
index 0000000000..cf68bf919e
--- /dev/null
+++ b/group04/564451732/hw1/src/hw1/List.java
@@ -0,0 +1,9 @@
+package hw1;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group04/564451732/src/hw1/QueueImpl.java b/group04/564451732/hw1/src/hw1/QueueImpl.java
similarity index 93%
rename from group04/564451732/src/hw1/QueueImpl.java
rename to group04/564451732/hw1/src/hw1/QueueImpl.java
index 30c73585ff..bef7f1a094 100644
--- a/group04/564451732/src/hw1/QueueImpl.java
+++ b/group04/564451732/hw1/src/hw1/QueueImpl.java
@@ -1,21 +1,21 @@
-package hw1;
-
-public class QueueImpl {
-	LinkedList queueList = new LinkedList();
-	
-	public void enQueue(Object o){
-		queueList.add(o);
-	}
-	
-	public Object deQueue(){
-		return queueList.removeFirst();
-	}
-	
-	public boolean isEmpty(){
-		return queueList.size() == 0;
-	}
-	
-	public int size(){
-		return queueList.size();
-	}
-}
+package hw1;
+
+public class QueueImpl {
+	LinkedList queueList = new LinkedList();
+	
+	public void enQueue(Object o){
+		queueList.add(o);
+	}
+	
+	public Object deQueue(){
+		return queueList.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		return queueList.size() == 0;
+	}
+	
+	public int size(){
+		return queueList.size();
+	}
+}
diff --git a/group04/564451732/src/hw1/StackImpl.java b/group04/564451732/hw1/src/hw1/StackImpl.java
similarity index 94%
rename from group04/564451732/src/hw1/StackImpl.java
rename to group04/564451732/hw1/src/hw1/StackImpl.java
index 3ae23593fa..6e4ad85374 100644
--- a/group04/564451732/src/hw1/StackImpl.java
+++ b/group04/564451732/hw1/src/hw1/StackImpl.java
@@ -1,23 +1,23 @@
-package hw1;
-
-public class StackImpl {
-private ArrayListImpl elementData = new ArrayListImpl();
-	
-	public void push(Object o){	
-		elementData.add(o);
-	}
-	
-	public Object pop(){
-		return elementData.remove(elementData.size() - 1);
-	}
-	
-	public Object peek(){
-		return elementData.get(elementData.size() - 1);
-	}
-	public boolean isEmpty(){
-		return elementData.size() == 0;
-	}
-	public int size(){
-		return elementData.size();
-	}
-}
+package hw1;
+
+public class StackImpl {
+private ArrayListImpl elementData = new ArrayListImpl();
+	
+	public void push(Object o){	
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		return elementData.remove(elementData.size() - 1);
+	}
+	
+	public Object peek(){
+		return elementData.get(elementData.size() - 1);
+	}
+	public boolean isEmpty(){
+		return elementData.size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.classpath" b/group04/564451732/hw2/.classpath
similarity index 100%
rename from "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.classpath"
rename to group04/564451732/hw2/.classpath
diff --git a/group04/564451732/hw2/.gitignore b/group04/564451732/hw2/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group04/564451732/hw2/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group04/564451732/hw2/.project b/group04/564451732/hw2/.project
new file mode 100644
index 0000000000..d4d12e546b
--- /dev/null
+++ b/group04/564451732/hw2/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>HW2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.settings/org.eclipse.jdt.core.prefs" b/group04/564451732/hw2/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.settings/org.eclipse.jdt.core.prefs"
rename to group04/564451732/hw2/.settings/org.eclipse.jdt.core.prefs
diff --git a/group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java b/group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..d0205332f6
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,213 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int len = origin.length;
+		for (int i = 0; i < len/2; i++) {
+			int temp = origin[i];
+			origin[i] = origin[len-1-i];
+			origin[len-1-i] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int slow = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			
+			if (oldArray[i] != 0) {
+				oldArray[slow++] = oldArray[i];
+			}
+		}
+		int[] newArray = new int[slow];
+		for (int i = 0; i < slow; i++) {
+			newArray[i] = oldArray[i];
+		}
+		
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] result = new int[array1.length + array2.length];
+		int i1 = 0 , i2 = 0, i3 = 0;
+		while (i1 < array1.length && i2 < array2.length) {
+			if (array1[i1] == array2[i2]) {
+				result[i3++] = array1[i1++];
+				i2++;
+			} else if (array1[i1] < array2[i2]) {
+				result[i3++] = array1[i1++];
+			} else {
+				result[i3++] = array2[i2++];
+			}
+		}
+		
+		while (i1 < array1.length) {
+			result[i3++] = array1[i1++];
+		}
+		while (i2 < array2.length) {
+			result[i3++] = array2[i2++];
+		}
+		
+		int[] finalResult = new int[i3];
+		for (int i = 0; i < i3; i++) {
+			finalResult[i] = result[i];
+		}
+		
+		return finalResult;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] result = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			result[i] = oldArray[i];
+		}
+		
+		return result;
+	
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		List<Integer> result = new ArrayList<>();
+		if (max <= 1) return new int[]{};
+		if (max < 2) return new int[]{1,1};
+		result.add(1);
+		//result.add(1);
+		int num = 1, index = 1;
+		
+		while (num < max) {
+			result.add(num);
+			num = result.get(index) + result.get(index - 1);
+			index++;
+			
+		}
+		
+		int[] resArray = new int[result.size()];
+		for (int i = 0; i < result.size(); i++) {
+			resArray[i] = result.get(i);
+		}
+		
+		return resArray;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		List<Integer> result = new ArrayList<>();
+		boolean[] notPrime = new boolean[max];
+		for (int i = 2; i < max; i++) {
+			if (!notPrime[i]) result.add(i);
+			for (int j = 2; i*j < max; j++) {
+				notPrime[i*j] = true;
+			}
+		}
+		
+		int[] resArray = new int[result.size()];
+		for (int i = 0; i < result.size();i++) {
+			resArray[i] = result.get(i);
+		}
+		
+		return resArray;
+	
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		List<Integer> result = new ArrayList<>();
+		for (int i = 1; i < max; i++) {
+			int sum = 0;
+			for (int j = 1; j < i/2; j++) {
+				if (i % j == 0) {
+					sum += j;
+				}
+			}
+			if (sum == i) result.add(i);
+		}
+		
+		int[] resArray = new int[result.size()];
+		for (int i = 0; i < result.size(); i++) {
+			resArray[i] = result.get(i);
+		}
+		return resArray;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if (array == null || array.length == 0) return null;
+		int len = array.length;
+		char[] result = new char[len + seperator.length()*(len - 1)];
+		int indexA = 0, indexR = 0;
+		while (indexA < array.length && indexR < result.length) {
+			result[indexR++] = (char)array[indexA++];
+			if (indexA < array.length - 1){
+				for (int i = 0; i < seperator.length(); i++) {
+					result[indexR++] = seperator.charAt(i);
+				}
+			}
+		}
+		
+		return String.valueOf(result);
+		
+		
+		
+	
+	}
+	
+
+}
diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java b/group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/Struts.java b/group04/564451732/hw2/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..1c117a681f
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,167 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws ClassNotFoundException {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	
+    	Class<?> targetClass = getTargetClass("struts.xml", actionName);
+    	Object foo = null;
+    	try {
+			 foo = targetClass.newInstance();
+		} catch (InstantiationException | IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	
+    	Method method = null;
+    	Method methodOne = null;
+    	String result  = null;
+    	Map<String, String> viewParas = new HashMap<>();
+    	try {
+    		for (String key : parameters.keySet()) {
+
+    			method = foo.getClass().getMethod("set"+key.substring(0, 1).toUpperCase()+key.substring(1), String.class);
+    			method.invoke(foo, parameters.get(key));
+    		}
+    		
+    		methodOne = foo.getClass().getMethod("execute");
+    		result = (String) methodOne.invoke(foo);
+    		Method[] allMethods = foo.getClass().getDeclaredMethods();
+    		for (Method m : allMethods) {
+    			if (m.getName().startsWith("get")) {
+    				viewParas.put(lowerFirstLetter(m.getName().substring(3)), (String) m.invoke(foo));
+    			}
+    		}
+    		
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    	}
+    	
+    	View view = new View();
+    	view.setParameters(viewParas);
+    	String destination = getDestiLoca("struts.xml", actionName, result);
+    	view.setJsp(destination);
+
+    	
+    	return view;
+    }    
+    
+    private static String lowerFirstLetter(String input) {
+    	String result = input.substring(0,1).toLowerCase() + input.substring(1);
+    	return result;
+    }
+    
+    private static Document readXML (String fileName) {
+    	Document doc = null;
+    	try {
+    		File xmlFile = new File(fileName);
+        	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+			doc = dBuilder.parse(xmlFile);
+			doc.getDocumentElement().normalize();
+    	
+    	} catch (ParserConfigurationException | SAXException | IOException e) {
+			e.printStackTrace();
+		}
+    	
+    	return doc;
+    }
+    
+    private static Element getTargetElement(String fileName, String actionName) {
+    	Document doc = readXML(fileName);
+    	NodeList nList = doc.getElementsByTagName("action");
+    	Element target = null;
+    	for (int i = 0; i < nList.getLength(); i++) {
+    		Node nNode = nList.item(i);
+    		
+    		if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+    			Element element = (Element)nNode;
+    			if (element.getAttribute("name").equals(actionName)){
+    				target = element;
+    				break;
+    			}
+    		}
+    	}
+    	
+    	return target;
+    }
+    private static String getDestiLoca(String fileName, String actionName, String result) {
+    	Document doc = readXML(fileName);
+    	NodeList nList = doc.getElementsByTagName("action");
+    	String resultDes = null;
+    	for (int i = 0; i < nList.getLength(); i++) {
+    		Node nNode = nList.item(i);
+    		Element el = (Element)nNode;
+    		
+    		if (el.getAttribute("name").equals(actionName)){
+    			
+    			NodeList nListSub = el.getElementsByTagName("result");
+    			for (int j = 0; j < nListSub.getLength(); j++) {
+    				Node nNodeSub = nListSub.item(j);
+    				Element eSub = (Element) nNodeSub;
+    				if (eSub.getAttribute("name").equals(result)){
+    					resultDes = eSub.getTextContent();
+    					break;
+    				}
+    			}
+    		}
+    		
+    	}
+    	
+    	return resultDes;
+    }
+    
+    private static Class<?> getTargetClass(String fileName, String actionName) {
+    	Element target = getTargetElement(fileName, actionName);
+    	
+    	String className = target.getAttribute("class");
+    	Class<?> targetClass = null;
+		try {
+			targetClass = Class.forName(className);
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+    	
+    	return targetClass;
+    }
+
+}
diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java b/group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a23b9154ba
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws ClassNotFoundException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws ClassNotFoundException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/View.java b/group04/564451732/hw2/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/struts.xml b/group04/564451732/hw2/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/423184723/src/com/coding/basic/ArrayList.java b/group04/564451732/hw2/src/com/coding/basic/ArrayList.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/ArrayList.java
rename to group04/564451732/hw2/src/com/coding/basic/ArrayList.java
diff --git a/group20/423184723/src/com/coding/basic/BinaryTreeNode.java b/group04/564451732/hw2/src/com/coding/basic/BinaryTreeNode.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/BinaryTreeNode.java
rename to group04/564451732/hw2/src/com/coding/basic/BinaryTreeNode.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/Iterator.java b/group04/564451732/hw2/src/com/coding/basic/Iterator.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/Iterator.java
rename to group04/564451732/hw2/src/com/coding/basic/Iterator.java
diff --git a/group04/564451732/hw2/src/com/coding/basic/LinkedList.java b/group04/564451732/hw2/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..d6f6ffebec
--- /dev/null
+++ b/group04/564451732/hw2/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,124 @@
+package com.coding.basic;
+
+
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和list均包含已升序排列的整数
+	 * 从当前链表中取出那些list所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public static int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在list中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/group11/395443277/data_structure/src/com/coding/basic/List.java b/group04/564451732/hw2/src/com/coding/basic/List.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/List.java
rename to group04/564451732/hw2/src/com/coding/basic/List.java
diff --git a/group20/423184723/src/com/coding/basic/Queue.java b/group04/564451732/hw2/src/com/coding/basic/Queue.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/Queue.java
rename to group04/564451732/hw2/src/com/coding/basic/Queue.java
diff --git a/group20/423184723/src/com/coding/basic/Stack.java b/group04/564451732/hw2/src/com/coding/basic/Stack.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/Stack.java
rename to group04/564451732/hw2/src/com/coding/basic/Stack.java
diff --git a/group04/564451732/hw2/struts.xml b/group04/564451732/hw2/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group04/564451732/hw2/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/564451732/src/Test.java b/group04/564451732/src/Test.java
deleted file mode 100644
index 3335242a80..0000000000
--- a/group04/564451732/src/Test.java
+++ /dev/null
@@ -1,8 +0,0 @@
-
-public class Test {
-
-	public static void main(String[] args) {
-		
-	}
-
-}
diff --git a/group04/564451732/src/hw1/BinaryTreeNode.java b/group04/564451732/src/hw1/BinaryTreeNode.java
deleted file mode 100644
index 4b0367f13c..0000000000
--- a/group04/564451732/src/hw1/BinaryTreeNode.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package hw1;
-
-public class BinaryTreeNode {
-	private Comparable data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	private BinaryTreeNode root;
-	
-	public BinaryTreeNode (Comparable data) {
-		this.data = data;
-	}
-	public BinaryTreeNode () {
-		
-	}
-	public Object getData() {
-		return data;
-	}
-	public void setData(Comparable data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-		return;
-	}
-	
-	
-	
-	public BinaryTreeNode getRoot() {
-		return root;
-	}
-	public void setRoot(BinaryTreeNode root) {
-		this.root = root;
-	}
-	public BinaryTreeNode insert(Comparable o){
-		BinaryTreeNode result = new BinaryTreeNode(o);
-		if (root == null) {
-			root = result;
-		} else {
-			BinaryTreeNode dummy = root;
-			insertHelper(o,dummy);
-			
-		}
-		return result;
-	}
-	
-	private void insertHelper (Comparable o, BinaryTreeNode root) {
-		if (o.compareTo(root.data) < 0) {
-			if (root.left == null) {
-				root.left = new BinaryTreeNode(o);
-			} else {
-				insertHelper (o, root.left);
-			}
-		} else {
-			if (root.right == null) {
-				root.right = new BinaryTreeNode(o);
-				
-			} else {
-				insertHelper (o, root.right);
-			}
-		}
-	}
-}
diff --git a/group04/564451732/src/hw1/Iterator.java b/group04/564451732/src/hw1/Iterator.java
deleted file mode 100644
index 93e22e9377..0000000000
--- a/group04/564451732/src/hw1/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package hw1;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/group04/564451732/src/hw1/LinkedList.java b/group04/564451732/src/hw1/LinkedList.java
deleted file mode 100644
index 793f7c66d6..0000000000
--- a/group04/564451732/src/hw1/LinkedList.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package hw1;
-
-import java.util.Iterator;
-
-public class LinkedList implements List {
-private Node head;
-private Node tail;
-	
-	public void add(Object o){
-		if (head != null) {
-			Node dummy = new Node(new Object());
-			dummy.next = head;
-			Node nextNode = head;
-			
-			while (nextNode != null) {
-				dummy = dummy.next;
-				nextNode = nextNode.next;
-			}
-			dummy.next = new Node(o);
-			tail = dummy.next;
-		} else {
-			head = new Node(o);
-			tail = head;
-		}
-		
-	}
-	public void add(int index , Object o){
-		if (index < 0 || index > size()) {
-			throw new IndexOutOfBoundsException("Index entered is out of bounds");
-		}
-		Node dummy = head;
-		for (int i = 1; i < index; i++) {
-			dummy = dummy.next;
-		}
-		Node temp = dummy.next;
-		dummy.next = new Node(o);
-		dummy.next.next = temp;
-		if (index == size()) {
-			tail = dummy.next;
-		}
-	}
-	public Object get(int index){
-		if (index < 0 || index >= size()) {
-			throw new IndexOutOfBoundsException("Index entered is out of bounds");
-		}
-		Node dummy = head;
-		for (int i = 0; i < index;i++) {
-			dummy = dummy.next;
-		}
-		return dummy.data;
-	}
-	public Object remove(int index){
-		if (index < 0 || index >= size()) {
-			throw new IndexOutOfBoundsException("Index entered is out of bounds");
-		}
-		Node dummy = head;
-		for (int i = 1; i < index;i++) {
-			dummy = dummy.next;
-		}
-		Node result = dummy.next;
-		dummy.next = dummy.next.next;
-		if (dummy.next == null) {
-			tail = dummy;
-		}
-		return result.data;
-	}
-	
-	public int size(){
-		Node dummy = head;
-		int size = 0;
-		while (dummy != null) {
-			dummy = dummy.next;
-			size++;
-		}
-		
-		return size;
-	}
-	
-	public void addFirst(Object o){
-		Node first = new Node(o);
-		first.next = head;
-		head = first;
-	}
-	public void addLast(Object o){
-		tail.next = new Node(o);
-		tail = tail.next;
-	}
-	public Object removeFirst(){
-		Node temp = head;
-		head = head.next;
-		return temp.data;
-	}
-	public Object removeLast(){
-		Node dummy = head;
-		for (int i = 1; i < size()-1; i++) {
-			dummy = dummy.next;
-		}
-		Node result = dummy.next;
-		tail = dummy;
-		dummy.next  = null;
-		return result.data;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-		
-		public Node(Object data) {
-			this.data = data;
-		}
-		
-	}
-}
diff --git a/group04/564451732/src/hw1/List.java b/group04/564451732/src/hw1/List.java
deleted file mode 100644
index a976c82204..0000000000
--- a/group04/564451732/src/hw1/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package hw1;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/group04/821655640/learning_projects/project_basic_001/pom.xml b/group04/821655640/learning_projects/project_basic_001/pom.xml
index 6675a5d76d..1f93bf44e0 100644
--- a/group04/821655640/learning_projects/project_basic_001/pom.xml
+++ b/group04/821655640/learning_projects/project_basic_001/pom.xml
@@ -19,7 +19,13 @@
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 			<version>4.10</version>
-			<scope>test</scope>
 		</dependency>
+		
+		<dependency>
+		    <groupId>jaxen</groupId>
+		    <artifactId>jaxen</artifactId>
+		    <version>1.1-beta-7</version>
+		</dependency>
+		
 	</dependencies>
 </project>
diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..6b5b877a7b
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,228 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 * 11 01    11|
+	 */
+	public void reverseArray(int[] origin){
+		int len = origin.length-1;
+		
+		for (int i = 0; i <((0 == len%2) ? len/2 :(len+1)/2) ; i++) {
+			origin[i] = origin[i]^origin[len-i];
+			origin[len-i] = origin[len-i]^origin[i];
+			origin[i] = origin[i]^origin[len-i];
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		//get count
+		int count = 0;
+		for (int i : oldArray) {
+			if(0 != i) {
+				count++;
+			}
+		}
+		
+		//remove zero
+		int newArray[] = new int[count];
+		int j=0;
+		for (int i : oldArray) {
+			if(0 != i) {
+				newArray[j++] = i;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public Integer[] merge(int[] array1, int[] array2){
+		
+		if (null==array1 || null == array2 || 0 == array1.length || 0 == array2.length) {
+			new IllegalArgumentException("参数不允许为空数组!");
+		}
+		
+		int i=0,j=0;
+		ArrayList<Integer> mergedList = new ArrayList<Integer>();
+		while (true) {
+			if (j == array2.length-1 || i == array1.length-1) {
+				break;
+			}
+			if (array1[i] < array2[j]) {
+				mergedList.add(array1[i]);
+				i++;
+			}else if (array1[i] > array2[j]) {
+				mergedList.add(array2[j]);
+				j++;
+			}else {
+				mergedList.add(array2[j]);
+				i++;
+				j++;
+			}
+			
+		}
+		
+		//put the least part of one array into list
+		if (i == array1.length) {
+			for (int k = j; k < array2.length; k++) {
+				mergedList.add(array2[k]);
+			}
+		}else {
+			for (int k = i; k < array1.length; k++) {
+				mergedList.add(array1[k]);
+			}
+		}
+		
+		return  arrayListToInteger(mergedList);
+	}
+	
+	private Integer[] arrayListToInteger(ArrayList<Integer> arrayList) {
+		Integer tempArray[] = new Integer[arrayList.size()];
+		int i=0;
+		for (Integer integer : arrayList) {
+			tempArray[i++] = integer;
+		}
+		
+		return tempArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		
+		if (null == oldArray || size<= 0) {
+			new IllegalArgumentException("数组为空或者长度非法!!");
+		}
+		
+		int newArray[] = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public Integer[] fibonacci(int max){
+		if ( 1 == max ) {
+			return new Integer[0];
+		}
+		ArrayList<Integer> arrayList = new ArrayList<Integer>();
+		arrayList.add(1);
+		arrayList.add(1);
+		
+		int i=0,j=1;
+		while (arrayList.get(i)+arrayList.get(j) < max) {
+			arrayList.add(arrayList.get(i)+arrayList.get(j));
+			i++;
+			j++;
+		}
+		
+		return arrayListToInteger(arrayList);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public Integer[] getPrimes(int max){
+		ArrayList<Integer> arrayList = new ArrayList<Integer>();
+		boolean isPrimes = true;
+		for (int i = 2; i < max; i++) {
+			isPrimes = true;
+			for (int j = 2; j <= Math.sqrt(i) ; j++) {
+				if (0 == i % j) {
+					isPrimes = false;
+					break;
+				}
+			}
+			
+			if (isPrimes) {
+				arrayList.add(i);
+			}
+			
+		}
+		return arrayListToInteger(arrayList);
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public Integer[] getPerfectNumbers(int max){
+		ArrayList<Integer> arrayList = new ArrayList<Integer>();
+		int sum = 0;
+		for (int i = 2; i < max; i++) {
+			sum = 0;
+			//the factor is less than half of a number
+			for (int j = 1; j <= (i+1)/2; j++) {
+				if (0 == i%j) {
+					sum += j;
+				}
+			}
+			
+			if (sum == i) {
+				arrayList.add(i);
+			}
+		}
+		return arrayListToInteger(arrayList);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sb = new StringBuilder();
+		for (int i : array) {
+			sb.append(i).append(seperator);
+		}
+		
+		sb.deleteCharAt(sb.length()-1);
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..544f5ac082
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,86 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String,String> parameters)  {
+    	
+        
+		//0. 读取配置文件struts.xml
+    	Document xmlDoc = null;
+    	View view = null;
+ 		try {
+ 			xmlDoc = getXMLDocument("./src/main/java/com/coderising/litestruts/struts.xml");
+    	
+	 		/*1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+			据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+			("name"="test" ,  "password"="1234") ,     	
+			那就应该调用 setName和setPassword方法*/
+ 		
+	 		String classStr = xmlDoc.selectSingleNode("struts/action[@name='"+actionName+"']/@class").getText();
+	 		Class<?> actionClass = Class.forName(classStr);
+	 		Object action = actionClass.newInstance();
+	 		
+	 		Iterator<Map.Entry<String,String>> itr = parameters.entrySet().iterator();
+	 		Entry<String,String> entry = null;
+	 		String key = "";
+	 		String value = "";
+	 		while(itr.hasNext()) {
+	 			entry = itr.next();
+	 			key = entry.getKey();
+	 			value = entry.getValue();
+	 			Method setter = actionClass.getMethod("set"+key.substring(0, 1).toUpperCase()+key.substring(1),String.class);
+	 			setter.invoke(action, value);
+	 		}
+	 		
+		
+	//		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+			Method exeMethod = actionClass.getMethod("execute");
+			String result = exeMethod.invoke(action).toString();
+//	 		System.out.println(result);
+		 	
+			/*3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+			通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+			放到View对象的parameters*/
+	 		
+		 	Map<String,String> viewDataMap = new HashMap<String,String>();
+		 	String methodName = "";
+		 	for (Method md : actionClass.getMethods()) {
+		 		methodName = md.getName();
+				if (methodName.startsWith("get")) {
+					viewDataMap.put(methodName.substring(3, 4).toLowerCase()+methodName.substring(4), md.invoke(action).toString());
+				}
+			}
+		 	
+//		 	System.out.println(viewDataMap);
+		 	
+			/**
+			4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+			放到View对象的jsp字段中。
+	        */
+		 	String jspRet = xmlDoc.selectSingleNode("struts/action[@name='"+actionName+"']/result[@name='"+result+"']").getText();
+		 	view = new View();
+		 	view.setJsp(jspRet);
+		 	view.setParameters(viewDataMap);
+ 		} catch (Exception e) {
+			e.printStackTrace();
+		}
+    	return view;
+    }    
+    
+    private static Document getXMLDocument(String filePath) throws DocumentException {
+    	return new SAXReader().read(filePath);
+    }
+
+}
diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..867faed126
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success" >/jsp/welcome.jsp</result>
+    	<result name="error" >/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java
deleted file mode 100644
index 48b5e72dc2..0000000000
--- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.sunline.project_basic_001;
-
-import javax.swing.tree.TreeNode;
-
-
-/**
- * Hello world!
- *
- */
-public class App {
-	public static void main(String[] args) {
-		System.out.println("Hello World!");
-		TreeNode a;
-	}
-}
diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..66ea66f645
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,85 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	ArrayUtil arrayUtil = null;
+	@Before
+	public void setUp() {
+		arrayUtil = new ArrayUtil();
+	}
+	
+	@Test
+	public void testReverseArray() {
+		int  origin[] = {7, 9, 30, 3, 4};
+		int  expecteds[] = {4,3, 30 , 9,7};
+		arrayUtil.reverseArray(origin);
+		
+		Assert.assertArrayEquals(expecteds, origin);
+	}
+	
+	@Test
+	public void testRemoveZero() {
+		int oldArray[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int  expecteds[] = {1,3,4,5,6,6,5,4,7,6,7,5};
+		int newArray[] = arrayUtil.removeZero(oldArray);
+		
+		Assert.assertArrayEquals(expecteds, newArray);
+	}
+	
+	@Test
+	public void testMerge() {
+		int array1[] = {3, 5, 7,8};
+		int  array2[] = {4, 5, 6,7};
+		Integer  expecteds[] = {3,4,5,6,7,8};
+		Integer newArray[] = arrayUtil.merge(array1, array2);
+		Assert.assertArrayEquals(expecteds, newArray);
+	}
+	
+	@Test
+	public void testGrow() {
+		int oldArray[] = {2,3,6};
+		int  expecteds[] = {2,3,6,0,0,0};
+		int newArray[] = arrayUtil.grow(oldArray,3);
+		
+		Assert.assertArrayEquals(expecteds, newArray);
+	}
+	
+	@Test
+	public void testFibonacci() {
+		Integer expecteds[] = {1,1,2,3,5,8,13};
+		Integer newArray[] = arrayUtil.fibonacci(18);
+		
+		Assert.assertArrayEquals(arrayUtil.fibonacci(1), new Integer[0]);
+		Assert.assertArrayEquals(expecteds, newArray);
+	}
+	
+	@Test
+	public void testGetPrimes() {
+		Integer expecteds[] = {2,3,5,7,11,13,17,19};
+		Integer newArray[] = arrayUtil.getPrimes(23);
+		
+		Assert.assertArrayEquals(expecteds, newArray);
+	}
+	
+	@Test
+	public void testGetPerfectNumbers() {
+		Integer array[] = arrayUtil.getPerfectNumbers(100);
+		System.out.println(Arrays.toString(array));
+	}
+	
+	@Test
+	public void testJoin() {
+		int dealedArray[] = {3,8,9};
+		String expectedStr = "3-8-9";
+		String resultStr = arrayUtil.join(dealedArray, "-");
+		Assert.assertEquals("", expectedStr, resultStr);
+	}
+
+}
diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..760a991195
--- /dev/null
+++ b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,41 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+	
+}
diff --git a/group04/844028312/two/.classpath b/group04/844028312/two/.classpath
new file mode 100644
index 0000000000..05cf0dba9e
--- /dev/null
+++ b/group04/844028312/two/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="src/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group04/844028312/two/.gitignore b/group04/844028312/two/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group04/844028312/two/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group04/844028312/two/.project b/group04/844028312/two/.project
new file mode 100644
index 0000000000..b0f45e938b
--- /dev/null
+++ b/group04/844028312/two/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>two</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group04/844028312/two/src/com/coderising/array/ArrayUtil.java b/group04/844028312/two/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..309610c6be
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,265 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int size=origin.length;
+		if(size>1){
+				for(int i=0;i<size/2;i++){
+					int temp=origin[i];			//记录origin[i]的值
+					origin[i]=origin[size-1-i];
+					origin[size-1-i]=temp;
+				}
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int size=oldArray.length;
+		int zero=0;	//记录0的数目
+		for(int i=0;i<size;i++){
+			if(oldArray[i]==0){
+				zero++;
+			}
+		}
+		if(zero==0){
+			return oldArray;
+		}
+		else{
+			int [] newArray=new int[size-zero];	//新建一个数组
+			int now=0;//记录新数组的下标
+			for(int i=0;i<size;i++){
+				if(oldArray[i]!=0){
+					newArray[now]=oldArray[i];
+					now++;
+				}
+			}
+			return newArray;
+		}
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int size1=array1.length;
+		int size2=array2.length;
+		int newArray[];
+		if(size1==0&&size2==0){
+			return  null;
+		}
+		else{
+			newArray=new int[size1+size2];
+		}
+		if(size1>0)
+			System.arraycopy(array1, 0, newArray, 0, size1);
+		if(size2>0)
+			System.arraycopy(array2,0, newArray,  size1, size2);
+		for(int i=0;i<newArray.length;i++){
+			int min=newArray[i];
+			for(int j=i+1;j<newArray.length;j++){	// [2, 4, 2, 5, 9, 6, 3, 1, 10, 8]
+				if(min==newArray[j]){				//去除重复数
+					System.arraycopy(newArray,j+1, newArray,  j, newArray.length-j-1);
+					int [] a=new int[newArray.length-1];
+					System.arraycopy(newArray,0, a,  0, newArray.length-1);
+					newArray=a;
+				}
+				if(min>newArray[j]){
+					int temp=min;
+					min=newArray[j];
+					newArray[i]=min;
+					newArray[j]=temp;
+				}
+			}
+		}
+		return  newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int [] newArray=new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int [] a = null;
+		if(max>2){
+			a=new int[10];
+			int record=2;
+			do{
+				a[0]=1;
+				a[1]=1;
+				if(a.length>record)
+					a[record]=a[record-2]+a[record-1];
+				else{
+					a=grow(a,3);
+					a[record]=a[record-2]+a[record-1];
+				}
+				record++;
+			}while(a[record-1]<max);
+			int[] b=new int[record-1];
+			System.arraycopy(a, 0, b, 0, record-1);
+			a=b;
+		}
+		else if(max==2){
+			a=new int[2];
+			a[0]=1;
+			a[1]=1;
+		}
+		return a;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int n=2;//初始素数大小
+		int[] primes=new int[10];
+		int record=0;
+		while(true){
+			boolean isPrime=true;//是否是质数的标志
+			if(max<=n){
+				break;
+			}
+			int jude=(int) Math.sqrt(n);
+			for(int i=jude;i>1;i--){
+				if(n%i==0){
+					 isPrime=false;
+				}
+			}
+			if(isPrime){
+				if(record<primes.length)
+					primes[record]=n;
+				else{
+					primes=grow(primes,5);
+					primes[record]=n;
+				}
+				record++;
+			}
+			n++;
+		}
+		if(record<10){			//如果小于初始数组要去除0
+			primes=removeZero(primes);
+		}
+		if(record<primes.length-1){
+			int[] newArray=new int [record];
+			System.arraycopy(primes, 0, newArray, 0, record);
+			primes=newArray;
+		}
+		return primes;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int min=6;
+		int[] perfect=new int[3];
+		int record=0;
+		if(max>=min){
+			while(true){
+				boolean isPerfect=false;//是否是完数的标志
+				if(max<=min){
+					break;
+				}
+				int n=(int) Math.sqrt(min);
+				int count=0;
+				for(int i=n;i>=1;i--){
+					if(min%i==0){
+						count=count+i;
+						int b=min/i;
+						if(b!=min)
+							count=count+b;
+					}
+				}
+				if(count==min){
+					isPerfect=true;
+				}
+				if(isPerfect){
+					if(record<perfect.length)
+						perfect[record]=min;
+					else{
+						perfect=grow(perfect,1);
+						perfect[record]=min;
+					}
+					record++;
+				}
+				min++;
+			}
+			if(record<3){			//如果小于初始数组要去除0
+				perfect=removeZero(perfect);
+			}
+			if(record<perfect.length-1){
+				int[] newArray=new int [record];
+				System.arraycopy(perfect, 0, newArray, 0, record);
+				perfect=newArray;
+			}
+		}
+		return perfect;
+	}
+	
+	/**
+	 * 用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]);
+			
+			else
+				sb.append(array[i]+seperator);
+			
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group04/844028312/two/src/com/coderising/array/ArrayUtilTest.java b/group04/844028312/two/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..6215bec0cf
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,66 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	private ArrayUtil arrayUtil;
+	@Before
+	public void setUp() throws Exception {
+		arrayUtil=new ArrayUtil();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int []origin={1,2,3,4,5,6};
+		arrayUtil.reverseArray(origin);
+	}
+	@Test
+	public void testRemoveZero() {
+		int []oleArray={0,0,1,2,3,0,0,0,4,5,6,0,0,0};
+		int []newArray=arrayUtil.removeZero(oleArray);
+		System.out.println(newArray);
+	}
+	@Test
+	public void testMerge() {
+		int []array1={2,4,2,5,9};
+		int []array2={6,3,1,10,8};
+		int []newArray=arrayUtil.merge(array1, array2);
+		System.out.println(newArray);
+	}
+	@Test
+	public void testGrow() {
+		int []array1={2,4,2,5,9};
+		int []newArray=arrayUtil.grow(array1, 3);
+		System.out.println(newArray);
+	}
+	@Test
+	public void testFibonacci() {
+		int []newArray=arrayUtil.fibonacci(25);
+		System.out.println(newArray);
+	}
+	@Test
+	public void testGetPrimes() {
+		int []newArray=arrayUtil.getPrimes(25);
+		System.out.println(newArray);
+	}
+	@Test
+	public void testGetPerfectNumbers() {
+		int []newArray=arrayUtil.getPerfectNumbers(10000000);
+		System.out.println(newArray);
+	}
+	@Test
+	public void testJoin() {
+		int []array1={2,4,2,5,9};
+		String a=arrayUtil.join(array1, "-");
+		System.out.println(a);
+	}
+	
+}
diff --git a/group04/844028312/two/src/com/coderising/litestruts/LoginAction.java b/group04/844028312/two/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group04/844028312/two/src/com/coderising/litestruts/Struts.java b/group04/844028312/two/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..ae9024f04a
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,161 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts { 
+	private  Map<String,String> action=new HashMap<String,String>();
+	private  boolean find=false;
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	View v=new View();
+    	//创建SAXReader对象 
+    	SAXReader reader = new SAXReader();   
+    	Struts struts=new Struts();
+    	File file=new File(Struts.class.getResource("struts.xml").getFile());
+    	Document document;
+		try {
+			document = reader.read(file);
+			Element root=document.getRootElement();
+			struts.listNodes("login",root);
+			if(struts.getAction().size()!=0){
+				try {
+					String className=struts.getAction().get("class");
+					Class c=Class.forName(className);
+					Object obj = c.newInstance();
+					 Method[] methods = c.getDeclaredMethods();
+					 Iterator iter = parameters.entrySet().iterator();			
+						while (iter.hasNext()) {
+							Map.Entry entry = (Map.Entry) iter.next();
+							Object key = entry.getKey();
+							Object val = entry.getValue();
+						 for(Method m:methods){
+							 String sName=m.getName().substring(0, 3);
+							 String eName=m.getName().substring(3, m.getName().length()).toLowerCase();
+							
+							 if("set".equals(sName)&&key.equals(eName)){
+								 m.invoke(obj, val);
+								 break;
+							 }
+						 }
+						}
+					 Method exectue= c.getDeclaredMethod("execute"); 
+					 String key=(String) exectue.invoke(obj, null);
+					 String jsp;
+					 if(key!=null&&!"".equals(key)){
+						 jsp=struts.getAction().get(key);
+						 v.setJsp(jsp);
+					 }
+					 Map map=new HashMap<>();
+					 for(Method m:methods){
+						 String sName=m.getName().substring(0, 3);
+						 
+						 if("get".equals(sName)){
+							String key2=m.getName().substring(3, m.getName().length()).toLowerCase();
+							String values=(String) m.invoke(obj, null);
+							map.put(key2, values);
+						 }
+					 }	
+					 v.setParameters(map);
+					
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				
+			}
+		} catch (DocumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	
+    	
+    	return v;
+    }   
+    public Map<String, String> getAction() {
+		return action;
+	}
+	public void setAction(Map<String, String> action) {
+		this.action = action;
+	}
+	public  Map listNodes(String actionName,Element node){
+    	String name=node.getName();			//节点名字
+        if("action".equals(name)){
+        		List<Attribute> attributes=node.attributes();//获取节点属性
+             	for(Attribute attribute:attributes){
+             		String aName=attribute.getName();
+             		if("name".equals(aName)&&attribute.getValue().equals(actionName)){
+             			for(Attribute attribute2:attributes){
+             				String cName=attribute2.getName();
+             				if("class".equals(cName)){
+                 				action.put(cName, attribute2.getValue());
+                 				Iterator<Element> iterator=node.elementIterator();
+                 				while(iterator.hasNext()){
+                 					Element rNode=iterator.next();
+                 					String result=rNode.getName();
+                 					if("result".equals(result)){
+                 			    		List<Attribute> attributes3=rNode.attributes();
+                 			    		for(Attribute attribute3:attributes3){
+                 			        		String rName=attribute3.getName();
+                 			        		if("name".equals(rName)){
+                 			        			String rValue=attribute3.getValue();
+                 			        			action.put(rValue, rNode.getTextTrim());
+                 			        			break;
+                 			        		}
+                 			        	}
+                 			    		
+                 			    		
+                 			    	}
+                 					else{
+                 						break;
+                 					}
+                 				}
+                 				break;
+                 				}
+             			}
+             			find=true;
+             			break;
+             		}
+             	}
+        	 }
+        	Iterator<Element> iterator=node.elementIterator();
+        	while(iterator.hasNext()&&!find){
+        		listNodes(actionName,iterator.next());
+        	}
+        	return null;
+    }
+  
+
+}
diff --git a/group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java b/group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..6511d77741
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,50 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        			
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+	@Test
+	public void test() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+	}
+}
diff --git a/group04/844028312/two/src/com/coderising/litestruts/View.java b/group04/844028312/two/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group04/844028312/two/src/com/coderising/litestruts/struts.xml b/group04/844028312/two/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..a0b14be5d3
--- /dev/null
+++ b/group04/844028312/two/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success"> /jsp/welcome.jsp </result>
+    	<result name= "error"> /jsp/error.jsp </result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group04/916758663/learn02/.gitignore b/group04/916758663/learn02/.gitignore
new file mode 100644
index 0000000000..45026a9caf
--- /dev/null
+++ b/group04/916758663/learn02/.gitignore
@@ -0,0 +1,21 @@
+# Eclipse project files
+.classpath
+.project
+.settings/
+
+
+# Intellij project files
+*.iml
+.idea/
+*.iws
+
+# maven
+target/
+logs/
+.DS_Store
+
+# Mac
+.DS_Store
+
+#
+*.log
diff --git a/group04/916758663/learn02/pom.xml b/group04/916758663/learn02/pom.xml
new file mode 100644
index 0000000000..6503735a51
--- /dev/null
+++ b/group04/916758663/learn02/pom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.example</groupId>
+  <artifactId>litestruts</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+    </dependency>
+  </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java
new file mode 100644
index 0000000000..2565fe4ad6
--- /dev/null
+++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.example.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author liuxin
+ */
+public class LoginAction {
+
+  private String name;
+  private String password;
+  private String message;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  public String execute() {
+    if ("test".equals(name) && "1234".equals(password)) {
+      this.message = "login successful";
+      return "success";
+    }
+    this.message = "login failed,please check your user/pwd";
+    return "fail";
+  }
+
+  public String getMessage() {
+    return this.message;
+  }
+}
diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java
new file mode 100644
index 0000000000..eccfdcb73f
--- /dev/null
+++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java
@@ -0,0 +1,158 @@
+package com.example.litestruts;
+
+import com.example.litestruts.dto.Action;
+import com.example.litestruts.dto.ActionResult;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+public class Struts {
+
+  public static View runAction(final String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+    try {
+      //读取配置文件struts.xml
+      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+      DocumentBuilder db = dbf.newDocumentBuilder();
+      Document document = db.parse(
+          "/Users/qilei/idea/coding2017/coding2017/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml");
+      List<Action> actions = parseActions(document);
+
+      //1. 根据actionName找到相对应的class
+      Optional<Action> matchAction = actions.stream()
+          .filter(action -> action.getName().equals(actionName)).findFirst();
+      if (matchAction.isPresent()) {
+        String actionClassName = matchAction.get().getClassName();
+        Object instance = Class.forName(actionClassName).newInstance();
+        Class<?> clazz = instance.getClass();
+        for (Entry<String, String> item : parameters.entrySet()) {
+          String key = item.getKey();
+          Field field = clazz.getDeclaredField(key);
+          field.setAccessible(true);
+          field.set(instance, item.getValue());
+        }
+
+        Method method = clazz.getDeclaredMethod("execute");
+        String invokeResult = (String) method.invoke(instance);
+        Optional<ActionResult> actionResultOptional = matchAction.get().getActionResultList().stream()
+            .filter(actionResult -> actionResult.getName().equals(invokeResult)).findFirst();
+        if (actionResultOptional.isPresent()) {
+          String jsp = actionResultOptional.get().getJsp();
+          Map<String, String> viewParas = new HashMap<>();
+          Method[] declaredMethods = clazz.getDeclaredMethods();
+          for (int i = 0; i < declaredMethods.length; i++) {
+            Method declaredMethod = declaredMethods[i];
+            if (declaredMethod.getName().startsWith("get")) {
+              String value = (String) declaredMethod.invoke(instance);
+              String key = declaredMethod.getName().substring(3).toLowerCase();
+              viewParas.put(key,value);
+            }
+          }
+
+          View view = new View();
+          view.setJsp(jsp);
+          view.setParameters(viewParas);
+          return view;
+        }
+
+
+      }
+
+      System.out.println("Finished");
+    } catch (ParserConfigurationException e) {
+      e.printStackTrace();
+    } catch (SAXException e) {
+      e.printStackTrace();
+    } catch (IOException e) {
+      e.printStackTrace();
+    } catch (IllegalAccessException e) {
+      e.printStackTrace();
+    } catch (InstantiationException e) {
+      e.printStackTrace();
+    } catch (ClassNotFoundException e) {
+      e.printStackTrace();
+    } catch (NoSuchFieldException e) {
+      e.printStackTrace();
+    } catch (NoSuchMethodException e) {
+      e.printStackTrace();
+    } catch (InvocationTargetException e) {
+      e.printStackTrace();
+    }
+
+    return null;
+  }
+
+  private static List<Action> parseActions(Document document) {
+    List<Action> actions = new ArrayList<Action>();
+    NodeList actionList = document.getElementsByTagName("action");
+    for (int i = 0; i < actionList.getLength(); i++) {
+      Node item = actionList.item(i);
+      NamedNodeMap attributes = item.getAttributes();
+      Action action = new Action();
+      for (int j = 0; j < attributes.getLength(); j++) {
+        Node attr = attributes.item(j);
+        String key = attr.getNodeName();
+        String value = attr.getNodeValue();
+        if (key.equals("name")) {
+          action.setName(value);
+        } else if (key.equals("class")) {
+          action.setClassName(value);
+        }
+      }
+
+      List<ActionResult> actionResultList = new ArrayList<ActionResult>();
+      NodeList actionResultNodes = item.getChildNodes();
+      for (int j = 0; j < actionResultNodes.getLength(); j++) {
+        Node actionResultNode = actionResultNodes.item(j);
+        if (actionResultNode.getNodeType() == Node.ELEMENT_NODE) {
+          ActionResult actionResult = new ActionResult();
+          Element actionResultElement = (Element) actionResultNode;
+          actionResult.setName(actionResultElement.getAttribute("name"));
+          actionResult.setJsp(actionResultElement.getFirstChild().getNodeValue());
+          actionResultList.add(actionResult);
+        }
+      }
+      action.setActionResultList(actionResultList);
+      actions.add(action);
+    }
+    return actions;
+  }
+
+}
diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/View.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/View.java
new file mode 100644
index 0000000000..44f3d97bcd
--- /dev/null
+++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/View.java
@@ -0,0 +1,27 @@
+package com.example.litestruts;
+
+import java.util.Map;
+
+public class View {
+
+  private String jsp;
+  private Map parameters;
+
+  public String getJsp() {
+    return jsp;
+  }
+
+  public View setJsp(String jsp) {
+    this.jsp = jsp;
+    return this;
+  }
+
+  public Map getParameters() {
+    return parameters;
+  }
+
+  public View setParameters(Map parameters) {
+    this.parameters = parameters;
+    return this;
+  }
+}
diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java
new file mode 100644
index 0000000000..733370ab73
--- /dev/null
+++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java
@@ -0,0 +1,78 @@
+package com.example.litestruts.dto;
+
+import java.util.List;
+
+/**
+ * Created by qilei on 17/3/5.
+ */
+public class Action {
+  private String name;
+  private String className;
+  private List<ActionResult> actionResultList;
+
+  public Action() {
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getClassName() {
+    return className;
+  }
+
+  public void setClassName(String className) {
+    this.className = className;
+  }
+
+  public List<ActionResult> getActionResultList() {
+    return actionResultList;
+  }
+
+  public void setActionResultList(List<ActionResult> actionResultList) {
+    this.actionResultList = actionResultList;
+  }
+
+  private Action(Builder builder) {
+    name = builder.name;
+    className = builder.className;
+    actionResultList = builder.actionResultList;
+  }
+
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
+  public static final class Builder {
+
+    private String name;
+    private String className;
+    private List<ActionResult> actionResultList;
+
+    private Builder() {
+    }
+
+    public Builder name(String val) {
+      name = val;
+      return this;
+    }
+
+    public Builder className(String val) {
+      className = val;
+      return this;
+    }
+
+    public Builder actionResultList(List<ActionResult> val) {
+      actionResultList = val;
+      return this;
+    }
+
+    public Action build() {
+      return new Action(this);
+    }
+  }
+}
diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java
new file mode 100644
index 0000000000..0fc815e162
--- /dev/null
+++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java
@@ -0,0 +1,28 @@
+package com.example.litestruts.dto;
+
+/**
+ * Created by qilei on 17/3/5.
+ */
+public class ActionResult {
+  private String name;
+  private String jsp;
+
+  public ActionResult() {
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getJsp() {
+    return jsp;
+  }
+
+  public void setJsp(String jsp) {
+    this.jsp = jsp;
+  }
+}
diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml b/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml
new file mode 100644
index 0000000000..c31db95dd5
--- /dev/null
+++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+  <action class="com.example.litestruts.LoginAction" name="login">
+    <result name="success">/jsp/homepage.jsp</result>
+    <result name="fail">/jsp/showLogin.jsp</result>
+  </action>
+  <action class="com.example.litestruts.LogoutAction" name="logout">
+    <result name="success">/jsp/welcome.jsp</result>
+    <result name="error">/jsp/error.jsp</result>
+  </action>
+</struts>
\ No newline at end of file
diff --git a/group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java b/group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..ba938f466e
--- /dev/null
+++ b/group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.example.litestruts;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by qilei on 17/3/5.
+ */
+public class StrutsTest {
+
+  @Test
+  public void testLoginActionSuccess() {
+
+    String actionName = "login";
+
+    Map<String,String> params = new HashMap<String,String>();
+    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<String,String> params = new HashMap<String,String>();
+    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/group05/1026626960/.classpath b/group05/1026626960/.classpath
index fb5011632c..bb62e29268 100644
--- a/group05/1026626960/.classpath
+++ b/group05/1026626960/.classpath
@@ -2,5 +2,8 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="src/cn/study2/myStruts/lib/commons-logging-1.1.3.jar"/>
+	<classpathentry kind="lib" path="src/cn/study2/myStruts/lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="src/cn/study2/myStruts/lib/junit-4.4.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group05/1026626960/src/cn/study2/array/ArrayUtil.java b/group05/1026626960/src/cn/study2/array/ArrayUtil.java
new file mode 100644
index 0000000000..a57881918b
--- /dev/null
+++ b/group05/1026626960/src/cn/study2/array/ArrayUtil.java
@@ -0,0 +1,213 @@
+package cn.study2.array;
+
+public class ArrayUtil {
+	
+	/**
+	 *  ����һ����������a , �Ը������ֵ�����û�
+	 *	���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+	 *	���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 */
+	public void exchangeArray(int[] a){
+		int index = a.length;
+		int a1 = 0;
+		for(int i = 1; i < index/2; i++){
+			a[i] = a1;
+			a[i] = a[index - i];
+			a[index - i] = a[i];
+		}
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 */
+	public int[] removeZero(){
+		int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int size = 0;
+		for(int i = 0; i < oldArr.length; i++){
+			if(oldArr[i] != 0){
+				size++;
+			}
+		}
+		int newArr[] = new int[size];
+		for(int i = 0; i < oldArr.length; i++){
+			int j = 0;
+			if(oldArr[i] != 0){
+				newArr[j] = oldArr[i];
+				j++;
+			}
+		}
+		return newArr;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 */
+	public int[] reshapeArr(int a1[], int a2[]){
+		int size = a1.length+a2.length;
+		int a3[] = new int[size];
+		//δ���
+		return a3;
+	}
+	
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 */
+	public int[] addSize(int oldArr[],int size){
+		int newSize = oldArr.length+size;
+		int newArr[] = new int[newSize];
+		for(int i = 0; i < newArr.length; i++){
+			if(i < oldArr.length){
+				newArr[i] = oldArr[i];
+			}
+			newArr[i] = 0;
+		}
+		return newArr;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 */
+	public int[] method1(int max){
+		int Arr[] = new int[max];
+		if(max <= 1){
+			return null;
+		}else if(max <= 2){ 
+			int a[] = {1,1,2};
+            return a; 
+        }else{
+        	Arr[0] = 1;
+        	Arr[1] = 1;
+        	Arr[2] = 2;
+        	int n = 3;
+        	while(n < max){
+        		Arr[n] = Arr[n-2] + Arr[n-1];
+        	}
+        	return Arr;
+        }
+	}
+	
+	/**
+	 * ���������쳲�������
+	 */
+	//δ���
+	
+	
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 */
+	public int[] getPrimes(int max) {
+		int size = 0;
+		for (int i = 0; i < max; i++) {
+			if (isPrimes(i)) {
+				size++;
+			}
+		}
+		int Arr[] = new int[size];
+		int j = 0;
+		for (int i = 0; i < max; i++) {
+			if (isPrimes(i)) {
+				Arr[j++] = i;
+			}
+		}
+		return Arr;
+	}
+	
+	/**
+	 * �ж��Ƿ�Ϊ����
+	 */
+	public boolean isPrimes(int num){
+		if(num<=1){
+			return false;
+		}else{
+			for(int i=2;i<num/2;i++){
+				if(num%i==0){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+		
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 */
+	public int[] isWanshu(int max){
+		if(max<=0){
+			return null;
+		}
+		int size = 0;
+		for(int i = 0; i < max; i++){
+			if(max/i==0){
+				size++;
+			}
+		}
+		int []a = new int[size];
+		int j = 0;
+		for(int i = 0; i < max; i++){
+			if(max/i==0){
+				a[j++]=i;
+			}
+		}
+		return a;
+	}
+	
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 */
+	public String join(int array[],String seperator){
+		StringBuffer sb = new StringBuffer();
+		for(int i = 0; i < array.length; i++){
+			if(i<array.length){
+				sb.append(array[i]+"-");
+			}else{
+				sb.append(array[i]+"");
+			}
+		}
+		return sb.toString();
+	}
+		
+		
+		
+	
+		
+		
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+}
diff --git a/group05/1026626960/src/cn/study2/myStruts/ActionMapping.java b/group05/1026626960/src/cn/study2/myStruts/ActionMapping.java
new file mode 100644
index 0000000000..d95a93b28f
--- /dev/null
+++ b/group05/1026626960/src/cn/study2/myStruts/ActionMapping.java
@@ -0,0 +1,45 @@
+package cn.study2.myStruts;
+
+import java.util.Map;
+/*
+  ��װaction�ڵ�
+    <action name="login" class="LoginAction" method="login">
+		<result name="success" type="redirect">/index.jsp</result>
+		<result name="loginFaild">/login.jsp</result>
+	</action>
+ */
+public class ActionMapping {
+	// ����·������
+		private String name;
+		// ����aciton���ȫ��
+		private String className;
+		// ��������
+		private String method;
+		// �����ͼ����
+		private Map<String,Result> results;
+		
+		public String getName() {
+			return name;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public String getClassName() {
+			return className;
+		}
+		public void setClassName(String className) {
+			this.className = className;
+		}
+		public String getMethod() {
+			return method;
+		}
+		public void setMethod(String method) {
+			this.method = method;
+		}
+		public Map<String, Result> getResults() {
+			return results;
+		}
+		public void setResults(Map<String, Result> results) {
+			this.results = results;
+		}
+}
diff --git a/group05/1026626960/src/cn/study2/myStruts/Result.java b/group05/1026626960/src/cn/study2/myStruts/Result.java
new file mode 100644
index 0000000000..0ed80bd80f
--- /dev/null
+++ b/group05/1026626960/src/cn/study2/myStruts/Result.java
@@ -0,0 +1,28 @@
+package cn.study2.myStruts;
+
+public class Result {
+		// ��ת�Ľ�����
+		private String name;
+		// ��ת���ͣ�Ĭ��Ϊת���� "redirect"Ϊ�ض���
+		private String type;
+		// ��ת��ҳ��
+		private String page;
+		public String getName() {
+			return name;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public String getType() {
+			return type;
+		}
+		public void setType(String type) {
+			this.type = type;
+		}
+		public String getPage() {
+			return page;
+		}
+		public void setPage(String page) {
+			this.page = page;
+		}
+}
diff --git a/group05/1026626960/src/cn/study2/myStruts/Test.java b/group05/1026626960/src/cn/study2/myStruts/Test.java
new file mode 100644
index 0000000000..3f571354f9
--- /dev/null
+++ b/group05/1026626960/src/cn/study2/myStruts/Test.java
@@ -0,0 +1,7 @@
+package cn.study2.myStruts;
+
+public class Test {
+	public static void main(String[] args) {
+		new readStrutsXml();
+	}
+}
diff --git a/group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java b/group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java
new file mode 100644
index 0000000000..c90fdfe5af
--- /dev/null
+++ b/group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java
@@ -0,0 +1,98 @@
+package cn.study2.myStruts;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Test;
+
+/**
+ * ������ģ���ȡ����һ��struts.xml�ļ�
+ *
+ <mystruts>
+	<package>
+		
+		<action name="login" class="LoginAction" method="login">
+			<result name="loginSuccess" type="redirect">/index.jsp</result>
+			<result name="loginFaild">/login.jsp</result>
+		</action>
+		
+		<action name="register" class="RegisterAction" method="register">
+			<result name="registerSuccess">/login</result>
+		</action>
+		
+	</package>
+
+</mystruts>
+ * @author zhengliang
+ *
+ */
+public class readStrutsXml {
+	// ����action�ļ���
+	private Map<String,ActionMapping> allActions = new HashMap<String,ActionMapping>();
+	public readStrutsXml() {
+		this.init();
+	}
+	
+	// ��ʼ��allActions����
+	private void init() {
+		/********DOM4J��ȡ�����ļ�***********/
+		System.out.println("���ڶ�ȡmystruts.xml�ļ�");
+		try {
+			// �õ�������
+			SAXReader reader = new SAXReader();
+			// �õ�src/mystruts.xml  �ļ���
+			InputStream inStream = this.getClass().getResourceAsStream("/mystruts.xml");
+			//  �����ļ�
+			Document doc = reader.read(inStream);
+			//  ��ȡ��
+			Element root = doc.getRootElement();
+			// �õ�package�ڵ�
+			Element ele_package = root.element("package");
+			//  �õ�package�ڵ��£�  ���е�action�ӽڵ�
+			List<Element> listAction = ele_package.elements("action");
+			// ���� ����װ
+			for (Element ele_action : listAction) {
+				//  ��װһ��ActionMapping����
+				ActionMapping actionMapping = new ActionMapping();
+				actionMapping.setName(ele_action.attributeValue("name"));
+				actionMapping.setClassName(ele_action.attributeValue("class"));
+				actionMapping.setMethod(ele_action.attributeValue("method"));
+				
+				// ��װ��ǰaciton�ڵ������еĽ����ͼ
+				Map<String,Result> results = new HashMap<String, Result>();
+				
+				// �õ���ǰaction�ڵ������е�result�ӽڵ�
+				 Iterator<Element> it = ele_action.elementIterator("result");
+				 while (it.hasNext()) {
+					 // ��ǰ������ÿһ��Ԫ�ض��� <result...>
+					 Element ele_result = it.next();
+					 // ��װ����
+					 Result res = new Result();
+					 res.setName(ele_result.attributeValue("name"));
+					 res.setType(ele_result.attributeValue("type"));
+					 res.setPage(ele_result.getTextTrim());
+					 // ���ӵ�����
+					 results.put(res.getName(), res);
+				 }
+				// ���õ�actionMapping��
+				actionMapping.setResults(results);
+				
+				// 6.x actionMapping���ӵ�map����
+				allActions.put(actionMapping.getName(), actionMapping);
+			}
+			
+			System.out.println("struts.xml�ļ���ȡ���");
+			
+		} catch (Exception e) {
+			throw new RuntimeException("����ʱ���ʼ������",e);
+		}
+	}
+	
+	
+}
diff --git a/group05/1026626960/src/mystruts.xml b/group05/1026626960/src/mystruts.xml
new file mode 100644
index 0000000000..2a3b40e879
--- /dev/null
+++ b/group05/1026626960/src/mystruts.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mystruts>
+	<package>
+		<action name="login" class="LoginAction" method="login">
+			<result name="loginSuccess" type="redirect">/index.jsp</result>
+			<result name="loginFaild">/login.jsp</result>
+		</action>
+		
+		<action name="register" class="RegisterAction" method="register">
+			<result name="registerSuccess">/login</result>
+		</action>
+		
+	</package>
+
+</mystruts>
\ No newline at end of file
diff --git a/group05/1094051862/test01/.classpath b/group05/1094051862/test01/.classpath
index 04cc82dc42..9794cd8084 100644
--- a/group05/1094051862/test01/.classpath
+++ b/group05/1094051862/test01/.classpath
@@ -3,5 +3,6 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java b/group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..80c2bf7c32
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,235 @@
+package com.coderising.array;
+
+import org.junit.experimental.max.MaxCore;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin) {
+		if (origin.length < 2)
+			return;
+		int temp;
+		for (int i = 0; i < origin.length >> 1; i++) {
+			temp = origin[i];
+			origin[i] = origin[origin.length - 1 - i];
+			origin[origin.length - 1 - i] = temp;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		if (oldArray == null || oldArray.length == 0)
+			return null;
+		int zeros = 0;// 数组中0元素的个数
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0)
+				zeros++;
+		}
+		int[] newArr = new int[oldArray.length - zeros];
+		for (int i = 0, j = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArr[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArr;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+		int[] mergedArr = new int[array1.length + array2.length];
+		int temp;
+		int i = 0, j = 0, index = 0, size = 0;
+		while (i < array1.length && j < array2.length) {
+			//两个数组都没遍历到最后一个元素
+			if (i != array1.length - 1 && j != array2.length - 1) {
+				if (array1[i] < array2[j]) {
+					temp = array1[i++];
+				} else if (array1[i] > array2[j]) {
+					temp = array2[j++];
+				} else {
+					//遇到相等元素，存放任意一个就实现去重了
+					temp = array1[i++];
+					j++;
+				}
+				mergedArr[index++] = temp;
+				size++;
+			//array1遍历到最后一个元素
+			} else if (i == array1.length - 1 && j != array2.length - 1) {
+				if (array1[i] < array2[j]) {
+					temp = array1[i];
+					mergedArr[index++] = temp;
+					size++;
+					//将array2的剩余元素复制到mergedArr中
+					System.arraycopy(array2, j, mergedArr, index, array2.length - j);
+					size += array2.length - j;
+					break;
+				} else if (array1[i] > array2[j]) {
+					temp = array2[j++];
+					size++;
+				} else {
+					System.arraycopy(array2, j, mergedArr, index, array2.length - j);
+					size += array2.length - j;
+					break;
+				}
+			//array2遍历到最后一个元素
+			} else if (i != array1.length - 1 && j == array2.length - 1) {
+				if (array1[i] > array2[j]) {
+					temp = array2[j];
+					mergedArr[index++] = temp;
+					size++;
+					//将array1的剩余元素复制到mergedArr中
+					System.arraycopy(array1, i, mergedArr, index, array1.length - i);
+					size += array1.length - i;
+					break;
+				} else if (array1[i] < array2[j]) {
+					temp = array2[i++];
+					size++;
+				} else {
+					System.arraycopy(array1, i, mergedArr, index, array1.length - i);
+					size += array1.length - i;
+					break;
+				}
+			}
+		}
+		//构造新数组，去除mergedArr中尾部若干0元素
+		int[] result = new int[size];
+		System.arraycopy(mergedArr, 0, result, 0, size);
+		return result;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] arr = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, arr, 0, oldArray.length);
+		return arr;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+		if (max < 2) return null;
+		int[] a = new int[max];
+		a[0] = 1;
+		a[1] = 1;
+		int size = 2;
+		for (int i = 2;; i++) {
+			a[i] = a[i-1] + a[i-2];
+			if (a[i] > max) break;
+			size ++;
+		}
+		int[] fibonacci = new int[size];
+		System.arraycopy(a, 0, fibonacci, 0, size);
+		return fibonacci;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		if (max < 2) {
+			return null;
+		}
+		int[] a = new int[max];
+		int size = 0;
+		for (int i = 2; i < max; i++) {
+			if (isPrime(i)) {
+				a[size++] = i;
+			}
+		}
+		int[] primes = new int[size];
+		System.arraycopy(a, 0, primes, 0, size);
+		return primes;
+	}
+	private static boolean isPrime(int i) {
+		for (int j = 2; j*j <= i; j++) {
+			if (i % j == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) {
+		int[] a = new int[max];
+		int size = 0;
+		for (int i = 6; i < max; i++) {
+			if (isPerfectNumber(i)) {
+				a[size++] = i;
+			}
+		}
+		int[] perfectNumbers = new int[size];
+		System.arraycopy(a, 0, perfectNumbers, 0, size);
+		return perfectNumbers;
+	}
+	private static boolean isPerfectNumber(int i) {
+		int sum = 0;
+		for (int j = 1; j <= i >> 1; j++) {
+			if (i % j == 0) {
+				sum += j;
+			}
+		}
+		if (i == sum) return true;
+		else return false;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		StringBuilder sb = new StringBuilder();
+		for (int i : array) {
+			sb.append(i);
+			sb.append(seperator);
+		}
+		return sb.substring(0, sb.lastIndexOf(seperator));
+	}
+
+}
diff --git a/group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java b/group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..ae75b41379
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,91 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import sun.misc.Perf.GetPerfAction;
+
+public class ArrayUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] a = {7,9,30,3,5};
+		int[] b = a.clone();
+		ArrayUtil.reverseArray(a);
+		for (int i = 0; i < b.length; i ++) {
+			Assert.assertEquals(b[i], a[b.length - 1 - i]);
+		}
+		
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] result = {1,3,4,5,6,6,5,4,7,6,7,5};
+		int[] removeZero = ArrayUtil.removeZero(oldArr);
+		assertArrayEquals(result, removeZero);
+	}
+
+	@Test
+	public void testMerge() {
+		 int[] a1 = {3,5,7,8};
+		 int[] a2 = {4,5,6,7};
+		 int[] a3 = {3,4,5,6,7,8};
+		 int[] merge = ArrayUtil.merge(a1, a2);
+		 assertArrayEquals(a3, merge);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = {2,3,6};
+		int size = 3;
+		int[] growedArr = {2,3,6,0,0,0};
+		assertArrayEquals(growedArr, ArrayUtil.grow(oldArray, size));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] fibonacci = ArrayUtil.fibonacci(15);
+		for (int i : fibonacci) {
+			System.out.println(i);
+		}
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] primes = ArrayUtil.getPrimes(3);
+		for (int i : primes) {
+			System.out.println(i);
+		}
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] perfectNumbers = ArrayUtil.getPerfectNumbers(10000);
+		int[] expecteds = {6,28,496,8128};
+		assertArrayEquals(expecteds, perfectNumbers);
+		for (int i : perfectNumbers) {
+			System.out.println(i);
+		}
+	}
+
+	@Test
+	public void testJoin() {
+		int[] arr = {3,4,5};
+		String join = ArrayUtil.join(arr, "-");
+		assertEquals("3-4-5", join);
+	}
+
+}
diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java b/group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/Struts.java b/group05/1094051862/test01/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..c9e9f50631
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,181 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Test;
+import org.omg.PortableInterceptor.ObjectIdHelper;
+import org.xml.sax.SAXException;
+
+import com.coding.basic.ArrayList;
+import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
+
+public class Struts {
+	@Test
+	public static View runAction(String actionName,
+			Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 */
+		
+		// DOM4J方式解析xml
+		// 读取文件 转换成Document
+		View view = new View();
+		if (actionName == null || actionName.isEmpty()) {
+			return view;
+		}
+		try {
+			//获取action标签元素
+			Element actionEle = getActionElement(actionName);
+			
+			String qualifiedName = actionEle.attributeValue("class");
+			Class<?> clazz = Class.forName(qualifiedName);
+			Object instanceOfAction = getParameteredInstance(parameters, clazz);
+			Method executeMethod = clazz.getMethod("execute");
+			
+			//调用execute方法，改变action实例，一定要在执行getResultMap方法之前执行
+			String executeResult = (String) executeMethod.invoke(instanceOfAction);
+			Method[] methods = clazz.getMethods();
+			Map<?, ?> resultMap = getResultMap(instanceOfAction, methods);
+			view.setParameters(resultMap);
+			
+			List<Element> resultEles = actionEle.elements("result");
+			String jspPath = getJspPath(executeResult, resultEles);
+			view.setJsp(jspPath);
+		} catch (ClassNotFoundException e1) {
+			e1.printStackTrace();
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		return view;
+	}
+
+	private static String getJspPath(String result, List<Element> resultEles) {
+		for (int i = 0; i < resultEles.size(); i++) {
+			String text = resultEles.get(i).attributeValue("name");
+			if (text.equals(result)) {
+				String jspString = resultEles.get(i).getText();
+				return jspString;
+			}
+		}
+		return null;
+	}
+
+	private static Map<String, Object> getResultMap(Object obj, Method[] methodsOfObj)
+			throws IllegalAccessException, InvocationTargetException {
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		Method m;
+		for (int i = 0; i < methodsOfObj.length; i++) {
+			if (methodsOfObj[i].getName().startsWith("get")) {
+				m = methodsOfObj[i];
+				String methodName = getMethodNameInLowerCase(m);
+				Object result = m.invoke(obj);
+				resultMap.put(methodName.substring(3), result);
+			}
+		}
+		return resultMap;
+	}
+
+	private static String getMethodNameInLowerCase(Method m) {
+		String methodName = m.getName();
+		StringBuilder sbr = new StringBuilder(methodName);
+		sbr.setCharAt(3, Character.toLowerCase(sbr.charAt(3)));
+		methodName = sbr.toString();
+		return methodName;
+	}
+
+	private static Object getParameteredInstance(Map<String, String> parameters,
+			Class<?> clazz) {
+		Object obj = null;
+		try {
+			obj = clazz.newInstance();
+			Map methodsAndParams = new HashMap();
+			Set<String> keySet = parameters.keySet();
+			for (String k : keySet) {
+				String methodName = getMethodNameByProperty(k);
+				methodsAndParams.put(methodName, parameters.get(k));
+				Method setter = clazz.getMethod(methodName, parameters.get(k)
+						.getClass());
+				setter.invoke(obj, parameters.get(k));
+			}
+		} catch (InstantiationException | IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		return obj;
+	}
+
+	private static String getMethodNameByProperty(String k) {
+		StringBuilder sb = new StringBuilder(k);
+		sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
+		sb = sb.insert(0, "set");
+		String method = sb.toString();// 获得方法名
+		return method;
+	}
+
+	@SuppressWarnings("unchecked")
+	private static Element getActionElement(String actionName) throws DocumentException {
+		SAXReader reader = new SAXReader();
+		Document document = reader.read(new File(
+				"src/com/coderising/litestruts/struts.xml"));
+		Element root = document.getRootElement();
+		List<Element> actNodes = root.elements("action");
+		Element e = null;
+		String className;
+		for (int i = 0; i < actNodes.size(); i++) {
+			className = actNodes.get(i).attributeValue("name");
+			if (className != null && className.equals(actionName)) {
+				e = actNodes.get(i);
+				break;
+			}
+		}
+		return e;
+	}
+
+}
diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java b/group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/View.java b/group05/1094051862/test01/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/struts.xml b/group05/1094051862/test01/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..c017732676
--- /dev/null
+++ b/group05/1094051862/test01/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/1094051862/test01/src/com/coding/basic/ArrayList.java b/group05/1094051862/test01/src/com/coding/basic/ArrayList.java
index af757a217e..60fe8b9150 100644
--- a/group05/1094051862/test01/src/com/coding/basic/ArrayList.java
+++ b/group05/1094051862/test01/src/com/coding/basic/ArrayList.java
@@ -8,7 +8,7 @@ public class ArrayList implements List {
 	
 	private Object[] elementData = new Object[10];
 	
-	private int increaseSize = 3;
+	private int increaseSize = 10;
 	private void increaseArray() {
 		Object[] newData = Arrays.copyOf(elementData, elementData.length + increaseSize);
 		elementData = newData;
diff --git a/group05/1377699408/.gitignore b/group05/1377699408/.gitignore
deleted file mode 100644
index 5deea7e781..0000000000
--- a/group05/1377699408/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/bin
-.classpath
-.project
-.settings/
diff --git "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java" "b/group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java"
deleted file mode 100644
index f015ad8623..0000000000
--- "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java"
+++ /dev/null
@@ -1,54 +0,0 @@
-package list;
-
-import java.util.Arrays;
-
-public class ArrayList<E> {
-	private transient static int INITIAL_SIZE = 10;
-	private transient int arrayLength;
-	private transient int size;
-	private transient E[] array;
-	public ArrayList(){
-		array = (E[]) new Object[INITIAL_SIZE];
-		arrayLength = INITIAL_SIZE;
-	}
-	public ArrayList(int size){
-		if(size<=0){
-			throw new IllegalArgumentException("参数不可以小于0");
-		}
-		array = (E[])new Object[size];
-		arrayLength = array.length;
-		ensureCapacity(size);
-		this.size = size;
-	}
-	public int size(){
-		return size;
-	}
-	public void add(E e){
-		ensureCapacity(size+1);
-		array[size] = e;
-		size++;
-	}
-	public E get(int index){
-		if(index<0 || index > size){
-			throw new IllegalArgumentException("索引越界");
-		}
-		return array[index];
-		
-	}
-	public E set(int index, E e){
-		if(index<0 || index>size){
-			throw new IllegalArgumentException("索引越界");
-		}
-		E result = array[index];
-		array[index] = e;
-		return result;
-	}
-	private void ensureCapacity(int size){
-		E[] oldArray = array;
-		int oldSize = arrayLength;
-		while(size>arrayLength){
-			arrayLength = arrayLength + (arrayLength >> 1);
-			array = Arrays.copyOf(oldArray, arrayLength);
-		}
-	}
-}
diff --git "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java" "b/group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java"
deleted file mode 100644
index e0d277eb10..0000000000
--- "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java"
+++ /dev/null
@@ -1,59 +0,0 @@
-package test;
-
-import junit.framework.TestCase;
-import list.ArrayList;
-
-public class ArrayListTest extends TestCase {
-
-	protected void setUp() throws Exception {
-		super.setUp();
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	public void testArrayList() {
-		ArrayList<Integer> a = new ArrayList<Integer>();
-		assertEquals(a.size(), 0);
-	}
-
-	public void testArrayListInt() {
-		ArrayList<Integer> a = new ArrayList<Integer>(9);
-		assertEquals(a.size(), 9);
-	}
-
-	public void testSize() {
-		ArrayList<Integer> a = new ArrayList<Integer>(9);
-		assertEquals(a.size(), 9);
-		ArrayList<Integer> a2 = new ArrayList<Integer>(100);
-		assertEquals(a2.size(), 100);
-	}
-
-	public void testAdd() {
-		ArrayList<Integer> a = new ArrayList<Integer>();
-		for (int i = 0; i < 1000; i++) {
-			a.add(5);
-			assertEquals(a.size(), i+1);
-			assertEquals(a.get(i), new Integer(5));
-		}
-	}
-
-	public void testGet() {
-		ArrayList<Integer> a = new ArrayList<Integer>();
-		a.add(6);
-		assertEquals(a.get(0), new Integer(6));
-		
-	}
-
-	public void testSet() {
-		ArrayList<Integer> a = new ArrayList<Integer>();
-		for (int i = 0; i < 100; i++) {
-			a.add(56);
-		}
-		a.set(5, 66);
-		assertEquals(a.get(5), new Integer(66));
-		assertEquals(a.get(7), new Integer(56));
-	}
-
-}
diff --git a/group05/183127807/HomeWork0226/.idea/workspace.xml b/group05/183127807/HomeWork0226/.idea/workspace.xml
index bea69f9904..927ae842b9 100644
--- a/group05/183127807/HomeWork0226/.idea/workspace.xml
+++ b/group05/183127807/HomeWork0226/.idea/workspace.xml
@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="d5122146-7cd8-40d4-a36b-01cd6481aebe" name="Default" comment="" />
+    <list default="true" id="d5122146-7cd8-40d4-a36b-01cd6481aebe" name="Default" comment="">
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
+    </list>
     <ignored path="$PROJECT_DIR$/out/" />
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="TRACKING_ENABLED" value="true" />
@@ -29,7 +31,7 @@
       <file leaf-file-name="ArrayList.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="242">
+            <state relative-caret-position="374">
               <caret line="36" column="0" lean-forward="false" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" />
               <folding>
                 <element signature="imports" expanded="true" />
@@ -48,7 +50,7 @@
       <file leaf-file-name="LinkedList.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="330">
+            <state relative-caret-position="880">
               <caret line="118" column="20" lean-forward="false" selection-start-line="118" selection-start-column="20" selection-end-line="118" selection-end-column="20" />
               <folding>
                 <element signature="method#LinkedList#0;class#LinkedList#0" expanded="false" />
@@ -73,7 +75,7 @@
         <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
           <provider selected="true" editor-type-id="text-editor">
             <state relative-caret-position="264">
-              <caret line="26" column="52" lean-forward="true" selection-start-line="26" selection-start-column="52" selection-end-line="26" selection-end-column="52" />
+              <caret line="26" column="52" lean-forward="false" selection-start-line="26" selection-start-column="52" selection-end-line="26" selection-end-column="52" />
               <folding>
                 <element signature="method#push#0;class#Stack#0" expanded="false" />
                 <element signature="method#pop#0;class#Stack#0" expanded="false" />
@@ -85,7 +87,7 @@
       <file leaf-file-name="Queue.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="418">
+            <state relative-caret-position="308">
               <caret line="19" column="32" lean-forward="false" selection-start-line="19" selection-start-column="32" selection-end-line="19" selection-end-column="32" />
               <folding>
                 <element signature="e#131#132#0" expanded="true" />
@@ -112,8 +114,8 @@
       <file leaf-file-name="BinaryTreeNode.java" pinned="false" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinaryTreeNode.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="44">
-              <caret line="2" column="13" lean-forward="true" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="27" />
+            <state relative-caret-position="396">
+              <caret line="32" column="0" lean-forward="false" selection-start-line="32" selection-start-column="0" selection-end-line="32" selection-end-column="0" />
               <folding />
             </state>
           </provider>
@@ -169,7 +171,6 @@
     </navigator>
     <panes>
       <pane id="Scratches" />
-      <pane id="PackagesPane" />
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -212,6 +213,7 @@
           </PATH>
         </subPane>
       </pane>
+      <pane id="PackagesPane" />
       <pane id="Scope" />
     </panes>
   </component>
@@ -465,6 +467,7 @@
       <setting name="passParentEnv" value="true" />
       <setting name="launchBrowser" value="true" />
       <setting name="launchBrowserUrl" value="" />
+      <setting name="depsClasspath" value="false" />
       <method />
     </configuration>
     <configuration default="true" type="JUnit" factoryName="JUnit">
@@ -586,6 +589,12 @@
       <method />
     </configuration>
     <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
+      <node-interpreter>project</node-interpreter>
+      <node-options />
+      <gulpfile />
+      <tasks />
+      <arguments />
+      <envs />
       <method />
     </configuration>
     <configuration default="true" type="js.build_tools.npm" factoryName="npm">
@@ -623,15 +632,16 @@
       <workItem from="1487808113056" duration="745000" />
       <workItem from="1487828990873" duration="1436000" />
       <workItem from="1487852559901" duration="6865000" />
-      <workItem from="1487900639002" duration="11180000" />
+      <workItem from="1487900639002" duration="11880000" />
+      <workItem from="1488159523435" duration="171000" />
     </task>
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="32191000" />
+    <option name="totallyTimeSpent" value="33062000" />
   </component>
   <component name="ToolWindowManager">
-    <frame x="-8" y="-8" width="1382" height="744" extended-state="7" />
+    <frame x="-8" y="-8" width="1382" height="744" extended-state="6" />
     <editor active="true" />
     <layout>
       <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
@@ -648,7 +658,7 @@
       <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2655068" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.26928896" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
@@ -677,6 +687,95 @@
     <watches-manager />
   </component>
   <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/List.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="110">
+          <caret line="5" column="33" lean-forward="false" selection-start-line="5" selection-start-column="33" selection-end-line="5" selection-end-column="33" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="792">
+          <caret line="36" column="0" lean-forward="false" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" />
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="method#add#0;class#ArrayList#0" expanded="false" />
+            <element signature="method#add#1;class#ArrayList#0" expanded="false" />
+            <element signature="method#get#0;class#ArrayList#0" expanded="false" />
+            <element signature="method#remove#0;class#ArrayList#0" expanded="false" />
+            <element signature="class#ArrayListIterator#0;class#ArrayList#0" expanded="false" />
+            <element signature="method#next#0;class#ArrayListIterator#0;class#ArrayList#0" expanded="false" />
+            <element signature="method#ensureCapacity#0;class#ArrayList#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2596">
+          <caret line="118" column="20" lean-forward="false" selection-start-line="118" selection-start-column="20" selection-end-line="118" selection-end-column="20" />
+          <folding>
+            <element signature="method#LinkedList#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#add#1;class#LinkedList#0" expanded="false" />
+            <element signature="method#get#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#remove#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#addFirst#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#addLast#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#removeFirst#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#removeLast#0;class#LinkedList#0" expanded="false" />
+            <element signature="e#2045#2046#0" expanded="true" />
+            <element signature="e#2063#2064#0" expanded="true" />
+            <element signature="class#LinkedListIterator#0;class#LinkedList#0" expanded="false" />
+            <element signature="method#next#0;class#LinkedListIterator#0;class#LinkedList#0" expanded="false" />
+            <element signature="class#Node#0;class#LinkedList#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="572">
+          <caret line="26" column="52" lean-forward="true" selection-start-line="26" selection-start-column="52" selection-end-line="26" selection-end-column="52" />
+          <folding>
+            <element signature="method#push#0;class#Stack#0" expanded="false" />
+            <element signature="method#pop#0;class#Stack#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="418">
+          <caret line="19" column="32" lean-forward="false" selection-start-line="19" selection-start-column="32" selection-end-line="19" selection-end-column="32" />
+          <folding>
+            <element signature="e#131#132#0" expanded="true" />
+            <element signature="e#159#160#0" expanded="true" />
+            <element signature="e#290#291#0" expanded="true" />
+            <element signature="e#327#328#0" expanded="true" />
+            <element signature="e#349#350#0" expanded="true" />
+            <element signature="e#380#381#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Iterator.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="44">
+          <caret line="2" column="17" lean-forward="false" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinaryTreeNode.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/List.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="132">
@@ -974,7 +1073,7 @@
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="264">
-          <caret line="26" column="52" lean-forward="true" selection-start-line="26" selection-start-column="52" selection-end-line="26" selection-end-column="52" />
+          <caret line="26" column="52" lean-forward="false" selection-start-line="26" selection-start-column="52" selection-end-line="26" selection-end-column="52" />
           <folding>
             <element signature="method#push#0;class#Stack#0" expanded="false" />
             <element signature="method#pop#0;class#Stack#0" expanded="false" />
@@ -984,7 +1083,7 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="242">
+        <state relative-caret-position="374">
           <caret line="36" column="0" lean-forward="false" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" />
           <folding>
             <element signature="imports" expanded="true" />
@@ -1001,7 +1100,7 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="330">
+        <state relative-caret-position="880">
           <caret line="118" column="20" lean-forward="false" selection-start-line="118" selection-start-column="20" selection-end-line="118" selection-end-column="20" />
           <folding>
             <element signature="method#LinkedList#0;class#LinkedList#0" expanded="false" />
@@ -1023,7 +1122,7 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="418">
+        <state relative-caret-position="308">
           <caret line="19" column="32" lean-forward="false" selection-start-line="19" selection-start-column="32" selection-end-line="19" selection-end-column="32" />
           <folding>
             <element signature="e#131#132#0" expanded="true" />
@@ -1046,8 +1145,8 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinaryTreeNode.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="44">
-          <caret line="2" column="13" lean-forward="true" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="27" />
+        <state relative-caret-position="396">
+          <caret line="32" column="0" lean-forward="false" selection-start-line="32" selection-start-column="0" selection-end-line="32" selection-end-column="0" />
           <folding />
         </state>
       </provider>
diff --git a/group05/183127807/HomeWork0305/out/production/HomeWork0305/com/coderising/litestruts/struts.xml b/group05/183127807/HomeWork0305/out/production/HomeWork0305/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..0325783136
--- /dev/null
+++ b/group05/183127807/HomeWork0305/out/production/HomeWork0305/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java b/group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..510efb2565
--- /dev/null
+++ b/group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,201 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int length = origin.length;
+		for (int i = 0, j = length / 2; i < j; i++) {
+			int temp = origin[i];
+			origin[i] = origin[length - i - 1];
+			origin[length - i - 1] = temp;
+		}
+	}
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+			int newLength = 0;
+			for (int t : oldArray){
+				newLength += t != 0 ? 1 : 0;
+			}
+			int[] newArr = new int[newLength];
+			int i = 0;
+			for (int t : oldArray) {
+				if (t != 0) {
+					newArr[i] = t;
+					i++;
+				}
+			}
+			return newArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+        int array1Length = array1.length;
+        int array2Length = array2.length;
+
+        int[] newArray=new int[array1Length+array2Length];
+
+		int i = 0, j = 0, index = 0;
+
+		while (i < array1.length && j < array2.length) {
+			if (array1[i] <= array2[j]) {
+				if (array1[i] == array2[j]) {
+					j++;
+				} else {
+					newArray[index] = array1[i];
+					i++;
+					index++;
+				}
+			} else {
+				newArray[index] = array2[j];
+				j++;
+				index++;
+			}
+		}
+		//当array2为null
+		while (i < array1.length) {
+			newArray[index] = array1[i];
+			index++;
+			i++;
+		}
+		//当array1为null
+		while (j < array2.length) {
+			newArray[index] = array2[j];
+			j++;
+			index++;
+		}
+		return newArray;
+	}
+
+    /**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int oldArrLength = oldArray.length;
+		int newArrLength = oldArrLength + size;
+		int[] newArray = new int[newArrLength];
+		System.arraycopy(oldArray,0,newArray,0,newArrLength);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] fibonacci = new int[max];
+		if (max <=1) {
+			return null;
+		} else if (max == 2) {
+			fibonacci[0] = 1;
+			fibonacci[1] = 1;
+		} else {
+			for (int i =2;i<max;i++) {
+				fibonacci[0] = 1;
+				fibonacci[1] = 1;
+				fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
+			}
+		}
+		return fibonacci;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		boolean isPrimes = false;
+		int[] primes=new int[max];
+		int index = 0;
+		for (int i=2;i<max;i++) {
+			//判断素数
+			for (int j=2;j<Math.sqrt(i);j++) {
+				if (i % j == 0) {
+					isPrimes = false;
+				} else isPrimes = true;
+			}
+			if (isPrimes) {
+				primes[index] = i;
+				index++;
+			}
+		}
+		return primes;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] perfectNum = new int[max];
+		int index = 0;
+
+		for (int i=0;i<max;i++) {
+			int sum = 0;
+			for (int j=0;j<max;j++) {
+				if (i % j == 0) {
+					sum = sum + i;
+				}
+				if (i == j) {
+					perfectNum[index] = sum;
+					index++;
+				}
+			}
+		}
+
+		return perfectNum;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String[] newArray = new String[2*array.length-1];
+		int i = 0, j = i + 1;
+		for (int k=0;k<array.length;k++) {
+			newArray[2*k] = String.valueOf(array[k]);
+			newArray[2*k+1] = seperator;
+		}
+		return newArray.toString();
+	}
+	
+
+}
diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/LoginAction.java b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/Struts.java b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..fc3b4e18dc
--- /dev/null
+++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,121 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		("name"="test" ,  "password"="1234") ,
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+
+        */
+        View view = new View();
+        SAXReader reader = new SAXReader();
+        String classValue = "";
+
+
+        try {
+            Document document= reader.read(new File("src/com/coderising/litestruts/struts.xml"));
+            //获取根节点
+            Element rootElement = document.getRootElement();
+            //根节点属性
+            List<Element> elements = rootElement.elements();
+            Element actionElement = null;
+            for (Element element : elements) {
+                Attribute actionNameAttr = element.attribute("name");
+                if (actionNameAttr.getValue().equals(actionName)) {
+                    Attribute classAttr = element.attribute("class");
+                    classValue = classAttr.getValue();
+                    actionElement = element;
+                }
+            }
+
+
+
+            Class newClass = Class.forName(classValue);
+            Object function = newClass.newInstance();
+            Field[] fields = newClass.getDeclaredFields();
+            String jsp = "";
+
+            Set<Map.Entry<String, String>> entrySet = parameters.entrySet();
+            for (Map.Entry entry:entrySet) {
+                String name = (String) entry.getKey();
+                String password = (String) entry.getValue();
+
+                Method setName = newClass.getDeclaredMethod("setName", String.class);
+                setName.invoke(function, name);
+
+                Method setPassword = newClass.getDeclaredMethod("setPassword", String.class);
+                setPassword.invoke(function, password);
+
+                Method executeMethod = newClass.getDeclaredMethod("execute");
+                executeMethod.invoke(function);
+
+                List<Element> resultElements = actionElement.elements();
+                for(Element e:resultElements) {
+                    Attribute resultNameAttr = e.attribute("name");
+                    if ( resultNameAttr.getValue().equals(executeMethod.invoke(function))){
+                        jsp = e.getText();
+                        break;
+                    }
+                }
+            }
+
+            HashMap<String, Object> hashMap = new HashMap<>();
+            for (Field field : fields) {
+                Method getMessage = newClass.getDeclaredMethod("getMessage");
+                Object message = getMessage.invoke(function);
+                hashMap.put(field.getName(), message);
+            }
+
+            view.setParameters(hashMap);
+            view.setJsp(jsp);
+
+
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return view;
+    }    
+
+}
diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..0325783136
--- /dev/null
+++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/284422826/.gitignore b/group05/284422826/.gitignore
index 0aca6d5fe8..a906dbdd56 100644
--- a/group05/284422826/.gitignore
+++ b/group05/284422826/.gitignore
@@ -1,4 +1,6 @@
 /bin/
+/lib/
+/out/
 *.class
 *.settings
 *.project
@@ -6,4 +8,4 @@
 */.settings
 *.iml
 /.idea
-/**/target/**/*
\ No newline at end of file
+/**/target/**/*
diff --git a/group05/284422826/src/com/coderising/array/ArrayUtil.java b/group05/284422826/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..440a930be0
--- /dev/null
+++ b/group05/284422826/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,268 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtil {
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public int[] reverseArray(int[] origin) {
+        if (origin == null || 0 == origin.length) {
+            throw new NullPointerException();
+        }
+
+        int N = origin.length;
+        for (int i = 0; i < N / 2; i++) {
+            int temp = origin[i];
+            origin[i] = origin[N - 1 - i];
+            origin[N - 1 - i] = temp;
+        }
+
+        return origin;
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        if (oldArray == null || 0 == oldArray.length) {
+            throw new NullPointerException();
+        }
+
+        int count = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (0 != oldArray[i]) {
+                count++;
+            }
+        }
+
+        int[] newArray = new int[count];
+        int j = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (0 != oldArray[i]) {
+                newArray[j] = oldArray[i];
+                j++;
+            }
+        }
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        if (array1.length == 0 && array2.length == 0) {
+            throw new NullPointerException();
+        } else if (array1.length == 0) {
+            return array2;
+        } else if (array2.length == 0) {
+            return array1;
+        }
+        int count = array1.length + array2.length;
+        for (int i = 0; i < array1.length; i++) {
+            for (int j = 0; j < array2.length; j++) {
+                if (array1[i] == array2[j]) {
+                    count--;
+                }
+            }
+        }
+        int[] newArray = new int[count];
+        int m = 0, n = 0;
+        for (int i = 0; i < count; i++) {
+            if (m == array1.length) {
+                System.arraycopy(array2, n, newArray, i, array2.length - n);
+                break;
+            }
+
+            if (n == array2.length) {
+                System.arraycopy(array1, m, newArray, i, array1.length - m);
+                break;
+            }
+
+            if (array1[m] < array2[n]) {
+                newArray[i] = array1[m];
+                m++;
+            } else if (array1[m] == array2[n]) {
+                newArray[i] = array1[m];
+                m++;
+                n++;
+            } else {
+                newArray[i] = array2[n];
+                n++;
+            }
+        }
+        return newArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        if (oldArray == null || 0 == oldArray.length) {
+            int[] array = new int[size];
+            return array;
+        }
+        int[] target = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, target, 0, oldArray.length);
+        return target;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (0 == max) {
+            throw new IllegalArgumentException();
+        } else if (1 == max) {
+            int[] array = {};
+            return array;
+        }
+
+        int length = 0;
+        List<Integer> list = new ArrayList<>();
+        for (int i = 1; i < max; i++) {
+            if (fibo(i) < max) {
+                length++;
+                list.add(fibo(i));
+            } else {
+                break;
+            }
+        }
+
+        int[] array = new int[length];
+        for (int i = 0; i < length; i++) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
+
+
+    public int fibo(int N) {
+        if (N <= 2) {
+            return 1;
+        } else {
+            return fibo(N - 1) + fibo(N - 2);
+        }
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        List<Integer> list = new ArrayList<>();
+
+        int count = 0;
+        for (int i = 0; i < max; i++) {
+            if (isPrime(i)) {
+                count++;
+                list.add(i);
+            }
+        }
+
+        int[] array = new int[count];
+        for (int i = 0; i < count; i++) {
+            array[i] = list.get(i);
+        }
+
+        return array;
+    }
+
+    public boolean isPrime(int N) {
+        if (N < 2) {
+            return false;
+        }
+
+        for (int i = 2; i * i <= N; i++) {
+            if (N % i == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int count = 0;
+        List<Integer> list = new ArrayList<>();
+        for (int i = 1; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                count++;
+                list.add(i);
+            }
+        }
+
+        int[] array = new int[count];
+        for (int i = 0; i < count; i++) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
+
+    public boolean isPerfectNumber(int N) {
+        int sum = 0;
+        for (int i = 1; i < N; i++) {
+            if (N % i == 0) {
+                sum += i;
+            }
+        }
+        return sum == N;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < array.length - 1; i++) {
+            sb.append(array[i]).append(seperator);
+        }
+        sb.append(array[array.length - 1]);
+        return sb.toString();
+    }
+}
diff --git a/group05/284422826/src/com/coderising/array/ArrayUtilTest.java b/group05/284422826/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..0b37ac11fb
--- /dev/null
+++ b/group05/284422826/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,82 @@
+package com.coderising.array;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class ArrayUtilTest {
+    private ArrayUtil arrayUtil = null;
+
+    @Before
+    public void setUp() throws Exception {
+        arrayUtil = new ArrayUtil();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] a = {7, 9, 30, 3};
+        int[] b = {3, 30, 9, 7};
+        assertArrayEquals(arrayUtil.reverseArray(a), b);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int[] oldArr = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int[] newArray = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5};
+        assertArrayEquals(arrayUtil.removeZero(oldArr), newArray);
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        int[] newArray = {3, 4, 5, 6, 7, 8};
+        assertArrayEquals(arrayUtil.merge(a1, a2), newArray);
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[] oldArray = {2, 3, 6};
+        int size = 3;
+        int[] newArray = {2, 3, 6, 0, 0, 0};
+        assertArrayEquals(arrayUtil.grow(oldArray, size), newArray);
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        int max = 15;
+        int[] array = {1, 1, 2, 3, 5, 8, 13};
+        assertArrayEquals(arrayUtil.fibonacci(max), array);
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int[] array = {2, 3, 5, 7, 11, 13, 17, 19};
+        int max = 23;
+        assertArrayEquals(arrayUtil.getPrimes(max), array);
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int max = 100;
+        int[] array = {6, 28};
+        assertArrayEquals(arrayUtil.getPerfectNumbers(max), array);
+    }
+
+    @Test
+    public void join() throws Exception {
+        int[] array = {3, 8, 9};
+        String seperator = "-";
+        String str = "3-8-9";
+        Assert.assertEquals(arrayUtil.join(array, seperator), str);
+    }
+
+}
\ No newline at end of file
diff --git a/group05/284422826/src/com/coderising/litestruts/LoginAction.java b/group05/284422826/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group05/284422826/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/284422826/src/com/coderising/litestruts/Struts.java b/group05/284422826/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..4d9004db93
--- /dev/null
+++ b/group05/284422826/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,143 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+
+public class Struts {
+    private static String className = null;
+
+    /*  0. 读取配置文件struts.xml
+
+        1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+       据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+       ("name"="test" ,  "password"="1234") ,
+       那就应该调用 setName和setPassword方法
+
+       2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+       3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+       通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+       放到View对象的parameters
+
+       4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+       放到View对象的jsp字段中。
+       */
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        View view = new View();
+        Element element = null;
+
+        element = parseXml(actionName);
+        Class clazz = null;
+        Object obj = null;
+        try {
+            clazz = Class.forName(className);
+            obj = clazz.newInstance();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        }
+
+        if (setValue(parameters, clazz, obj)) return null;
+
+        String result = null;
+
+        try {
+            Method method = clazz.getDeclaredMethod("execute");
+            result = (String) method.invoke(obj);
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+
+        Map map = new HashMap();
+        Field[] field = clazz.getDeclaredFields();
+        try {
+            for (Field f : field) {
+                f.setAccessible(true);
+                String fieldName = f.toString().substring(f.toString().lastIndexOf(".")+1);
+                map.put(fieldName, f.get(obj));
+            }
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+
+        view.setParameters(map);
+        view.setJsp(getResultString(result, element));
+
+        return view;
+    }
+
+    private static boolean setValue(Map<String, String> parameters, Class clazz, Object obj) {
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            String name = entry.getKey();
+            String value = entry.getValue();
+
+            if (name == null || "".equals(name)) {
+                System.out.println("属性名称不能为空！");
+                return true;
+            }
+            System.out.println("Key = " + name + ", Value = " + value);
+            try {
+                Field field = clazz.getDeclaredField(name);
+                field.setAccessible(true);
+                field.set(obj, value);
+            } catch (NoSuchFieldException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    private static Element parseXml(String name) {
+        Element el = null;
+        SAXReader reader = new SAXReader();
+        try {
+            Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml"));
+            Element root = document.getRootElement();
+            Iterator it = root.elementIterator();
+            while (it.hasNext()) {
+                Element element = ((Element) it.next());
+                if (name.equals(element.attributeValue("name"))) {
+                    className = element.attributeValue("class");
+                    el = element;
+                }
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+        return el;
+    }
+
+    private static String getResultString(String name, Element element) {
+        String result = null;
+        Iterator iterator = element.elementIterator();
+        while (iterator.hasNext()) {
+            Element e = ((Element) iterator.next());
+            if (name.equals(e.attributeValue("name"))) {
+                result = e.getText();
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/group05/284422826/src/com/coderising/litestruts/StrutsTest.java b/group05/284422826/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group05/284422826/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/284422826/src/com/coderising/litestruts/View.java b/group05/284422826/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group05/284422826/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/284422826/src/com/coderising/litestruts/struts.xml b/group05/284422826/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..a7cb57e188
--- /dev/null
+++ b/group05/284422826/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/284422826/src/com/coding2017/basic/ArrayList.java b/group05/284422826/src/com/coding2017/basic/ArrayList.java
new file mode 100644
index 0000000000..3d2182ae5a
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/ArrayList.java
@@ -0,0 +1,130 @@
+package com.coding2017.basic;
+
+/**
+ * 功能：实现ArrayList.
+ * @author zhanglifeng.
+ */
+public class ArrayList implements List {
+	private int size = 0;  //当前数组大小
+
+	private Object[] elementData = new Object[5];  //初始数组
+
+	/**
+	 * 将对象o添加到ArrayList中.
+	 * @param o:需要添加的对象.
+	 */
+	public void add(Object o) {
+		ensureCapacity(size + 1);  //确保数组的容量可以装的下size + 1个元素，如果不够则扩容
+
+		elementData[size] = o;  //将o添加到数组中
+		size++;  //数组大小增加1
+	}	
+
+	/**
+	 * 将对象o添加到ArrayList的指定位置.
+	 * @param index: 指定位置.
+	 * @param o: 需要添加的对象.
+	 */
+	public void add(int index, Object o) {
+		rangeCheck(index);   //判断指定的位置index是否合法
+
+		ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素，如果不够则扩容
+
+		System.arraycopy(elementData, index, elementData, index + 1, size - index); //将index位置到结束位置所有的数组往后移动一个位置
+		elementData[index] = o; //将对象o添加到index位置
+		size++;//数组大小增加1
+	}
+
+	public Object get(int index) {
+		rangeCheck(index);
+		return elementData[index];
+	}
+
+	public Object remove(int index) {		
+		rangeCheck(index);
+		
+		if (index != elementData.length - 1) {
+			System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index);
+		}
+
+		size--;
+		return elementData;
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public Iterator iterator() {
+		return new ArrayListIterator(this);
+	}
+	
+	private void ensureCapacity(int number) {
+		if (number > elementData.length) {
+			elementData = grow(elementData, 1);
+		}
+	}
+
+	public Object[] grow(Object[] src, int step) {
+		Object[] target = new Object[src.length + step];
+		System.arraycopy(src, 0, target, 0, src.length);
+		return target;
+	}
+	
+	public void rangeCheck(int index){
+		if (index > size || index < 0) {
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
+		}
+	}
+
+	private class ArrayListIterator implements Iterator {
+		ArrayList arrayList = null;
+		int current = 0;
+
+		private ArrayListIterator(ArrayList arrayList) {
+			this.arrayList = arrayList;
+		}
+
+		@Override
+		public boolean hasNext() {
+			current++;
+			return current > arrayList.size() ? false : true;
+		}
+
+		@Override
+		public Object next() {
+			return elementData[current];
+		}
+
+	}
+
+	public static void main(String[] args) {
+		ArrayList arrayList = new ArrayList();
+		arrayList.add("s1");
+		arrayList.add("s2");
+		arrayList.add("s3");
+		arrayList.add("s4");
+		arrayList.add(3, "s33");
+		arrayList.add("s5");
+
+		System.out.println(arrayList.size());
+
+		System.out.println(arrayList.get(2));
+
+		arrayList.remove(3);
+
+		System.out.println(arrayList.size());
+
+		arrayList.add("s1");
+		System.out.println(arrayList.size());
+		arrayList.remove(5);
+		System.out.println(arrayList.size());
+		
+		Iterator it = arrayList.iterator();
+		while(it.hasNext()){
+			System.out.print(it.next() + " ");
+		}
+		System.out.println();
+	}
+
+}
diff --git a/group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java b/group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..f4ce9f561c
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java
@@ -0,0 +1,37 @@
+package com.coding2017.basic;
+
+public class BinaryTreeNode {
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+
+	public BinaryTreeNode(Object data) {
+		this.data = data;
+		left = null;
+		right = null;
+	}
+
+	public Object getData() {
+		return this.data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return this.left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return this.right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group05/284422826/src/com/coding2017/basic/Iterator.java b/group05/284422826/src/com/coding2017/basic/Iterator.java
new file mode 100644
index 0000000000..19e214cfbb
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding2017.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group05/284422826/src/com/coding2017/basic/LinkedList.java b/group05/284422826/src/com/coding2017/basic/LinkedList.java
new file mode 100644
index 0000000000..f0ab5d7969
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/LinkedList.java
@@ -0,0 +1,168 @@
+package com.coding2017.basic;
+
+import java.util.NoSuchElementException;
+
+/**
+ * 功能：实现LinkedList.
+ * @author zhanglifeng.
+ */
+public class LinkedList implements List {
+	private Node head, tail;
+	private int size;
+
+	private Node getNodeByIndex(int index) {
+		if (index < 0 || index > size - 1) {
+			throw new IndexOutOfBoundsException("线性表索引越界");
+		}
+		Node current = head;
+		for (int i = 0; i < size && current != null; i++, current = current.next) {
+			if (i == index) {
+				return current;
+			}
+		}
+		return null;
+	}
+
+	public void add(Object o) {
+		addLast(o);
+	}
+
+	public void add(int index, Object o) {
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("线性表索引越界");
+		}
+
+		if (0 == index) {
+			addFirst(o);
+		}else{			
+			Node node = getNodeByIndex(index - 1);
+			node.next = new Node(o, node.next);
+			size ++;
+		}
+	}
+
+	public Object get(int index) {
+		return getNodeByIndex(index).data;
+	}
+
+	public Object remove(int index) {
+		if (index < 0 || index > size - 1) {
+			throw new IndexOutOfBoundsException("线性表索引越界");
+		}
+
+		if(0 == index){
+			return removeFirst();
+		}else if(size - 1 == index){
+			return removeLast();
+		}else{
+			Node node = getNodeByIndex(index);
+			Node preNode = getNodeByIndex(index - 1);
+			preNode.next = node.next;
+			size --;
+			return node.data;
+		}
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public void addFirst(Object o) {
+		Node currentHead = head;
+		Node newNode = new Node(o, currentHead);
+		head = newNode;
+		if(currentHead == null){
+			tail = newNode;
+		}
+
+		size++;
+	}
+
+	public void addLast(Object o) {
+		Node currentTail = tail;
+		Node newNode = new Node(o, null);
+		tail = newNode;
+		if(currentTail == null){
+			head = newNode;
+		}else {
+			currentTail.next = newNode;
+		}
+		size++;
+	}
+
+	public Object removeFirst() {
+		if(head == null){
+			throw new NoSuchElementException();
+		}
+		Node node = new Node(head.data, null);
+		head = head.next;
+		size --;
+		return node.data;
+	}
+
+	public Object removeLast() {
+		if(tail == null){
+			throw new NoSuchElementException();
+		}
+		Node node = getNodeByIndex(size - 1);
+		node.next = null;
+		size --;
+		return node.data;
+	}
+
+	public Iterator iterator() {
+		return new LinkedListIterator(this);
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+		public Node(Object data, Node next) {
+			this.data = data;
+			this.next = next;
+		}
+	}
+
+	private class LinkedListIterator implements Iterator {
+		LinkedList linkedList = null;
+		private int current = 0;
+
+		public LinkedListIterator(LinkedList linkedList) {
+			this.linkedList = linkedList;
+		}
+
+		@Override
+		public boolean hasNext() {
+			return current < size;
+		}
+
+		@Override
+		public Object next() {
+			return linkedList.get(current ++);
+		}
+	}
+
+	public static void main(String[] args) {
+		LinkedList linkedList = new LinkedList();
+		linkedList.add("s1");
+		linkedList.add("s2");
+		linkedList.add("s3");
+		linkedList.addFirst("s0");
+		linkedList.addLast("s4");
+
+		Iterator it = linkedList.iterator();
+		while(it.hasNext()){
+			System.out.print(it.next() + " ");
+		}
+		System.out.println();
+		System.out.println("第3个元素：" + linkedList.get(3));
+
+		System.out.println(linkedList.removeFirst());
+		System.out.println(linkedList.size());
+		System.out.println("Last element:" + linkedList.removeLast());
+		System.out.println(linkedList.size());
+		System.out.println("第2个元素：" + linkedList.remove(2));
+		System.out.println(linkedList.size());
+	}
+}
diff --git a/group05/284422826/src/com/coding2017/basic/List.java b/group05/284422826/src/com/coding2017/basic/List.java
new file mode 100644
index 0000000000..25c197cc18
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding2017.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group05/284422826/src/com/coding2017/basic/Queue.java b/group05/284422826/src/com/coding2017/basic/Queue.java
new file mode 100644
index 0000000000..57d63f43bf
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/Queue.java
@@ -0,0 +1,25 @@
+package com.coding2017.basic;
+
+import java.util.EmptyStackException;
+
+public class Queue {
+	private LinkedList elementData = new LinkedList();
+	public void enQueue(Object o){
+		elementData.add(o);
+	}
+	
+	public Object deQueue(){
+		if (elementData.size() == 0) {
+			throw new EmptyStackException();
+		}
+		return elementData.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		return elementData.size() == 0;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group05/284422826/src/com/coding2017/basic/Stack.java b/group05/284422826/src/com/coding2017/basic/Stack.java
new file mode 100644
index 0000000000..16e72a3942
--- /dev/null
+++ b/group05/284422826/src/com/coding2017/basic/Stack.java
@@ -0,0 +1,31 @@
+package com.coding2017.basic;
+
+import java.util.EmptyStackException;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(0);
+	}
+	
+	public Object pop(){
+		if (elementData.size() == 0) {
+			throw new EmptyStackException();
+		}
+		return elementData.remove(elementData.size() - 1);
+	}
+	
+	public Object peek(){
+		if (elementData.size() == 0) {
+			throw new EmptyStackException();
+		}
+		return elementData.get(elementData.size() - 1);
+	}
+	public boolean isEmpty(){
+		return elementData.size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group05/289326186/.classpath b/group05/289326186/.classpath
new file mode 100644
index 0000000000..fe22904a9e
--- /dev/null
+++ b/group05/289326186/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="F:/2017study/lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="F:/2017study/lib/junit-4.8.2.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group05/289326186/.gitignore b/group05/289326186/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group05/289326186/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group05/289326186/.project b/group05/289326186/.project
new file mode 100644
index 0000000000..5364d34f0e
--- /dev/null
+++ b/group05/289326186/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>work</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+	</natures>
+</projectDescription>
diff --git a/group05/289326186/.settings/org.eclipse.jdt.core.prefs b/group05/289326186/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..0c68a61dca
--- /dev/null
+++ b/group05/289326186/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml b/group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000000..f4ef8aa0a5
--- /dev/null
+++ b/group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/group05/289326186/src/com/coderising/array/ArrayUtil.java b/group05/289326186/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..628bb4564c
--- /dev/null
+++ b/group05/289326186/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,270 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin) {
+		int[] array = new int[origin.length];
+		for (int i = 0; i < origin.length; i++) {
+			array[i] = origin[origin.length - 1 - i];
+		}
+		return array;
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+	public int[] removeZero(int[] oldArray) {
+		int length = 0;
+		for (int arr : oldArray) {
+			if (arr != 0) {
+				length++;
+			}
+		}
+		int[] newArray = new int[length];
+		int j = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	public int[] merge(int[] array1, int[] array2) {
+		Set<Integer> set = new TreeSet<Integer>();
+
+		List<Integer> list1 = new ArrayList<Integer>();
+		List<Integer> list2 = new ArrayList<Integer>();
+		for (int i = 0; i < array1.length; i++) {
+			list1.add(array1[i]);
+		}
+		for (int i = 0; i < array2.length; i++) {
+			list1.add(array2[i]);
+		}
+		set.addAll(list1);
+		set.addAll(list2);
+		int length = set.size();
+		int[] array = new int[length];
+		int i = 0;
+		for (int a : set) {
+			array[i] = a;
+			i++;
+		}
+		return array;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int length = oldArray.length + size;
+		int[] newArray = new int[length];
+		for (int i = 0; i < newArray.length; i++) {
+			if (i > oldArray.length - 1) {
+				newArray[i] = 0;
+			} else {
+				newArray[i] = oldArray[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max < 2) {
+			int[] array = {};
+			return array;
+		}
+		List<Integer> list = new ArrayList<Integer>();
+		for (int i = 1; i < max; i++) {
+			System.out.println("iiiii:" + getFibonacci(i));
+			if (max < getFibonacci(i)) {
+				break;
+			} else {
+				list.add(getFibonacci(i));
+			}
+		}
+		int[] array = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			array[i] = list.get(i);
+		}
+		return array;
+	}
+
+	/**
+	 * 获取斐波那契数列
+	 * 
+	 * @param n
+	 * @return
+	 */
+	private int getFibonacci(int n) {
+		if (n <= 2) {
+			return 1;
+		} else {
+			return getFibonacci(n - 1) + getFibonacci(n - 2);
+		}
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		List<Integer> list = new ArrayList<Integer>();
+		for (int i = 1; i < max; i++) {
+			if (isPrime(i)) {
+				list.add(i);
+			}
+		}
+		int[] array = new int[list.size()];
+		for (int i = 0; i < array.length; i++) {
+			array[i] = list.get(i);
+		}
+		return array;
+	}
+
+	/**
+	 * 判断一个数是否为素数
+	 * 
+	 * @param a
+	 * @return
+	 */
+	private boolean isPrime(int a) {
+		if (a < 2)
+			return false;
+		for (int i = 2; i < a; i++) {
+			if (a % i == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		List<Integer> list = new ArrayList<Integer>();
+		int sum = 0;
+		for(int i=1; i<max; i++){
+			sum = i;
+			for(int j=1;j<i;j++){
+				if(i % j ==0){
+					sum = sum -j;
+				}
+			}
+			if(sum == 0){
+				list.add(i);
+			}
+		}
+		int [] array = new int[list.size()];
+		for(int i=0; i<list.size(); i++){
+			array[i] = list.get(i);
+		}
+		return array;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		String str = "";
+		for (int arr : array) {
+			str += arr + seperator;
+		}
+		return str.substring(0, str.length() - 1);
+	}
+
+	public static void main(String[] args) {
+		ArrayUtil util = new ArrayUtil();
+		// 1、reverseArray
+		// int[] origin = {7, 9, 30, 3, 4};
+		// int[] arr = util.reverseArray(origin);
+		// for(int i : arr){
+		// System.out.println("i="+i);
+		// }
+		// 2、removeZero
+		// int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		// int[] newArray = util.removeZero(oldArray);
+		// for(int i : newArray){
+		// System.out.println(i);
+		// }
+		// 3、merge
+		// int[] array1 = { 3, 5, 7, 8, 99 };
+		// int[] array2 = { 4, 5, 6, 7, 3 };
+		// int[] array = util.merge(array1, array2);
+		// for (int i : array) {
+		// System.out.print(i + ",");
+		// }
+		// 4、fibonacci
+//		int[] array = util.fibonacci(50);
+//		for (int i : array) {
+//			System.out.print(i + ",");
+//		}
+		// int [] oldArray = {2,3,6};
+		// int [] newArray = util.grow(oldArray, 3);
+		// for(int i : newArray){
+		// System.out.print(i+",");
+		// }
+		//getPerfectNumbers
+		 int [] array = util.getPerfectNumbers(2000);
+		 for(int i : array){
+			 System.out.print(i+",");
+		 }
+		// getPrimes
+		// int [] array = util.getPrimes(23);
+		// for(int i : array){
+		// System.out.print(i+",");
+		// }
+		// 8、join
+		// int [] array = {3,8,9};
+		// String str = util.join(array, "-");
+		// System.out.println(str);
+	}
+}
diff --git a/group05/289326186/src/com/coderising/litestruts/LoginAction.java b/group05/289326186/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group05/289326186/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/289326186/src/com/coderising/litestruts/Struts.java b/group05/289326186/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..de7474534e
--- /dev/null
+++ b/group05/289326186/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,112 @@
+package com.coderising.litestruts;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	@SuppressWarnings("unchecked")
+	public static View runAction(String actionName, Map<String, String> parameters) throws Exception {
+		// 0. 读取配置文件struts.xml
+		// 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		// 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		// ("name"="test" , "password"="1234") ,
+		// 那就应该调用 setName和setPassword方法
+		//
+		// 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		//
+		// 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		// 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
+		// 放到View对象的parameters
+		//
+		// 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		// 放到View对象的jsp字段中。
+		View view = new View();
+		// 0. 读取配置文件struts.xml
+		SAXReader reader = new SAXReader();
+		// 读取文件 转换成Document
+		Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml"));
+		// 获取根节点元素对象
+		Element root = document.getRootElement();
+		//根节点的元素
+		Iterator<Element> it = root.elementIterator();
+		while(it.hasNext()){
+			Element e = (Element) it.next();
+			if(actionName.equals(e.attributeValue("name"))){
+				// 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+				String className = e.attributeValue("class");
+				Class clazz = Class.forName(className);
+				Object obj = clazz.newInstance(); 
+				//获取类的所有属性
+				BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
+				PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
+				for(PropertyDescriptor pd : pds){
+					for (Entry<String, String> entry : parameters.entrySet()) {
+						String key = entry.getKey();
+						if(pd.getName().equals(key)){
+							Method setMethod = pd.getWriteMethod();//获得set方法
+							setMethod .invoke(obj, entry.getValue());//调用
+							break;
+						}
+					}
+				}
+		        //2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		        Method method = clazz.getMethod("execute", null);
+		        Object result = method.invoke(obj);
+		        Map<String, String> map = new HashMap<String, String>();
+		        if("success".equals(result)){
+		        	map.put("message", "login successful");
+		        }else{
+		        	map.put("message", "login failed,please check your user/pwd");
+		        }
+		        // 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+				// 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
+				// 放到View对象的parameters
+		        for(PropertyDescriptor pd : pds){
+					for (Entry<String, String> entry : parameters.entrySet()) {
+						String key = entry.getKey();
+						if(pd.getName().equals(key)){
+							Method getMethod = pd.getReadMethod();//获得get方法
+							Object getresult = getMethod .invoke(obj);//调用
+							map.put(pd.getName(), getresult.toString());
+							break;
+						}
+					}
+				}
+		        view.setParameters(map);
+		        //遍历action的子元素
+		        Iterator<Element> it2 = e.elementIterator();
+		        while(it2.hasNext()){
+					Element resultEle = (Element) it2.next();
+					if(resultEle.attributeValue("name").equals(result)){
+						view.setJsp(resultEle.getText());
+						break;
+					}
+		        }	
+			}
+		}
+		return view;
+	}
+	
+	public static void main(String[] args) throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234"); 
+		View view = runAction(actionName, params);
+		System.out.println("view jsp:"+view.getJsp());
+		System.out.println("view param:"+view.getParameters());
+	}
+
+}
diff --git a/group05/289326186/src/com/coderising/litestruts/StrutsTest.java b/group05/289326186/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..c4e1f588d0
--- /dev/null
+++ b/group05/289326186/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws Exception {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/289326186/src/com/coderising/litestruts/View.java b/group05/289326186/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group05/289326186/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/289326186/src/com/coderising/litestruts/struts.xml b/group05/289326186/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group05/289326186/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/351592484/.gitignore b/group05/351592484/.gitignore
new file mode 100644
index 0000000000..0aca6d5fe8
--- /dev/null
+++ b/group05/351592484/.gitignore
@@ -0,0 +1,9 @@
+/bin/
+*.class
+*.settings
+*.project
+*.classpath
+*/.settings
+*.iml
+/.idea
+/**/target/**/*
\ No newline at end of file
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Iterator.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Iterator.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Iterator.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Iterator.java
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/List.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/List.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/List.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/List.java
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Queue.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Queue.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Queue.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Queue.java
diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Stack.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Stack.java
similarity index 100%
rename from group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Stack.java
rename to group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Stack.java
diff --git a/group05/371492887/task_02/.classpath b/group05/371492887/task_02/.classpath
new file mode 100644
index 0000000000..b699c050f9
--- /dev/null
+++ b/group05/371492887/task_02/.classpath
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**/*.java" kind="src" output="target/classes" path="src">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/group05/371492887/task_02/.gitignore b/group05/371492887/task_02/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group05/371492887/task_02/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group05/371492887/task_02/.project b/group05/371492887/task_02/.project
new file mode 100644
index 0000000000..1cadc86932
--- /dev/null
+++ b/group05/371492887/task_02/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>task_02</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group05/371492887/task_02/pom.xml b/group05/371492887/task_02/pom.xml
new file mode 100644
index 0000000000..319e86e55c
--- /dev/null
+++ b/group05/371492887/task_02/pom.xml
@@ -0,0 +1,37 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>java_207</groupId>
+	<artifactId>task_02</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<dependencies>
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>1.6.1</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<sourceDirectory>src</sourceDirectory>
+		<resources>
+			<resource>
+				<directory>src</directory>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.1</version>
+				<configuration>
+					<source />
+					<target />
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/group05/371492887/task_02/src/com/coderising/action/LoginAction.java b/group05/371492887/task_02/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..72e00894bb
--- /dev/null
+++ b/group05/371492887/task_02/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java b/group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java
new file mode 100644
index 0000000000..1138368352
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java
@@ -0,0 +1,269 @@
+package com.nitasty.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	
+	public static void main(String[] args) {
+		ArrayUtil util=new ArrayUtil();
+		
+		int[] origin={7, 9 ,10, 30, 3};
+		util.reverseArray(origin);
+		int[] oldArray={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] a1={3, 5,7,9,10};
+		int[] a2={4,6,100,111,132}; 
+		
+		System.out.println(Arrays.toString(origin));
+		System.out.println(Arrays.toString(util.removeZero(oldArray)));
+		System.out.println(Arrays.toString(util.merge(a1,a2)));
+		System.out.println(Arrays.toString(util.grow(a1,3)));
+		System.out.println(Arrays.toString(util.fibonacci(100)));
+		System.out.println(Arrays.toString(util.getPrimes(100)));
+		System.out.println(Arrays.toString(util.getPerfectNumbers(1000)));
+		System.out.println(util.join(oldArray,"--"));
+	}
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int dataBus;
+		int len=origin.length;
+		for(int i=0;i<len>>1;i++){
+			dataBus=origin[i];
+			origin[i]=origin[len-i-1];
+			origin[len-i-1]=dataBus;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int[] arrayBus=new int[oldArray.length];
+		int count = 0;
+		//利用中间数值来剔除0
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i]!=0)
+				arrayBus[count++]=oldArray[i];
+		}
+		//返回新的数值
+		int[] newArray=new int[count];
+		System.arraycopy(arrayBus, 0, newArray, 0, count);
+		
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	//插入排序挺快的
+	public int[] merge(int[] array1, int[] array2){
+		int len1=array1.length;
+		int len2=array2.length;
+		List<Integer> longList=new ArrayList<Integer>();
+		List<Integer> shortList=new ArrayList<Integer>();
+		//数组转list，有没有简单的方法啊我擦
+		if(len1>len2){
+			for (int i = 0; i < len1; i++) {
+				longList.add(array1[i]);
+			}
+			for (int i = 0; i < len2; i++) {
+				shortList.add(array2[i]);
+			}
+		}else{
+			for (int i = 0; i < len1; i++) {
+				shortList.add(array1[i]);
+			}
+			for (int i = 0; i < len2; i++) {
+				longList.add(array2[i]);
+			}
+		}
+		
+		//将短list中的值插入长list中
+		int j=0;
+		for (int i = 0; i < longList.size(); i++) {
+			if(j==shortList.size())
+				continue;
+			if((Integer)shortList.get(j)<(Integer)longList.get(i)){
+				longList.add(i, shortList.get(j));
+				j++;
+			}else if(((Integer)shortList.get(j)).equals((Integer)longList.get(i))){
+				continue;
+			}else{
+				if(i==(longList.size()-1)){
+					longList.add(shortList.get(j));
+					j++;
+				}
+			}
+		}
+		
+		//list再转数组···阿西吧
+		int[] intArray=new int[longList.size()];
+		
+		for (int i = 0; i < longList.size(); i++) {
+			intArray[i]=longList.get(i);
+		}
+		
+		return intArray;
+	}
+	
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int len=oldArray.length;
+		int[] newArray=new int[len+size];
+		
+		System.arraycopy(oldArray, 0, newArray, 0, len);
+		
+		for(int i=len;i<len+size;i++){
+			newArray[i]=0;
+		}
+		
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if (max==1)
+				return null;
+		
+		int a1=1;
+		int a2=1;
+		int count=1;
+		int dataBus=0;
+		while(a2<max){
+			dataBus=a2;
+			a2+=a1;
+			a1=dataBus;
+			count++;
+		}
+		int[] newArray=new int[count];
+		newArray[0]=newArray[1]=1;
+		for (int i = 2; i < count; i++) {
+			newArray[i]=newArray[i-1]+newArray[i-2];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		List<Integer> list=new ArrayList<Integer>();
+		for (int i = 1; i < max; i++) {
+			if(isPrimeNumber(i))
+				list.add(i);
+		}
+		
+		int[] intArr=new int[list.size()];
+		for (int i = 0; i < intArr.length; i++) {
+			intArr[i]=list.get(i);
+		}
+		return intArr;
+	}
+	
+	private boolean isPrimeNumber(int n)
+	{
+	    if (n==2)
+	    {
+	        return true;
+	    }
+	 
+	    if (n%2==0)
+	    {
+	        return false;
+	    }
+	 
+	    int sqrtn=(int)Math.sqrt((double)n);
+	    boolean flag=true;
+	 
+	    for (int i=3;i<=sqrtn;i+=2)
+	    {
+	        if (n%i==0)
+	        {
+	            flag=false;
+	        }
+	    }
+	    return flag;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		
+		List<Integer> list=new ArrayList<Integer>();
+		
+		for (int i = 1; i < max; i++) {
+			int sum=0;
+			for (int j = 1; j < i; j++) {
+				if(i%j==0)
+					sum+=j;
+			}
+			if(sum==i)
+				list.add(i);
+		}
+		
+		int[] intArr=new int[list.size()];
+		for (int i = 0; i < intArr.length; i++) {
+			intArr[i]=list.get(i);
+		}
+		return intArr;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer buff=new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			buff.append(array[i]);
+			if(i<array.length-1)
+				buff.append(seperator);
+		}
+		return buff.toString();
+	}
+	
+
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/array/ArrayUtilTest.java b/group05/371492887/task_02/src/com/nitasty/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..89200eaaac
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/array/ArrayUtilTest.java
@@ -0,0 +1,92 @@
+package com.nitasty.array;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	ArrayUtil util;
+	@Before
+	public void setUp() throws Exception {
+		
+		util=new ArrayUtil();
+		
+		
+		int[] a1={3, 5,7,9,10};
+		int[] a2={4,6,100,111,132}; 
+		
+//		System.out.println(Arrays.toString(origin));
+//		System.out.println(Arrays.toString(util.removeZero(oldArray)));
+//		System.out.println(Arrays.toString(util.merge(a1,a2)));
+//		System.out.println(Arrays.toString(util.grow(a1,3)));
+//		System.out.println(Arrays.toString(util.fibonacci(100)));
+//		System.out.println(Arrays.toString(util.getPrimes(100)));
+//		System.out.println(Arrays.toString(util.getPerfectNumbers(1000)));
+//		System.out.println(util.join(oldArray,"--"));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] origin={7, 9 ,10, 30, 3};
+		int[] later={3,30,10,9,7};
+		util.reverseArray(origin);
+		assertArrayEquals(later, origin);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int[] oldArray={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArray={1,3,4,5,6,6,5,4,7,6,7,5};
+		assertArrayEquals(newArray, util.removeZero(oldArray));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1={3, 5,7,9,10};
+		int[] a2={4,6,100,111,132}; 
+		int[] result={3,4,5,6,7,9,10,100,111,132};
+		assertArrayEquals(result, util.merge(a1,a2));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] a1={3, 5,7,9,10};
+		int[] result={3,5,7,9,10,0,0,0};
+		assertArrayEquals(result, util.grow(a1,3));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] result={1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
+		assertArrayEquals(result, util.fibonacci(100));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] result={1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
+		assertArrayEquals(result, util.getPrimes(100));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] result={6, 28, 496};
+		assertArrayEquals(result, util.getPerfectNumbers(1000));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] oldArray={1,2,3,4,5};
+		String result="1-2-3-4-5";
+		assertEquals(result,util.join(oldArray, "-"));
+	}
+
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/LoginAction.java b/group05/371492887/task_02/src/com/nitasty/litestruts/LoginAction.java
new file mode 100644
index 0000000000..9846908724
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.nitasty.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/Struts.java b/group05/371492887/task_02/src/com/nitasty/litestruts/Struts.java
new file mode 100644
index 0000000000..fbd119cdef
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/litestruts/Struts.java
@@ -0,0 +1,204 @@
+package com.nitasty.litestruts;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	public static View runAction(String actionName,
+			Map<String, String> parameters) {
+		
+		View view=new View();
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 */
+		// 0.读取配置文件struts.xml
+		try {
+			// 将struts.xml转换成输入流
+			InputStream in = new FileInputStream(new File(
+					"src/com/nitasty/litestruts/struts.xml"));
+			// 穿件SAXReader读取器，用于读取xml
+			SAXReader saxReader = new SAXReader();
+			//
+			Document document = saxReader.read(in);
+			// 获取根节点对象
+			Element rootElement = document.getRootElement();
+			//获取action节点列表
+			List<Element> elementList=rootElement.elements();
+			//加载第一个action的class类
+			Element login=elementList.get(0);
+			Class clazz=Class.forName(login.attribute("class").getStringValue());
+			//new一个该class实例
+			Object obj=clazz.newInstance();
+			//获取name和password
+			String name=parameters.get("name");
+			String password=parameters.get("password");
+			//获取setName方法
+			Method setName=clazz.getMethod("setName",String.class);
+			//获取setPassword方法
+			Method setPassword=clazz.getMethod("setPassword",String.class);
+			//获取execute方法
+			Method execute=clazz.getMethod("execute");
+
+			//执行获取的方法
+			setName.invoke(obj,name);
+			setPassword.invoke(obj,password);
+			String result=(String) execute.invoke(obj);
+			List<Element> results=login.elements();
+			for (int i = 0; i < results.size(); i++) {
+				if(result.equalsIgnoreCase(results.get(i).attribute(0).getStringValue())){
+					view.setJsp(results.get(i).getTextTrim());
+				}
+			}
+			
+			//获取message属性
+			Field fld=clazz.getDeclaredField("message");
+			//允许访问私有属性
+			fld.setAccessible(true);
+			//获取该属性值
+			String message=(String) fld.get(obj);
+			
+			//将结果返回
+			Map<String,String> map=new HashMap<String,String>();
+			map.put("message", message);
+			view.setParameters(map);
+			
+			
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		} catch (NoSuchFieldException e) {
+			e.printStackTrace();
+		}
+
+		return view;
+	}
+	
+	
+	/**
+	 * 测试用
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		// 0.读取配置文件struts.xml
+		try {
+			// 将struts.xml转换成输入流
+			InputStream in = new FileInputStream(new File(
+					"src/com/nitasty/litestruts/struts.xml"));
+			// 创建SAXReader读取器，用于读取xml
+			SAXReader saxReader = new SAXReader();
+			//
+			Document document = saxReader.read(in);
+			// 获取根节点对象
+			Element rootElement = document.getRootElement();
+			List<Element> elementList=rootElement.elements();
+			
+			System.out.println(elementList.get(0).attribute("name").getStringValue());
+			System.out.println(elementList.get(0).attribute("class").getStringValue());
+
+			
+			Class clazz=Class.forName(elementList.get(0).attribute("class").getStringValue());
+			
+			Object obj=clazz.newInstance();
+			
+			Method setName=clazz.getMethod("setName",String.class);
+			Method setPassword=clazz.getMethod("setPassword",String.class);
+			setName.invoke(obj,"test");
+			setPassword.invoke(obj,"1234");
+			Method execute=clazz.getMethod("execute");
+			String str=(String) execute.invoke(obj);
+			Field fld=clazz.getDeclaredField("message");
+			fld.setAccessible(true);
+			String message=(String) fld.get(obj);
+			
+			System.out.println(str);
+			System.out.println(message);
+			elementList.get(0).attribute("name").getStringValue();
+			elementList.get(0).attribute("class").getStringValue();
+
+			Map map = new HashMap();
+//			map = getAttributes(rootElement, map);
+
+			// Element login=element.element("result");
+			// System.out.println(login.getText());
+
+			// for (Iterator it=rootElement.elementIterator(); it.hasNext();) {
+			// System.out.println(it.next());
+			// }
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (DocumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchFieldException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java b/group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..f9dc6be21f
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.nitasty.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/View.java b/group05/371492887/task_02/src/com/nitasty/litestruts/View.java
new file mode 100644
index 0000000000..28f3d586f2
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.nitasty.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml b/group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml
new file mode 100644
index 0000000000..cafe98fdea
--- /dev/null
+++ b/group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="com.coderising.action.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+	<action name="logout" class="com.coderising.action.LogoutAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/group05/399258474/.classpath b/group05/399258474/.classpath
index b387714202..5dc752a7bd 100644
--- a/group05/399258474/.classpath
+++ b/group05/399258474/.classpath
@@ -3,5 +3,6 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="F:/JAVA/jar包/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group05/399258474/src/com/coderising/array/ArrayUtil.java b/group05/399258474/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..57efb6de72
--- /dev/null
+++ b/group05/399258474/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,247 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int[] arr = new int[origin.length];
+		for (int i = 0; i < origin.length; i++) {
+			arr[i] = origin[origin.length-i-1];
+		}
+		for (int i = 0; i < arr.length; i++) {
+			origin[i] = arr[i];
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int size = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] != 0){
+				size ++;
+			}
+		}
+		int[] newArray = new int[size];
+		for (int i = 0,j = 0; i < oldArray.length; i++) {
+			if(oldArray[i] != 0){
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] totalArr = new int[array1.length + array2.length];
+		for (int i = 0; i < array1.length; i++) {
+			totalArr[i] = array1[i];
+		}
+		for (int j = array1.length,i = 0; i < array2.length; i++) {
+			totalArr[j] = array2[i];
+			j++;
+		}
+		//排序
+		for (int i = 0; i < totalArr.length; i++) {
+			for (int j = 0; j < totalArr.length-i-1; j++) {
+				if(totalArr[j] > totalArr[j+1]){
+					int temp = totalArr[j+1];
+					
+					totalArr[j+1] = totalArr[j];
+					totalArr[j] = temp;
+				}
+			}
+		}
+		//去重
+		if(totalArr.length < 2){
+			return totalArr;
+		}
+		int size = 1;
+		for (int i = 0; i < totalArr.length-1; i++) {
+			if(totalArr[i] != totalArr[i+1]){
+				size ++ ;
+			}
+		}		
+		int[] newArr = new int[size];
+		for (int i = 0,j = 0; i < totalArr.length-1; i++) {
+			if(totalArr[i] != totalArr[i+1]){
+				newArr[j] = totalArr[i];
+				j++;
+			}
+		}		
+		newArr[size-1] = totalArr[totalArr.length-1];
+		
+		return  newArr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int size = 0;
+		while(f(size) < max){
+			size++;
+		}
+		int[] arr = new int[size];
+		for (int i = 0; i < arr.length; i++) {
+			arr[i] = f(i);
+		}
+		return arr;
+	}
+	
+	public int f(int n){
+		if(n == 0 || n ==1){
+			return 1;
+		}else{
+			return f(n-1)+f(n-2);
+		}
+		
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max <= 2){
+			return null;
+		}
+		int size = 1;
+ 		for (int i = 3; i < max; i++) {
+			int n = 2;
+			while(n < i){
+				if(i%n == 0){
+					break;
+				}
+				n++;
+			}
+			if(n == i){
+				size ++;
+			}
+		}
+ 		int[] arr = new int[size];
+ 		arr[0] = 2;
+ 		for (int i = 3,j = 1; i < max; i++) {
+			int n = 2;
+			while(n < i){
+				if(i%n == 0){
+					break;
+				}
+				n++;
+			}
+			if(n == i){
+				arr[j] = i;
+				j ++;
+			}
+		}
+		return arr;
+	}
+	
+	
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max <= 5){
+			return null;
+		}
+		int size = 0;
+		for (int i = 6; i < max; i++) {
+			int sum = 0;
+			int n = 1;
+			while(n < i){
+				if(i % n == 0){
+					sum += n;
+				}
+				n++;
+			}
+			if(sum == i){
+				size ++;
+			}
+		}
+		int[] arr = new int[size];
+		for (int i = 6,j = 0; i < max; i++) {
+			int sum = 0;
+			int n = 1;
+			while(n < i){
+				if(i % n == 0){
+					sum += n;
+				}
+				n++;
+			}
+			if(sum == i){
+				arr[j] = i;
+				j ++;
+			}
+		}
+		return arr;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String str = "";
+		for (int i = 0; i < array.length; i++) {
+			if(i != array.length-1){
+				str += (array[i] + seperator);
+			}else{
+				str += array[i];
+			}
+		}
+		return str;
+	}
+	
+
+}
diff --git a/group05/399258474/src/com/coderising/array/ArrayUtilTest.java b/group05/399258474/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..952b6cd26d
--- /dev/null
+++ b/group05/399258474/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,92 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coding.basic.ArrayList;
+
+public class ArrayUtilTest {
+	ArrayUtil util = new ArrayUtil();
+	
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		System.out.println("-----------------------------");
+	}
+
+	@Test
+	public void reverseArraytest() {
+		int[] origin = new int[]{7,9,30,3};
+		System.out.println(Arrays.toString(origin));
+		util.reverseArray(origin);
+		System.out.println("数组置换："+Arrays.toString(origin));
+	}
+	
+	@Test
+	public void removeZeroTest(){
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArr = util.removeZero(oldArr);
+		System.out.println(Arrays.toString(oldArr) +"数组去0后为："+ Arrays.toString(newArr));
+	}
+	
+	@Test
+	public void mergeTest(){
+		int[] a1 = {3,5,7,8};
+		int[] a2 = {4,5,6,7};
+		int[] a3 = util.merge(a1, a2);
+		System.out.println(Arrays.toString(a1)+Arrays.toString(a2)+"合并、排序、去重后为："+Arrays.toString(a3));
+	}
+	
+	@Test
+	public void growTest(){
+		int[] oldArray = {2,3,6};
+		int i = 3;
+		int[] newArray = util.grow(oldArray, i);
+		System.out.println(Arrays.toString(oldArray) +" 扩容 "+ i +"后为："+Arrays.toString(newArray));
+ 	}
+	
+	@Test
+	public void fibonacciTest(){
+		int i = 15;
+		int[] arr = util.fibonacci(i);
+		System.out.println("斐波那契数列最大数小于"+ i +"的数组是：" + Arrays.toString(arr));
+	}
+	
+	@Test
+	public void getPrimesTest(){
+		int max = 23;
+		int[] arr = util.getPrimes(max);
+		System.out.println("最大数小于"+ max +"的素数数组是：" + Arrays.toString(arr));
+	}
+	
+	@Test
+	public void getPerfectNumbersTest(){
+		int max = 1000;
+		int[] arr = util.getPerfectNumbers(max);
+		System.out.println("最大数小于"+ max +"的完数数组是：" + Arrays.toString(arr));
+	}
+	
+	@Test
+	public void joinTest(){
+		int[] arr = {3,8,9};
+		String seperator = "-";
+		String str = util.join(arr, seperator);
+		System.out.println(Arrays.toString(arr)+"数组用\""+seperator+"\"连接后为："+str);
+ 	}
+	
+}
+
+
+
+
+
+
+
+
+
diff --git a/group05/399258474/src/com/coderising/litestruts/LoginAction.java b/group05/399258474/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group05/399258474/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/399258474/src/com/coderising/litestruts/Struts.java b/group05/399258474/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..79c82a78f4
--- /dev/null
+++ b/group05/399258474/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,162 @@
+package com.coderising.litestruts;
+
+import java.beans.PropertyDescriptor;
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	SAXReader saxReader = new SAXReader();
+    	View view = new View();
+    	try {
+			Document document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml"));
+			//获取根元素
+			Element root = document.getRootElement();
+			//根据参数获取子元素
+			List<Element> listElement=root.elements();//所有一级子节点的list  
+			Element actionElement = null;
+			String classStr = "";
+		    for(Element e:listElement){
+		    	Attribute actionNameAttr = e.attribute("name");
+		    	if(actionNameAttr.getValue().equals(actionName)){
+		    		//获取属性值
+					Attribute classAttr = e.attribute("class");
+					classStr = classAttr.getValue();
+					actionElement = e;
+					break;
+		    	}
+		    }
+			
+			//通过反射创建对象
+			Class<?> clazz = Class.forName(classStr);
+			Object c = clazz.newInstance();                                       
+			Field[] fields = clazz.getDeclaredFields();
+			//通过set方法赋值
+			Set<Entry<String, String>> set = parameters.entrySet();
+			for(Entry<String, String> entry : set){
+				String key = entry.getKey();
+				String val = entry.getValue();
+				for(Field f :fields){
+					PropertyDescriptor pd = getPropertyDescriptor(clazz,key,true);
+					Method setMethod = pd.getWriteMethod();
+					setMethod.invoke(c, new Object[]{val});
+				}
+			}
+			
+			//通过返回值确定jsp
+			String jspStr = "";
+			Method executeMethod = clazz.getDeclaredMethod("execute");
+			executeMethod.setAccessible(true);
+			String str = (String) executeMethod.invoke(c);
+			List<Element> resultElements = actionElement.elements();
+			for(Element e:resultElements){
+				Attribute resultNameAttr = e.attribute("name");
+				if(resultNameAttr.getValue().equals(str)){
+					jspStr = e.getText();
+					break;
+				}
+		    	
+		    }
+			
+			//获取所有的get方法,存入map
+			HashMap<String,Object> map = new HashMap<String,Object>();
+			for(Field f :fields){
+				PropertyDescriptor pd = getPropertyDescriptor(clazz,f.getName(),false);
+				Method getMethod = pd.getReadMethod();
+				Object value = getMethod.invoke(c, new Object[]{});
+				map.put(f.getName(), value);
+			}
+			
+			//确定返回的View
+			
+			view.setJsp(jspStr);
+			view.setParameters(map);
+			
+			
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		} 
+    	
+    	return view;
+    }
+    
+    public static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String propertyName,boolean hasSetMethod) {  
+        StringBuffer sb = new StringBuffer();
+        Method setMethod = null;  
+        Method getMethod = null;  
+        PropertyDescriptor pd = null;  
+        try {  
+            Field f = clazz.getDeclaredField(propertyName);//根据字段名来获取字段  
+            if (f!= null) {  
+               //构建方法的后缀  
+               String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);  
+               if(hasSetMethod){
+            	   sb.append("set" + methodEnd);
+            	   setMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ f.getType() });  
+               }
+               sb.delete(0, sb.length());//清空
+               sb.append("get" + methodEnd);//构建get方法  
+               //构建get 方法  
+               getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ });  
+               //构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中  
+               pd = new PropertyDescriptor(propertyName, getMethod, setMethod);  
+            }  
+        } catch (Exception ex) {  
+            ex.printStackTrace();  
+        }  
+      
+        return pd;  
+    } 
+
+}
diff --git a/group05/399258474/src/com/coderising/litestruts/StrutsTest.java b/group05/399258474/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..56bb5b23d0
--- /dev/null
+++ b/group05/399258474/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,48 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+	
+	@Test
+	public void testLoginActionSuccess() throws ClassNotFoundException {
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/399258474/src/com/coderising/litestruts/View.java b/group05/399258474/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group05/399258474/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/399258474/src/com/coderising/litestruts/struts.xml b/group05/399258474/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..246b3595ad
--- /dev/null
+++ b/group05/399258474/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/399258474/src/com/coding/basic/ArrayList.java b/group05/399258474/src/com/coding/basic/ArrayList.java
index 5030b8d001..78706c993f 100644
--- a/group05/399258474/src/com/coding/basic/ArrayList.java
+++ b/group05/399258474/src/com/coding/basic/ArrayList.java
@@ -4,7 +4,7 @@ public class ArrayList implements List {
 	
 	private int size = 0;
 	
-	private Object[] elementData = new Object[2];
+	private Object[] elementData = new Object[10];
 	
 	public void add(Object o){
 		int len = elementData.length;
diff --git a/group05/399258474/src/test/BasicTest.java b/group05/399258474/src/com/coding/basic/test/BasicTest.java
similarity index 92%
rename from group05/399258474/src/test/BasicTest.java
rename to group05/399258474/src/com/coding/basic/test/BasicTest.java
index 7339881525..8febc26102 100644
--- a/group05/399258474/src/test/BasicTest.java
+++ b/group05/399258474/src/com/coding/basic/test/BasicTest.java
@@ -1,4 +1,4 @@
-package test;
+package com.coding.basic.test;
 
 import org.junit.Test;
 
diff --git a/group05/515505513/Task02/.classpath b/group05/515505513/Task02/.classpath
new file mode 100644
index 0000000000..916d837ac0
--- /dev/null
+++ b/group05/515505513/Task02/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-2.0.0.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group05/515505513/Task02/.gitignore b/group05/515505513/Task02/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group05/515505513/Task02/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group05/515505513/Task02/.project b/group05/515505513/Task02/.project
new file mode 100644
index 0000000000..e4d9a52aa9
--- /dev/null
+++ b/group05/515505513/Task02/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Task02</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/296933284/DataStructuresTest/.settings/org.eclipse.jdt.core.prefs b/group05/515505513/Task02/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from group14/296933284/DataStructuresTest/.settings/org.eclipse.jdt.core.prefs
rename to group05/515505513/Task02/.settings/org.eclipse.jdt.core.prefs
diff --git a/group05/515505513/Task02/lib/dom4j-2.0.0.jar b/group05/515505513/Task02/lib/dom4j-2.0.0.jar
new file mode 100644
index 0000000000..fd9e2ccd44
Binary files /dev/null and b/group05/515505513/Task02/lib/dom4j-2.0.0.jar differ
diff --git a/group05/515505513/Task02/src/com/coderising/action/LoginAction.java b/group05/515505513/Task02/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..5cdf1b78e4
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,45 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+ 
+}
diff --git a/group05/515505513/Task02/src/com/coderising/action/Struts.java b/group05/515505513/Task02/src/com/coderising/action/Struts.java
new file mode 100644
index 0000000000..7a342e28bb
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/action/Struts.java
@@ -0,0 +1,165 @@
+package com.coderising.action;
+import java.beans.PropertyDescriptor;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+     
+		//0. 读取配置文件struts.xml
+    	
+    	SAXReader saxReader = new SAXReader();
+    	View view = new View();
+    	Element actionElement = null;
+		String classVal="";
+ 		try {
+			Document read = saxReader.read(new File("src/com/coderising/action/struts.xml"));
+			//获得根节点
+			Element rootElement = read.getRootElement();
+			//获得根节点下的一级节点
+			List<Element> elements = rootElement.elements();
+			for (Element element : elements) {
+				Attribute attribute = element.attribute("name");
+				//如果等于传递进来的actionName
+				if(attribute.getValue().equals(actionName)){
+					actionElement = element;
+					//获得属性值
+					Attribute classAttr = element.attribute("class");
+					classVal = classAttr.getValue();
+				}
+			}
+			
+//	 	1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+//			据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+//			("name"="test" ,  "password"="1234") ,     	
+//			那就应该调用 setName和setPassword方法
+	 		//com.coderising.action.LoginAction
+			
+			Class<?> clazz = Class.forName(classVal);
+			Object c = clazz.newInstance();
+			Field[] fields = clazz.getDeclaredFields();
+			Set<Entry<String, String>> set = parameters.entrySet();
+			for (Entry<String, String> entry : set) {
+				String key = entry.getKey();
+				String value = entry.getValue();
+				for (Field f : fields) {
+					setProperty(c, key, value);
+				}
+			}
+	
+	//2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+			Method executeMethod = clazz.getDeclaredMethod("execute");
+			executeMethod.setAccessible(true);
+			String jspStr = "";
+			String str = (String) executeMethod.invoke(c);
+			List<Element> resultNameJSp = actionElement.elements();
+			for (Element element : resultNameJSp) {
+				Attribute attribute = element.attribute("name");
+				if(attribute.getValue().equals(str)){
+					jspStr = element.getText();
+					break;
+				}
+			}
+			
+//			3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+//			通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+//			放到View对象的parameters
+			HashMap<String,Object> hashMap = new HashMap<>();
+			for (Field f : fields) {
+				Object value = getProperty(c, f.getName());
+				hashMap.put(f.getName(),value);
+			}
+			
+//			4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+//			放到View对象的jsp字段中。
+			view.setJsp(jspStr);
+			//System.out.println("====="+view.getJsp());
+			view.setParameters(hashMap);
+			//System.out.println(view.getParameters().get("message"));
+			
+			
+ 		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return view;
+    }    
+    
+    public static PropertyDescriptor getPropertyDescriper(Class clazz,String propertyName){
+    	//构建一个可变字符串用来构建方法名称
+    	StringBuffer sBuffer = new StringBuffer();
+    	Method setMethod = null;
+    	Method getMethod = null;
+    	PropertyDescriptor pd = null;
+    	try {
+    		//根据字段名来获取字段
+			Field f = clazz.getDeclaredField(propertyName);
+			if(f!=null){
+				//构建方法的后缀
+				String methodEnd = propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
+				sBuffer.append("set"+methodEnd);//构建set方法
+				setMethod = clazz.getDeclaredMethod(sBuffer.toString(),new Class[]{f.getType()});
+				sBuffer.delete(0, sBuffer.length());//清空整个可变字符串
+				sBuffer.append("get"+methodEnd);//构建get方法
+				getMethod = clazz.getDeclaredMethod(sBuffer.toString(),new Class[]{});
+				//构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中 
+				pd = new PropertyDescriptor(propertyName, getMethod, setMethod);  
+			}
+			
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return pd;
+    }
+    
+    /**
+     * @param obj
+     * @param propertyName
+     * @param value
+     */
+    public static void setProperty(Object obj,String propertyName,Object value){
+    	//获取对象的类型
+    	Class clazz = obj.getClass();
+    	PropertyDescriptor pd = getPropertyDescriper(clazz,propertyName);
+    	//从属性描述器中获取set方法
+    	Method setMethod = pd.getWriteMethod();
+    	try {
+			setMethod.invoke(obj, new Object[]{value});
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} 
+    	
+    }
+    public static Object getProperty(Object obj,String propertyName){
+    	Class clazz = obj.getClass();
+    	PropertyDescriptor pd = getPropertyDescriper(clazz,propertyName);
+    	Method getMethod = pd.getReadMethod();
+    	Object value= null;
+    	try {
+			value = getMethod.invoke(obj,new Object[]{});
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return value;
+    }
+    
+
+}
diff --git a/group05/515505513/Task02/src/com/coderising/action/StrutsTest.java b/group05/515505513/Task02/src/com/coderising/action/StrutsTest.java
new file mode 100644
index 0000000000..f162786054
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/action/StrutsTest.java
@@ -0,0 +1,42 @@
+package com.coderising.action;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/515505513/Task02/src/com/coderising/action/View.java b/group05/515505513/Task02/src/com/coderising/action/View.java
new file mode 100644
index 0000000000..11cb1872e5
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/action/View.java
@@ -0,0 +1,23 @@
+package com.coderising.action;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/515505513/Task02/src/com/coderising/action/struts.xml b/group05/515505513/Task02/src/com/coderising/action/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/action/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java b/group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..eca61be119
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,221 @@
+package com.coderising.array;
+
+import java.util.Iterator;
+import java.util.TreeSet;
+
+import org.junit.Test;
+
+public class ArrayUtil {
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return leon1900
+	 */
+	public void reverseArray(int[] origin){
+		for (int i = 0; i < origin.length/2; i++) {
+			int temp =  origin[origin.length-1-i];
+			origin[origin.length-1-i] = origin[i];
+			origin[i] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return leon1900
+	 */
+	public int[] removeZero(int[] oldArray){
+		int size = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] !=0 ){
+				size++;
+			}
+		}
+		int [] newArray = new int [size]; 
+		for (int i = 0,j = 0; i < oldArray.length; i++) {
+			if(oldArray[i]!=0){
+				newArray[j++] = oldArray[i];
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return leon1900
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		TreeSet<Integer> ts = new TreeSet<>();
+		for (int i = 0; i < array1.length; i++) {
+			ts.add(array1[i]);
+		}
+		for (int i = 0; i < array2.length; i++) {
+			ts.add(array2[i]);
+		}
+		int size = ts.size();
+		int[] newArr = new int[size];
+		int i = 0;
+		for (Integer integer : ts) {
+			newArr[i++] = integer;
+		}
+		return newArr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return leon1900
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int newsize = oldArray.length+size;
+		int [] newArr = new int[newsize];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArr[i] = oldArray[i];
+		}
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return leon1900
+	 */
+	public int[] fibonacci(int max){
+		int size = 1;
+		while(fun(size)<max){
+			size++;
+		}
+		int [] arr = new int [size-1];
+		for (int j=0,i = 1; i < max; i++) {
+			if(fun(i)<max){
+				arr[j++] = fun(i);
+			}else {
+				return arr;
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * 求给定数的斐波拉契数
+	 * @param max
+	 * @return leon1900
+	 */
+	private int fun(int n) {
+		if(n==1||n==2){
+			return 1;
+		}else {
+			return fun(n-1)+fun(n-2);
+		}
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return leon1900
+	 */
+	public int[] getPrimes(int max){
+		int size = 0;
+		for (int i = 1; i < max; i++) {
+			if(primeNumber(i)){
+				size++;
+			}
+		}
+		int []arr = new int[size];
+		for (int j=0,i = 1; i < max; i++) {
+			if(primeNumber(i)){
+				arr[j++]=i;
+			}
+		}
+		return arr;
+	}
+	
+	/**
+	 * 判断是否为素数
+	 * @param num
+	 * @return leon1900
+	 */
+	public boolean primeNumber(int num){
+		boolean flag = true;
+		if(num==1) flag = false;
+			for (int j = 2; j <= num/2; j++) {
+				if(num % j == 0){
+					flag = false;
+					break;
+				}
+		}
+		return flag;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int size=0;
+		for (int i = 1; i < max; i++) {
+			if(perfectNumber(i)){
+				size++;
+			}
+		}
+		int[] arr = new int[size];
+		for (int j=0,i = 1; i < max; i++) {
+			if(perfectNumber(i)){
+				arr[j++] = i;
+			}
+		}
+		return arr;
+	}
+	
+	public boolean perfectNumber(int num){
+		boolean flag = false;
+		int sum = 0;
+		//完数 除了1 跟本身的因子
+		for (int i = 1; i <= num/2; i++) {
+			if(num%i==0){
+				sum+=i;
+			}
+		}
+		if(sum==num)
+			flag =true;
+		return flag;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return leon1900
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sBuilder =new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			if(i==array.length-1){
+				sBuilder.append(array[i]);
+			}else{
+				sBuilder.append(array[i]+seperator);
+			}
+		}
+		return sBuilder.toString();
+	}
+	
+
+}
diff --git a/group05/515505513/Task02/src/com/coderising/array/ArrayUtilTest.java b/group05/515505513/Task02/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..e63c398772
--- /dev/null
+++ b/group05/515505513/Task02/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,84 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	ArrayUtil util = new ArrayUtil();
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		System.out.println("-----------------------------");
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] origin = new int[]{7,9,30,3};
+		System.out.println(Arrays.toString(origin));
+		util.reverseArray(origin);
+		System.out.println("数组置换："+Arrays.toString(origin));
+		
+	}
+
+	@Test
+	public void testRemoveZero() {
+		  int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		  System.out.println(Arrays.toString(oldArr));
+		  int [] newArr = util.removeZero(oldArr);
+		  System.out.println("去0后新数组："+Arrays.toString(newArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int [] a1 = {3, 5, 7,8};
+		int [] a2 = {4, 5, 6,7};
+		int [] a3 = util.merge(a1, a2);
+		System.out.println("合并排序后的数组："+Arrays.toString(a3));
+	}
+
+	@Test
+	public void testGrow() {
+		int [] oldArray = {2,3,6};
+		int size = 3;
+		int[] newArr = util.grow(oldArray, size);
+		System.out.println("增长后的数组："+Arrays.toString(newArr));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15;
+		int[] arr = util.fibonacci(max);
+		System.out.println("返回小于"+max+"的数列"+Arrays.toString(arr));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max=23;
+		int []arr = util.getPrimes(max);
+		System.out.println("返回小于"+max+"所有素数数组"+Arrays.toString(arr));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max = 6;
+		int [] arr= util.getPerfectNumbers(max);
+		System.out.println("返回小于"+max+"的所有完数"+Arrays.toString(arr));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array= {3,8,9};
+		String seperator = "-";
+		String str = util.join(array, seperator);
+		System.out.println("返回带连接符的数组表示"+str);
+	}
+
+}
diff --git a/group05/578505552/pom.xml b/group05/578505552/pom.xml
index 3e841624e0..b22dfcedd8 100644
--- a/group05/578505552/pom.xml
+++ b/group05/578505552/pom.xml
@@ -15,6 +15,11 @@
   </properties>
 
   <dependencies>
+    <dependency>
+      <groupId>dom4j</groupId>
+      <artifactId>dom4j</artifactId>
+      <version>1.6.1</version>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
diff --git a/group05/578505552/src/main/java/com/coderising/Q&A.md b/group05/578505552/src/main/java/com/coderising/Q&A.md
new file mode 100644
index 0000000000..29fcbb1560
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/Q&A.md
@@ -0,0 +1,5 @@
+# Struts中去获得getter或者setter方法的时候怎样比较靠谱？目前有两种思路
+## 获取Struts中所有以“get”或“set”开头的方法
+### 问题1：可能有不是getter或者setter的方法也是以“get”或者“set”开头
+## 先获取Struts中所有的成员变量的名字，再与字符串“get”或“set”拼接出getter或者setter方法名，再通过方法名用反射获取方法
+### 问题1：因为拼接方法名肯定以驼峰命名法来拼接，这就要求getter和setter方法也是以这个规则命名，虽然ide自动生成的方法是如此，但不能保存总是如此。
\ No newline at end of file
diff --git a/group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java b/group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..2c248db331
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,242 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int length = origin.length;
+		int i = 0;
+		int j = length - 1;
+		while (i < j){
+			int tmp = origin[i];
+			origin[i] = origin[j];
+			origin[j] = tmp;
+			i++;
+			j--;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int length = oldArray.length;
+		int[] newArray = new int[length];
+		int j = 0;
+		for (int i = 0; i < length; i++) {
+			if (oldArray[i] != 0){
+				newArray[j++] = oldArray[i];
+			}
+		}
+		int[] res = new int[j];
+		System.arraycopy(newArray, 0, res, 0, j);
+		return res;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int length1 = array1.length;
+		int length2 = array2.length;
+		int i = 0;
+		int j = 0;
+
+		int[] res = new int[length1 + length2];
+		int k = 0;
+		while (i < length1 || j < length2){
+			int next = Integer.MIN_VALUE;
+			if (i < length1 && j < length2){
+				if (array1[i] == array2[j]){
+					next = array1[i];
+					i++;
+					j++;
+				} else if (array1[i] < array2[j]){
+					next = array1[i++];
+				} else {
+					next = array2[j++];
+				}
+			} else if (i < length1){
+				next = array1[i++];
+			} else {
+				next = array2[j++];
+			}
+
+			if (k == 0){
+				res[k++] = next;
+			} else if (next > res[k-1]){
+				res[k++]  = next;
+			}
+		}
+
+		int[] merged = new int[k];
+		System.arraycopy(res, 0, merged, 0, k);
+		return  merged;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if (size < 0){
+			throw new IllegalArgumentException("illegal size");
+		}
+		int newLength = oldArray.length + size;
+		int[] newArray = new int[newLength];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+
+		if (max <= 1){
+			return new int[0];
+		}
+
+		int[] res = new int[max];
+		int i = 1;
+		int j = 1;
+		int k = 0;
+		res[k++] = 1;
+		res[k++] = 1;
+
+		int tmp = i + j;
+		while (tmp < max){
+			res[k++] = tmp;
+			i = j;
+			j = tmp;
+			tmp = i + j;
+		}
+
+		int[] result = new int[k];
+		System.arraycopy(res, 0, result, 0, k);
+		return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if (max < 0){
+			return new int[0];
+		}
+		int[] res = new int[max];
+		int k = 0;
+		for (int i = 2; i < max; i++) {
+			if (isPrime(i)){
+				res[k++] = i;
+			}
+		}
+		int[] result = new int[k];
+		System.arraycopy(res, 0, result, 0, k);
+		return result;
+	}
+
+	private boolean isPrime(int num){
+
+		if (num < 1){
+			return false;
+		}
+		for (int i = 2; i <= num / 2; i++) {
+			if (num % i == 0){
+				return false;
+			}
+
+		}
+		return true;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+
+		if (max < 0){
+			return new int[0];
+		}
+		int[] res = new int[max];
+		int k = 0;
+		for (int i = 0; i < max; i++) {
+			if (isPerfectNumbers(i)){
+				res[k++] = i;
+			}
+		}
+		int[] result = new int[k];
+		System.arraycopy(res, 0, result, 0, k);
+		return result;
+	}
+
+	private boolean isPerfectNumbers(int num){
+
+		return num == getFactorSum(num);
+	}
+
+	private int getFactorSum(int num){
+		if (num == 0 || num == 1){
+			return -1;
+		}
+		int sum = 0;
+		for (int i = 1; i <= num / 2; i++) {
+			if (num % i == 0){
+				sum += i;
+			}
+		}
+		return sum;
+	}
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param separator
+	 * @return
+	 */
+	public String join(int[] array, String separator){
+
+		if (array.length <= 0){
+			return "";
+		}
+
+		StringBuffer stringBuffer = new StringBuffer();
+		for (int i = 0; i < array.length - 1; i++) {
+			stringBuffer.append(String.valueOf(array[i])).append(separator);
+		}
+		stringBuffer.append(String.valueOf(array[array.length-1]));
+		return stringBuffer.toString();
+	}
+
+}
diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/Action.java b/group05/578505552/src/main/java/com/coderising/litestruts/Action.java
new file mode 100644
index 0000000000..743f452030
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/litestruts/Action.java
@@ -0,0 +1,38 @@
+package com.coderising.litestruts;
+
+
+import java.util.Map;
+
+/**
+ * Created by songbao.yang on 2017/3/1.
+ *
+ */
+public class Action {
+    private String name;
+    private String className;
+    private Map<String, String> results;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Map getResults() {
+        return results;
+    }
+
+    public void setResults(Map results) {
+        this.results = results;
+    }
+}
diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java b/group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..b74dfa425d
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,38 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/Struts.java b/group05/578505552/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..95b4d37a52
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,131 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+//        0. 读取配置文件struts.xml
+        Action action = matchAction(parseXml("/struts.xml"), actionName);
+        try {
+
+//            1. 根据actionName找到相对应的class, 通过反射实例化（创建对象）,
+//               根据parameters中的数据，调用对象的setter方法
+            Class<?> clazz = Class.forName(action.getClassName());
+            Object instance = clazz.newInstance();
+            for (String key : parameters.keySet()){
+                try {
+                    PropertyDescriptor propertyDescriptor = new PropertyDescriptor(key, clazz);
+                    Method setMethod = propertyDescriptor.getWriteMethod();
+                    setMethod.invoke(instance, parameters.get(key));
+                } catch (IntrospectionException e) {
+                    e.printStackTrace();
+                }
+            }
+
+//            2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+            Method exectueMethod = null;
+            String result = null;
+            try {
+                exectueMethod = clazz.getMethod("execute");
+                result = (String)exectueMethod.invoke(instance);
+            } catch (NoSuchMethodException e) {
+                e.printStackTrace();
+            }
+
+//            3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+//            通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+//            放到View对象的parameters
+            Map<String, Object> hashMap = new HashMap<String, Object>();
+            Field[] declaredFields = clazz.getDeclaredFields();
+            for (Field field : declaredFields){
+                String name = field.getName();
+                try {
+                    PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, clazz);
+                    Method getMethod = propertyDescriptor.getReadMethod();
+                    Object res = getMethod.invoke(instance);
+                    hashMap.put(name, res);
+                } catch (IntrospectionException e) {
+                    e.printStackTrace();
+                }
+            }
+
+//            4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+//            放到View对象的jsp字段中。
+            View view = new View();
+            view.setJsp((String)action.getResults().get(result));
+            view.setParameters(hashMap);
+            return view;
+
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    private static Element parseXml(String resourcePath){
+
+        InputStream resourceAsStream = Struts.class.getResourceAsStream(resourcePath);
+        SAXReader saxReader = new SAXReader();
+        try {
+            Document document = saxReader.read(resourceAsStream);
+            Element rootElement = document.getRootElement();
+            return rootElement;
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+        throw new RuntimeException("fail to parse xml");
+    }
+
+    private static Action matchAction(Element rootElement, String actionName){
+
+        List actions = rootElement.elements("action");
+        Iterator iterator = actions.iterator();
+        Action action = new Action();
+        while (iterator.hasNext()){
+            Element actionElement = (Element) iterator.next();
+            String nameAttributeValue = actionElement.attributeValue("name");
+            if (actionName.equals(nameAttributeValue)){
+                action.setName(nameAttributeValue);
+                action.setClassName(actionElement.attributeValue("class"));
+                List results = actionElement.elements("result");
+                Map<String, String> resultMap = new HashMap<String, String>();
+                Iterator it = results.iterator();
+                while (it.hasNext()){
+                    Element resultElement = (Element)it.next();
+                    resultMap.put(resultElement.attributeValue("name"), (String)resultElement.getData());
+                }
+                action.setResults(resultMap);
+            }
+        }
+
+        return action;
+    }
+
+
+
+
+}
diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/View.java b/group05/578505552/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java b/group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java
new file mode 100644
index 0000000000..6e3c261882
--- /dev/null
+++ b/group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java
@@ -0,0 +1,8 @@
+package com.coderising.litestruts;
+
+/**
+ *
+ * Created by songbao.yang on 2017/2/28.
+ */
+public class XmlUtil {
+}
diff --git a/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java b/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java
index 0610a542b5..3a36db4031 100644
--- a/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java
+++ b/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -30,6 +30,9 @@ public void setRight(BinaryTreeNode right) {
 	}
 	
 	public BinaryTreeNode insert(Integer o){
+		if (o == null){
+		    throw new IllegalArgumentException("can not insert null");
+        }
 
         BinaryTreeNode newNode = new BinaryTreeNode();
         newNode.data = o;
diff --git a/group05/578505552/src/main/java/com/coding/basic/LinkedList.java b/group05/578505552/src/main/java/com/coding/basic/LinkedList.java
index 58accde4d8..d1fa42bf4c 100644
--- a/group05/578505552/src/main/java/com/coding/basic/LinkedList.java
+++ b/group05/578505552/src/main/java/com/coding/basic/LinkedList.java
@@ -13,7 +13,7 @@ public class LinkedList implements List {
 
     //head作为一个节点，其next的值指向List中真正的第一个节点
 	public LinkedList() {
-        Node head = new Node();
+        head = new Node();
         head.next = null;
         head.data = null;
         elementCount = 0;
@@ -60,7 +60,7 @@ public Object get(int index){
         for (int i = 0; i < index; i++) {
             cursor = cursor.next;
         }
-        return cursor.next;
+        return cursor.next.data;
     }
 
 	public Object remove(int index){
diff --git a/group05/578505552/src/main/java/com/coding/basic/List.java b/group05/578505552/src/main/java/com/coding/basic/List.java
index a979b2fdb9..e26fbe7c98 100644
--- a/group05/578505552/src/main/java/com/coding/basic/List.java
+++ b/group05/578505552/src/main/java/com/coding/basic/List.java
@@ -10,4 +10,5 @@ public interface List {
 	public Object get(int index);
 	public Object remove(int index);
 	public int size();
+	public Iterator iterator();
 }
diff --git a/group05/578505552/src/main/resources/struts.xml b/group05/578505552/src/main/resources/struts.xml
new file mode 100644
index 0000000000..0a44e0927e
--- /dev/null
+++ b/group05/578505552/src/main/resources/struts.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java b/group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..607f4fed5b
--- /dev/null
+++ b/group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,206 @@
+package com.coderising.array;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * Created by songbao.yang on 2017/3/2.
+ *
+ */
+public class ArrayUtilTest {
+
+    private  ArrayUtil arrayUtil;
+
+    @Before
+    public void setUp() throws Exception {
+        arrayUtil = new ArrayUtil();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+
+        int[][] actualAndExpected = {
+                {}, {}, {0}, {0},
+                {1,2,3,4,5,6}, {6,5,4,3,2,1},
+                {7,9,30,3,4}, {4,3,30,9,7}
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 2) {
+            int[] acutal = actualAndExpected[i];
+            int[] expected = actualAndExpected[i+1];
+            arrayUtil.reverseArray(acutal);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, acutal));
+        }
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int[][] actualAndExpected = {
+                {}, {}, {0}, {},
+                {1,0,3,0,5,0}, {1,3,5},
+                {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}, {1,3,4,5,6,6,5,4,7,6,7,5}
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 2) {
+            int[] acutal = actualAndExpected[i];
+            int[] expected = actualAndExpected[i+1];
+            int[] ints = arrayUtil.removeZero(acutal);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, ints));
+        }
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[][] actualAndExpected = {
+                {}, {}, {},
+                {}, {0}, {0},
+                {3,5,7,8}, {4,5,6,7},{3,4,5,6,7,8},
+                {1,2,3,4,5,}, {6,7,8,9,10}, {1,2,3,4,5,6,7,8,9,10}
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 3) {
+            int[] array1 = actualAndExpected[i];
+            int[] array2 = actualAndExpected[i+1];
+            int[] expected = actualAndExpected[i+2];
+            int[] result = arrayUtil.merge(array1, array2);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, result));
+        }
+
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[][] actualAndExpected = {
+                {}, {},
+                {1}, {},
+                {5}, {0,0,0,0,0},
+                {0},{2,3,6},
+                {3}, {2,3,6,0,0,0}
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 3) {
+            int[] oldArray = actualAndExpected[i];
+            int size = actualAndExpected[i+1][0];
+            int[] expected = actualAndExpected[i+2];
+            int[] newArray = arrayUtil.grow(oldArray, size);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, newArray));
+        }
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        int[][] actualAndExpected = {
+                {0}, {},
+                {1}, {},
+                {2}, {1,1},
+                {3}, {1,1,2},
+                {4}, {1,1,2,3},
+                {15}, {1,1,2,3,5,8,13},
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 2) {
+            int max = actualAndExpected[i][0];
+            int[] expected = actualAndExpected[i+1];
+            int[] actual = arrayUtil.fibonacci(max);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, actual));
+        }
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int[][] actualAndExpected = {
+                {-1}, {},
+                {0}, {},
+                {1}, {},
+                {2}, {},
+                {3}, {2},
+                {4}, {2,3},
+                {23}, {2,3,5,7,11,13,17,19},
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 2) {
+            int max = actualAndExpected[i][0];
+            int[] expected = actualAndExpected[i+1];
+            int[] actual = arrayUtil.getPrimes(max);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, actual));
+        }
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int[][] actualAndExpected = {
+                {-1}, {},
+                {0}, {},
+                {1}, {},
+                {2}, {},
+                {7}, {6},
+                {30}, {6,28},
+                {500}, {6,28,496},
+                {10000}, {6,28,496,8128}
+        };
+
+        for (int i = 0; i < actualAndExpected.length; i += 2) {
+            int max = actualAndExpected[i][0];
+            int[] expected = actualAndExpected[i+1];
+            int[] actual = arrayUtil.getPerfectNumbers(max);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, actual));
+        }
+    }
+
+    @Test
+    public void join() throws Exception {
+        int[][] arrays = {
+                {},
+                {3,8,9},
+                {1},
+                {0,0,0,0,0},
+                {1,2,3,4,5}
+        };
+        String[] separators = {"", "-", "+", "*", "00"};
+        String[] expecteds = {
+                "",
+                "3-8-9",
+                "1",
+                "0*0*0*0*0",
+                "1002003004005"
+        };
+        for (int i = 0; i < arrays.length; i++) {
+            int[] array = arrays[i];
+            String separator = separators[i];
+            String expected = expecteds[i];
+            String actual = arrayUtil.join(array, separator);
+            Assert.assertTrue("wrong index: " + String.valueOf(i), expected.equals(actual));
+        }
+    }
+
+    private boolean isArrayEqual(int[] expected, int[] actual){
+        if (expected.length != actual.length){
+            System.out.println("expected.length != actual.length");
+            System.out.println("expected: " + Arrays.toString(expected));
+            System.out.println("actual: " + Arrays.toString(actual));
+            return false;
+        }
+
+        for (int i = 0; i < expected.length; i++) {
+            if (expected[i] != actual[i]){
+                System.out.println("expected[i] != actual[i]");
+                System.out.println("expected: " + Arrays.toString(expected));
+                System.out.println("actual: " + Arrays.toString(actual));
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java b/group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..6df05450b6
--- /dev/null
+++ b/group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java b/group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java
deleted file mode 100644
index 87b9906c29..0000000000
--- a/group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.coding.basic;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Created by songbao.yang on 2017/2/21.
- *
- */
-public class ArrayListTest {
-
-    private ArrayList list;
-
-    public static final int SIZE = 10000;
-
-    @Before
-    public void setUp() throws Exception {
-
-        list = new ArrayList();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-
-    }
-
-    @Test
-    public void add() throws Exception {
-
-        for (int i = 0; i < SIZE; i++) {
-            list.add(i);
-            Assert.assertEquals(i+1, list.size());
-        }
-    }
-
-    @Test
-    public void add1() throws Exception {
-
-        add();
-        for (int i = 0; i < 1000; i++) {
-            int oldSize = list.size();
-            int randomIndex = (int)Math.floor(Math.random() * oldSize);
-
-            list.add(randomIndex, randomIndex);
-            int newSize = list.size();
-
-            Assert.assertEquals(newSize, oldSize+1);
-            Assert.assertEquals(list.get(randomIndex), randomIndex);
-        }
-    }
-
-    @Test
-    public void get() throws Exception {
-
-        add();
-        for (int i = 0; i < SIZE * 100; i++) {
-            int randomIndex = (int)Math.floor(Math.random() * list.size());
-            if(randomIndex < 0 || randomIndex >= SIZE){
-                System.out.println("illegal index: " + randomIndex);
-                throw new RuntimeException();
-            }
-            int o = (Integer) list.get(randomIndex);
-            Assert.assertEquals(randomIndex, o);
-        }
-    }
-
-    @Test
-    public void remove() throws Exception {
-
-        add();
-        for (int i = 0; i < SIZE; i++) {
-            System.out.println("remove: " + i);
-            list.remove(0);
-        }
-
-    }
-
-    @Test
-    public void size() throws Exception {
-
-    }
-
-    @Test
-    public void iterator() throws Exception {
-        add();
-        Iterator iterator1 = list.iterator();
-        int i = 0;
-        while (iterator1.hasNext()){
-            Object next = iterator1.next();
-            Assert.assertEquals(i, next);
-            i++;
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java b/group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..d1e408554e
--- /dev/null
+++ b/group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java
@@ -0,0 +1,38 @@
+package com.coding.basic;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by songbao.yang on 2017/2/28.
+ *
+ */
+public class BinaryTreeNodeTest {
+
+    private BinaryTreeNode node;
+
+    @Before
+    public void setUp() throws Exception {
+        node = new BinaryTreeNode();
+        node.setData(100);
+        node.setLeft(null);
+        node.setRight(null);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void insert() throws Exception {
+
+        for (int i = 0; i < 100; i++) {
+            int ele = (int)Math.floor(Math.random() * 200);
+            node.insert(ele);
+        }
+    }
+}
\ No newline at end of file
diff --git a/group05/578505552/src/test/java/com/coding/basic/ListTest.java b/group05/578505552/src/test/java/com/coding/basic/ListTest.java
new file mode 100644
index 0000000000..0c786de96c
--- /dev/null
+++ b/group05/578505552/src/test/java/com/coding/basic/ListTest.java
@@ -0,0 +1,100 @@
+package com.coding.basic;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by songbao.yang on 2017/2/21.
+ *
+ */
+public class ListTest {
+
+    private List list;
+
+    public static final int SIZE = 10000;
+
+    @Before
+    public void setUp() throws Exception {
+
+//        list = new ArrayList();
+        list = new LinkedList();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void add() throws Exception {
+
+        for (int i = 0; i < SIZE; i++) {
+            list.add(i);
+            Assert.assertEquals(i+1, list.size());
+        }
+    }
+
+    @Test
+    public void add1() throws Exception {
+
+        add();
+        for (int i = 0; i < 1000; i++) {
+            int oldSize = list.size();
+            int randomIndex = (int)Math.floor(Math.random() * oldSize);
+
+            list.add(randomIndex, randomIndex);
+            int newSize = list.size();
+
+            Assert.assertEquals(newSize, oldSize+1);
+            Assert.assertEquals(list.get(randomIndex), randomIndex);
+        }
+    }
+
+    @Test
+    public void get() throws Exception {
+
+        add();
+        for (int i = 0; i < SIZE * 100; i++) {
+            int randomIndex = (int)Math.floor(Math.random() * list.size());
+            if(randomIndex < 0 || randomIndex >= SIZE){
+                System.out.println("illegal index: " + randomIndex);
+                throw new RuntimeException();
+            }
+            int o = (Integer) list.get(randomIndex);
+            Assert.assertEquals(randomIndex, o);
+        }
+    }
+
+    @Test
+    public void remove() throws Exception {
+
+        add();
+        for (int i = 0; i < SIZE; i++) {
+            int oldSize = list.size();
+            int randomIndex = (int)Math.floor(Math.random() * oldSize);
+            list.remove(randomIndex);
+            int newSize = list.size();
+            Assert.assertEquals(newSize, oldSize-1);
+        }
+    }
+
+    @Test
+    public void size() throws Exception {
+
+    }
+
+    @Test
+    public void iterator() throws Exception {
+        add();
+        Iterator iterator1 = list.iterator();
+        int i = 0;
+        while (iterator1.hasNext()){
+            Object next = iterator1.next();
+            Assert.assertEquals(i, next);
+            i++;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/group05/591010847/.gitignore b/group05/591010847/.gitignore
new file mode 100644
index 0000000000..7a02c10a7e
--- /dev/null
+++ b/group05/591010847/.gitignore
@@ -0,0 +1,10 @@
+/vendor
+/node_modules
+Homestead.yaml
+Homestead.json
+.env
+.idea
+.xml
+/out
+.class
+.DS_Store
diff --git a/group05/591010847/job_2017_02/.gitignore b/group05/591010847/job_2017_02/.gitignore
new file mode 100644
index 0000000000..a93e887bab
--- /dev/null
+++ b/group05/591010847/job_2017_02/.gitignore
@@ -0,0 +1 @@
+libs
diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore
deleted file mode 100644
index dd9d181eaa..0000000000
--- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-/vendor
-/node_modules
-Homestead.yaml
-Homestead.json
-.env
-.idea
-.xml
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/job_2017_02_26_Struts.iml b/group05/591010847/job_2017_02/job_2017_02_26_Struts/job_2017_02_26_Struts.iml
new file mode 100644
index 0000000000..a141f7b1fe
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/job_2017_02_26_Struts.iml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/res" type="java-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Arquillian JUnit:Release" level="project" />
+    <orderEntry type="module-library">
+      <library name="JUnit4">
+        <CLASSES>
+          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.12.jar!/" />
+          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="dom4j-1.6.1" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml b/group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml
new file mode 100644
index 0000000000..92c2e5800b
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.java.xiaoqin.litestruts.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.java.xiaoqin.litestruts.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java
new file mode 100644
index 0000000000..75ae466816
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java
@@ -0,0 +1,229 @@
+package com.java.xiaoqin.array;
+
+import java.util.Objects;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        if (null != origin) {
+            int[] temp = new int[origin.length];
+            System.arraycopy(origin, 0, temp, 0, origin.length);
+            for (int index = origin.length; index > 0; index--) {
+                origin[origin.length - index] = temp[index - 1];
+            }
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        int size = 0;
+        int[] newArray = new int[oldArray.length];
+        for (int indexO = 0; indexO < oldArray.length; indexO++) {
+            if (0 == oldArray[indexO]) {
+                continue;
+            }
+            newArray[size++] = oldArray[indexO];
+        }
+        int[] returnArray = new int[size];
+        System.arraycopy(newArray, 0, returnArray, 0, returnArray.length);
+        return returnArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        int[] mergeArray = new int[array1.length + array2.length];
+        int size = 0;
+        for (int index = 0, max = Math.max(array1.length, array2.length); index < max; index++) {
+            Object arrObj1 = null;
+            Object arrObj2 = null;
+            if (index < array1.length) {
+                arrObj1 = array1[index];
+            }
+            if (index < array2.length) {
+                arrObj2 = array2[index];
+            }
+            if (null != arrObj1 && Objects.equals(arrObj1, arrObj2)) {
+                arrObj2 = null;
+            }
+            for (int indexMerge = 0; indexMerge < size; indexMerge++) {
+                if (Objects.equals(arrObj1, mergeArray[indexMerge])) {
+                    arrObj1 = null;
+                }
+                if (Objects.equals(arrObj2, mergeArray[indexMerge])) {
+                    arrObj2 = null;
+                    break;
+                }
+            }
+            if (null != arrObj1 && null != arrObj2 && (int) arrObj1 > (int) arrObj2) {
+                arrObj1 = (int) arrObj1 + (int) arrObj2;
+                arrObj2 = (int) arrObj1 - (int) arrObj2;
+                arrObj1 = (int) arrObj1 - (int) arrObj2;
+            }
+            if (null != arrObj1) {
+                mergeArray[size++] = (int) arrObj1;
+            }
+            if (null != arrObj2) {
+                mergeArray[size++] = (int) arrObj2;
+            }
+        }
+        int[] resultArr = new int[size];
+        System.arraycopy(mergeArray, 0, resultArr, 0, size);
+        return resultArr;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        for (int indexOld = 0; indexOld < oldArray.length; indexOld++) {
+            newArray[indexOld] = oldArray[indexOld];
+        }
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        int[] newArray = new int[0];
+        if (max > 1) {
+            int size = 0;
+            newArray = new int[max];
+            if (max >= 1) {
+                for (int n = 1; n < Integer.MAX_VALUE; n++) {
+                    int fibonacci = mFibonacci(n);
+                    if (fibonacci < max) {
+                        newArray[size++] = fibonacci;
+                    } else {
+                        break;
+                    }
+                }
+            }
+            int[] resultArr = new int[size];
+            System.arraycopy(newArray, 0, resultArr, 0, size);
+            newArray = resultArr;
+        }
+        return newArray;
+    }
+
+    private int mFibonacci(int n) {
+        if (n == 0) return 0;
+        else if (n == 1) return 1;
+        else return mFibonacci(n - 1) + mFibonacci(n - 2);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        int[] newArray = new int[max];
+        int size = 0;
+        for (int index = 2; index < max; index++) {
+            if (isPrimes(index)) {
+                newArray[size++] = index;
+            }
+        }
+        int[] resultArr = new int[size];
+        System.arraycopy(newArray, 0, resultArr, 0, size);
+        return resultArr;
+    }
+
+    private boolean isPrimes(int number) {
+        int i = 1;
+        while (++i < number) {
+            if (number % i == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int[] newArray = new int[max];
+        int size = 0;
+        for (int i = 6; i < max; i++) {
+            int total = 0;
+            for (int index = 1, length = i / 2; index <= length; index++) {
+                if (i % index == 0) {
+                    total += index;
+                }
+            }
+            if (i == total) {
+                newArray[size++] = i;
+            }
+        }
+        int[] resultArr = new int[size];
+        System.arraycopy(newArray, 0, resultArr, 0, size);
+        return resultArr;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        StringBuilder arrBuilder = new StringBuilder();
+        for (int arr : array) {
+            if (arrBuilder.length() > 0) {
+                arrBuilder.append(seperator);
+            }
+            arrBuilder.append(arr);
+        }
+        return arrBuilder.toString();
+    }
+
+
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java
new file mode 100644
index 0000000000..0726c17779
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java
@@ -0,0 +1,64 @@
+package com.java.xiaoqin.litestruts;
+
+import com.java.xiaoqin.litestruts.bean.View;
+import com.java.xiaoqin.litestruts.manager.StrutsParseManager;
+import com.java.xiaoqin.litestruts.util.ReflectUtils;
+
+import java.net.URL;
+import java.util.Map;
+
+
+public class Struts {
+
+    private static final String METHOD_EXECUTE = "execute";
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+        URL resourceURL = Struts.class.getResource("/struts.xml");
+        StrutsParseManager.getInstance().init(resourceURL.getPath());
+
+        String className = StrutsParseManager.getInstance().findClassNameByActionName(actionName);
+
+        Object instance = ReflectUtils.newInstance(className);
+        if (null != parameters) {
+            for (Map.Entry<String, String> paramSet : parameters.entrySet()) {
+                ReflectUtils.setMethod(instance, paramSet.getKey(), paramSet.getValue());
+            }
+        }
+
+        Object resultExecute = ReflectUtils.executeMethod(instance, METHOD_EXECUTE);
+
+        Map<String, Object> getMap = ReflectUtils.executeGets(instance);
+
+        View view = new View();
+        view.setParameters(getMap);
+
+        if (resultExecute instanceof String) {
+            String result = StrutsParseManager.getInstance().getResult(actionName, (String) resultExecute);
+            view.setJsp(result);
+        }
+
+        return view;
+    }
+
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java
new file mode 100644
index 0000000000..de6a7aefca
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.java.xiaoqin.litestruts.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java
new file mode 100644
index 0000000000..b26cce5630
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java
@@ -0,0 +1,7 @@
+package com.java.xiaoqin.litestruts.action;
+
+/**
+ * Created by xiaoqin on 17-3-5.
+ */
+public class LogoutAction {
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java
new file mode 100644
index 0000000000..91f9f8f213
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java
@@ -0,0 +1,41 @@
+package com.java.xiaoqin.litestruts.bean;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by xiaoqin on 17-3-5.
+ */
+public class ActionBean {
+    private String className;
+    private Map<String, String> result;
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Map<String, String> getResult() {
+        return result;
+    }
+
+    public void setResult(Map<String, String> result) {
+        this.result = result;
+    }
+
+    public void addResult(String name, String text) {
+        if (null == result) result = new HashMap<>();
+        result.put(name, text);
+    }
+
+    @Override
+    public String toString() {
+        return "ActionBean{" +
+                "className='" + className + '\'' +
+                ", result=" + result +
+                '}';
+    }
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java
new file mode 100644
index 0000000000..d3cb44085c
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java
@@ -0,0 +1,23 @@
+package com.java.xiaoqin.litestruts.bean;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java
new file mode 100644
index 0000000000..fc7ac10f89
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java
@@ -0,0 +1,95 @@
+package com.java.xiaoqin.litestruts.manager;
+
+import com.java.xiaoqin.litestruts.bean.ActionBean;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Created by xiaoqin on 17-3-5.
+ */
+public class StrutsParseManager {
+
+    private final static String ACTION = "action";
+    private final static String ACTION_NAME = "name";
+    private final static String ACTION_CLASS = "class";
+    private static final String RESULT_NAME = "name";
+
+    private final static StrutsParseManager INSTANCE = new StrutsParseManager();
+
+
+    private Map<String, ActionBean> mActionBeanMap = new HashMap<>();
+
+    private StrutsParseManager() {
+    }
+
+    public static StrutsParseManager getInstance() {
+        return INSTANCE;
+    }
+
+    public void init(String path) {
+        if (!Objects.isNull(path) && !"".equals(path)) {
+            parseXML(path);
+        } else {
+            throw new NullPointerException("path is null");
+        }
+    }
+
+    private void parseXML(String path) {
+        try {
+            SAXReader reader = new SAXReader();
+            Document document = reader.read(new File(path));
+            Element rootElement = document.getRootElement();
+            Iterator actionIterator = rootElement.elementIterator(ACTION);
+            while (actionIterator.hasNext()) {
+                Object actionObj = actionIterator.next();
+                if (actionObj instanceof Element) {
+                    String name = ((Element) actionObj).attributeValue(ACTION_NAME);
+                    String className = ((Element) actionObj).attributeValue(ACTION_CLASS);
+                    ActionBean actionBean = new ActionBean();
+                    actionBean.setClassName(className);
+                    mActionBeanMap.put(name, actionBean);
+                    Iterator iteratorResult = ((Element) actionObj).elementIterator();
+                    while (iteratorResult.hasNext()) {
+                        Object resultObj = iteratorResult.next();
+                        if (resultObj instanceof Element) {
+                            String resultName = ((Element) resultObj).attributeValue(RESULT_NAME);
+                            String resultText = ((Element) resultObj).getText();
+                            actionBean.addResult(resultName, resultText);
+                        }
+                    }
+                }
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public String findClassNameByActionName(String actionName) {
+        String className = "";
+        if (mActionBeanMap.containsKey(actionName)) {
+            className = mActionBeanMap.get(actionName).getClassName();
+        }
+        return className;
+    }
+
+    public String getResult(String actionName, String result) {
+        String resultResult = "";
+        if (mActionBeanMap.containsKey(actionName)) {
+            Map<String, String> actionResult = mActionBeanMap.get(actionName).getResult();
+            if (null != actionResult && actionResult.containsKey(result)) {
+                resultResult = actionResult.get(result);
+            }
+
+        }
+        return resultResult;
+    }
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java
new file mode 100644
index 0000000000..1fc3ff1e1c
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java
@@ -0,0 +1,75 @@
+package com.java.xiaoqin.litestruts.util;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by xiaoqin on 17-3-5.
+ */
+public class ReflectUtils {
+
+    public static Object newInstance(String className) {
+        Object obj = null;
+        try {
+            Class<?> aClass = Class.forName(className);
+            obj = aClass.newInstance();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static void setMethod(Object obj, String methodName, String paramter) {
+        try {
+            StringBuilder methodNameBuilder = new StringBuilder();
+            methodNameBuilder.append("set").append(methodName.substring(0, 1).toUpperCase()).append(methodName.substring(1));
+            Method method = obj.getClass().getMethod(methodNameBuilder.toString(), String.class);
+            method.invoke(obj, paramter);
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static Object executeMethod(Object obj, String methodName) {
+        Object resultObj = null;
+        try {
+            Method method = obj.getClass().getMethod(methodName);
+            resultObj = method.invoke(obj);
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return resultObj;
+    }
+
+    public static Map<String, Object> executeGets(Object obj) {
+        Map<String, Object> resultMap = new HashMap<>();
+        try {
+            Method[] methods = obj.getClass().getMethods();
+            for (Method method : methods) {
+                String methodName = method.getName();
+                if (methodName.startsWith("get")) {
+                    resultMap.put(methodName.substring(3, 4).toLowerCase() + methodName.substring(4), method.invoke(obj));
+                }
+            }
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return resultMap;
+    }
+}
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..ea196a50ca
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java
@@ -0,0 +1,110 @@
+package test.com.java.xiaoqin.array;
+
+import com.java.xiaoqin.array.ArrayUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * ArrayUtil Tester.
+ *
+ * @author <Authors name>
+ * @version 1.0
+ * @since <pre>三月 4, 2017</pre>
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil mArrayUtil;
+
+    @Before
+    public void before() throws Exception {
+        mArrayUtil = new ArrayUtil();
+    }
+
+    @After
+    public void after() throws Exception {
+        mArrayUtil = null;
+    }
+
+    /**
+     * Method: reverseArray(int[] origin)
+     */
+    @Test
+    public void testReverseArray() throws Exception {
+        int[] origin = {7, 9, 30, 3};
+        mArrayUtil.reverseArray(origin);
+        System.out.println(Arrays.toString(origin));
+    }
+
+    /**
+     * Method: removeZero(int[] oldArray)
+     */
+    @Test
+    public void testRemoveZero() throws Exception {
+        int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        System.out.println(Arrays.toString(mArrayUtil.removeZero(oldArr)));
+    }
+
+    /**
+     * Method: merge(int[] array1, int[] array2)
+     */
+    @Test
+    public void testMerge() throws Exception {
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        int[] mergeArr = mArrayUtil.merge(a1, a2);
+        System.out.println(Arrays.toString(mergeArr));
+    }
+
+    /**
+     * Method: grow(int[] oldArray, int size)
+     */
+    @Test
+    public void testGrow() throws Exception {
+        int[] oldArray = {2, 3, 6};
+        int[] growArray = mArrayUtil.grow(oldArray, 3);
+        System.out.println(Arrays.toString(growArray));
+    }
+
+    /**
+     * Method: fibonacci(int max)
+     */
+    @Test
+    public void testFibonacci() throws Exception {
+        int[] fibonacciArray = mArrayUtil.fibonacci(1);
+        System.out.println(Arrays.toString(fibonacciArray));
+        fibonacciArray = mArrayUtil.fibonacci(15);
+        System.out.println(Arrays.toString(fibonacciArray));
+    }
+
+    /**
+     * Method: getPrimes(int max)
+     */
+    @Test
+    public void testGetPrimes() throws Exception {
+        int[] primes = mArrayUtil.getPrimes(23);
+        System.out.println(Arrays.toString(primes));
+    }
+
+    /**
+     * Method: getPerfectNumbers(int max)
+     */
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+        int[] perfectNumbers = mArrayUtil.getPerfectNumbers(10000);
+        System.out.println(Arrays.toString(perfectNumbers));
+    }
+
+    /**
+     * Method: join(int[] array, String seperator)
+     */
+    @Test
+    public void testJoin() throws Exception {
+        String join = mArrayUtil.join(new int[]{3, 8, 9}, "-");
+        System.out.println(join);
+    }
+
+
+} 
diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a6b8645648
--- /dev/null
+++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java
@@ -0,0 +1,41 @@
+package test.com.java.xiaoqin.litestruts;
+
+import com.java.xiaoqin.litestruts.Struts;
+import com.java.xiaoqin.litestruts.bean.View;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/ArrayList.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/ArrayList.java
similarity index 100%
rename from group05/810574652/src/com/github/PingPi357/coding2017/basic/ArrayList.java
rename to group05/810574652/src/com/github/PingPi357/coding2017/homework1/ArrayList.java
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/LinkedList.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/LinkedList.java
similarity index 100%
rename from group05/810574652/src/com/github/PingPi357/coding2017/basic/LinkedList.java
rename to group05/810574652/src/com/github/PingPi357/coding2017/homework1/LinkedList.java
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/List.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/List.java
similarity index 100%
rename from group05/810574652/src/com/github/PingPi357/coding2017/basic/List.java
rename to group05/810574652/src/com/github/PingPi357/coding2017/homework1/List.java
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/Queue.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Queue.java
similarity index 100%
rename from group05/810574652/src/com/github/PingPi357/coding2017/basic/Queue.java
rename to group05/810574652/src/com/github/PingPi357/coding2017/homework1/Queue.java
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/Stack.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Stack.java
similarity index 100%
rename from group05/810574652/src/com/github/PingPi357/coding2017/basic/Stack.java
rename to group05/810574652/src/com/github/PingPi357/coding2017/homework1/Stack.java
diff --git "a/group05/810574652/src/com/github/PingPi357/coding2017/basic/\350\257\264\346\230\216" "b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/\350\257\264\346\230\216"
similarity index 100%
rename from "group05/810574652/src/com/github/PingPi357/coding2017/basic/\350\257\264\346\230\216"
rename to "group05/810574652/src/com/github/PingPi357/coding2017/homework1/\350\257\264\346\230\216"
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java
new file mode 100644
index 0000000000..b12c28c589
--- /dev/null
+++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java
@@ -0,0 +1,203 @@
+package com.github.PingPi357.coding2017.homework2;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin) {
+		int len = origin.length;
+		int[] temp = new int[len];
+		for (int i = 0; i < len; i++) {
+			temp[i] = origin[--len];
+		}
+		return temp;
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int[] newArray = new int[oldArray.length];
+		int i = 0;
+		for (int element : oldArray) {
+			if (element != 0) {
+				newArray[i++] = element;
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		int k1=0;
+		int k2 = 0;
+		for (int i = 0; i < array1.length; i++) {
+				for (int j = k2; j < array2.length; j++) {
+					if (array1[i] < array2[j]) {
+						list.add(array1[i]);
+						k1++;
+						break;
+					} else if(array1[i] > array2[j]) {
+						list.add(array2[j]);
+						k2++;
+					}else{
+						list.add(array1[i]);
+						k1++;
+						k2++;
+						break;
+						}
+				}
+				if(k2==array2.length-1){
+					for (; k1 <= array1.length-1 ; k1++) {
+						list.add(array1[k1]);
+					}
+					break;
+				}
+				if(k1== array1.length-1){
+					for (; k2 <= array2.length-1 ; k2++) {
+						list.add(array2[k2]);
+					}
+					break;
+				}
+		}
+			
+
+		int[] mergeArray = arrayListToArray(list);
+		return mergeArray;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] growArray = Arrays.copyOf(oldArray, oldArray.length + size);
+		return growArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		int a = 1;
+		int b = 1;
+		int fibMaxNum = 1;
+		ArrayList<Integer> list=new ArrayList<Integer>();
+		list.add(1);
+		if (max <= 1) {
+			return new int[0];
+		}
+		while (max > fibMaxNum) {
+			list.add(fibMaxNum);
+			fibMaxNum = a + b;
+			b = fibMaxNum;
+			a = b;
+		}
+		return arrayListToArray(list);
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		ArrayList<Integer> list =new ArrayList<Integer>();
+		for(int i=2; i <=max-1;i++){
+			boolean flag=true;
+			for(int j=2; j < Math.floor(i/2); j++){
+				if(i%j==0){
+					flag=false;
+					break;
+				}
+			}
+			if(!flag){
+				list.add(i);
+			}
+		}
+		return arrayListToArray(list);
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		ArrayList<Integer> list =new ArrayList<Integer>();
+		int sum=0;
+		if(max<=1){
+			return null;
+		}
+		for(int i=1;i <=(max-1);i++){
+			for(int j=1; j<=i/2;j++){
+				if(i%j==0){
+					sum+=j;
+				}
+			}
+			if(sum==i){
+				list.add(i);
+			}
+		}
+		return arrayListToArray(list);
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		 StringBuilder sb=new StringBuilder();
+		 sb.append(array[0]);
+		for(int i=1;i<array.length;i++){
+			sb.append(seperator);
+			sb.append(array[i]);
+		}
+		return sb.toString();
+	}
+
+	private int[] arrayListToArray(ArrayList<?> list) {
+		int[] Array = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			Array[i] = (int) list.get(i);
+		}
+		return Array;
+	}
+}
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml
new file mode 100644
index 0000000000..a6cfe43e6c
--- /dev/null
+++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result = "success">/jsp/welcome.jsp</result>
+    	<result = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git "a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216" "b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216"
new file mode 100644
index 0000000000..0ef3e2e2f8
--- /dev/null
+++ "b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216"
@@ -0,0 +1 @@
+"litestruts"作业暂时超出能力范围内，仍在查找资料解决中......
\ No newline at end of file
diff --git a/group06/1378560653/.classpath b/group06/1378560653/.classpath
index fb5011632c..3e0fb272a8 100644
--- a/group06/1378560653/.classpath
+++ b/group06/1378560653/.classpath
@@ -2,5 +2,6 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group06/1378560653/src/com/coderising/array/ArrayUtil.java b/group06/1378560653/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..11fefff510
--- /dev/null
+++ b/group06/1378560653/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,208 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int N = origin.length;
+		for(int i = 0; i < N/2; i++){
+			int temp = origin[i];
+			origin[i] = origin[N-i-1];
+			origin[N-i-1] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int N = oldArray.length;
+		int[] newArray = new int[N];
+		int j = 0;
+		for(int i = 0; i < N; i++){
+			if(oldArray[i] != 0){
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int N = array1.length + array2.length;
+		int[] array3 = new int[N];
+		System.arraycopy(array1, 0, array3, 0, array1.length);
+		for(int i = 0; i < N; i++){
+			for(int j = 0; j < array2.length; j++){
+				if(array3[i] > array2[j]){
+					System.arraycopy(array3, i , array3, i+1, N-i-1);
+					array3[i] = array2[j];
+				}
+			}		
+		}
+		return  array3;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] zero = new int[0];
+		int[] array = new int[100];
+		array[0] = 1;
+		array[1] = 1;
+		int i = 1;
+		
+		if(max == 1){
+			return zero;
+		}else{
+			while(array[i] <= max){
+				i++;
+				if(i > array.length){
+					grow(array, i*2);
+				}
+				array[i+1] = array[i] + array[i-1];
+			}
+			return array;
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		boolean[] prime = new boolean[max + 1];
+		int[] zero = new int[0];
+		int[] array = new int[max];
+		int q = 1;
+		if(max == 1 || max ==2){
+			return zero;
+		}else{
+			for(int i = 3; i < max; i++)
+				if(i % 2 == 0){
+					prime[i] = false;
+				}else{
+					prime[i] = true;
+				}
+			
+			for(int i = 3; i < Math.sqrt(max); i++){//因子;若n是合数，则其所有因子都不超过sqrt(n)
+				if(prime[i])
+					for(int j = 2 * i; j<= max; j += i){//其倍数
+						prime[j] = false;
+					}
+				}
+			array[0] = 2;
+			for(int p = 0; p < max; p++){
+				if(prime[p] == true){
+					array[q] = p;
+					q++;
+				}
+			}
+			return array;
+		}
+	}
+		/*int[] zero = new int[0];
+		int[] array = new int[100];
+		int k = 0;
+		
+		if(max == 1 || max == 2){
+			return zero;
+		}else{
+			for(int n = 2; n <= max; n++){
+				int isPrime = 1;
+				for(int i = 2; i < n; i++){
+					if(n % i == 0){
+						isPrime = 0;
+						break;
+					}
+					if(isPrime == 1){
+						array[k] = n;
+						k++;
+					}
+				}
+			}
+			return array;
+		}*/
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] perfectNumbers = new int[max];
+		int n = 0;
+		for(int i = 1; i < max; i++){//i:要判断的数
+			int sum = 0;
+			for(int j = 1; j < i; j++){//j:可能因子
+				if(i % j == 0){
+					sum += j;
+				}
+			}
+			if(sum == i){
+				perfectNumbers[n] = i;
+				n++;
+			}
+		}
+		return perfectNumbers;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String s = "";
+		for(int i = 0; i < array.length; i++){
+			s = s + array[i] + seperator;
+		}
+		return s;
+	}
+	
+
+}
\ No newline at end of file
diff --git a/group06/1378560653/src/com/coderising/litestruts/LoginAction.java b/group06/1378560653/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..76547ac3b3
--- /dev/null
+++ b/group06/1378560653/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group06/1378560653/src/com/coderising/litestruts/StructsTest.java b/group06/1378560653/src/com/coderising/litestruts/StructsTest.java
new file mode 100644
index 0000000000..4e761b0b2d
--- /dev/null
+++ b/group06/1378560653/src/com/coderising/litestruts/StructsTest.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class StructsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
\ No newline at end of file
diff --git a/group06/1378560653/src/com/coderising/litestruts/Struts.java b/group06/1378560653/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..0e73017f99
--- /dev/null
+++ b/group06/1378560653/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,56 @@
+package com.coderising.litestruts;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+    	try {
+			DocumentBuilder db  = dbf.newDocumentBuilder();
+			Document document = db.parse("structs.xml");
+			NodeList actionList = document.getElementsByTagName("action");
+			
+		} catch (ParserConfigurationException e) {
+			e.printStackTrace();
+		} catch (SAXException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+    	
+    	return null;
+    }    
+
+}
\ No newline at end of file
diff --git a/group06/1378560653/src/com/coderising/litestruts/View.java b/group06/1378560653/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f68a8c438b
--- /dev/null
+++ b/group06/1378560653/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/group06/1378560653/src/com/coderising/litestruts/structs.xml b/group06/1378560653/src/com/coderising/litestruts/structs.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group06/1378560653/src/com/coderising/litestruts/structs.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group06/1454385822/.classpath b/group06/1454385822/.classpath
index fb5011632c..f68e6279c1 100644
--- a/group06/1454385822/.classpath
+++ b/group06/1454385822/.classpath
@@ -2,5 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="C:/Users/yanght/Downloads/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git "a/group06/1454385822/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" "b/group06/1454385822/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx"
deleted file mode 100644
index 4399ea1b1d..0000000000
Binary files "a/group06/1454385822/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" and /dev/null differ
diff --git a/group06/1454385822/src/com/coding/basic/ArrayList.java b/group06/1454385822/src/com/coding/basic/ArrayList.java
deleted file mode 100644
index 571ca71f21..0000000000
--- a/group06/1454385822/src/com/coding/basic/ArrayList.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package com.coding.basic;
-
-import java.util.Arrays;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private int pos = 0; // 当前数组的末尾元素的下一位置
-	
-	private Object[] elementData = new Object[3];
-	
-	public void add(Object o){
-	
-		if(pos >= elementData.length - 1){
-			//数组扩容1/3
-			elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/3);
-		}
-		elementData[pos++] = o;
-		
-	}
-	public void add(int index, Object o){
-
-		if(pos >= elementData.length - 1){
-			//数组扩容1/3
-			elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/3);
-		}
-		/*
-		 * 情况1.index < pos && pos < elementData.length - 1 
-		 * index 只能在pos前面
-		 */
-		 if(index <= pos && pos <= elementData.length - 1){
-			 Object[] tem = new Object[pos - index];
-			 System.arraycopy(elementData, index, tem, 0, tem.length);
-			 elementData[index] = o;
-			 System.arraycopy(tem, 0, elementData, index + 1, tem.length);
-			 pos++;
-		 }else{
-			 throw new IndexOutOfBoundsException();
-		 }
-		
-		
-
-	}
-	
-	public Object get(int index){
-		if(index < pos){
-			return elementData[index];
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	
-	public Object remove(int index){
-		Object result;
-		//将数字删除并将该数字后面的元素向前移动一位
-		if(index < pos ){ //只有index在pos之前才进行删除操作
-			result = elementData[index];
-			if(pos - index > 1){ //删除的不是最后一个元素
-				Object[] tem = new Object[pos - index - 1];
-				System.arraycopy(elementData, index + 1, tem, 0, tem.length);
-				for(int i=0; i<tem.length; i++){
-					elementData[index + i] = tem[i];
-				}
-			}
-			elementData[--pos] = null;
-			return result;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	
-	public int size(){
-		return pos;
-	}
-	
-	public Iterator iterator(){
-		return new Iterator(){
-			private int cur = 0;
-			@Override
-			public boolean hasNext() {
-				if(cur < pos){
-					return true;
-				}
-				return false;
-			}
-
-			@Override
-			public Object next() {
-				return elementData[cur++];
-			}
-			
-		};
-	}
-	public static void main(String[]args){
-		ArrayList list = new ArrayList();
-		list.add(1);
-		list.add(2);
-		list.add(3);
-		list.add(4);
-		list.add(0, 0);
-//		list.add(5, 0);
-//		list.add(5, 0);
-//		list.add(5, 0);
-//		list.add(5, 0);
-		Iterator it = list.iterator();
-//		while(it.hasNext()){
-//			System.out.print(it.next()+" ");
-//		}
-		System.out.println();
-//		System.out.println(list.get(0));
-		System.out.println(list.remove(0));
-		while(it.hasNext()){
-			System.out.print(it.next()+" ");
-		}
-		System.out.println();
-		System.out.println(list.size());
-		
-	}
-	
-}
-
-
-
-
-
diff --git a/group06/1454385822/src/com/coding/basic/BinaryTreeNode.java b/group06/1454385822/src/com/coding/basic/BinaryTreeNode.java
deleted file mode 100644
index 23cc02e579..0000000000
--- a/group06/1454385822/src/com/coding/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.coding.basic;
-
-public class BinaryTreeNode {
-	
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	
-	public Object getData() {
-		return data;
-	}
-	public void setData(Object data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-	
-	public BinaryTreeNode insert(Object o){
-		BinaryTreeNode node = null;
-		return  this.insert(node, o);
-	}
-	public BinaryTreeNode insert(BinaryTreeNode node, Object o){
-		if(node == null){
-			node = new BinaryTreeNode();
-			node.data = o;
-			node.left = node.left = null;
-			return node;
-		}
-		BinaryTreeNode tem = new BinaryTreeNode();
-		tem.setData(o);
-		int iroot = (Integer) node.data;
-		int io = (Integer) o;
-		if(io < iroot){
-			insert(node.left, o);
-		}else{
-			insert(node.right, o);
-		}
-		return node;
-	}
-	
-}
-//class TreeComparator implements Comparator{
-//
-//	@Override
-//	public int compare(Object o1, Object o2) {
-//		BinaryTreeNode b1 = (BinaryTreeNode)o1;
-//		BinaryTreeNode b2 = (BinaryTreeNode)o2;
-//		Integer i1 = (Integer)b1.getData();
-//		Integer i2 = (Integer)b2.getData();
-//		
-//		int result = i1 > i2 ? 1 : (i1 == i2 ? 0 : -1);
-//		return result;
-//	}
-//	
-//}
diff --git a/group06/1454385822/src/com/coding/basic/Iterator.java b/group06/1454385822/src/com/coding/basic/Iterator.java
deleted file mode 100644
index d2e7a2c23c..0000000000
--- a/group06/1454385822/src/com/coding/basic/Iterator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.coding.basic;
-
-public interface Iterator {
-
-	public boolean hasNext();
-	public Object next();
-	
-}
diff --git a/group06/1454385822/src/com/coding/basic/LinkedList.java b/group06/1454385822/src/com/coding/basic/LinkedList.java
deleted file mode 100644
index 6197b9fb35..0000000000
--- a/group06/1454385822/src/com/coding/basic/LinkedList.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package com.coding.basic;
-
-
-public class LinkedList implements List{
-
-	//private Node head;
-	private Node pre; //指向当前结点的前一个元素
-	private Node pHead; //头节点指向第一个元素
-	private Node cur; //指向链表的最后一个元素
-	private int num = 0; //链表中的元素个数
-	
-	public void add(Object o){
-		Node node = new Node();
-		node.data = o;
-		if(pHead == null){ //链表为空，从第一个元素添加
-			pHead = cur = node;
-			pHead.pre = null;
-		}else{
-			node.pre = cur; //前一结点向后移动一位
-			cur.next = node; // 添加元素
-			cur = cur.next; //当前结点向后移动一位
-		}
-		num++; //链表数目增1
-	}
-	
-	/**
-	 * 根据索引找到对应的结点
-	 * @param index
-	 * @return
-	 */
-	public Node findNode(int index){
-		Node node = pHead;
-		int tem = 0;
-		while(tem++ != index){
-			node = node.next;
-		}
-		return node;
-	}
-	
-	public void add(int index , Object o){
-		if(num == 0 || index == num){
-			add(o);
-			return;
-		}
-		if(index <= num-1 && index > 0){
-			Node node = new Node();
-			node.data = o;
-			Node tem = findNode(index);
-			Node preNode = tem.pre;
-			Node posNode = tem.next;
-			preNode.next = node;
-			node.next = posNode;
-			posNode.pre = node;
-			num++;
-			return;
-		}
-		if(index == 0){
-			Node node = new Node();
-			node.data = o;
-			pHead.pre = node;
-			node.next = pHead;
-			pHead = node;
-			num++;
-			return;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	public Object get(int index){
-		if(index <= num - 1 && index >= 0){
-			return findNode(index).data;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	
-	public Object remove(int index){
-		Object result;
-		if(index >0 && index < num - 1){ //删除链表中间的元素
-			Node node = findNode(index);
-			result = node.data;
-			Node preNode = node.pre;
-			Node posNode = node.next;
-			preNode.next = posNode;
-			posNode.pre = preNode;
-			num--;
-			return result;
-		}
-		if(index == 0 && num > 0){ //删除第一个元素
-			Node node = pHead.next;
-			result = pHead.data;
-			node.pre = null;
-			pHead = node;
-			num--;
-			return result;
-		}
-		if(index == num - 1 && num > 0){ //删除最后一个元素
-			result = cur.data;
-			cur = cur.pre;
-			cur.next = null;
-			num--;
-			return result;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	
-	public int size(){
-		return num;
-	}
-	
-	public void addFirst(Object o){
-		if(num == 0){
-			add(o);
-			return;
-		}
-		if(num > 0){
-			Node node = new Node();
-			node.data = o;
-			node.pre = null;
-			node.next = pHead;
-			pHead = node;
-			num++;
-			return;
-		}
-		throw new IndexOutOfBoundsException();
-		
-	}
-	public void addLast(Object o){
-		if(num == 0){
-			add(o);
-			return;
-		}
-		if(num > 0){
-			Node node = new Node();
-			node.data = o;
-			node.pre = cur;
-			cur.next = node;
-			node.next = null;
-			cur = node;
-			num++;
-			return;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	public Object removeFirst(){
-		Object result;
-		if(num > 0){
-			result = pHead.data;
-			if(num == 1){
-				pHead = null;
-				num = 0;
-			}
-			if(num > 1){
-				pHead = pHead.next;
-				pHead.pre = null;
-				num--;
-			}
-			return result;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-
-	public Object removeLast(){
-		Object result;
-		if(num == 1){
-			result = pHead.data;
-			pHead = null;
-			num = 0;
-			return result;
-		}
-		if(num > 1){
-			
-			result = cur.data;
-			cur = cur.pre;
-			cur.next = null;
-			num--;
-			return result;
-		}
-		throw new IndexOutOfBoundsException();
-	}
-	public Iterator iterator(){
-		return new Iterator(){
-			int cur = 0;
-			Node node = pHead;
-			@Override
-			public boolean hasNext() {
-				if(cur++ < num){
-					return true;
-				}
-				return false;
-			}
-
-			@Override
-			public Object next() {
-				Object result = node.data;
-				node = node.next;
-				return result;
-			}
-			
-		};
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node pre;
-		Node next;
-		
-	}
-
-	public static void main(String[]args){
-		LinkedList list = new LinkedList();
-		list.add(1);
-//		list.add(2);
-//		list.add(3);
-//		list.add(4);
-//		list.add(0, 0);
-//		list.addFirst(0);
-//		list.addLast(5);
-//		list.removeFirst();
-		System.out.println(list.removeLast());
-		Iterator it = list.iterator();
-		while(it.hasNext()){
-			System.out.println(it.next());
-		}
-	}
-	
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/group06/1454385822/src/com/coding/basic/List.java b/group06/1454385822/src/com/coding/basic/List.java
deleted file mode 100644
index 1fd3aa61b3..0000000000
--- a/group06/1454385822/src/com/coding/basic/List.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.coding.basic;
-
-public interface List {
-
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-	
-}
diff --git a/group06/1454385822/src/com/coding/basic/Queue.java b/group06/1454385822/src/com/coding/basic/Queue.java
deleted file mode 100644
index c77317ef21..0000000000
--- a/group06/1454385822/src/com/coding/basic/Queue.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coding.basic;
-
-public class Queue {
-	
-	private LinkedList elementData = new LinkedList();
-	private int num = 0;
-	
-	public void enQueue(Object o){	
-		elementData.add(o);
-		num++;
-	}
-	
-	public Object deQueue(){
-		num--;
-		return elementData.removeFirst();
-	}
-	
-	public boolean isEmpty(){
-		return num <= 0;
-	}
-	
-	public int size(){
-		return num;
-	}
-	
-	public static void main(String[] args) {
-		Queue queue = new Queue();
-		queue.enQueue(1);
-		queue.enQueue(2);
-		queue.enQueue(3);
-		queue.enQueue(4);
-		System.out.println("当前队列的长度为:"+queue.size());
-		while(!queue.isEmpty()){
-			System.out.println(queue.deQueue());
-		}
-		
-	}
-	
-}
-
-
-
diff --git a/group06/1454385822/src/com/coding/basic/Stack.java b/group06/1454385822/src/com/coding/basic/Stack.java
deleted file mode 100644
index 2900430728..0000000000
--- a/group06/1454385822/src/com/coding/basic/Stack.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coding.basic;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	private int num = 0;
-	
-	public void push(Object o){
-		elementData.add(o);
-		num++;
-	}
-	
-	public Object pop(){
-	
-		return elementData.remove(--num) ;
-	}
-	
-	public Object peek(){
-		return elementData.get(num - 1);
-	}
-	public boolean isEmpty(){
-		return num <= 0 ;
-	}
-	public int size(){
-		return num;
-	}
-	public static void main(String[] args) {
-		Stack stack = new Stack();
-		stack.push(1);
-		stack.push(2);
-		stack.push(3);
-		stack.push(4);
-		System.out.println(stack.peek());
-		System.out.println(stack.size());
-//		while(!stack.isEmpty()){
-//			System.out.println(stack.pop());
-//		}
-	}
-}
-
-
-
-
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java b/group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java
new file mode 100644
index 0000000000..8524b89318
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java
@@ -0,0 +1,124 @@
+package com.coding.basic.homework_01;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private int pos = 0; // 当前数组的末尾元素的下一位置
+	
+	private Object[] elementData = new Object[3];
+	
+	public void add(Object o){
+	
+		if(pos >= elementData.length - 1){
+			//数组扩容1/3
+			elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/3);
+		}
+		elementData[pos++] = o;
+		
+	}
+	public void add(int index, Object o){
+
+		if(pos >= elementData.length - 1){
+			//数组扩容1/3
+			elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/3);
+		}
+		/*
+		 * 情况1.index < pos && pos < elementData.length - 1 
+		 * index 只能在pos前面
+		 */
+		 if(index <= pos && pos <= elementData.length - 1){
+			 Object[] tem = new Object[pos - index];
+			 System.arraycopy(elementData, index, tem, 0, tem.length);
+			 elementData[index] = o;
+			 System.arraycopy(tem, 0, elementData, index + 1, tem.length);
+			 pos++;
+		 }else{
+			 throw new IndexOutOfBoundsException();
+		 }
+		
+		
+
+	}
+	
+	public Object get(int index){
+		if(index < pos){
+			return elementData[index];
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	
+	public Object remove(int index){
+		Object result;
+		//将数字删除并将该数字后面的元素向前移动一位
+		if(index < pos ){ //只有index在pos之前才进行删除操作
+			result = elementData[index];
+			if(pos - index > 1){ //删除的不是最后一个元素
+				Object[] tem = new Object[pos - index - 1];
+				System.arraycopy(elementData, index + 1, tem, 0, tem.length);
+				for(int i=0; i<tem.length; i++){
+					elementData[index + i] = tem[i];
+				}
+			}
+			elementData[--pos] = null;
+			return result;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	
+	public int size(){
+		return pos;
+	}
+	
+	public Iterator iterator(){
+		return new Iterator(){
+			private int cur = 0;
+			@Override
+			public boolean hasNext() {
+				if(cur < pos){
+					return true;
+				}
+				return false;
+			}
+
+			@Override
+			public Object next() {
+				return elementData[cur++];
+			}
+			
+		};
+	}
+	public static void main(String[]args){
+		ArrayList list = new ArrayList();
+		list.add(1);
+		list.add(2);
+		list.add(3);
+		list.add(4);
+		list.add(0, 0);
+//		list.add(5, 0);
+//		list.add(5, 0);
+//		list.add(5, 0);
+//		list.add(5, 0);
+		Iterator it = list.iterator();
+//		while(it.hasNext()){
+//			System.out.print(it.next()+" ");
+//		}
+		System.out.println();
+//		System.out.println(list.get(0));
+		System.out.println(list.remove(0));
+		while(it.hasNext()){
+			System.out.print(it.next()+" ");
+		}
+		System.out.println();
+		System.out.println(list.size());
+		
+	}
+	
+}
+
+
+
+
+
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/BinaryTreeNode.java b/group06/1454385822/src/com/coding/basic/homework_01/BinaryTreeNode.java
new file mode 100644
index 0000000000..b28b33b3d1
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/BinaryTreeNode.java
@@ -0,0 +1,65 @@
+package com.coding.basic.homework_01;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		BinaryTreeNode node = null;
+		return  this.insert(node, o);
+	}
+	public BinaryTreeNode insert(BinaryTreeNode node, Object o){
+		if(node == null){
+			node = new BinaryTreeNode();
+			node.data = o;
+			node.left = node.left = null;
+			return node;
+		}
+		BinaryTreeNode tem = new BinaryTreeNode();
+		tem.setData(o);
+		int iroot = (Integer) node.data;
+		int io = (Integer) o;
+		if(io < iroot){
+			insert(node.left, o);
+		}else{
+			insert(node.right, o);
+		}
+		return node;
+	}
+	
+}
+//class TreeComparator implements Comparator{
+//
+//	@Override
+//	public int compare(Object o1, Object o2) {
+//		BinaryTreeNode b1 = (BinaryTreeNode)o1;
+//		BinaryTreeNode b2 = (BinaryTreeNode)o2;
+//		Integer i1 = (Integer)b1.getData();
+//		Integer i2 = (Integer)b2.getData();
+//		
+//		int result = i1 > i2 ? 1 : (i1 == i2 ? 0 : -1);
+//		return result;
+//	}
+//	
+//}
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/Iterator.java b/group06/1454385822/src/com/coding/basic/homework_01/Iterator.java
new file mode 100644
index 0000000000..b683268cd9
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/Iterator.java
@@ -0,0 +1,8 @@
+package com.coding.basic.homework_01;
+
+public interface Iterator {
+
+	public boolean hasNext();
+	public Object next();
+	
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java b/group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java
new file mode 100644
index 0000000000..c05bca48ec
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java
@@ -0,0 +1,241 @@
+package com.coding.basic.homework_01;
+
+
+public class LinkedList implements List{
+
+	//private Node head;
+	private Node pre; //指向当前结点的前一个元素
+	private Node pHead; //头节点指向第一个元素
+	private Node cur; //指向链表的最后一个元素
+	private int num = 0; //链表中的元素个数
+	
+	public void add(Object o){
+		Node node = new Node();
+		node.data = o;
+		if(pHead == null){ //链表为空，从第一个元素添加
+			pHead = cur = node;
+			pHead.pre = null;
+		}else{
+			node.pre = cur; //前一结点向后移动一位
+			cur.next = node; // 添加元素
+			cur = cur.next; //当前结点向后移动一位
+		}
+		num++; //链表数目增1
+	}
+	
+	/**
+	 * 根据索引找到对应的结点
+	 * @param index
+	 * @return
+	 */
+	public Node findNode(int index){
+		Node node = pHead;
+		int tem = 0;
+		while(tem++ != index){
+			node = node.next;
+		}
+		return node;
+	}
+	
+	public void add(int index , Object o){
+		if(num == 0 || index == num){
+			add(o);
+			return;
+		}
+		if(index <= num-1 && index > 0){
+			Node node = new Node();
+			node.data = o;
+			Node tem = findNode(index);
+			Node preNode = tem.pre;
+			Node posNode = tem.next;
+			preNode.next = node;
+			node.next = posNode;
+			posNode.pre = node;
+			num++;
+			return;
+		}
+		if(index == 0){
+			Node node = new Node();
+			node.data = o;
+			pHead.pre = node;
+			node.next = pHead;
+			pHead = node;
+			num++;
+			return;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	public Object get(int index){
+		if(index <= num - 1 && index >= 0){
+			return findNode(index).data;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	
+	public Object remove(int index){
+		Object result;
+		if(index >0 && index < num - 1){ //删除链表中间的元素
+			Node node = findNode(index);
+			result = node.data;
+			Node preNode = node.pre;
+			Node posNode = node.next;
+			preNode.next = posNode;
+			posNode.pre = preNode;
+			num--;
+			return result;
+		}
+		if(index == 0 && num > 0){ //删除第一个元素
+			Node node = pHead.next;
+			result = pHead.data;
+			node.pre = null;
+			pHead = node;
+			num--;
+			return result;
+		}
+		if(index == num - 1 && num > 0){ //删除最后一个元素
+			result = cur.data;
+			cur = cur.pre;
+			cur.next = null;
+			num--;
+			return result;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	
+	public int size(){
+		return num;
+	}
+	
+	public void addFirst(Object o){
+		if(num == 0){
+			add(o);
+			return;
+		}
+		if(num > 0){
+			Node node = new Node();
+			node.data = o;
+			node.pre = null;
+			node.next = pHead;
+			pHead = node;
+			num++;
+			return;
+		}
+		throw new IndexOutOfBoundsException();
+		
+	}
+	public void addLast(Object o){
+		if(num == 0){
+			add(o);
+			return;
+		}
+		if(num > 0){
+			Node node = new Node();
+			node.data = o;
+			node.pre = cur;
+			cur.next = node;
+			node.next = null;
+			cur = node;
+			num++;
+			return;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	public Object removeFirst(){
+		Object result;
+		if(num > 0){
+			result = pHead.data;
+			if(num == 1){
+				pHead = null;
+				num = 0;
+			}
+			if(num > 1){
+				pHead = pHead.next;
+				pHead.pre = null;
+				num--;
+			}
+			return result;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+
+	public Object removeLast(){
+		Object result;
+		if(num == 1){
+			result = pHead.data;
+			pHead = null;
+			num = 0;
+			return result;
+		}
+		if(num > 1){
+			
+			result = cur.data;
+			cur = cur.pre;
+			cur.next = null;
+			num--;
+			return result;
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	public Iterator iterator(){
+		return new Iterator(){
+			int cur = 0;
+			Node node = pHead;
+			@Override
+			public boolean hasNext() {
+				if(cur++ < num){
+					return true;
+				}
+				return false;
+			}
+
+			@Override
+			public Object next() {
+				Object result = node.data;
+				node = node.next;
+				return result;
+			}
+			
+		};
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node pre;
+		Node next;
+		
+	}
+
+	public static void main(String[]args){
+		LinkedList list = new LinkedList();
+		list.add(1);
+//		list.add(2);
+//		list.add(3);
+//		list.add(4);
+//		list.add(0, 0);
+//		list.addFirst(0);
+//		list.addLast(5);
+//		list.removeFirst();
+		System.out.println(list.removeLast());
+		Iterator it = list.iterator();
+		while(it.hasNext()){
+			System.out.println(it.next());
+		}
+	}
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/List.java b/group06/1454385822/src/com/coding/basic/homework_01/List.java
new file mode 100644
index 0000000000..df248690b7
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/List.java
@@ -0,0 +1,11 @@
+package com.coding.basic.homework_01;
+
+public interface List {
+
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+	
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/Queue.java b/group06/1454385822/src/com/coding/basic/homework_01/Queue.java
new file mode 100644
index 0000000000..3909ea420a
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/Queue.java
@@ -0,0 +1,42 @@
+package com.coding.basic.homework_01;
+
+public class Queue {
+	
+	private LinkedList elementData = new LinkedList();
+	private int num = 0;
+	
+	public void enQueue(Object o){	
+		elementData.add(o);
+		num++;
+	}
+	
+	public Object deQueue(){
+		num--;
+		return elementData.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		return num <= 0;
+	}
+	
+	public int size(){
+		return num;
+	}
+	
+	public static void main(String[] args) {
+		Queue queue = new Queue();
+		queue.enQueue(1);
+		queue.enQueue(2);
+		queue.enQueue(3);
+		queue.enQueue(4);
+		System.out.println("当前队列的长度为:"+queue.size());
+		while(!queue.isEmpty()){
+			System.out.println(queue.deQueue());
+		}
+		
+	}
+	
+}
+
+
+
diff --git a/group06/1454385822/src/com/coding/basic/homework_01/Stack.java b/group06/1454385822/src/com/coding/basic/homework_01/Stack.java
new file mode 100644
index 0000000000..9b1d2c1439
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_01/Stack.java
@@ -0,0 +1,42 @@
+package com.coding.basic.homework_01;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int num = 0;
+	
+	public void push(Object o){
+		elementData.add(o);
+		num++;
+	}
+	
+	public Object pop(){
+	
+		return elementData.remove(--num) ;
+	}
+	
+	public Object peek(){
+		return elementData.get(num - 1);
+	}
+	public boolean isEmpty(){
+		return num <= 0 ;
+	}
+	public int size(){
+		return num;
+	}
+	public static void main(String[] args) {
+		Stack stack = new Stack();
+		stack.push(1);
+		stack.push(2);
+		stack.push(3);
+		stack.push(4);
+		System.out.println(stack.peek());
+		System.out.println(stack.size());
+//		while(!stack.isEmpty()){
+//			System.out.println(stack.pop());
+//		}
+	}
+}
+
+
+
+
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java
new file mode 100644
index 0000000000..36c733e7b9
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java
@@ -0,0 +1,218 @@
+package com.coding.basic.homework_02.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a，对该数组的值进行置换
+	 * 	例如：a = [7, 9, 30, 3] , 置换后为[3, 30, 9, 7]
+	 *  如果 a = [7, 9, 30, 3, 4] , 置换后为[4, 3, 30, 9, 7]  
+	 * @param origin
+	 */
+	public static void reverseArray(int [] origin){
+		if(origin.length > 1){ // 数组的长度大于1置换才有意义
+			int tem;
+			for(int i = 0; i < origin.length / 2; i++){
+				tem = origin[i];
+				origin[i] = origin[origin.length - 1 - i];
+				origin[origin.length - 1 - i] = tem;
+			}
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero(int[] oldArray){
+		int len = 0;
+		for(int i : oldArray){
+			if(i == 0)
+				continue;
+			len++;
+		}
+		int[] result = new int[len];
+		len = 0;
+		for(int i = 0; i < oldArray.length; i++){
+			if(oldArray[i] == 0)
+				continue;
+			result[len++] = oldArray[i];
+		}
+		return result;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组 a1,a2,创建一个新的数组a3,使得a3包含a1和a2的所有元素并集
+	 * 例如a1 = [3,5,7,8] , a2 = [4,5,6,7] 则a3为[3,4,5,6,7,8]
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	public static int [] merge(int[] array1, int [] array2){
+		if(array1.length == 0)
+			return array2;
+		if(array2.length == 0)
+			return array1;
+		if(array1.length == 0 && array2.length == 0)
+			return null;
+		int arrLen1 = 0;
+		int arrLen2 = 0;
+		int arrLen3 = 0;
+		int []result = new int[array1.length + array2.length];
+		while(arrLen1 < array1.length || arrLen2 < array2.length){
+			if(arrLen1 >= array1.length){ //数组1已经没了
+				result[arrLen3++] = array2[arrLen2++];
+				continue;
+			}
+			if(arrLen2 >= array2.length){ //数组2已经没了
+				result[arrLen3++] = array1[arrLen1++];
+				continue;
+			}
+			if(array1[arrLen1] > array2[arrLen2]){
+				result[arrLen3++] = array2[arrLen2++];
+			}else if(array1[arrLen1] < array2[arrLen2]){
+				result[arrLen3++] = array1[arrLen1++];
+			}else{
+				result[arrLen3++] = array1[arrLen1++];
+				arrLen2++;
+			}
+		}
+		result = Arrays.copyOf(result, arrLen3);
+		return result;
+	}
+	
+	/**
+	 * 把一个已经存满数据的数组oldArray的容量进行扩容，扩容后的新数据大小为oldArray.length * 2
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如oldArray = {2,3,6}, size = 3,则返回的新数组为{2,3,6,0,0,0}
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size){
+		int[] result = new int [size * 2];
+		for(int i = 0; i < oldArray.length; i++){
+			result[i] = oldArray[i];
+		}
+		return result;
+	}
+	
+	/**
+	 * 斐波那契数列为：1， 1， 2， 3， 5， 8， 13， 21...... ,给定一个最大值，返回小于该值的数列
+	 * 例如：max = 15, 则返回的数组应该为{1， 1， 2， 3， 5， 8， 13}
+	 * max = 1, 则返回空数组{}
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max == 1)
+			return new int[]{};
+		int[] result = new int[10];
+		int reLen = 2;
+		result[0] = result[1] = 1;
+		while(result[reLen - 1] + result[reLen -2] < max){
+			if(reLen >= result.length)
+				result = grow(result, result.length);
+			result[reLen] = result[reLen - 1] + result[reLen -2];
+			reLen++;
+		}
+		result = Arrays.copyOf(result, reLen);
+		
+		return result;
+	}
+	
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23，返回的数组为{2,3,5,7,11,13,17,19}
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		if(max <= 2){
+			return null;
+		}
+		int[] result = new int[10];
+		int len = 0;
+		boolean flag = true;
+		result[0] = 2;
+		if(max == 3)
+			return result;
+		len++;
+		for(int i = 3; i < max; i++){
+			flag = true;
+			if(len >= result.length)
+				result = grow(result, result.length);
+			for(int j = 2; j < i; j++){
+				if(i % j == 0){
+					flag = false;
+				}
+			}
+			if(flag == true){
+				result[len++] = i;
+			}
+				
+		}
+		result = Arrays.copyOf(result, len);
+		return result;
+	}
+	
+	/**
+	 * 所谓"完数"，是指这个数恰好等于他的因子之和，例如6 = 1+2+3
+	 * 给定一个最大值max，返回一个数组，数组中是小于max的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		int sum = 1;
+		int [] result = new int[10]; 
+		int len = 0;
+		for(int i = 2;i < max; i++){
+			sum = 1;
+			if(len >= result.length)
+				result = grow(result, result.length);
+			for(int j = 2; j < i; j++){
+				if(i % j == 0)
+					sum += j;
+			}
+			if(sum == i)
+				result[len++] = sum;	
+		}
+		result = Arrays.copyOf(result, len);
+		return result;
+	}
+	
+	
+	/**
+	 * 用seperator 把数组array给连接起来
+	 * 例如array = [3,8,9] ,seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public static String join(int[]array, String seperator){
+		String result = new String();
+		int len = 0;
+		result = new Integer(array[0]).toString();
+		for(int i = 1; i < array.length; i++){
+			result += seperator;
+			result += array[i];
+		}
+		return result;
+	}
+
+}
+
+
+
+
+
+
+
+
+
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..5c2c13083f
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java
@@ -0,0 +1,93 @@
+package com.coding.basic.homework_02.array;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class ArrayUtilTest {
+	int[] array;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		array = new int[]{7, 9, 30, 3};
+//		array = new int[]{7, 9, 30, 3, 4};
+		ArrayUtil.reverseArray(array);
+		Assert.assertArrayEquals(new int[]{3, 30, 9, 7}, array);
+//		Assert.assertArrayEquals(new int[]{4, 3, 30, 9, 7}, array);
+	}
+	
+	@Test
+	public void testRemoveZero(){
+		array = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		Assert.assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, ArrayUtil.removeZero(array));
+	}
+	
+	@Test
+	public void testMerge(){
+		array = new int[]{3,5,7,8};
+		int [] array2 = new int[]{4,5,6,7};
+		Assert.assertArrayEquals(new int[]{3,4,5,6,7,8}, ArrayUtil.merge(array, array2));
+	}
+	
+	@Test
+	public void testGrow(){
+		array = new int[]{2, 3, 6};
+		Assert.assertArrayEquals(new int[]{2, 3, 6, 0, 0, 0} ,ArrayUtil.grow(array, 3));
+	}
+	
+	@Test
+	public void testFibonacci(){
+		Assert.assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, ArrayUtil.fibonacci(15));
+//		array = ArrayUtil.fibonacci(15);
+//		for(int i: array)
+//			System.out.println(i);
+	}
+	
+	
+	@Test
+	public void testPrimes(){
+		Assert.assertArrayEquals(new int[]{2,3,5,7,11,13,17,19}, ArrayUtil.getPrimes(23));
+//		array = ArrayUtil.getPrimes(23);
+//		for(int i : array){
+//			System.out.print(i + " ");
+//		}
+		
+	}
+	
+	@Test
+	public void testPerfectNumbers(){
+//		Assert.assertArrayEquals(new int[]{6}, ArrayUtil.getPerfectNumbers(7));
+		array = ArrayUtil.getPerfectNumbers(100);
+		for(int i : array){
+			System.out.print(i + " ");
+		}
+	}
+	
+	@Test
+	public void testJoin(){
+		Assert.assertEquals("3-8-9", ArrayUtil.join(new int[]{3,8,9}, "-"));
+	}
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..8156c45e43
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coding.basic.homework_02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..e563673a89
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java
@@ -0,0 +1,5 @@
+package com.coding.basic.homework_02.litestruts;
+
+public class LogoutAction {
+
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java
new file mode 100644
index 0000000000..5c6c57cf73
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java
@@ -0,0 +1,286 @@
+package com.coding.basic.homework_02.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+
+	private static String jspUrl = null;
+	private static String resultStatic = null;
+	
+    public static View runAction(String actionName, Map<String, String> params) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, DocumentException{
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		根据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	View view = new View();
+		Element root = getRoot();
+		Class clazz = getClazz(actionName, root);
+		Object obj = clazz.newInstance();
+		
+		methodInvoke(clazz, obj, params);
+		String result = getExecuteInfo(clazz, obj);
+		setParams(clazz, obj, view);
+		getJsp(result, root, actionName);
+		view.setJsp(jspUrl);
+
+    	return view;
+    }    
+
+    /**
+     * 读取xml文件获得根节点
+     * @return
+     * @throws DocumentException 
+     */
+    private static Element getRoot() throws DocumentException{
+    	//step1:创建SAXReader对象
+		SAXReader reader = new SAXReader();
+		//step2:读取文件 转换成Document
+		Document document = reader.read("src/com/coding/basic/homework_02/litestruts/struts.xml");
+		return document.getRootElement();
+    }
+    
+    
+    /**
+     * 根据给定的actionName找到对应的Class
+     * @return
+     * @throws ClassNotFoundException 
+     */
+    @SuppressWarnings("rawtypes")
+	private static Class getClazz(String actionName, Element node) throws ClassNotFoundException{
+
+		findClassNameByAttr(node, actionName);
+		if(resultStatic != null)
+			return Class.forName(resultStatic);
+
+    	throw new ClassNotFoundException();
+    }
+    
+    /**
+     * 根据resultName找到对应的jsp路径
+     * @param resultName
+     * @param node
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+	private static void getJsp(String resultName, Element node, String actionName){
+    	
+    	if(node.attributes() != null)
+    		forEachAttr(node.attributes(), actionName, node, resultName);
+    	
+    	List<Element> listElement = node.elements();
+    	for(Element e : listElement)
+    		getJsp(resultName, e, actionName);
+
+    	if(jspUrl != null)
+    		return;
+    }
+    
+    /**
+     * 遍历当前结点的属性
+     * @param list
+     * @param actionName
+     * @param node
+     * @param resultName
+     */
+    private static void forEachAttr(List<Attribute> list, String actionName, Element node, String resultName){
+    	List<Attribute> attrs = node.attributes();
+		for(Attribute attr : attrs){
+			if(resultName.equals(attr.getValue()) && !"".equals(node.getTextTrim()))			
+				findJspByParentNode(actionName, node);
+		}
+    }
+     
+    /**
+     * 根据跟定的action找到对应的jspUrl
+     * @param actionName
+     * @param node
+     */
+    private static void findJspByParentNode(String actionName, Element node){
+    	Element parent = node.getParent();
+		if(parent.attributes() != null){
+			for(Attribute pattr : (List<Attribute>)parent.attributes()){
+				if(actionName.equals(pattr.getValue()))
+					jspUrl = node.getTextTrim();
+			}
+		}
+    }
+    
+    /**
+     * 获取execute()方法运行后的信息
+     * @param clazz
+     * @param obj
+     * @return
+     * @throws NoSuchMethodException
+     * @throws SecurityException
+     * @throws IllegalAccessException
+     * @throws IllegalArgumentException
+     * @throws InvocationTargetException
+     */
+    private static String getExecuteInfo(Class clazz, Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
+    	Method executeMethod = clazz.getMethod("execute", null);
+		
+		return (String)executeMethod.invoke(obj, null);
+		
+    }
+    
+    /**
+     * 将类中的getter信息放入View
+     * @return
+     * @throws InvocationTargetException 
+     * @throws IllegalArgumentException 
+     * @throws IllegalAccessException 
+     */
+    public static View setParams(Class clazz, Object obj, View view) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
+    	Map<String, String> viewMap = getterAttr(clazz, obj);
+		view.setParameters(viewMap);
+		return view;
+    }
+    
+    /**
+     * 找出当前对象的所有getter方法，将信息放入map中
+     * @param clazz
+     * @return
+     * @throws InvocationTargetException 
+     * @throws IllegalArgumentException 
+     * @throws IllegalAccessException 
+     */
+    private static Map<String, String> getterAttr(Class clazz, Object obj) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
+    	Map<String, String> viewMap = new HashMap<String, String>();
+		//获取所有的getter方法
+		Method[] methods = clazz.getDeclaredMethods();
+		for(Method me : methods){
+			if("get".equals(me.getName().substring(0, 3)))
+				viewMap.put(method2Attr(me), (String) me.invoke(obj, null));
+		}
+		return viewMap;
+    }
+    
+    /**
+     * 将方法名转换为属性名
+     * @param method
+     * @return
+     */
+    private static String method2Attr(Method method){
+    	StringBuilder builder = new StringBuilder();
+    	return builder.append(new Character(method.getName().charAt(3)).toString().toLowerCase())
+    			.append(method.getName().substring(4)).toString();
+    }
+    
+    /**
+     * 调用setXXX给属性设置值
+     * @param params
+     * @throws SecurityException 
+     * @throws NoSuchMethodException 
+     * @throws InvocationTargetException 
+     * @throws IllegalArgumentException 
+     * @throws IllegalAccessException 
+     */
+    private static void methodInvoke(Class clazz, Object obj,Map<String, String> params) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
+    	//将参数名转换为方法名
+		Map<String, String> methodMap = methodMap(params);
+		
+		//将数据set到属性中
+		Iterator<Map.Entry<String, String>> it = methodMap.entrySet().iterator();
+		while(it.hasNext()){
+			Map.Entry<String, String> entry = it.next();
+			Method method = clazz.getMethod(entry.getKey(), String.class);
+			method.invoke(obj, entry.getValue());
+		}
+    }
+    
+    /**
+     * 将属性名转换为方法名之后放入到map中
+     * @param params
+     * @return
+     */
+	@SuppressWarnings("rawtypes")
+	private static Map methodMap(Map<String, String> params){
+    	Map<String, String> methodMap = new HashMap<String, String>();
+		Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
+		while(it.hasNext()){
+			Map.Entry<String, String> entry = it.next();
+			String attrName = entry.getKey();
+			StringBuilder builder = new StringBuilder();
+			builder.append("set").append(new Character(attrName.charAt(0)).toString().toUpperCase()).append(attrName.substring(1));
+			methodMap.put(builder.toString(), entry.getValue());
+		}
+		return methodMap;
+    }
+    
+    
+    /**
+     * 遍历结点的属性找到类名
+     * @param attrList
+     * @return   List<Attribute> attrList
+     * @throws ClassNotFoundException 
+     */
+    @SuppressWarnings("unchecked")
+	private static void findClassNameByAttr(Element node,String actionName) throws ClassNotFoundException{
+    	
+    	if(!node.attributes().isEmpty())
+    		For2attr(actionName, node);
+
+    	List<Element> listElement = node.elements();
+    	for(Element e : listElement)
+    		findClassNameByAttr(e, actionName);
+
+    	if(resultStatic != null)
+    		return;
+    }
+    
+    /**
+     * 遍历属性找到类名
+     * @param actionName
+     * @param findAction
+     * @param node
+     */
+    private static void For2attr(String actionName, Element node){
+    	boolean findAction = false;
+    	for(Attribute attribute : (List<Attribute>)node.attributes()){
+			
+			if(actionName.equals(attribute.getValue())){
+				findAction = true;
+				break;
+			}
+		}
+		for(Attribute attribute : (List<Attribute>)node.attributes()){
+    		if(findAction == true && "class".equals(attribute.getName())){
+    			resultStatic = attribute.getValue(); 
+    			return;
+			}
+    	}
+    }
+    
+    
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..fc5f202c3b
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java
@@ -0,0 +1,46 @@
+package com.coding.basic.homework_02.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	
+	@Test
+	public void testLoginActionSuccess() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, DocumentException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, DocumentException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);  
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java
new file mode 100644
index 0000000000..8dfd610cb1
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coding.basic.homework_02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml
new file mode 100644
index 0000000000..53f1245121
--- /dev/null
+++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.basic.homework_02.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding.basic.homework_02.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/Iterator.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/Iterator.java
deleted file mode 100644
index c41df9c249..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/Iterator.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.pxshuo.basic;
-
-public interface Iterator {
-	/**
-	 * 查看是否有下一个元素
-	 * @return 有的话返回true，否则返回false
-	 */
-	public boolean hasNext();
-	/**
-	 * 获得下一个元素，也就是当前元素
-	 * @return 获取当前位置的元素
-	 */
-	public Object next();
-
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/List.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/List.java
deleted file mode 100644
index 615ee9419b..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/List.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.pxshuo.basic;
-/**
- * 数组的接口
- * @author Pxshuo
- *
- */
-
-public interface List {
-	/**
-	 * 向数组中添加一个元素
-	 * @param o 添加的元素
-	 */
-	public void add(Object o);
-	/**
-	 * 向数组中某一个位置添加一个元素
-	 * @param index 添加元素的位置
-	 * @param o 添加的元素
-	 */
-	public void add(int index,Object o);
-	/**
-	 * 从数组中根据位置获取一个元素
-	 * @param index 想要获取的元素的位置
-	 * @return 想获取的元素
-	 */
-	public Object get(int index);
-	/**
-	 * 根据位置移除数组中的一个元素
-	 * @param index 被移除元素的位置
-	 * @return 被移除的元素
-	 */
-	public Object remove(int index);
-	/**
-	 * 获取数组的长度
-	 * @return 返回数组的长度
-	 */
-	public int size();
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/ArrayList.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/ArrayList.java
deleted file mode 100644
index 68108e41a2..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/ArrayList.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package com.pxshuo.basic.impl;
-
-import com.pxshuo.basic.Iterator;
-import com.pxshuo.basic.List;
-
-/**
- * 实现一个ArrayList 
- * @author Pxshuo
- *
- */
-
-public class ArrayList implements List{
-
-	private int size = -1;//数组的长度的下标
-	private Object[] elements = new Object[10];//数组内容
-	private int addSize = 10;//每次增加的长度
-	
-	@Override
-	public void add(Object o) {
-		elements = grow();
-		size++;
-		elements[size] = o;//size与index同一个概念
-	}
-
-	@Override
-	public void add(int index, Object o) {
-		if (index > size + 1) {
-			return;
-		}
-		elements = grow();
-		int moveNum = size - index + 1;//本次操作需要移动的元素的个数；
-		size++;
-		if (index >= elements.length - 1) {//按照位置来看
-			elements = grow(elements, index - (elements.length - 1));
-			size = index;//size与index同一个概念
-		}
-		
-		/**
-		 * 整体向后移一位
-		 */
-		if(moveNum > 0){
-			System.arraycopy(elements, index, elements, index + 1, moveNum);	
-		}
-//		for(int i = size - 1; i >= index; i--)
-//		{
-//			elements[i] = elements[i-1];
-//		}
-		
-		elements[index] = o;
-	}
-
-	@Override
-	public Object get(int index) {
-		return elements[index];
-	}
-
-	@Override
-	public Object remove(int index) {
-		if (index > size) {
-			return null;
-		}
-		Object removeEle = elements[index];
-		int moveNum = size - index;//本次操作需要移动的元素的个数；
-		if (moveNum > 0) {
-			System.arraycopy(elements, index + 1, elements, index, size - index + 1);
-		}
-		elements[size] = null;
-		size--;
-		return removeEle;
-	}
-
-	@Override
-	public int size() {
-		return size + 1;
-	}
-	
-	/**
-	 * 设置迭代器
-	 * @return
-	 */
-	public Iterator iterator() {
-		return new ArrayListIterator(this);
-	}
-	
-	private class ArrayListIterator implements Iterator{
-
-		ArrayList arrayList = null;
-		int position = -1;
-		
-		public ArrayListIterator(ArrayList arrayList) {
-			this.arrayList = arrayList;
-		}
-		
-		@Override
-		public boolean hasNext() {
-			position ++;
-			if (position >= arrayList.size()) {
-				return false;
-			}
-			return true;
-		}
-
-		@Override
-		public Object next() {
-			return arrayList.elements[position];
-		}
-		
-	}
-
-	/**
-	 * 自动控制是否增加数组长度
-	 * @return 如果增加一条数据会造成数组溢出，则增加数组的长度，否则不进行改变。
-	 */
-	private Object[] grow(){
-		if (size() >= elements.length) {
-			return grow(elements, addSize);
-		}
-		else {
-			return elements;
-		}
-		
-	}
-	
-	/**
-	 * 动态增加数组长度
-	 * @param src
-	 * @param addSize
-	 * @return
-	 */
-	private Object[] grow(Object[] src,int addSize){
-		Object[] target = new Object[src.length + addSize];
-		System.arraycopy(src, 0, target, 0, src.length);
-		return target;
-		
-		//return Arrays.copyOf(src, src.length + addSize);同理
-	}
-	
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/BinaryTree.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/BinaryTree.java
deleted file mode 100644
index 7ea54eae78..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/BinaryTree.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.pxshuo.basic.impl;
-
-import com.pxshuo.basic.Iterator;
-
-/**
- * 排序二叉树
- * @author Pxshuo
- *
- */
-
-public class BinaryTree {
-	BinaryTreeNode root = null;
-	
-	/**
-	 * 添加一个二叉树的节点
-	 * @param o
-	 */
-	public void add(Comparable<Object> o){
-		if (root == null) {
-			root = new BinaryTreeNode();
-			root.setData(o);
-		}
-		else {
-			root.insert(o);
-		}
-	}
-	
-	public Object get(int index){
-		Stack findChild = childPath(index);
-		BinaryTreeNode child = null;
-		int childNum = 0;
-		for(;!findChild.isEmpty();){
-			childNum = (int)findChild.pop();
-			if (childNum != -1) {
-				child = child.getChild(childNum);
-			}
-			else {
-				child = root;
-			}
-		}
-		return child == null ? null : child.getData();
-	}
-	
-	public void display(){
-		root.display(1);
-	}
-	
-	private Stack childPath(int index) {
-		Stack findChild = new Stack();
-		
-		while(true){
-			if (index == 1 || index <= 0) {
-				findChild.push(-1);
-				return findChild;
-			}
-			if (index%2 == 1) {
-				findChild.push(1);
-			}
-			else {
-				findChild.push(0);
-			}
-			index = index/2;
-		}
-	}
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/BinaryTreeNode.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/BinaryTreeNode.java
deleted file mode 100644
index d028dc5f48..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/BinaryTreeNode.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.pxshuo.basic.impl;
-
-public class BinaryTreeNode {
-	
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	private int index = 0;
-	
-	public BinaryTreeNode() {
-		data = null;
-		left = null;
-		right = null;
-	}
-	
-	/**
-	 * 差入一个二叉树节点
-	 * @param o
-	 * @return
-	 */
-	public BinaryTreeNode insert(Comparable<Object> o){
-		if(data == null){
-			data = o;
-			return this;
-		}
-		//本节点已经存过数据
-		BinaryTreeNode child = new BinaryTreeNode();
-		child.setData(o);
-		if (o.compareTo(data) > 0) {
-			if (right == null) {
-				right = child;
-			}
-			else {
-				right.insert(o);
-			}
-		}
-		else {//小于等于的数据放在左子树中
-			if (left == null) {
-				left = child;
-			}
-			else {
-				left.insert(o);
-			}
-		}
-		return child;
-	}
-	
-	/**
-	 * 根据二叉树的位置获取孩子节点
-	 * @param index 0代表左孩子，1代表右孩子
-	 * @return
-	 */
-	public BinaryTreeNode getChild(int index){
-		if(index == 0){
-			return getLeft();
-		}
-		else if(index == 1){
-			return getRight();
-		}
-		else {
-			return null;
-		}
-	}
-	
-	/**
-	 * 用于打印二叉树
-	 * @param myIndex 在二叉树中的位置--采用完全二叉树
-	 */
-	public void display(int myIndex){
-
-		System.out.println(myIndex + ":" + data.toString());
-		if (left != null) {
-			left.display(2 * myIndex);
-		}
-		if (right != null) {
-			right.display(2 * myIndex + 1);
-		}
-	}
-	
-	/////////////////get和set函数///////////////////////////////////////
-	
-	public Object getData() {
-		return data;
-	}
-	public void setData(Object data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-	
-	public void setIndex(int index) {
-		this.index = index;
-	}
-	
-	public int getIndex() {
-		return index;
-	}
-	
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/LinkedList.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/LinkedList.java
deleted file mode 100644
index 7711e72a86..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/LinkedList.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package com.pxshuo.basic.impl;
-
-import java.time.Period;
-
-import com.pxshuo.basic.Iterator;
-import com.pxshuo.basic.List;
-
-public class LinkedList implements List {
-	
-	private Node head = new Node();
-	private Node tail = null;
-	private int size = -1;//与index的位置等同
-	
-	//封装空表时候的增加与最后一次的删除--
-	
-	public void add(Object o){
-		Node node = new Node(o);
-		node.next = null;
-		
-		if (head.next == null) {//初始化
-			head.next = node;
-			tail = node;
-		}
-		else {
-			tail.next = node;
-			tail = node;
-		}
-		size ++;
-	}
-	public void add(int index , Object o){
-		if (index > size + 1) {
-			add(o);
-		}
-		else{
-			Node prev = head;
-			Node current = new Node(o);
-			for(int i=0; i < index; i++)
-			{
-				prev = prev.next;
-			}
-			current.next = prev.next;
-			prev.next = current;
-			size ++;
-		}
-	}
-	public Object get(int index){
-		if (index <= size) {
-			Node node = head;
-			for(int i = 0; i <= index;i++){
-				node = node.next;
-			}
-			return node.data;
-		}
-		return null;
-	}
-	public Object remove(int index){
-		Node remove = null;
-		if (index <= size) {
-			Node prev = head;
-			for(int i=0; i < index; i++)
-			{
-				prev = prev.next;
-			}
-			remove = prev.next;
-			prev.next = remove.next;
-			remove.next = null;
-			
-			if (index == size) {//设置尾部
-				tail = prev;
-				if (size == 0) {
-					tail = null;
-				}
-			}
-			size --;
-		}
-		return remove != null ? remove.data : null;
-	}
-	
-	public int size(){
-		return size + 1;
-	}
-	
-	public void addFirst(Object o){
-		Node first = new Node(o);
-		first.next = head.next;
-		head.next = first;
-		if(tail == null)
-		{
-			tail = first;
-		}
-		size ++;
-	}
-	public void addLast(Object o){
-		if(tail == null){
-			add(o);
-		}
-		else {
-			Node last = new Node(o);
-			last.next = null;
-			tail.next = last;
-			tail = last;
-			size ++;
-		}
-		
-	}
-	public Object removeFirst(){
-		Node first = head.next;
-		if(first != null)
-		{
-			head.next = first.next;
-			first.next = null;
-		}
-		else {
-			head.next = null;
-		}
-		if (head.next == null) {//如果链表为空
-			tail = null;
-		}
-		size --;
-		return first!=null ? first.data : null;
-	}
-	public Object removeLast(){
-		Node last = head;
-		for(;last.next != tail; last = last.next ){
-			
-		}
-		tail = last;
-		last = last.next;
-		if(tail == head){//最后一个元素
-			head.next=null;
-			tail = null;
-		}else {
-			tail.next = null;
-		}
-		
-		size --;
-		return last != null? last.data : null;
-	}
-	public Iterator iterator(){
-		return new LinkedListIterator(this);
-	}
-	
-	private static class Node{
-		Object data;
-		Node next;
-		
-		public Node() {
-		}
-		
-		public Node(Object data) {
-			this.data = data;
-		}
-		
-	}
-	
-	private class LinkedListIterator implements Iterator{
-		LinkedList linkedList = null;
-		Node position = new Node();
-		
-		public LinkedListIterator(LinkedList linkedList) {
-			this.linkedList = linkedList;
-			this.position = head;
-		}
-		
-		@Override
-		public boolean hasNext() {
-			position = position.next;
-			if (position == null) {
-				return false;
-			}
-			return true;
-		}
-
-		@Override
-		public Object next() {
-			return position.data;
-		}
-		
-	}
-	
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/Queue.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/Queue.java
deleted file mode 100644
index b042f1d18c..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/Queue.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.pxshuo.basic.impl;
-
-/**
- * 基本数据结构-队列
- * @author Pxshuo
- *
- */
-
-public class Queue {
-	
-	private LinkedList linkedList = new LinkedList();
-	
-	/**
-	 * 入队操作
-	 * @param o 入队的元素
-	 */
-	public void enQueue(Object o){		
-		linkedList.addLast(o);
-	}
-	
-	/**
-	 * 出队操作
-	 * @return 返回出队的元素
-	 */
-	public Object deQueue(){
-		return linkedList.removeFirst();
-	}
-	
-	/**
-	 * 判断队列是否为空
-	 * @return 为空返回true，否则返回false
-	 */
-	public boolean isEmpty(){
-		return linkedList.size() == 0 ? true : false;
-	}
-	
-	/**
-	 * 返回队列的长度
-	 * @return
-	 */
-	public int size(){
-		return linkedList.size();
-	}
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/Stack.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/Stack.java
deleted file mode 100644
index f3f837e117..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/Stack.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.pxshuo.basic.impl;
-
-/**
- * 基本数据结构-栈
- * @author Pxshuo
- *
- */
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	/**
-	 * 使一个元素入栈
-	 * @param o 将要入栈的元素
-	 */
-	public void push(Object o){		
-		elementData.add(elementData.size(), o);
-	}
-	
-	/**
-	 * 使一个元素出栈
-	 * @return 返回出栈的元素
-	 */
-	public Object pop(){
-		return elementData.size() == 0 ? null : elementData.remove(elementData.size() - 1);
-	}
-	
-	/**
-	 * 获得栈顶元素
-	 * @return 返回栈顶元素
-	 */
-	public Object peek(){
-		return elementData.size() == 0 ? null : elementData.get(elementData.size() - 1);
-	}
-	
-	/**
-	 * 查看栈是否为空
-	 * @return 空的话返回true
-	 */
-	public boolean isEmpty(){
-		return elementData.size() == 0 ? true : false;
-	}
-	
-	/**
-	 * 查看栈中元素的个数
-	 * @return 返回栈中的个数
-	 */
-	public int size(){
-		return elementData.size();
-	}
-}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/package-info.java b/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/package-info.java
deleted file mode 100644
index e87dca3a61..0000000000
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/impl/package-info.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * 用于实现基本数据类型，包括但不仅限于：
- * ArrayList
- * Stack
- * LinkedList
- * Queue
- * Tree
- * Iterator 
- */
-/**
- * @author Pxshuo
- *
- */
-package com.pxshuo.basic.impl;
\ No newline at end of file
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/Iterator.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/Iterator.java
new file mode 100644
index 0000000000..2bb103d7d5
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/Iterator.java
@@ -0,0 +1,15 @@
+package com.pxshuo.se01.basic;
+
+public interface Iterator {
+	/**
+	 * 查看是否有下一个元素
+	 * @return 有的话返回true，否则返回false
+	 */
+	public boolean hasNext();
+	/**
+	 * 获得下一个元素，也就是当前元素
+	 * @return 获取当前位置的元素
+	 */
+	public Object next();
+
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/List.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/List.java
new file mode 100644
index 0000000000..e20daa44cd
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/List.java
@@ -0,0 +1,37 @@
+package com.pxshuo.se01.basic;
+/**
+ * 数组的接口
+ * @author Pxshuo
+ *
+ */
+
+public interface List {
+	/**
+	 * 向数组中添加一个元素
+	 * @param o 添加的元素
+	 */
+	public void add(Object o);
+	/**
+	 * 向数组中某一个位置添加一个元素
+	 * @param index 添加元素的位置
+	 * @param o 添加的元素
+	 */
+	public void add(int index,Object o);
+	/**
+	 * 从数组中根据位置获取一个元素
+	 * @param index 想要获取的元素的位置
+	 * @return 想获取的元素
+	 */
+	public Object get(int index);
+	/**
+	 * 根据位置移除数组中的一个元素
+	 * @param index 被移除元素的位置
+	 * @return 被移除的元素
+	 */
+	public Object remove(int index);
+	/**
+	 * 获取数组的长度
+	 * @return 返回数组的长度
+	 */
+	public int size();
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/TreeData.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/TreeData.java
similarity index 91%
rename from group06/2415980327/CodeSE01/src/com/pxshuo/basic/TreeData.java
rename to group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/TreeData.java
index f20a3765f1..25b8b1d733 100644
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/basic/TreeData.java
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/TreeData.java
@@ -1,4 +1,4 @@
-package com.pxshuo.basic;
+package com.pxshuo.se01.basic;
 
 public class TreeData implements Comparable<Object> {
 	private int data;
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java
new file mode 100644
index 0000000000..ae64aca982
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java
@@ -0,0 +1,138 @@
+package com.pxshuo.se01.basic.impl;
+
+import com.pxshuo.se01.basic.Iterator;
+import com.pxshuo.se01.basic.List;
+
+/**
+ * 实现一个ArrayList 
+ * @author Pxshuo
+ *
+ */
+
+public class ArrayList implements List{
+
+	private int size = -1;//数组的长度的下标
+	private Object[] elements = new Object[10];//数组内容
+	private int addSize = 10;//每次增加的长度
+	
+	@Override
+	public void add(Object o) {
+		elements = grow();
+		size++;
+		elements[size] = o;//size与index同一个概念
+	}
+
+	@Override
+	public void add(int index, Object o) {
+		if (index > size + 1) {
+			return;
+		}
+		elements = grow();
+		int moveNum = size - index + 1;//本次操作需要移动的元素的个数；
+		size++;
+		if (index >= elements.length - 1) {//按照位置来看
+			elements = grow(elements, index - (elements.length - 1));
+			size = index;//size与index同一个概念
+		}
+		
+		/**
+		 * 整体向后移一位
+		 */
+		if(moveNum > 0){
+			System.arraycopy(elements, index, elements, index + 1, moveNum);	
+		}
+//		for(int i = size - 1; i >= index; i--)
+//		{
+//			elements[i] = elements[i-1];
+//		}
+		
+		elements[index] = o;
+	}
+
+	@Override
+	public Object get(int index) {
+		return elements[index];
+	}
+
+	@Override
+	public Object remove(int index) {
+		if (index > size) {
+			return null;
+		}
+		Object removeEle = elements[index];
+		int moveNum = size - index;//本次操作需要移动的元素的个数；
+		if (moveNum > 0) {
+			System.arraycopy(elements, index + 1, elements, index, size - index + 1);
+		}
+		elements[size] = null;
+		size--;
+		return removeEle;
+	}
+
+	@Override
+	public int size() {
+		return size + 1;
+	}
+	
+	/**
+	 * 设置迭代器
+	 * @return
+	 */
+	public Iterator iterator() {
+		return new ArrayListIterator(this);
+	}
+	
+	private class ArrayListIterator implements Iterator{
+
+		ArrayList arrayList = null;
+		int position = -1;
+		
+		public ArrayListIterator(ArrayList arrayList) {
+			this.arrayList = arrayList;
+		}
+		
+		@Override
+		public boolean hasNext() {
+			position ++;
+			if (position >= arrayList.size()) {
+				return false;
+			}
+			return true;
+		}
+
+		@Override
+		public Object next() {
+			return arrayList.elements[position];
+		}
+		
+	}
+
+	/**
+	 * 自动控制是否增加数组长度
+	 * @return 如果增加一条数据会造成数组溢出，则增加数组的长度，否则不进行改变。
+	 */
+	private Object[] grow(){
+		if (size() >= elements.length) {
+			return grow(elements, addSize);
+		}
+		else {
+			return elements;
+		}
+		
+	}
+	
+	/**
+	 * 动态增加数组长度
+	 * @param src
+	 * @param addSize
+	 * @return
+	 */
+	private Object[] grow(Object[] src,int addSize){
+		Object[] target = new Object[src.length + addSize];
+		System.arraycopy(src, 0, target, 0, src.length);
+		return target;
+		
+		//return Arrays.copyOf(src, src.length + addSize);同理
+	}
+	
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java
new file mode 100644
index 0000000000..69bee72af0
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java
@@ -0,0 +1,65 @@
+package com.pxshuo.se01.basic.impl;
+
+import com.pxshuo.se01.basic.Iterator;
+
+/**
+ * 排序二叉树
+ * @author Pxshuo
+ *
+ */
+
+public class BinaryTree {
+	BinaryTreeNode root = null;
+	
+	/**
+	 * 添加一个二叉树的节点
+	 * @param o
+	 */
+	public void add(Comparable<Object> o){
+		if (root == null) {
+			root = new BinaryTreeNode();
+			root.setData(o);
+		}
+		else {
+			root.insert(o);
+		}
+	}
+	
+	public Object get(int index){
+		Stack findChild = childPath(index);
+		BinaryTreeNode child = null;
+		int childNum = 0;
+		for(;!findChild.isEmpty();){
+			childNum = (int)findChild.pop();
+			if (childNum != -1) {
+				child = child.getChild(childNum);
+			}
+			else {
+				child = root;
+			}
+		}
+		return child == null ? null : child.getData();
+	}
+	
+	public void display(){
+		root.display(1);
+	}
+	
+	private Stack childPath(int index) {
+		Stack findChild = new Stack();
+		
+		while(true){
+			if (index == 1 || index <= 0) {
+				findChild.push(-1);
+				return findChild;
+			}
+			if (index%2 == 1) {
+				findChild.push(1);
+			}
+			else {
+				findChild.push(0);
+			}
+			index = index/2;
+		}
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java
new file mode 100644
index 0000000000..57cf2da9e1
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java
@@ -0,0 +1,109 @@
+package com.pxshuo.se01.basic.impl;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	private int index = 0;
+	
+	public BinaryTreeNode() {
+		data = null;
+		left = null;
+		right = null;
+	}
+	
+	/**
+	 * 差入一个二叉树节点
+	 * @param o
+	 * @return
+	 */
+	public BinaryTreeNode insert(Comparable<Object> o){
+		if(data == null){
+			data = o;
+			return this;
+		}
+		//本节点已经存过数据
+		BinaryTreeNode child = new BinaryTreeNode();
+		child.setData(o);
+		if (o.compareTo(data) > 0) {
+			if (right == null) {
+				right = child;
+			}
+			else {
+				right.insert(o);
+			}
+		}
+		else {//小于等于的数据放在左子树中
+			if (left == null) {
+				left = child;
+			}
+			else {
+				left.insert(o);
+			}
+		}
+		return child;
+	}
+	
+	/**
+	 * 根据二叉树的位置获取孩子节点
+	 * @param index 0代表左孩子，1代表右孩子
+	 * @return
+	 */
+	public BinaryTreeNode getChild(int index){
+		if(index == 0){
+			return getLeft();
+		}
+		else if(index == 1){
+			return getRight();
+		}
+		else {
+			return null;
+		}
+	}
+	
+	/**
+	 * 用于打印二叉树
+	 * @param myIndex 在二叉树中的位置--采用完全二叉树
+	 */
+	public void display(int myIndex){
+
+		System.out.println(myIndex + ":" + data.toString());
+		if (left != null) {
+			left.display(2 * myIndex);
+		}
+		if (right != null) {
+			right.display(2 * myIndex + 1);
+		}
+	}
+	
+	/////////////////get和set函数///////////////////////////////////////
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public void setIndex(int index) {
+		this.index = index;
+	}
+	
+	public int getIndex() {
+		return index;
+	}
+	
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java
new file mode 100644
index 0000000000..eeded51514
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java
@@ -0,0 +1,181 @@
+package com.pxshuo.se01.basic.impl;
+
+import java.time.Period;
+
+import com.pxshuo.se01.basic.Iterator;
+import com.pxshuo.se01.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head = new Node();
+	private Node tail = null;
+	private int size = -1;//与index的位置等同
+	
+	//封装空表时候的增加与最后一次的删除--
+	
+	public void add(Object o){
+		Node node = new Node(o);
+		node.next = null;
+		
+		if (head.next == null) {//初始化
+			head.next = node;
+			tail = node;
+		}
+		else {
+			tail.next = node;
+			tail = node;
+		}
+		size ++;
+	}
+	public void add(int index , Object o){
+		if (index > size + 1) {
+			add(o);
+		}
+		else{
+			Node prev = head;
+			Node current = new Node(o);
+			for(int i=0; i < index; i++)
+			{
+				prev = prev.next;
+			}
+			current.next = prev.next;
+			prev.next = current;
+			size ++;
+		}
+	}
+	public Object get(int index){
+		if (index <= size) {
+			Node node = head;
+			for(int i = 0; i <= index;i++){
+				node = node.next;
+			}
+			return node.data;
+		}
+		return null;
+	}
+	public Object remove(int index){
+		Node remove = null;
+		if (index <= size) {
+			Node prev = head;
+			for(int i=0; i < index; i++)
+			{
+				prev = prev.next;
+			}
+			remove = prev.next;
+			prev.next = remove.next;
+			remove.next = null;
+			
+			if (index == size) {//设置尾部
+				tail = prev;
+				if (size == 0) {
+					tail = null;
+				}
+			}
+			size --;
+		}
+		return remove != null ? remove.data : null;
+	}
+	
+	public int size(){
+		return size + 1;
+	}
+	
+	public void addFirst(Object o){
+		Node first = new Node(o);
+		first.next = head.next;
+		head.next = first;
+		if(tail == null)
+		{
+			tail = first;
+		}
+		size ++;
+	}
+	public void addLast(Object o){
+		if(tail == null){
+			add(o);
+		}
+		else {
+			Node last = new Node(o);
+			last.next = null;
+			tail.next = last;
+			tail = last;
+			size ++;
+		}
+		
+	}
+	public Object removeFirst(){
+		Node first = head.next;
+		if(first != null)
+		{
+			head.next = first.next;
+			first.next = null;
+		}
+		else {
+			head.next = null;
+		}
+		if (head.next == null) {//如果链表为空
+			tail = null;
+		}
+		size --;
+		return first!=null ? first.data : null;
+	}
+	public Object removeLast(){
+		Node last = head;
+		for(;last.next != tail; last = last.next ){
+			
+		}
+		tail = last;
+		last = last.next;
+		if(tail == head){//最后一个元素
+			head.next=null;
+			tail = null;
+		}else {
+			tail.next = null;
+		}
+		
+		size --;
+		return last != null? last.data : null;
+	}
+	public Iterator iterator(){
+		return new LinkedListIterator(this);
+	}
+	
+	private static class Node{
+		Object data;
+		Node next;
+		
+		public Node() {
+		}
+		
+		public Node(Object data) {
+			this.data = data;
+		}
+		
+	}
+	
+	private class LinkedListIterator implements Iterator{
+		LinkedList linkedList = null;
+		Node position = new Node();
+		
+		public LinkedListIterator(LinkedList linkedList) {
+			this.linkedList = linkedList;
+			this.position = head;
+		}
+		
+		@Override
+		public boolean hasNext() {
+			position = position.next;
+			if (position == null) {
+				return false;
+			}
+			return true;
+		}
+
+		@Override
+		public Object next() {
+			return position.data;
+		}
+		
+	}
+	
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java
new file mode 100644
index 0000000000..5d9f4eee31
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java
@@ -0,0 +1,44 @@
+package com.pxshuo.se01.basic.impl;
+
+/**
+ * 基本数据结构-队列
+ * @author Pxshuo
+ *
+ */
+
+public class Queue {
+	
+	private LinkedList linkedList = new LinkedList();
+	
+	/**
+	 * 入队操作
+	 * @param o 入队的元素
+	 */
+	public void enQueue(Object o){		
+		linkedList.addLast(o);
+	}
+	
+	/**
+	 * 出队操作
+	 * @return 返回出队的元素
+	 */
+	public Object deQueue(){
+		return linkedList.removeFirst();
+	}
+	
+	/**
+	 * 判断队列是否为空
+	 * @return 为空返回true，否则返回false
+	 */
+	public boolean isEmpty(){
+		return linkedList.size() == 0 ? true : false;
+	}
+	
+	/**
+	 * 返回队列的长度
+	 * @return
+	 */
+	public int size(){
+		return linkedList.size();
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java
new file mode 100644
index 0000000000..e6237fa7e8
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java
@@ -0,0 +1,51 @@
+package com.pxshuo.se01.basic.impl;
+
+/**
+ * 基本数据结构-栈
+ * @author Pxshuo
+ *
+ */
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	/**
+	 * 使一个元素入栈
+	 * @param o 将要入栈的元素
+	 */
+	public void push(Object o){		
+		elementData.add(elementData.size(), o);
+	}
+	
+	/**
+	 * 使一个元素出栈
+	 * @return 返回出栈的元素
+	 */
+	public Object pop(){
+		return elementData.size() == 0 ? null : elementData.remove(elementData.size() - 1);
+	}
+	
+	/**
+	 * 获得栈顶元素
+	 * @return 返回栈顶元素
+	 */
+	public Object peek(){
+		return elementData.size() == 0 ? null : elementData.get(elementData.size() - 1);
+	}
+	
+	/**
+	 * 查看栈是否为空
+	 * @return 空的话返回true
+	 */
+	public boolean isEmpty(){
+		return elementData.size() == 0 ? true : false;
+	}
+	
+	/**
+	 * 查看栈中元素的个数
+	 * @return 返回栈中的个数
+	 */
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java
new file mode 100644
index 0000000000..5d2c270af8
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java
@@ -0,0 +1,14 @@
+/**
+ * 用于实现基本数据类型，包括但不仅限于：
+ * ArrayList
+ * Stack
+ * LinkedList
+ * Queue
+ * Tree
+ * Iterator 
+ */
+/**
+ * @author Pxshuo
+ *
+ */
+package com.pxshuo.se01.basic.impl;
\ No newline at end of file
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java
new file mode 100644
index 0000000000..e2d5a07eed
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java
@@ -0,0 +1,226 @@
+package com.pxshuo.se02.array;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int[] result = new int[origin.length];
+		for(int i = 0;i<origin.length;i++){
+			result[i] = origin[origin.length - i -1];
+		}
+		System.arraycopy(result, 0, origin, 0, origin.length);//使用复制，是因为origin属于指针，指向原地址，所以可以修改原地址中的内容。而修改指针不会发生任何事情
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int[] tailZero = new int[oldArray.length];
+		int tailNum = 0;//记录去除0之后数组的长度
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				tailZero[tailNum++] = oldArray[i];
+			}
+		}
+		int[] removeResult = new int[tailNum];
+		System.arraycopy(tailZero, 0, removeResult, 0, tailNum);
+		return removeResult;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， 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){
+		List<Integer> resultList = new ArrayList<>();
+		for(int i = 0,j = 0;i<array1.length || j < array2.length;){
+			if (i == array1.length) {
+				for(;j < array2.length;j++){
+					resultList.add(array2[j]);
+				}
+				break;
+			}
+			if (j == array2.length) {
+				for(;i < array1.length;i++){
+					resultList.add(array1[i]);
+				}
+				break;
+			}
+			if(array1[i] > array2[j]){
+				resultList.add(array2[j++]);
+			}
+			else if (array1[i] < array2[j]) {
+				resultList.add(array1[i++]);
+			} else {
+				j++;
+			}
+		}
+		
+		int[] result = new int[resultList.size()];
+		for(int i = 0;i < resultList.size();i++){
+			result[i] = resultList.get(i);
+		}
+		return  result;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] result = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, result, 0, oldArray.length);
+		return result;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		List<Integer> resultList = new ArrayList<>();
+		resultList.add(1);
+		resultList.add(1);
+		int fibon = 1,fibonPrev1 = 1,fibonPrev2 = 1; 
+		while(fibon < max){
+			fibonPrev2 = fibon;
+			fibon = fibonPrev1 + fibonPrev2;
+			fibonPrev1 = fibonPrev2;
+			resultList.add(fibon);
+		}
+		resultList.remove(resultList.size()-1);
+		
+		int[] result = new int[resultList.size()];
+		for(int i = 0;i < resultList.size();i++){
+			result[i] = resultList.get(i);
+		}
+		return  result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if (max < 2) {
+			return null;
+		}else if (max < 4) {
+			return new int[]{2};
+		}
+		if (max < 6) {
+			return new int[]{2,3};
+		}
+		List<Integer> primeList = new ArrayList<>();
+		primeList.add(2);
+		primeList.add(3);
+		boolean isPrime = true;
+		/**
+		 * 非2偶数肯定不是素数
+		 */
+		for(int i = 5;i < max; i = i + 2){
+			isPrime =true;
+			for(int j = 1;j<primeList.size();j++){
+				if (i%primeList.get(j) == 0) {
+					isPrime =false;
+					break;
+				}
+			}
+			if (isPrime) {
+				primeList.add(i);
+			}
+		}
+		if (primeList.get(primeList.size() - 1) >= max) {
+			primeList.remove(primeList.size() - 1);
+		}
+		
+		int[] result = new int[primeList.size()];
+		for(int i = 0;i < primeList.size();i++){
+			result[i] = primeList.get(i);
+		}
+		return  result;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if (max < 7) {
+			return null;
+		}
+		List<Integer> perfectList = new ArrayList<>();
+		int sum = 1;
+		
+		for (int i = 2; i < max; i++) {
+			sum = 1;
+			for(int j = 2;j < i; j++){
+				if (i%j == 0) {
+					sum += j;
+				}
+			}
+			if (sum == i) {
+				perfectList.add(sum);
+			}
+		}
+		
+		if (perfectList.get(perfectList.size() - 1) >= max) {
+			perfectList.remove(perfectList.size() - 1);
+		}
+		
+		int[] result = new int[perfectList.size()];
+		for(int i = 0;i < perfectList.size();i++){
+			result[i] = perfectList.get(i);
+		}
+		return  result;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String result = "";
+		for (int i = 0; i < array.length; i++) {
+			result = result + array[i] + seperator;
+		}
+		if (result.endsWith(seperator)) {
+			result = result.substring(0, result.length()-1);
+		}
+		return result;
+	}
+	
+
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..067a2875b1
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.pxshuo.se02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java
new file mode 100644
index 0000000000..6801a838d7
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java
@@ -0,0 +1,151 @@
+package com.pxshuo.se02.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	Element struts = strutsFactory("struts.xml");
+    	List<Element> actions = struts.elements();
+    	List<Element> resultRefs = new ArrayList<>();//action下面的结果跳转
+    	String actionClass = "";//获取action的类型
+    	for (Element element : actions) {
+			if (actionName.equals(element.attributeValue("name"))) {
+				actionClass = element.attributeValue("class");
+				resultRefs = element.elements();//获取结果跳转
+			}
+		}
+    	
+    	Iterator<Map.Entry<String, String>> iterator = parameters.entrySet().iterator();//规范化传递进来的数据
+    	
+    	try {
+    		//反射实例化一个对象
+			Object action = Class.forName(actionClass).newInstance();
+			while (iterator.hasNext()) {//执行set方法
+				Map.Entry<String,String> entry = (Map.Entry<String,String>) iterator.next();
+				Method setMethod = action.getClass().getDeclaredMethod("set" + Tools.upperFirst(entry.getKey())
+						,String.class);//这里的类型值不知道怎么取
+				setMethod.invoke(action, entry.getValue());
+			}
+
+			//调用exectue
+			Method exectue = action.getClass().getDeclaredMethod("execute");
+			String result = (String)exectue.invoke(action);
+			
+			//生成返回列表
+			Map<String, String> actionParam = new HashMap<>();
+			Method[] methods = action.getClass().getDeclaredMethods();
+			for (Method method : methods) {
+				if (method.getName().startsWith("get")) {
+					String methodName = Tools.lowerFirst(method.getName().substring(3));
+					String methodValue = (String)method.invoke(action);
+					actionParam.put(methodName, methodValue);
+				}
+			}
+			
+			//返回的视图
+			View view = new View();
+			view.setParameters(actionParam);
+			for(Element element:resultRefs){
+				if (result.equals(element.attributeValue("name"))) {
+					view.setJsp((String)element.getData());
+				}
+			}
+			
+			return view;
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	
+    	
+    	return null;
+    }    
+
+    public static Element strutsFactory(String filename) {
+    	//读配置文件
+    	InputStream inputStream = Struts.class.getResourceAsStream(filename);
+    	SAXReader reader = new SAXReader();
+    	Document document = null;
+    	
+    	try {
+			document = reader.read(inputStream);
+			
+			Element struts = document.getRootElement();
+			return struts;
+		} catch (DocumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return null;
+	}
+    
+    public static void main(String[] args) {
+		//strutsFactory("struts.xml");
+    	//runAction(null, null);
+    	String actionName = "login";
+    	Element struts = strutsFactory("struts.xml");
+    	List<Element> actions = struts.elements();
+    	for (Element element : actions) {
+			if (actionName.equals(element.attributeValue("name"))) {
+				System.out.println(element.attributeValue("class"));
+				
+				for(Element element1:(List<Element>)element.elements()){
+					System.out.println(element1.getData());
+				}
+			}
+		}
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..7ed32c89f6
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.pxshuo.se02.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java
new file mode 100644
index 0000000000..66acb26157
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java
@@ -0,0 +1,33 @@
+package com.pxshuo.se02.litestruts;
+
+public class Tools {
+	/**
+	 * 将第一个字母转为大写
+	 * @param string
+	 * @return
+	 */
+	public static String upperFirst(String string) {
+		if (string == null || ("").equals(string)) {
+			return "";
+		}		
+		string = string.substring(0,1).toUpperCase() + string.substring(1);
+		return string;
+	}
+	
+	/**
+	 * 将第一个字母转为大写
+	 * @param string
+	 * @return
+	 */
+	public static String lowerFirst(String string) {
+		if (string == null || ("").equals(string)) {
+			return "";
+		}		
+		string = string.substring(0,1).toLowerCase() + string.substring(1);
+		return string;
+	}
+	
+	public static void main(String[] args) {
+		upperFirst("1ame");
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java
new file mode 100644
index 0000000000..5f017e9a8a
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.pxshuo.se02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml
new file mode 100644
index 0000000000..227b855f45
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.pxshuo.se02.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.pxshuo.se02.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java b/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java
index c40ddac87d..9737d269e8 100644
--- a/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java
+++ b/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java
@@ -1,13 +1,13 @@
 package com.pxshuo.test;
 
 
-import com.pxshuo.basic.Iterator;
-import com.pxshuo.basic.TreeData;
-import com.pxshuo.basic.impl.ArrayList;
-import com.pxshuo.basic.impl.BinaryTree;
-import com.pxshuo.basic.impl.LinkedList;
-import com.pxshuo.basic.impl.Queue;
-import com.pxshuo.basic.impl.Stack;
+import com.pxshuo.se01.basic.Iterator;
+import com.pxshuo.se01.basic.TreeData;
+import com.pxshuo.se01.basic.impl.ArrayList;
+import com.pxshuo.se01.basic.impl.BinaryTree;
+import com.pxshuo.se01.basic.impl.LinkedList;
+import com.pxshuo.se01.basic.impl.Queue;
+import com.pxshuo.se01.basic.impl.Stack;
 
 public class Test {
 	public static void main(String[] args) {
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/ArrayListTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/ArrayListTest.java
deleted file mode 100644
index 4249574817..0000000000
--- a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/ArrayListTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package test.com.pxshuo.basic.impl;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.pxshuo.basic.impl.ArrayList;
-
-public class ArrayListTest {
-	ArrayList object = new ArrayList();
-	
-	@Test
-	public void addTest() {
-		object.add("String");
-		Assert.assertEquals("String", object.get(0));
-	}
-	
-	@Test
-	public void addIndexTest(){
-		object.add(3,"Hello");
-		Assert.assertEquals("Hello", object.get(3) );
-	}
-	
-	@Test
-	public void removeTest() {
-		object.add("Hello");
-		object.add("Hello");
-		object.add("Hello");
-		object.add(3,"Hello");
-		Assert.assertNotNull(object.get(3));
-		object.remove(3);
-		Assert.assertNull(object.get(3));
-	}
-	
-	@Test
-	public void sizeTest(){
-		object.add("new");
-		object.add("hi");
-		object.add(1,"new");
-		object.remove(2);
-		Assert.assertEquals(2, object.size());
-	}
-}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/BinaryTreeTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/BinaryTreeTest.java
deleted file mode 100644
index a9d67f7ba1..0000000000
--- a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/BinaryTreeTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package test.com.pxshuo.basic.impl;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.pxshuo.basic.TreeData;
-import com.pxshuo.basic.impl.BinaryTree;
-
-public class BinaryTreeTest {
-	BinaryTree object = new BinaryTree();
-	
-	@Test
-	public void binaryTest() {
-		BinaryTree binaryTree = new BinaryTree();
-		binaryTree.add(new TreeData(5));
-		binaryTree.add(new TreeData(2));
-		binaryTree.add(new TreeData(7));
-		binaryTree.add(new TreeData(1));
-		binaryTree.add(new TreeData(6));
-		binaryTree.add(new TreeData(4));
-		binaryTree.add(new TreeData(8));
-		
-		Assert.assertEquals("4", binaryTree.get(5).toString());
-		Assert.assertEquals("8", binaryTree.get(7).toString());
-	}
-}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/LinkedListTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/LinkedListTest.java
deleted file mode 100644
index 72fd2c49f1..0000000000
--- a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/LinkedListTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package test.com.pxshuo.basic.impl;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.pxshuo.basic.impl.ArrayList;
-import com.pxshuo.basic.impl.LinkedList;
-
-public class LinkedListTest {
-	LinkedList object = new LinkedList();
-	
-	@Test
-	public void addTest() {
-		object.add("String");
-		Assert.assertEquals("String", object.get(0));
-	}
-	
-	@Test
-	public void addIndexTest(){
-		object.add(3,"Hello");
-		Assert.assertEquals("Hello", object.get(0));
-	}
-	
-	@Test
-	public void removeTest() {
-		object.add("Hello");
-		object.add("Hello");
-		object.add("Hello");
-		object.add(3,"Hello");
-		Assert.assertNotNull(object.get(3));
-		object.remove(3);
-		Assert.assertNull(object.get(3));
-	}
-	
-	@Test
-	public void sizeTest(){
-		object.add("new");
-		object.add("hi");
-		object.add(1,"new");
-		object.remove(2);
-		Assert.assertEquals(2, object.size());
-	}
-}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/QueueTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/QueueTest.java
deleted file mode 100644
index 4f2b5735e4..0000000000
--- a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/QueueTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package test.com.pxshuo.basic.impl;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.pxshuo.basic.impl.Queue;
-
-public class QueueTest {
-	public Queue object = new Queue();
-	
-	@Test
-	public void enQueueTest() {
-		Assert.assertEquals(true, object.isEmpty());
-		object.enQueue("hello");
-		object.enQueue("world");
-		Assert.assertEquals(false, object.isEmpty());
-		Assert.assertEquals(2, object.size());
-		Assert.assertEquals("hello", object.deQueue());
-		Assert.assertEquals("world", object.deQueue());
-		Assert.assertEquals(0, object.size());
-	}
-
-}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/StackTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/StackTest.java
deleted file mode 100644
index df1e254595..0000000000
--- a/group06/2415980327/CodeSE01/src/test/com/pxshuo/basic/impl/StackTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package test.com.pxshuo.basic.impl;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.pxshuo.basic.impl.Queue;
-import com.pxshuo.basic.impl.Stack;
-
-public class StackTest {
-	public Stack object = new Stack();
-	
-	@Test
-	public void enQueueTest() {
-		Assert.assertEquals(true, object.isEmpty());
-		object.push("hello");
-		object.push("world");
-		Assert.assertEquals(false, object.isEmpty());
-		Assert.assertEquals(2, object.size());
-		Assert.assertEquals("world", object.peek());
-		Assert.assertEquals("world", object.pop());
-		Assert.assertEquals("hello", object.pop());
-		Assert.assertEquals(0, object.size());
-	}
-
-}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java
new file mode 100644
index 0000000000..26b7b977e6
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java
@@ -0,0 +1,42 @@
+package test.com.pxshuo.se01.basic.impl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.pxshuo.se01.basic.impl.ArrayList;
+
+public class ArrayListTest {
+	ArrayList object = new ArrayList();
+	
+	@Test
+	public void addTest() {
+		object.add("String");
+		Assert.assertEquals("String", object.get(0));
+	}
+	
+	@Test
+	public void addIndexTest(){
+		object.add(3,"Hello");
+		Assert.assertEquals("Hello", object.get(3) );
+	}
+	
+	@Test
+	public void removeTest() {
+		object.add("Hello");
+		object.add("Hello");
+		object.add("Hello");
+		object.add(3,"Hello");
+		Assert.assertNotNull(object.get(3));
+		object.remove(3);
+		Assert.assertNull(object.get(3));
+	}
+	
+	@Test
+	public void sizeTest(){
+		object.add("new");
+		object.add("hi");
+		object.add(1,"new");
+		object.remove(2);
+		Assert.assertEquals(2, object.size());
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java
new file mode 100644
index 0000000000..dc53c5988d
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java
@@ -0,0 +1,26 @@
+package test.com.pxshuo.se01.basic.impl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.pxshuo.se01.basic.TreeData;
+import com.pxshuo.se01.basic.impl.BinaryTree;
+
+public class BinaryTreeTest {
+	BinaryTree object = new BinaryTree();
+	
+	@Test
+	public void binaryTest() {
+		BinaryTree binaryTree = new BinaryTree();
+		binaryTree.add(new TreeData(5));
+		binaryTree.add(new TreeData(2));
+		binaryTree.add(new TreeData(7));
+		binaryTree.add(new TreeData(1));
+		binaryTree.add(new TreeData(6));
+		binaryTree.add(new TreeData(4));
+		binaryTree.add(new TreeData(8));
+		
+		Assert.assertEquals("4", binaryTree.get(5).toString());
+		Assert.assertEquals("8", binaryTree.get(7).toString());
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java
new file mode 100644
index 0000000000..21fea9680f
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java
@@ -0,0 +1,43 @@
+package test.com.pxshuo.se01.basic.impl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.pxshuo.se01.basic.impl.ArrayList;
+import com.pxshuo.se01.basic.impl.LinkedList;
+
+public class LinkedListTest {
+	LinkedList object = new LinkedList();
+	
+	@Test
+	public void addTest() {
+		object.add("String");
+		Assert.assertEquals("String", object.get(0));
+	}
+	
+	@Test
+	public void addIndexTest(){
+		object.add(3,"Hello");
+		Assert.assertEquals("Hello", object.get(0));
+	}
+	
+	@Test
+	public void removeTest() {
+		object.add("Hello");
+		object.add("Hello");
+		object.add("Hello");
+		object.add(3,"Hello");
+		Assert.assertNotNull(object.get(3));
+		object.remove(3);
+		Assert.assertNull(object.get(3));
+	}
+	
+	@Test
+	public void sizeTest(){
+		object.add("new");
+		object.add("hi");
+		object.add(1,"new");
+		object.remove(2);
+		Assert.assertEquals(2, object.size());
+	}
+}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java
new file mode 100644
index 0000000000..edd3bfd73a
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java
@@ -0,0 +1,23 @@
+package test.com.pxshuo.se01.basic.impl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.pxshuo.se01.basic.impl.Queue;
+
+public class QueueTest {
+	public Queue object = new Queue();
+	
+	@Test
+	public void enQueueTest() {
+		Assert.assertEquals(true, object.isEmpty());
+		object.enQueue("hello");
+		object.enQueue("world");
+		Assert.assertEquals(false, object.isEmpty());
+		Assert.assertEquals(2, object.size());
+		Assert.assertEquals("hello", object.deQueue());
+		Assert.assertEquals("world", object.deQueue());
+		Assert.assertEquals(0, object.size());
+	}
+
+}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java
new file mode 100644
index 0000000000..fc3f450e01
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java
@@ -0,0 +1,25 @@
+package test.com.pxshuo.se01.basic.impl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.pxshuo.se01.basic.impl.Queue;
+import com.pxshuo.se01.basic.impl.Stack;
+
+public class StackTest {
+	public Stack object = new Stack();
+	
+	@Test
+	public void enQueueTest() {
+		Assert.assertEquals(true, object.isEmpty());
+		object.push("hello");
+		object.push("world");
+		Assert.assertEquals(false, object.isEmpty());
+		Assert.assertEquals(2, object.size());
+		Assert.assertEquals("world", object.peek());
+		Assert.assertEquals("world", object.pop());
+		Assert.assertEquals("hello", object.pop());
+		Assert.assertEquals(0, object.size());
+	}
+
+}
diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java
new file mode 100644
index 0000000000..6a6e3d4229
--- /dev/null
+++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java
@@ -0,0 +1,72 @@
+package test.com.pxshuo.se02.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.pxshuo.se02.array.*;
+
+public class ArrayUntilTest {
+	private ArrayUtil obj = new ArrayUtil();
+	
+	@Test
+	public void reverseArrayTest() {
+		int[] origin = {3, 30, 9,7}; 
+		obj.reverseArray(origin);
+		int[] expect = {7,9,30,3};
+		Assert.assertArrayEquals(expect, origin);
+	}
+	
+	@Test
+	public void removeZeroTest() {
+		int[] origin = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 
+		int[] actual = obj.removeZero(origin);
+		int[] expect = {1,3,4,5,6,6,5,4,7,6,7,5};
+		Assert.assertArrayEquals(expect, actual);
+	}
+	
+	@Test
+	public void mergeTest() {
+		int[] array1 = {3, 5, 7,8}; 
+		int[] array2 = {4, 5, 6,7}; 
+		int[] actual = obj.merge(array2,array1);
+		int[] expect = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(expect, actual);
+	}
+	
+	@Test
+	public void growTest() {
+		int[] origin = {2,3,6}; 
+		int[] actual = obj.grow(origin,3);
+		int[] expect = {2,3,6,0,0,0};
+		Assert.assertArrayEquals(expect, actual);
+	}
+	
+	@Test
+	public void fibonacciTest() {
+		int[] actual = obj.fibonacci(15);
+		int[] expect = {1,1,2,3,5,8,13};
+		Assert.assertArrayEquals(expect, actual);
+	}
+	
+	@Test
+	public void getPrimesTest() {
+		int[] actual = obj.getPrimes(23);
+		int[] expect = {2,3,5,7,11,13,17,19};
+		Assert.assertArrayEquals(expect, actual);
+	}
+	
+	@Test
+	public void getPerfectNumbersTest() {
+		int[] actual = obj.getPerfectNumbers(1000);
+		int[] expect = {6,28,496};
+		Assert.assertArrayEquals(expect, actual);
+	}
+	
+	@Test
+	public void joinTest() {
+		int[] origin = {3,8,9}; 
+		String actual = obj.join(origin, "-");
+		String expect = "3-8-9";
+		Assert.assertEquals(expect, actual);
+	}
+}
diff --git a/group06/263050006/article.txt b/group06/263050006/article.txt
index 1bec070839..2eaa5b792f 100644
--- a/group06/263050006/article.txt
+++ b/group06/263050006/article.txt
@@ -1,2 +1,2 @@
-CPU���ڴ桢Ӳ�̡�ָ���Լ�����֮��Ĺ�ϵ
+﻿CPU、内存、硬盘、指令以及他们之间的关系
 https://zhuanlan.zhihu.com/p/25442061
\ No newline at end of file
diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java
new file mode 100644
index 0000000000..b807a9b321
--- /dev/null
+++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java
@@ -0,0 +1,197 @@
+package com.github.chaoswang.learning.java.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.TreeSet;
+
+
+public class ArrayUtil {
+	
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+		int length = origin.length;
+		for(int i=0;i<length/2;i++){
+			int tmp = origin[i];
+			origin[i] = origin[length - 1 - i];
+			origin[length - 1 - i] = tmp;
+		}
+		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){
+		List<Integer> list = new ArrayList<Integer>();
+		for(int value : oldArray){
+			if(value != 0){
+				list.add(value);
+			}
+		}
+		return returnByIntArray(list);
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		TreeSet<Integer> ts1 = new TreeSet<Integer>(Arrays.asList(convertToIntegerArray(array1)));
+		TreeSet<Integer> ts2 = new TreeSet<Integer>(Arrays.asList(convertToIntegerArray(array2)));
+		ts2.addAll(ts1);
+		return  returnByIntArray(ts2);
+	}
+	
+	private static Integer[] convertToIntegerArray(int[] array){
+		Integer[] returnArray = new Integer[array.length];
+		for(int i=0;i<array.length;i++){
+			returnArray[i] = array[i];
+		}
+		return returnArray;
+	}
+	
+	private static int[] returnByIntArray(Collection<Integer> collection){
+		int[] returnArray = new int[collection.size()];
+		int i = 0;
+		for(Iterator<Integer> it = collection.iterator(); it.hasNext();){
+			returnArray[i] = it.next();
+			i++;
+		}
+		return returnArray;
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int[] returnArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, returnArray, 0, oldArray.length);
+		return returnArray;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max <= 1){
+			return new int[0];
+		}
+		Integer[] init = {1,1};
+		LinkedList<Integer> result = new LinkedList<Integer>(Arrays.asList(init));
+		for(int tmp = -1; tmp <= max;){
+			tmp = generateFibonacci(result);
+		}
+		result.removeLast();
+		return returnByIntArray(result);
+	}
+	
+	private static int generateFibonacci(LinkedList<Integer> result){
+		int a = result.getLast();
+		int b = result.get(result.size()-2);
+		result.add(a + b);
+		return result.getLast();
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		List<Integer> list = new LinkedList<Integer>();
+		for(int i=2;i<max;i++){
+			if(isPrime(i)){
+				list.add(i);
+			}
+		}
+		return returnByIntArray(list);
+	}
+	
+	private static boolean isPrime(int number) {
+		for(int i=2;i<number;i++){
+			if(number%i == 0){
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		List<Integer> list = new LinkedList<Integer>();
+		for(int i=2;i<=max;i++){
+			if(isPerfectNumber(i)){
+				list.add(i);
+			}
+		}
+		return returnByIntArray(list);
+	}
+	
+	private static boolean isPerfectNumber(int number) {
+		int sum = 0;
+		for(int i=1;i<number;i++){
+			if(number%i == 0){
+				sum += i;
+			}
+		}
+		
+		if(sum == number){
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuffer sb = new StringBuffer();
+		for(int number : array){
+			sb.append(number);
+			sb.append(seperator);
+		}
+		String returnStr = sb.toString();
+		return returnStr.substring(0, returnStr.length() - seperator.length());
+	}
+	
+
+}
\ No newline at end of file
diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java
new file mode 100644
index 0000000000..7df73b09d9
--- /dev/null
+++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.github.chaoswang.learning.java.litestruts;
+
+/**
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java
new file mode 100644
index 0000000000..26c39ef661
--- /dev/null
+++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java
@@ -0,0 +1,134 @@
+package com.github.chaoswang.learning.java.litestruts;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.URLDecoder;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+public class Struts {
+	private static Map<String, String> action_class = new HashMap<String, String>();
+	private static Map<String, Map<String, String>> action_result = new HashMap<String, Map<String, String>>();
+	
+
+	public static View runAction(String actionName,
+			Map<String, String> parameters) {
+
+		/*
+		 * 0. ��ȡ�����ļ�struts.xml
+		 */
+		parseConfig();
+		
+		/*
+		 * 
+		 * 1. ����actionName�ҵ����Ӧ��class �� ����LoginAction, ͨ������ʵ��������������
+		 * ��parameters�е����ݣ����ö����setter������ ����parameters�е������� ("name"="test" ,
+		 * "password"="1234") , �Ǿ�Ӧ�õ��� setName��setPassword����
+		 */
+		Class actionClass = null;
+		Object actionInstance = null;
+		try {
+			actionClass = Class.forName(action_class.get(actionName));
+			actionInstance = actionClass.newInstance();
+			for (Entry entry : parameters.entrySet()) {
+				String key = (String) entry.getKey();
+				String value = (String) entry.getValue();
+				actionClass.getMethod(
+						"set" + key.substring(0, 1).toUpperCase()
+								+ key.substring(1), String.class).invoke(
+						actionInstance, value);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		/*
+		 * 2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+		 */
+		
+		String returnStr = null;
+		try {
+			returnStr = (String)actionClass.getMethod("execute", new Class[0]).invoke(actionInstance, new Object[0]);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		/*
+		 * 3. ͨ�������ҵ����������getter���������� getMessage��, ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ����
+		 * {"message": "��¼�ɹ�"} , �ŵ�View�����parameters
+		 */
+		Map<String, String> params = new HashMap<String, String>();
+		Method[] methods = actionClass.getDeclaredMethods();
+		try {
+			for(Method method : methods){
+				if(method.getModifiers() == Modifier.PUBLIC && method.getName().startsWith("get")){
+					String key = method.getName().substring(3,4).toLowerCase() + method.getName().substring(4);
+					String value = (String)method.invoke(actionInstance, new Object[0]);
+					params.put(key, value);
+				}
+			}
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		/*
+		 * 4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ�� ȷ����һ��jsp��
+		 * �ŵ�View�����jsp�ֶ��С�
+		 */
+		View view = new View();
+		view.setParameters(params);
+		Map<String, String> results = action_result.get(actionName);
+		view.setJsp(results.get(returnStr));
+		return view;
+	}
+
+	private static void parseConfig() {
+		String xmlpath = Struts.class.getResource("struts.xml").getFile();
+		try {
+			xmlpath = URLDecoder.decode(xmlpath, "utf-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		SAXBuilder builder = new SAXBuilder(false);
+		try {
+			Document doc = builder.build(xmlpath);
+			Element struts = doc.getRootElement();
+			List actionlist = struts.getChildren("action");
+			for (Iterator iter = actionlist.iterator(); iter.hasNext();) {
+				Element action = (Element) iter.next();
+				String actionName = action.getAttributeValue("name");
+				String actionClass = action.getAttributeValue("class");
+				action_class.put(actionName, actionClass);
+				List resultlist = action.getChildren("result");
+				Map<String,String> result_value = new HashMap<String,String>();
+				for (Iterator iter1 = resultlist.iterator(); iter1.hasNext();) {
+					Element result = (Element) iter1.next();
+					String resultName = result.getAttributeValue("name");
+					String resultView = result.getTextTrim();
+					result_value.put(resultName, resultView);
+				}
+				action_result.put(actionName, result_value);
+			}
+		} catch (JDOMException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		System.out.println(action_class);
+		System.out.println(action_result);
+	}
+	
+	public static void main(String[] args) {
+		Struts.parseConfig();
+	}
+}
\ No newline at end of file
diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java
new file mode 100644
index 0000000000..ae57b41d32
--- /dev/null
+++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.github.chaoswang.learning.java.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml
new file mode 100644
index 0000000000..10671eac25
--- /dev/null
+++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.github.chaoswang.learning.java.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.github.chaoswang.learning.java.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..4ebff76195
--- /dev/null
+++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java
@@ -0,0 +1,134 @@
+package com.github.chaoswang.learning.java.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	@Test
+	public void testReverseArray() {
+		int a[] = {7, 9, 30, 3};
+		int reversedA[] = {3, 30, 9, 7};
+		int b[] = {7, 9, 30, 3, 4};
+		int reversedB[] = {4, 3, 30, 9, 7};
+		Assert.assertArrayEquals(reversedA, ArrayUtil.reverseArray(a));
+		Assert.assertArrayEquals(reversedB, ArrayUtil.reverseArray(b));
+	}
+
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}; 
+		Assert.assertArrayEquals(newArr, ArrayUtil.removeZero(oldArr));
+	}
+
+	/**
+	 * ���������Ѿ�����õ��������飬 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
+	 */
+	@Test
+	public void testMerge() {
+		int a1[] = {3, 5, 7,8};
+		int a2[] = {4, 5, 6,7};
+		int a3[] = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(a3, ArrayUtil.merge(a1, a2));
+	}
+
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	@Test
+	public void testGrow() {
+		int oldArray[] = {2,3,6};
+		int newArray[] = {2,3,6,0,0,0};
+		Assert.assertArrayEquals(newArray, ArrayUtil.grow(oldArray, 3));
+	}
+
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	@Test
+	public void testFibonacci() {
+		int returnA[] = {1,1,2,3,5,8,13};
+		int returnB[] = {};
+		int returnC[] = {1,1,2,3,5,8,13,21,34};
+		int returnD[] = {1,1,2};
+		Assert.assertArrayEquals(returnA, ArrayUtil.fibonacci(15));
+		Assert.assertArrayEquals(returnB, ArrayUtil.fibonacci(1));
+		Assert.assertArrayEquals(returnC, ArrayUtil.fibonacci(34));
+		Assert.assertArrayEquals(returnD, ArrayUtil.fibonacci(2));
+	}
+
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	@Test
+	public void testGetPrimes() {
+		int returnC[] = {2,3,5,7,11,13,17,19};
+		int returnD[] = {2,3,5,7,11};
+		Assert.assertArrayEquals(returnC, ArrayUtil.getPrimes(23));
+		Assert.assertArrayEquals(returnD, ArrayUtil.getPrimes(12));
+	}
+
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	@Test
+	public void testGetPerfectNumbers() {
+		int returnC[] = {6,28,496};
+		int returnD[] = {6,28,496,8128};
+		int returnE[] = {6,28,496,8128,33550336};
+		Assert.assertArrayEquals(returnC, ArrayUtil.getPerfectNumbers(496));
+		Assert.assertArrayEquals(returnD, ArrayUtil.getPerfectNumbers(8129));
+		Assert.assertArrayEquals(returnE, ArrayUtil.getPerfectNumbers(33550337));
+	}
+
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	@Test
+	public void testJoin() {
+		int array[] = {3,8,9};
+		Assert.assertEquals("3-8-9", ArrayUtil.join(array,"-"));
+		Assert.assertEquals("3@$8@$9", ArrayUtil.join(array,"@$"));
+	}
+
+}
diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..834a4dd390
--- /dev/null
+++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package com.github.chaoswang.learning.java.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //�����Ԥ��Ĳ�һ��
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
\ No newline at end of file
diff --git a/group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java b/group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java
new file mode 100644
index 0000000000..12f5362069
--- /dev/null
+++ b/group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java
@@ -0,0 +1,5 @@
+package com.liteStructs;
+
+public class LoginAction {
+
+}
diff --git a/group06/799237637/secondhomework/src/com/liteStructs/Structs.java b/group06/799237637/secondhomework/src/com/liteStructs/Structs.java
new file mode 100644
index 0000000000..ab36173eaf
--- /dev/null
+++ b/group06/799237637/secondhomework/src/com/liteStructs/Structs.java
@@ -0,0 +1,5 @@
+package com.liteStructs;
+
+public class Structs {
+
+}
diff --git a/group06/799237637/secondhomework/src/com/liteStructs/View.java b/group06/799237637/secondhomework/src/com/liteStructs/View.java
new file mode 100644
index 0000000000..4942fc8c6c
--- /dev/null
+++ b/group06/799237637/secondhomework/src/com/liteStructs/View.java
@@ -0,0 +1,5 @@
+package com.liteStructs;
+
+public class View {
+
+}
diff --git a/group06/799237637/secondhomework/src/com/liteStructs/struts.xml b/group06/799237637/secondhomework/src/com/liteStructs/struts.xml
new file mode 100644
index 0000000000..cc909972cd
--- /dev/null
+++ b/group06/799237637/secondhomework/src/com/liteStructs/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.liteStructs.action.LogoutAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.liteStructs.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java b/group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java
new file mode 100644
index 0000000000..4b5c626cd2
--- /dev/null
+++ b/group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java
@@ -0,0 +1,214 @@
+package secondhomework;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/*
+ * ʵ��ArrayUtil
+ */
+@SuppressWarnings("all")
+public class MyArrayUtil {
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	
+	public  void reverseArray(int[] origin){
+		int size =origin.length;
+		
+		for(int i=0;i<size/2;i++){
+			int temp=origin[i];
+			origin[i]=origin[size-1-i];
+			origin[size-1-i]=temp;
+		}
+		System.out.println(Arrays.toString(origin));
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public void removeZero(int[] oldArray){
+		StringBuilder sb=new StringBuilder();
+		sb.append("[");
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i]!=0){
+				sb.append(oldArray[i]);
+				if(i<oldArray.length-1-1){
+					sb.append(",");
+				}
+			}
+		}
+		sb.append("]");
+		System.out.println(sb);
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 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 void merge(int[] array1, int[] array2){
+		ArrayList al = new ArrayList();
+		for(int i=0;i<array1.length;i++){
+			al.add(array1[i]);
+		}
+		
+		for(int i=0;i<array2.length;i++){
+			if(!al.contains(array2[i])){
+				al.add(array2[i]);
+			}
+		}
+		System.out.println(al);
+		
+		
+	}
+	
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int newLength = oldArray.length;
+		int[] newArray=Arrays.copyOf(oldArray, newLength+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 ifobonacci(int num){
+		if(num==1||num==2){
+			return 1;
+		}else{
+			return ifobonacci(num-2)+ifobonacci(num-1);
+		}
+	}
+	
+	public void fibonacci(int max){
+		ArrayList  al= new ArrayList();
+		for(int i=1;i<max;i++){
+			if(ifobonacci(i)<max){
+				al.add(ifobonacci(i));
+			}
+		}
+		System.out.println(Arrays.toString(al.toArray()));
+		
+	}
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	
+	public boolean isPrimes(int num){
+		boolean flag=true;
+		if(num<2){
+			return false;
+		}else{
+			for(int i=2;i<num;i++){
+				if(num%i==0){
+					flag=false;
+					break;
+				}
+			}
+			return flag;
+		}
+		
+		
+	}
+	public void getPrimes(int max){
+		ArrayList al= new ArrayList();
+		for(int i=2;i<max;i++){
+			if(isPrimes(i)){
+				al.add(i);
+			}
+		}
+		Object[] o=al.toArray();
+		System.out.println(Arrays.toString(o));
+		
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public void getPerfectNumbers(int max){
+		
+		ArrayList alist= new ArrayList();
+		for(int i=1;i<=max;i++){
+			int sum=0;
+			for(int j=1;j<=i/2;j++){
+				if(i%j==0){
+					sum+=j;
+				}
+			}
+			if(sum==i){
+				alist.add(i);
+			}
+		}
+		System.out.println(alist);
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public void join(int[] array, String seperator){
+		StringBuilder sb =new StringBuilder();
+		for(int i=0;i<array.length;i++){
+			sb.append(array[i]);
+			if(i<array.length-1){
+				sb.append(seperator);
+			}
+		}
+		System.out.println(sb.toString()); 
+	}
+	
+
+	
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		MyArrayUtil my= new MyArrayUtil();
+		int[] a={0,1,2,3,4,6,7,8,6,0,12,0,29,98,0,2};
+//		my.reverseArray(a);
+//		my.removeZero(a);
+		
+		int[] array1={1,2,3};
+		int[] array2={3,4,5};
+//		my.merge(array1, array2);
+//		my.getPrimes(20);
+		my.getPerfectNumbers(30);
+		my.join(array1, "-");
+		System.out.println(Arrays.toString(my.grow(array1, 3)));
+		my.fibonacci(15);
+	}
+
+}
diff --git "a/group06/799237637/\347\254\254\344\272\214\345\221\250\346\226\207\347\253\240\345\234\260\345\235\200.txt" "b/group06/799237637/\347\254\254\344\272\214\345\221\250\346\226\207\347\253\240\345\234\260\345\235\200.txt"
new file mode 100644
index 0000000000..7c5818d8a3
--- /dev/null
+++ "b/group06/799237637/\347\254\254\344\272\214\345\221\250\346\226\207\347\253\240\345\234\260\345\235\200.txt"
@@ -0,0 +1 @@
+http://blog.csdn.net/codingxiaozhupig/article/details/60349989
\ No newline at end of file
diff --git a/group06/949319266/RemoteSystemsTempFiles/.project b/group06/949319266/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000000..5447a64fa9
--- /dev/null
+++ b/group06/949319266/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RemoteSystemsTempFiles</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/296933284/DataStructuresTest/.classpath b/group06/949319266/homework/.classpath
similarity index 100%
rename from group14/296933284/DataStructuresTest/.classpath
rename to group06/949319266/homework/.classpath
diff --git a/group06/949319266/homework/.gitignore b/group06/949319266/homework/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group06/949319266/homework/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group06/949319266/homework/.project b/group06/949319266/homework/.project
new file mode 100644
index 0000000000..b4bd3f32d4
--- /dev/null
+++ b/group06/949319266/homework/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>homework</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group06/949319266/homework/.settings/org.eclipse.core.resources.prefs b/group06/949319266/homework/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..8822690b9a
--- /dev/null
+++ b/group06/949319266/homework/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/cn/ecust/Iitestruts/LoginAction.java=UTF-8
+encoding//src/cn/ecust/Iitestruts/Struts.java=UTF-8
+encoding//src/cn/ecust/Iitestruts/StrutsTest.java=UTF-8
diff --git a/group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs b/group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java b/group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java
new file mode 100644
index 0000000000..8965b7a1aa
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java
@@ -0,0 +1,201 @@
+package cn.ecust.Array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class ArrayUtil {
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){		
+		int tem = 0;
+		for(int i = 0; i < origin.length/2; i++) {
+			tem = origin[i];
+			origin[i] = origin[origin.length-1-i];
+			origin[origin.length-1-i] = tem;
+		}
+		
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+	    ArrayList<Integer> arr = new ArrayList<Integer>();
+	    for(int i = 0; i < oldArray.length; i++) {
+	    	if(oldArray[i] != 0) {
+	    		arr.add(oldArray[i]);
+	    	}
+	    }	   
+	    oldArray = null;
+	    for(int i = 0; i<arr.size();i++) {
+	    	oldArray[i] = arr.get(i);
+	    }
+		return oldArray;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		if(array1.length == 0 && array2.length == 0)
+			return null;
+		if(array1.length == 0)
+			return array2;
+		if(array2.length == 0)
+			return array1;	
+		//a,b,c�ֱ������������ĳ���
+		int a = 0,b = 0,c = 0;
+		//��������3��������1,2֮��
+		int []array3 = new int[array1.length + array2.length];
+
+		while(a < array1.length || b < array2.length){
+			if(a >= array1.length){ //����1�Ѿ���������
+				array3[c++] = array2[b++];
+				continue;
+			}
+
+			if(b >= array2.length){ //����2�Ѿ���������
+				array3[c++] = array1[a++];
+				continue;
+			}
+
+			if(array1[a] > array2[b]){
+				array3[c++] = array2[b++];
+			}else if(array1[a] < array2[b]){
+				array3[c++] = array1[a++];
+			}else{
+				array3[c++] = array1[a++];
+				b++;
+			}
+		}
+		array3 = Arrays.copyOf(array3, c);
+		return array3;
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		for(int i = 0 ; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	
+	public int[] fibonacci(int max){
+		ArrayList<Integer> arr = new ArrayList<Integer>();
+		int i = 1;
+		int j = 1;
+		arr.add(i);arr.add(j);
+		int m=i+j;
+		while(m<max){
+			arr.add(m);
+			i=j;j=m;
+			m=i+j;
+		}
+		int[] result = new int[arr.size()];
+		for(int x=0;x<arr.size();x++) {
+			result[x] = arr.get(x);
+		}
+		return result;
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	
+	public int[] getPrimes(int max){
+		int[] a = {1,5,6,8,6,4,2,3,45,68,111,72,1,2,23};
+		ArrayList<Integer> arr = new ArrayList<Integer>();
+		for(int i=0;i<a.length;i++) {
+			if(a[i]<max) {
+				arr.add(a[i]);
+				continue;
+			}
+		}
+		int[] b = new int[arr.size()];
+		for(int j= 0;j<arr.size();j++) {
+			b[j] = arr.get(j);
+		}
+		return b;
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	
+	public int[] getPerfectNumbers(int max){
+		int sum = 1;
+		int [] result = new int[10]; 
+		int len = 0;
+		for(int i = 2;i < max; i++){
+			sum = 1;
+			if(len >= result.length)
+				result = grow(result, result.length);
+			for(int j = 2; j < i; j++){
+				if(i % j == 0)
+					sum += j;
+			}
+			if(sum == i)
+				result[len++] = sum;	
+		}
+		result = Arrays.copyOf(result, len);
+		return result;
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String result = new String();
+		int len = 0;
+		result = new Integer(array[0]).toString();
+		for(int i = 1; i < array.length; i++){
+			result += seperator;
+			result += array[i];
+		}
+		return result;
+	}
+
+}
diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java
new file mode 100644
index 0000000000..004f428e2b
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package cn.ecust.Iitestruts;
+
+/**
+ * 杩欐槸涓�涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩��
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java
new file mode 100644
index 0000000000..27c36c6902
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java
@@ -0,0 +1,34 @@
+package cn.ecust.Iitestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 璇诲彇閰嶇疆鏂囦欢struts.xml
+ 		
+ 		1. 鏍规嵁actionName鎵惧埌鐩稿搴旂殑class 锛� 渚嬪LoginAction,   閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛�
+		鎹畃arameters涓殑鏁版嵁锛岃皟鐢ㄥ璞＄殑setter鏂规硶锛� 渚嬪parameters涓殑鏁版嵁鏄� 
+		("name"="test" ,  "password"="1234") ,     	
+		閭ｅ氨搴旇璋冪敤 setName鍜宻etPassword鏂规硶
+		
+		2. 閫氳繃鍙嶅皠璋冪敤瀵硅薄鐨別xectue 鏂规硶锛� 骞惰幏寰楄繑鍥炲�硷紝渚嬪"success"
+		
+		3. 閫氳繃鍙嶅皠鎵惧埌瀵硅薄鐨勬墍鏈塯etter鏂规硶锛堜緥濡� getMessage锛�,  
+		閫氳繃鍙嶅皠鏉ヨ皟鐢紝 鎶婂�煎拰灞炴�у舰鎴愪竴涓狧ashMap , 渚嬪 {"message":  "鐧诲綍鎴愬姛"} ,  
+		鏀惧埌View瀵硅薄鐨刾arameters
+		
+		4. 鏍规嵁struts.xml涓殑 <result> 閰嶇疆,浠ュ強execute鐨勮繑鍥炲�硷紝  纭畾鍝竴涓猨sp锛�  
+		鏀惧埌View瀵硅薄鐨刯sp瀛楁涓��
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java
new file mode 100644
index 0000000000..10c0d5c6db
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package cn.ecust.Iitestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //瀵嗙爜鍜岄璁剧殑涓嶄竴鑷�
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/View.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/View.java
new file mode 100644
index 0000000000..dd652dad20
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/View.java
@@ -0,0 +1,23 @@
+package cn.ecust.Iitestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml b/group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml
new file mode 100644
index 0000000000..a6cfe43e6c
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result = "success">/jsp/welcome.jsp</result>
+    	<result = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java b/group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java
new file mode 100644
index 0000000000..0ac38f0256
--- /dev/null
+++ b/group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java
@@ -0,0 +1,26 @@
+package cn.ecust.Test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import cn.ecust.Array.ArrayUtil;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void test() {
+		int[] a = {7, 9, 30, 0, 0, 0, 3, 4};
+		int[] b = {3,4,5,6,7,8};
+		ArrayUtil au = new ArrayUtil();
+		au.reverseArray(a);
+		//au.removeZero(a);
+		au.merge(a, b);
+		au.grow(a, 3);
+		au.fibonacci(25);
+		au.getPrimes(25);
+		au.getPerfectNumbers(25);
+		au.join(a, "-");
+	}
+
+}
diff --git "a/group06/949319266/homework/src/\346\226\207\347\253\2402.txt" "b/group06/949319266/homework/src/\346\226\207\347\253\2402.txt"
new file mode 100644
index 0000000000..89823c8f5a
--- /dev/null
+++ "b/group06/949319266/homework/src/\346\226\207\347\253\2402.txt"
@@ -0,0 +1 @@
+http://blog.sina.com.cn/s/blog_c20b18280102x3fi.html
\ No newline at end of file
diff --git a/group07/1058267830/week2/.classpath b/group07/1058267830/week2/.classpath
new file mode 100644
index 0000000000..b258db3060
--- /dev/null
+++ b/group07/1058267830/week2/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_80"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group07/1058267830/week2/.project b/group07/1058267830/week2/.project
new file mode 100644
index 0000000000..5b537d7055
--- /dev/null
+++ b/group07/1058267830/week2/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>week2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/630254746/2017Leaning/.settings/org.eclipse.jdt.core.prefs b/group07/1058267830/week2/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from group14/630254746/2017Leaning/.settings/org.eclipse.jdt.core.prefs
rename to group07/1058267830/week2/.settings/org.eclipse.jdt.core.prefs
diff --git a/group07/1058267830/week2/bin/com/coderising/array/ArrayTest.class b/group07/1058267830/week2/bin/com/coderising/array/ArrayTest.class
new file mode 100644
index 0000000000..b0d101658f
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/array/ArrayTest.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/array/ArrayUtil.class b/group07/1058267830/week2/bin/com/coderising/array/ArrayUtil.class
new file mode 100644
index 0000000000..515999a911
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/array/ArrayUtil.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/Demo.class b/group07/1058267830/week2/bin/com/coderising/litestruts/Demo.class
new file mode 100644
index 0000000000..7d37f20c22
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/litestruts/Demo.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/LoginAction.class b/group07/1058267830/week2/bin/com/coderising/litestruts/LoginAction.class
new file mode 100644
index 0000000000..794c66e2c7
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/litestruts/LoginAction.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/Struts.class b/group07/1058267830/week2/bin/com/coderising/litestruts/Struts.class
new file mode 100644
index 0000000000..2e2b15c45f
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/litestruts/Struts.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/StrutsTest.class b/group07/1058267830/week2/bin/com/coderising/litestruts/StrutsTest.class
new file mode 100644
index 0000000000..74b68390bc
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/litestruts/StrutsTest.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/View.class b/group07/1058267830/week2/bin/com/coderising/litestruts/View.class
new file mode 100644
index 0000000000..c28f317aa6
Binary files /dev/null and b/group07/1058267830/week2/bin/com/coderising/litestruts/View.class differ
diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml b/group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/1058267830/week2/lib/dom4j-1.6.1.jar b/group07/1058267830/week2/lib/dom4j-1.6.1.jar
new file mode 100644
index 0000000000..c8c4dbb92d
Binary files /dev/null and b/group07/1058267830/week2/lib/dom4j-1.6.1.jar differ
diff --git a/group07/1058267830/week2/src/com/coderising/array/ArrayTest.java b/group07/1058267830/week2/src/com/coderising/array/ArrayTest.java
new file mode 100644
index 0000000000..954ebf54a3
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/array/ArrayTest.java
@@ -0,0 +1,77 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ArrayTest {
+	ArrayUtil util = new ArrayUtil();
+	
+	@Test
+	public void testReverseArray() {
+		int[] origin = {1,2,3,4,53,52,4,2,423};
+		int[] target = util.reverseArray(origin);
+		int[] expecteds = {423, 2, 4, 52, 53, 4, 3, 2, 1};
+		assertArrayEquals(expecteds, target);
+	}
+	
+	@Test
+	public void testRemoveZero(){
+		int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] target = util.removeZero(oldArray);
+		int[] expecteds = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 };
+		assertArrayEquals(expecteds, target);
+	}
+	
+	@Test
+	public void testMerger(){
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] target = util.merge(a1, a2);
+		int[] expecteds = {3, 4, 5, 6, 7, 8 };
+		assertArrayEquals(expecteds, target);
+	}
+	
+	@Test
+	public void testGrow(){
+		int[] oldArray = {3, 5,7,8};
+		int[] target = util.grow(oldArray, 4);
+		int[] expecteds = {3, 5,7,8, 0, 0, 0,0 };
+		assertArrayEquals(expecteds, target);
+	}
+	
+	@Test
+	public void testFibonacci(){
+		int[] target = util.fibonacci(15);
+		
+		//int[] expecteds = {1,1};
+		int[] expecteds = {1, 1, 2, 3, 5, 8, 13 };
+		assertArrayEquals(expecteds, target);
+	}
+	
+	@Test
+	public void testGetPrimes(){
+		int[] target = util.getPrimes(25);
+		int[] expecteds = {2, 3, 5, 7, 11, 13, 17, 19, 23 };
+		assertArrayEquals(expecteds, target);
+//		for(int i=0; i<target.length; i++)
+//			System.out.print(target[i] + " ");
+	}
+	
+	@Test
+	public void testGetPerfectNumbers(){
+		int[] target = util.getPerfectNumbers(3000);
+		int[] expecteds = {6, 28, 496 };
+		assertArrayEquals(expecteds, target);
+//		for(int i=0; i<target.length; i++)
+//			System.out.print(target[i] + " ");
+	}
+	
+	@Test
+	public void testJoin(){
+		int[] array = {1,2,3};
+		String target = util.join(array, "-");
+		String expecteds = "1-2-3";
+		assertEquals(expecteds, target);
+	}
+}
diff --git a/group07/1058267830/week2/src/com/coderising/array/ArrayUtil.java b/group07/1058267830/week2/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..5ff17fd814
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,240 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+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 int[] reverseArray(int[] origin){
+		if(origin == null)
+			return null;
+		int length = origin.length;
+		int[] target = new int[length];
+		for(int i=0; i<length ;i++){
+			target[length-1-i] = origin[i];
+		}
+		return target;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if(oldArray == null)
+			return null;
+		int zeroNum = 0;
+		int length = oldArray.length;
+		for(int i=0; i<length; i++){
+			if(oldArray[i] == 0)
+				zeroNum++;
+		}
+		int[] newArray = new int[length - zeroNum];
+		int j = 0;
+		for(int i=0; i<length; i++){
+			if(oldArray[i] != 0)
+				newArray[j++] = oldArray[i];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		if(array1 == null || array2 == null)
+			return array1 == null ? array2 : array1;
+		Set<Integer> set = new HashSet<Integer>();
+		for(int i=0; i<array1.length; i++){
+			set.add(array1[i]);
+		}
+		for(int i=0; i<array2.length; i++){
+			set.add(array2[i]);
+		}
+		int[] target = new int[set.size()];
+		int i = 0;
+		Iterator<Integer> it = set.iterator();
+		while(it.hasNext()){
+			target[i++] = it.next();
+		}
+		return target;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(oldArray == null)
+			return null;
+		if(size == 0)
+			return oldArray;
+		if(size < 0)
+			throw new RuntimeException("参数错误");
+		int length = oldArray.length + size;
+		int[] target = new int[length];
+		System.arraycopy(oldArray, 0, target, 0, oldArray.length);
+		for(int i=oldArray.length; i< length; i++){
+			target[i] = 0;
+		}
+		return target;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max < 1)
+			throw new RuntimeException("参数错误");
+		if(max == 1){
+			int[] result = {};
+			return result;
+		}
+		if(max == 2){
+			int[] result = {1, 1};
+			return result;
+		}
+		List<Integer> list = new ArrayList<Integer>();
+		list.add(1);
+		list.add(1);
+		for(int i=2; ; i++){
+			int tmp = list.get(i-2) + list.get(i-1);
+			if(tmp < max){
+				list.add(tmp);
+			}else{
+				break;
+			}
+		}
+		int size = list.size();
+		int[] result = new int[size];
+		for(int i=0; i<size; i++)
+			result[i] = list.get(i);
+		return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max <= 0)
+			throw new RuntimeException("参数错误");
+		if(max <=2 ){
+			int[] result = {};
+			return result;
+		}
+		
+		if(max <= 13){
+			int[] tmp = {2,3,5,7,11,13};
+			int index = 0;
+			for(int i=0; i<6; i++){
+				index = i;
+				if(tmp[i] >= max)
+					break;
+			}
+			int[] result = new int[index];
+			System.arraycopy(tmp, 0, result, 0, index);
+			return result;
+		}
+			
+		List<Integer> list = new ArrayList<Integer>();
+		list.add(2);
+		list.add(3);
+		list.add(5);
+		list.add(7);
+		list.add(11);
+		for(int i=13; i<max; i+=2){
+			boolean isNum = true;
+			for(int j=3; j<=Math.sqrt(i); j++){
+				if(i%j == 0){
+					isNum = false;
+					break;
+				}
+			}
+			if(isNum == true)
+				list.add(i);
+		}
+		int[] result = new int[list.size()];
+		for(int i=0; i<list.size(); i++)
+			result[i] = list.get(i);
+		return result;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return	
+	 */
+	public int[] getPerfectNumbers(int max){  
+		if(max <= 1)
+			throw new RuntimeException("参数错误");
+		if(max <= 5){
+			int[] result = {};
+			return result;
+		}
+		List<Integer> list = new ArrayList<Integer>();
+		for(int input = 2; input<max; input++){
+			int sum = 1;
+			for(int i=2; i<=input/2.0; i++){
+				if(input % i == 0){
+					sum += i;
+				}
+			}
+			if(sum == input)
+				list.add(input);
+		}
+		int[] result = new int[list.size()];
+		for(int i=0; i<list.size(); i++)
+			result[i] = list.get(i);
+		return result;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String s = "";
+		for(int i=0; i<array.length-1; i++){
+			s = s + (array[i]) + "-"; 
+		}
+		s = s + array[array.length-1];
+		return s;
+	}
+	
+
+}
diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/Demo.java b/group07/1058267830/week2/src/com/coderising/litestruts/Demo.java
new file mode 100644
index 0000000000..c79a002294
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/litestruts/Demo.java
@@ -0,0 +1,35 @@
+package com.coderising.litestruts;
+
+import java.util.List;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Demo {
+
+	@SuppressWarnings("unchecked")
+	public static void main(String[] args) throws DocumentException {
+		SAXReader saxReader = new SAXReader();  
+        Document doc =  saxReader.read("src/com/coderising/litestruts/struts.xml");  
+        Element root = doc.getRootElement();
+        List<Element> list = root.elements("action");
+        for(Element action_element : list) {  
+            //获取元素action的属性  
+        	if("logout".equals(action_element.attributeValue("name"))){
+        		System.out.print("action name=" + action_element.attributeValue("name") + "   ");  
+                System.out.print("class=" + action_element.attributeValue("class"));  
+                System.out.println();
+                
+              //遍历元素action下所有的result元素  
+                for(Element rusult_element : (List<Element>)action_element.elements("result")) {  
+                    //获取元素result的属性  
+                    System.out.print("result name=" + rusult_element.attributeValue("name") + "   ");  
+                    System.out.println("value=" + rusult_element.getText() );  
+                }  
+        	}
+        }  
+	}
+
+}
diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java b/group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/Struts.java b/group07/1058267830/week2/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..195a63bc8f
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,64 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+public class Struts {
+
+    @SuppressWarnings("unchecked")
+	public static View runAction(String actionName, Map<String,String> parameters) throws Exception{
+    	
+    	Class<?> viewClass = Class.forName("com.coderising.litestruts.View");
+        View view = (View)viewClass.newInstance();
+    	
+    	SAXReader saxReader = new SAXReader();  
+        Document doc =  saxReader.read("src/com/coderising/litestruts/struts.xml");  
+        Element root = doc.getRootElement();
+        List<Element> list = root.elements("action");
+        for(Element action_element : list) {  
+        	if(actionName.equals(action_element.attributeValue("name"))){
+               String className = action_element.attributeValue("class");
+               Class<?> clazz = Class.forName(className);
+               LoginAction la = (LoginAction)clazz.newInstance();
+               Class<?> clazz1 = la.getClass();
+               
+               if(parameters.containsKey("name")){
+            	   Method m1 = clazz1.getDeclaredMethod("setName", String.class);
+            	   m1.invoke(la, parameters.get("name"));
+               }
+               if(parameters.containsKey("password")){
+            	   Method m2 = clazz1.getDeclaredMethod("setPassword", String.class);
+            	   m2.invoke(la, parameters.get("password"));
+               }
+               
+               Method m3 = clazz1.getDeclaredMethod("execute");
+               String result = (String)m3.invoke(la);
+               Map<String, String> map = new HashMap<String, String>();
+               // 这里没有通过反射，后续要改正成反射
+               map.put("name", la.getName());
+               map.put("password", la.getPassword());
+               map.put("message", la.getMessage());
+               
+               view.setParameters(map);
+               
+               
+                for(Element rusult_element : (List<Element>)action_element.elements("result")) {  
+                	if(result != null && result.equals(rusult_element.attributeValue("name"))){
+                		view.setJsp(rusult_element.getText());
+                		break;
+                	}
+                }
+                break;
+        	}
+        }
+		return view;  
+	}
+	
+}
diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java b/group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..cb1be91034
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,41 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws Exception {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/View.java b/group07/1058267830/week2/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/struts.xml b/group07/1058267830/week2/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group07/1058267830/week2/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/1519504320/.idea/libraries/dom4j_1_6_1.xml b/group07/1519504320/.idea/libraries/dom4j_1_6_1.xml
new file mode 100644
index 0000000000..933acece89
--- /dev/null
+++ b/group07/1519504320/.idea/libraries/dom4j_1_6_1.xml
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="dom4j-1.6.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/src/coderising/litestruts/dom4j-1.6.1.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
diff --git a/group07/1519504320/.idea/workspace.xml b/group07/1519504320/.idea/workspace.xml
index 7dbdbd8302..d4a1a0f4a8 100644
--- a/group07/1519504320/.idea/workspace.xml
+++ b/group07/1519504320/.idea/workspace.xml
@@ -22,83 +22,81 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="ArrayList.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
+      <file leaf-file-name="Struts.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/Struts.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="673">
-              <caret line="79" column="51" selection-start-line="79" selection-start-column="51" selection-end-line="79" selection-end-column="51" />
-              <folding />
+            <state relative-caret-position="426">
+              <caret line="97" column="46" selection-start-line="97" selection-start-column="46" selection-end-line="97" selection-end-column="46" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Iterator.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Iterator.java">
+      <file leaf-file-name="ArrayUtil.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/coderising/array/ArrayUtil.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="76">
-              <caret line="4" column="25" selection-start-line="3" selection-start-column="4" selection-end-line="4" selection-end-column="25" />
+            <state relative-caret-position="247">
+              <caret line="13" column="9" selection-start-line="13" selection-start-column="9" selection-end-line="13" selection-end-column="9" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Stack.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
+      <file leaf-file-name="LoginAction.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/LoginAction.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="285">
-              <caret line="16" column="53" selection-start-line="16" selection-start-column="53" selection-end-line="16" selection-end-column="53" />
+            <state relative-caret-position="342">
+              <caret line="22" column="44" selection-start-line="22" selection-start-column="44" selection-end-line="22" selection-end-column="44" />
               <folding>
-                <element signature="e#127#128#0" expanded="true" />
-                <element signature="e#152#153#0" expanded="true" />
-                <element signature="e#490#491#0" expanded="true" />
-                <element signature="e#522#523#0" expanded="true" />
+                <element signature="e#235#236#0" expanded="false" />
+                <element signature="e#262#263#0" expanded="false" />
+                <element signature="e#297#298#0" expanded="false" />
+                <element signature="e#328#329#0" expanded="false" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="LinkedList.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
+      <file leaf-file-name="Class.java" pinned="false" current-in-tab="false">
+        <entry file="jar://C:/Program Files/Java/jdk1.8.0_102/src.zip!/java/lang/Class.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="350">
-              <caret line="63" column="0" selection-start-line="63" selection-start-column="0" selection-end-line="63" selection-end-column="0" />
+            <state relative-caret-position="38779">
+              <caret line="2124" column="65" selection-start-line="2124" selection-start-column="65" selection-end-line="2124" selection-end-column="65" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Queue.java" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
+      <file leaf-file-name="StrutsTest.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/StrutsTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="171">
-              <caret line="9" column="30" selection-start-line="9" selection-start-column="30" selection-end-line="9" selection-end-column="30" />
+            <state relative-caret-position="418">
+              <caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
               <folding>
-                <element signature="e#112#113#0" expanded="true" />
-                <element signature="e#127#128#0" expanded="true" />
-                <element signature="e#155#156#0" expanded="true" />
-                <element signature="e#184#185#0" expanded="true" />
-                <element signature="e#293#294#0" expanded="true" />
-                <element signature="e#315#316#0" expanded="true" />
+                <element signature="e#292#307#0" expanded="false" />
+                <element signature="e#751#766#0" expanded="false" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="BinaryTreeNode.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinaryTreeNode.java">
+      <file leaf-file-name="View.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/View.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="38">
-              <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
+            <state relative-caret-position="95">
+              <caret line="5" column="20" selection-start-line="5" selection-start-column="20" selection-end-line="5" selection-end-column="20" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="List.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/coding/basic/List.java">
+      <file leaf-file-name="struts.xml" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/struts.xml">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="76">
-              <caret line="4" column="40" selection-start-line="4" selection-start-column="40" selection-end-line="4" selection-end-column="40" />
+            <state relative-caret-position="95">
+              <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" />
               <folding />
             </state>
           </provider>
@@ -119,6 +117,9 @@
         <option value="$PROJECT_DIR$/src/com/coding/basic/LinkedList.java" />
         <option value="$PROJECT_DIR$/src/com/coding/basic/Queue.java" />
         <option value="$PROJECT_DIR$/src/com/coding/basic/Stack.java" />
+        <option value="$PROJECT_DIR$/src/coderising/litestruts/struts.xml" />
+        <option value="$PROJECT_DIR$/src/coderising/litestruts/Struts.java" />
+        <option value="$PROJECT_DIR$/src/coderising/array/ArrayUtil.java" />
       </list>
     </option>
   </component>
@@ -153,6 +154,7 @@
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
+      <pane id="PackagesPane" />
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -184,8 +186,26 @@
               <option name="myItemId" value="src" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="1519504320Learning" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="1519504320" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="coderising" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="basic" />
+              <option name="myItemId" value="litestruts" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
@@ -203,21 +223,30 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value=".idea" />
+              <option name="myItemId" value="coderising" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="array" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
         </subPane>
       </pane>
       <pane id="Scratches" />
-      <pane id="PackagesPane" />
       <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
     <property name="last_opened_file_path" value="$PROJECT_DIR$" />
   </component>
-  <component name="RunManager" selected="Application.ArrayList">
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="C:\git\coding2017\group07\1519504320\src\coderising\litestruts" />
+      <recent name="C:\git\coding2017\group07\1519504320\src" />
+    </key>
+  </component>
+  <component name="RunManager" selected="JUnit.StrutsTest.testLoginActionSuccess">
     <configuration default="false" name="LinkedList" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
@@ -258,6 +287,52 @@
       <envs />
       <method />
     </configuration>
+    <configuration default="false" name="Struts" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="coderising.litestruts.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <option name="MAIN_CLASS_NAME" value="coderising.litestruts.Struts" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="1519504320Learning" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="false" name="StrutsTest.testLoginActionSuccess" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="coderising.litestruts.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="1519504320Learning" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="coderising.litestruts" />
+      <option name="MAIN_CLASS_NAME" value="coderising.litestruts.StrutsTest" />
+      <option name="METHOD_NAME" value="testLoginActionSuccess" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
     <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
       <module name="" />
       <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
@@ -492,14 +567,18 @@
       <listeners />
       <method />
     </configuration>
-    <list size="2">
+    <list size="4">
       <item index="0" class="java.lang.String" itemvalue="Application.LinkedList" />
       <item index="1" class="java.lang.String" itemvalue="Application.ArrayList" />
+      <item index="2" class="java.lang.String" itemvalue="Application.Struts" />
+      <item index="3" class="java.lang.String" itemvalue="JUnit.StrutsTest.testLoginActionSuccess" />
     </list>
     <recent_temporary>
-      <list size="2">
-        <item index="0" class="java.lang.String" itemvalue="Application.ArrayList" />
-        <item index="1" class="java.lang.String" itemvalue="Application.LinkedList" />
+      <list size="4">
+        <item index="0" class="java.lang.String" itemvalue="JUnit.StrutsTest.testLoginActionSuccess" />
+        <item index="1" class="java.lang.String" itemvalue="Application.Struts" />
+        <item index="2" class="java.lang.String" itemvalue="Application.ArrayList" />
+        <item index="3" class="java.lang.String" itemvalue="Application.LinkedList" />
       </list>
     </recent_temporary>
   </component>
@@ -519,6 +598,17 @@
     </task>
     <servers />
   </component>
+  <component name="TestHistory">
+    <history-entry file="StrutsTest_testLoginActionSuccess - 2017.03.03 at 00h 04m 39s.xml">
+      <configuration name="StrutsTest.testLoginActionSuccess" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="StrutsTest_testLoginActionSuccess - 2017.03.03 at 00h 16m 33s.xml">
+      <configuration name="StrutsTest.testLoginActionSuccess" configurationId="JUnit" />
+    </history-entry>
+    <history-entry file="StrutsTest_testLoginActionSuccess - 2017.03.03 at 00h 19m 15s.xml">
+      <configuration name="StrutsTest.testLoginActionSuccess" configurationId="JUnit" />
+    </history-entry>
+  </component>
   <component name="ToolWindowManager">
     <frame x="-8" y="-8" width="1616" height="876" extended-state="0" />
     <editor active="true" />
@@ -539,7 +629,7 @@
       <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32972974" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
@@ -561,7 +651,17 @@
     <option name="myLimit" value="2678400000" />
   </component>
   <component name="XDebuggerManager">
-    <breakpoint-manager />
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/coderising/litestruts/Struts.java</url>
+          <line>44</line>
+          <properties />
+          <option name="timeStamp" value="3" />
+        </line-breakpoint>
+      </breakpoints>
+      <option name="time" value="4" />
+    </breakpoint-manager>
     <watches-manager />
   </component>
   <component name="antWorkspaceConfiguration">
@@ -569,11 +669,117 @@
     <option name="FILTER_TARGETS" value="false" />
   </component>
   <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/Struts.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/LoginAction.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="342">
+          <caret line="22" column="44" selection-start-line="22" selection-start-column="44" selection-end-line="22" selection-end-column="44" />
+          <folding>
+            <element signature="e#235#236#0" expanded="false" />
+            <element signature="e#262#263#0" expanded="false" />
+            <element signature="e#297#298#0" expanded="false" />
+            <element signature="e#328#329#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_102/src.zip!/java/lang/Class.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="38779">
+          <caret line="2124" column="65" selection-start-line="2124" selection-start-column="65" selection-end-line="2124" selection-end-column="65" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/StrutsTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="418">
+          <caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
+          <folding>
+            <element signature="e#292#307#0" expanded="false" />
+            <element signature="e#751#766#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/View.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="95">
+          <caret line="5" column="20" selection-start-line="5" selection-start-column="20" selection-end-line="5" selection-end-column="20" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/struts.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="95">
+          <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1463">
+          <caret line="79" column="51" selection-start-line="79" selection-start-column="51" selection-end-line="79" selection-end-column="51" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Iterator.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="76">
+          <caret line="4" column="25" selection-start-line="3" selection-start-column="4" selection-end-line="4" selection-end-column="25" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="247">
+          <caret line="16" column="53" selection-start-line="16" selection-start-column="53" selection-end-line="16" selection-end-column="53" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1197">
+          <caret line="63" column="0" selection-start-line="63" selection-start-column="0" selection-end-line="63" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinaryTreeNode.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="38">
+          <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/List.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="76">
+          <caret line="4" column="40" selection-start-line="4" selection-start-column="40" selection-end-line="4" selection-end-column="40" />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="1463">
           <caret line="79" column="51" selection-start-line="79" selection-start-column="51" selection-end-line="79" selection-end-column="51" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -581,7 +787,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="76">
           <caret line="4" column="25" selection-start-line="3" selection-start-column="4" selection-end-line="4" selection-end-column="25" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -589,12 +794,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="38">
           <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
-          <folding>
-            <element signature="e#127#128#0" expanded="true" />
-            <element signature="e#152#153#0" expanded="true" />
-            <element signature="e#490#491#0" expanded="true" />
-            <element signature="e#522#523#0" expanded="true" />
-          </folding>
         </state>
       </provider>
     </entry>
@@ -602,7 +801,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -610,14 +808,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="76">
           <caret line="4" column="40" selection-start-line="4" selection-start-column="40" selection-end-line="4" selection-end-column="40" />
-          <folding>
-            <element signature="e#112#113#0" expanded="true" />
-            <element signature="e#127#128#0" expanded="true" />
-            <element signature="e#155#156#0" expanded="true" />
-            <element signature="e#184#185#0" expanded="true" />
-            <element signature="e#293#294#0" expanded="true" />
-            <element signature="e#315#316#0" expanded="true" />
-          </folding>
         </state>
       </provider>
     </entry>
@@ -625,7 +815,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="38">
           <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -633,7 +822,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="76">
           <caret line="4" column="40" selection-start-line="4" selection-start-column="40" selection-end-line="4" selection-end-column="40" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -641,7 +829,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="38">
           <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -649,12 +836,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="38">
           <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
-          <folding>
-            <element signature="e#127#128#0" expanded="true" />
-            <element signature="e#152#153#0" expanded="true" />
-            <element signature="e#490#491#0" expanded="true" />
-            <element signature="e#522#523#0" expanded="true" />
-          </folding>
         </state>
       </provider>
     </entry>
@@ -662,7 +843,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -670,7 +850,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="38">
           <caret line="2" column="17" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -678,7 +857,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="76">
           <caret line="4" column="40" selection-start-line="4" selection-start-column="40" selection-end-line="4" selection-end-column="40" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -686,36 +864,27 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="76">
           <caret line="4" column="25" selection-start-line="3" selection-start-column="4" selection-end-line="4" selection-end-column="25" />
-          <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="673">
+        <state relative-caret-position="1463">
           <caret line="79" column="51" selection-start-line="79" selection-start-column="51" selection-end-line="79" selection-end-column="51" />
-          <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="350">
+        <state relative-caret-position="1197">
           <caret line="63" column="0" selection-start-line="63" selection-start-column="0" selection-end-line="63" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="285">
+        <state relative-caret-position="247">
           <caret line="16" column="53" selection-start-line="16" selection-start-column="53" selection-end-line="16" selection-end-column="53" />
-          <folding>
-            <element signature="e#127#128#0" expanded="true" />
-            <element signature="e#152#153#0" expanded="true" />
-            <element signature="e#490#491#0" expanded="true" />
-            <element signature="e#522#523#0" expanded="true" />
-          </folding>
         </state>
       </provider>
     </entry>
@@ -723,24 +892,103 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="38">
           <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
-          <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="171">
-          <caret line="9" column="30" selection-start-line="9" selection-start-column="30" selection-end-line="9" selection-end-column="30" />
+        <state relative-caret-position="114">
+          <caret line="8" column="28" selection-start-line="8" selection-start-column="28" selection-end-line="8" selection-end-column="28" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://$PROJECT_DIR$/src/coderising/litestruts/dom4j-1.6.1.jar!/org/dom4j/tree/AbstractElement.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="237">
+          <caret line="347" column="21" selection-start-line="347" selection-start-column="21" selection-end-line="347" selection-end-column="21" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://$PROJECT_DIR$/src/coderising/litestruts/dom4j-1.6.1.jar!/org/dom4j/Element.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="227">
+          <caret line="102" column="0" selection-start-line="102" selection-start-column="0" selection-end-line="102" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_102/src.zip!/java/lang/reflect/Method.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="24">
+          <caret line="483" column="18" selection-start-line="483" selection-start-column="18" selection-end-line="483" selection-end-column="18" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/View.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="95">
+          <caret line="5" column="20" selection-start-line="5" selection-start-column="20" selection-end-line="5" selection-end-column="20" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/struts.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="95">
+          <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/StrutsTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="418">
+          <caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
           <folding>
-            <element signature="e#112#113#0" expanded="true" />
-            <element signature="e#127#128#0" expanded="true" />
-            <element signature="e#155#156#0" expanded="true" />
-            <element signature="e#184#185#0" expanded="true" />
-            <element signature="e#293#294#0" expanded="true" />
-            <element signature="e#315#316#0" expanded="true" />
+            <element signature="e#292#307#0" expanded="false" />
+            <element signature="e#751#766#0" expanded="false" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_102/src.zip!/java/lang/Class.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="38779">
+          <caret line="2124" column="65" selection-start-line="2124" selection-start-column="65" selection-end-line="2124" selection-end-column="65" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/LoginAction.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="342">
+          <caret line="22" column="44" selection-start-line="22" selection-start-column="44" selection-end-line="22" selection-end-column="44" />
+          <folding>
+            <element signature="e#235#236#0" expanded="false" />
+            <element signature="e#262#263#0" expanded="false" />
+            <element signature="e#297#298#0" expanded="false" />
+            <element signature="e#328#329#0" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/litestruts/Struts.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="426">
+          <caret line="97" column="46" selection-start-line="97" selection-start-column="46" selection-end-line="97" selection-end-column="46" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/coderising/array/ArrayUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="247">
+          <caret line="13" column="9" selection-start-line="13" selection-start-column="9" selection-end-line="13" selection-end-column="9" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>
\ No newline at end of file
diff --git a/group07/1519504320/1519504320Learning.iml b/group07/1519504320/1519504320Learning.iml
index 5034ed029c..7a17e1a748 100644
--- a/group07/1519504320/1519504320Learning.iml
+++ b/group07/1519504320/1519504320Learning.iml
@@ -8,5 +8,16 @@
     </content>
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="inheritedJdk" />
+    <orderEntry type="library" name="dom4j-1.6.1" level="project" />
+    <orderEntry type="module-library">
+      <library name="JUnit4">
+        <CLASSES>
+          <root url="jar://$MODULE_DIR$/lib/junit-4.12.jar!/" />
+          <root url="jar://$MODULE_DIR$/lib/hamcrest-core-1.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
   </component>
 </module>
\ No newline at end of file
diff --git a/group07/1519504320/lib/hamcrest-core-1.3.jar b/group07/1519504320/lib/hamcrest-core-1.3.jar
new file mode 100644
index 0000000000..9d5fe16e3d
Binary files /dev/null and b/group07/1519504320/lib/hamcrest-core-1.3.jar differ
diff --git a/group07/1519504320/lib/junit-4.12.jar b/group07/1519504320/lib/junit-4.12.jar
new file mode 100644
index 0000000000..3a7fc266c3
Binary files /dev/null and b/group07/1519504320/lib/junit-4.12.jar differ
diff --git a/group07/1519504320/src/coderising/array/ArrayUtil.java b/group07/1519504320/src/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..5caa3d54b7
--- /dev/null
+++ b/group07/1519504320/src/coderising/array/ArrayUtil.java
@@ -0,0 +1,224 @@
+package coderising.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+	public static void main(String[] args) {
+		int[] a1 = {3, 5, 7, 8};
+		int[] a2 = {4, 5, 6, 7, 9, 10};
+		ArrayUtil aa = new ArrayUtil();
+		int[] o = aa.merge(a1, a2);
+		for (int i = 0; i < o.length; i++) {
+			System.out.println(o[i]);
+		}
+
+	}
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+	 * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+	 * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 *
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int[] temp = new int[origin.length];
+		for (int i = origin.length - 1; i >= 0; i--) {
+			temp[origin.length - 1 - i] = origin[i];
+		}
+		for (int i = 0; i < origin.length; i++) {
+			origin[i] = temp[i];
+		}
+
+	}
+
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}
+	 *
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int[] result;
+		int zeroNumber = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				zeroNumber++;
+			}
+		}
+		result = new int[oldArray.length - zeroNumber];
+		for (int i = 0, j = 0; j < result.length; i++) {
+			if (oldArray[i] != 0) {
+				result[j] = oldArray[i];
+				j++;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 *
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		int[] result = Arrays.copyOf(array1, array1.length);
+		outer:
+		for (int i = 0; i < array2.length; i++) {
+			for (int j = 0; j < array1.length; j++) {
+				if (array1[j] == array2[i]) {
+					continue outer;
+				}
+			}
+			result = Arrays.copyOf(result, result.length + 1);
+			result[result.length - 1] = array2[i];
+		}
+
+		for (int i = 0; i < result.length - 1; i++) {
+			for (int j = 0; j < result.length - i - 1; j++) {
+				if (result[j] > result[j+1]) {
+					int temp = result[j];
+					result[j] = result[j+1];
+					result[j+1] = temp;
+				}
+			}
+		}
+
+
+		return result;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 *
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] result = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			result[i] = oldArray[i];
+		}
+		for (int i = oldArray.length; i < result.length; i++) {
+			result[i] = 0;
+		}
+		return result;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 *
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		int[] initial = new int[]{1, 1};
+		if (max == 1) {
+			return new int[1];
+		} else {
+			while (max > initial[initial.length - 1] + initial[initial.length - 2]) {
+				initial = addOne(initial);
+			}
+		}
+		return initial;
+	}
+
+	public int[] addOne(int[] current) {
+		int[] result = Arrays.copyOf(current, current.length + 1);
+		result[current.length] = result[current.length - 1] + result[current.length - 2];
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 *
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		int[] result = new int[1];
+		outer:
+		for (int i = 2; i < max; i++) {
+			for (int j = 2; j < i; j++) {
+				if (i % j == 0) {
+					continue outer;
+				}
+			}
+			if (result.length == 1 && result[0] == 0) {
+				result[0] = i;
+			} else {
+				result = Arrays.copyOf(result, result.length + 1);
+				result[result.length - 1] = i;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 *
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		int[] result = new int[1];
+		for (int i = 1; i < max; i++) {
+			int sum = 0;
+			for (int j = 1; j < i; j++) {
+				if (i % j == 0) {
+					sum += j;
+				}
+			}
+			if (sum == i) {
+				if (result.length == 1 && result[0] == 0) {
+					result[0] = i;
+				} else {
+					result = Arrays.copyOf(result, result.length + 1);
+					result[result.length - 1] = i;
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 *
+	 * @param array
+	 * @param
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			if (i == array.length - 1) {
+				sb.append(array[i]);
+			} else {
+				sb.append(array[i]);
+				sb.append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+
+
+}
\ No newline at end of file
diff --git a/group07/1519504320/src/coderising/litestruts/LoginAction.java b/group07/1519504320/src/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..c528df798a
--- /dev/null
+++ b/group07/1519504320/src/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/1519504320/src/coderising/litestruts/Struts.java b/group07/1519504320/src/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..22b7a291b4
--- /dev/null
+++ b/group07/1519504320/src/coderising/litestruts/Struts.java
@@ -0,0 +1,106 @@
+package coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+    public static void main(String[] args) {
+        runAction("login", null);
+    }
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        String className = " ";
+        View view = new View();
+        Map<String, String> map = new HashMap<>();
+        String result = " ";
+
+        SAXReader reader = new SAXReader();
+        Document document = null;
+        try {
+            document = reader.read(new File("src\\coderising\\litestruts\\struts.xml"));
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        Element root = document.getRootElement();
+        List<Element> eles = root.elements();
+        for (Element e : eles) {
+            if (e.attribute("name").getValue().equals(actionName)) {
+                className = e.attribute("class").getValue();
+            }
+        }
+
+        try {
+            Class clz = Class.forName(className);
+            Object obj = clz.newInstance();
+            Method method = clz.getDeclaredMethod("setName",String.class);
+            method.invoke(obj, parameters.get("name"));
+            method = clz.getDeclaredMethod("setPassword",String.class);
+            method.invoke(obj, parameters.get("password"));
+            method = clz.getDeclaredMethod("execute");
+            result = (String) method.invoke(obj);
+            method = clz.getDeclaredMethod("getMessage");
+            map.put("message", (String) method.invoke(obj));
+            method = clz.getDeclaredMethod("getName");
+            map.put("name", (String) method.invoke(obj));
+            method = clz.getDeclaredMethod("getPassword");
+            map.put("password", (String) method.invoke(obj));
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+
+        view.setParameters(map);
+        for (Element e : eles) {
+            if (e.attribute("name").getValue().equals(actionName)) {
+                List<Element> ele_subs = e.elements();
+                for (Element e_sub : ele_subs) {
+                    if (e_sub.attribute("name").getValue().equals(result)) {
+                        view.setJsp(e_sub.getTextTrim());
+                    }
+                }
+            }
+        }
+
+
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+        return view;
+    }
+
+}
diff --git a/group07/1519504320/src/coderising/litestruts/StrutsTest.java b/group07/1519504320/src/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..257f3d5a89
--- /dev/null
+++ b/group07/1519504320/src/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/1519504320/src/coderising/litestruts/View.java b/group07/1519504320/src/coderising/litestruts/View.java
new file mode 100644
index 0000000000..22fdf877d8
--- /dev/null
+++ b/group07/1519504320/src/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/1519504320/src/coderising/litestruts/dom4j-1.6.1.jar b/group07/1519504320/src/coderising/litestruts/dom4j-1.6.1.jar
new file mode 100644
index 0000000000..c8c4dbb92d
Binary files /dev/null and b/group07/1519504320/src/coderising/litestruts/dom4j-1.6.1.jar differ
diff --git a/group07/1519504320/src/coderising/litestruts/struts.xml b/group07/1519504320/src/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..57ad66abd0
--- /dev/null
+++ b/group07/1519504320/src/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/178007127/001DataStructure/build.gradle b/group07/178007127/001DataStructure/build.gradle
index 670cff0568..8450dd647d 100644
--- a/group07/178007127/001DataStructure/build.gradle
+++ b/group07/178007127/001DataStructure/build.gradle
@@ -1,9 +1,12 @@
-apply plugin:'java'
-
-repositories{
-	mavenCentral()
-}
-
-dependencies{
-	compile group: 'junit', name: 'junit', version: '4.12'  
+apply plugin:'java'
+
+repositories{
+	mavenCentral()
+}
+
+dependencies{
+	compile group: 'junit', name: 'junit', version: '4.12'  
+	
+	compile group: 'dom4j', name: 'dom4j', version: '1.6.1'
+	compile group: 'jaxen', name: 'jaxen', version: '1.1.6'
 }
\ No newline at end of file
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java
new file mode 100644
index 0000000000..b98e1c1c37
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java
@@ -0,0 +1,225 @@
+package com.easy.codersing.array;
+
+import org.junit.Test;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+		int[] dest =new int[origin.length];
+		for(int i=0;i<origin.length;i++){
+			dest[origin.length-1-i]=origin[i];
+		}
+		return dest;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   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){
+		StringBuilder sb=new StringBuilder();
+		for (int i : oldArray) {
+			if(i!=0){
+				sb.append(i+",");
+			}
+		}
+		String[] strArr = sb.toString().split("[,]");
+		
+		return strArr2IntArr(strArr);
+	}
+	
+	private static int[] strArr2IntArr(String[] strArr){
+		int[] dest = new int[strArr.length];
+		for (int i=0;i<strArr.length;i++) {
+			dest[i]=Integer.parseInt(strArr[i]);
+		}
+		return dest;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int[] array3=new int[array1.length+array2.length];
+		int j=0;
+		if(isArrayContainElement(array1, 0)||isArrayContainElement(array2, 0)){
+			j++;
+		}
+		
+		for(int i1=0;i1<array1.length;i1++){
+			if(!isArrayContainElement(array3, array1[i1])){
+				array3[j]=array1[i1];
+				j++;
+			}
+		}
+		
+		for(int i2=0;i2<array2.length;i2++){
+			if(!isArrayContainElement(array3, array2[i2])){
+				array3[j]=array2[i2];
+				j++;
+			}
+		}
+		
+		int[] newArr=new int[j];
+		System.arraycopy(array3, 0, newArr, 0, j);
+		return  sort(newArr);
+	}
+	
+	private static boolean isArrayContainElement(int[] arr,int element){
+		for (int i : arr) {
+			if(i==element){
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public static int[] sort(int[] arr){
+		for(int i=0;i<arr.length-1;i++){
+			for(int j=i+1;j<arr.length;j++){
+				if(arr[i]>arr[j]){
+					int temp=arr[i];
+					arr[i]=arr[j];
+					arr[j]=temp;
+				}
+			}
+		}
+		return arr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArray, 0, newArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		StringBuilder sb=new StringBuilder();
+		
+		if(max==1){
+			return new int[]{};
+		}else{
+			for(int i=1 ;i<2*max;i++){
+				int num = getFibo(i);
+				if(num<max){
+					sb.append(getFibo(i)+",");
+				}
+			}
+			String[] strArr=sb.toString().split("[,]");
+			return strArr2IntArr(strArr);
+		}
+	}
+	
+	private static int getFibo(int i){
+		if(i==1||i==2){
+			return 1;
+		}else{
+			return getFibo(i-1)+getFibo(i-2);
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		int i,n,k=0;
+		StringBuilder sb=new StringBuilder();
+		for(n=2;n<=max;n++){
+			i=2;
+			while(i<n){
+				if(n%i==0){
+					break;
+				}
+				i++;
+			}
+			if(i==n){
+				k++;
+				//System.out.print(i+",");
+				sb.append(i+",");
+			}
+		}
+		String str=sb.toString();
+		String[] strArr=str.split("[,]");
+		return strArr2IntArr(strArr);
+	}
+	
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		StringBuilder sb=new StringBuilder();
+		for(int i=1;i<max;i++){
+			int temp=0;
+			for(int j=1;j<i/2+1;j++){
+				if(i%j==0){
+					temp+=j;
+				}
+			}
+			if(temp==i){
+				//System.out.println(i+",");
+				sb.append(i+",");
+			}
+		}
+		String[] strArr=sb.toString().split("[,]");
+		return strArr2IntArr(strArr);
+	}
+	
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuilder sb=new StringBuilder();
+		for (int i : array) {
+			sb.append(i+seperator);
+		}
+		String str=sb.toString();
+		return str.substring(0, str.length()-1);
+	}
+	
+
+}
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/LoginAction.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/LoginAction.java
new file mode 100644
index 0000000000..38089b3813
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.easy.codersing.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/Struts.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/Struts.java
new file mode 100644
index 0000000000..22a2d87921
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/Struts.java
@@ -0,0 +1,99 @@
+package com.easy.codersing.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import com.easy.core.AppUtils;
+
+
+/**
+ * 下面是一段糟糕的代码，有时间在重构下！！！
+ * TODO：抽离三个方法，actin解析方法，view解析方法，jsp映射方法
+ * @author 1744
+ *
+ */
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws Exception {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	SAXReader reader = new SAXReader();
+    	File file =new File("src/main/java/com/easy/codersing/litestruts/struts.xml");
+		Document doc=reader.read(file);
+		Element el_root=doc.getRootElement();
+	 	Iterator it= el_root.elementIterator();
+	 	while(it.hasNext()){
+	 		Object obj=it.next();
+	 		Element el_action = (Element)obj;
+	 		//System.out.println(el_action.attributeValue("name"));
+	 		String el_action_name=el_action.attributeValue("name");
+	 		
+	 		
+	 		if(actionName.equals(el_action_name)){
+	 			String el_action_class=el_action.attributeValue("class");
+	 			Class clazz = Class.forName(el_action_class);
+	 			Object actionObj = clazz.newInstance();
+	 			
+	 			for(String map_key:parameters.keySet()){
+	 				String set_method_name = "set"+AppUtils.fistLetterToUpper(map_key);
+	 				Method set_method =clazz.getMethod(set_method_name, String.class);
+	 				set_method.invoke(actionObj,parameters.get(map_key));
+	 			}
+	 			
+	 			Method execute_method = clazz.getMethod("execute");
+	 			String execute_result = (String)execute_method.invoke(actionObj);
+	 			
+	 			Method get_message_method = clazz.getMethod("getMessage");
+	 			String get_message_result=(String)get_message_method.invoke(actionObj);
+	 			
+	 			Map<String, String> map=new HashMap<String,String>();
+	 			map.put("message", get_message_result);
+	 			
+	 			View view =new View();
+	 			view.setParameters(map);
+	 			
+	 			Iterator it_result = el_action.elementIterator();
+	 			while(it_result.hasNext()){
+	 				Element el_result =(Element)it_result.next();
+	 				if(el_result.attributeValue("name").equals(execute_result)){
+	 					view.setJsp(el_result.getText());
+	 				}
+	 			}
+	 			
+	 			return view;
+	 			
+	 			
+	 		}
+	 	}
+    	
+    	return null;
+    }    
+    
+  
+    
+
+}
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..2d167cce90
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.easy.codersing.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws Exception {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java
new file mode 100644
index 0000000000..df78950609
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java
@@ -0,0 +1,85 @@
+package com.easy.codersing.litestruts;
+
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class TestApp {
+	public static void test1() throws Exception {
+		SAXReader reader = new SAXReader();
+		File file =new File("src/main/java/com/easy/codersing/litestruts/struts.xml");
+		//System.out.println(file.exists());
+		Document doc=reader.read(file);
+		List actions = doc.selectNodes("//*[@name]");
+		for(Iterator it=actions.iterator();it.hasNext();){
+			Element action = (Element)it.next();
+			List list=action.attributes();
+			for(Iterator it2=list.iterator();it2.hasNext();){
+				Attribute a=(Attribute)it2.next();
+				System.out.println(a.getName()+"="+a.getValue());
+			}
+		}
+		
+	}
+	
+	public static void main(String[] args) throws Exception {
+	/*	Map<String, String> map=new HashMap<>();
+		map.put("name", "test");
+		map.put("password", "1234");
+		
+		for (String s : map.keySet()) {
+			System.out.println(s);
+			System.out.println(map.get(s));
+		}*/
+		
+		
+		
+		SAXReader reader = new SAXReader();
+		File file =new File("src/main/java/com/easy/codersing/litestruts/struts.xml");
+		Document doc=reader.read(file);
+		Element el_root=doc.getRootElement();
+	 	Iterator it= el_root.elementIterator();
+	 	while(it.hasNext()){
+	 		Object obj=it.next();
+	 		Element el_action = (Element)obj;
+	 		//System.out.println(el_action.attributeValue("name"));
+	 		//System.out.println(el_action.attributeValue("class"));
+	 		
+	 		Iterator it_row=el_action.elementIterator();
+	 		if(el_action.attributeValue("name").equals("login")){
+	 			while(it_row.hasNext()){
+	 				Element el_result=(Element)it_row.next();
+	 				System.out.println(el_result.attributeValue("name"));
+	 				System.out.println(el_result.getText());
+	 				
+	 			}
+	 		}
+	 	}
+	 	
+		
+		
+	}
+	
+	public static void test3(String[] args) throws Exception {
+		Class clazz = Class.forName("com.easy.codersing.litestruts.LoginAction");
+		Object obj=clazz.newInstance();
+		
+		Method method1 =clazz.getMethod("setName",String.class);
+		method1.invoke(obj, "张三");
+		
+		Method method2 = clazz.getMethod("getName",null);
+		Object result = method2.invoke(obj);
+		System.out.println(result);
+		
+	}
+}	
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java
new file mode 100644
index 0000000000..8c44204849
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.easy.codersing.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml
new file mode 100644
index 0000000000..2d1ab0da83
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="com.easy.codersing.litestruts.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+	<action name="logout" class="com.easy.codersing.litestruts.LoginAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java b/group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java
new file mode 100644
index 0000000000..e0b216553e
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java
@@ -0,0 +1,13 @@
+package com.easy.core;
+
+public class AppUtils {
+	public static String fistLetterToUpper(String words){
+		String letter = words.substring(0,1).toUpperCase();
+		return letter+words.substring(1,words.length());
+	}
+	
+	public static void main(String[] args) {
+		String s="abc";
+		System.out.println(fistLetterToUpper(s));
+	}
+}
diff --git a/group07/178007127/001DataStructure/src/test/java/com/easy/codersing/array/TestArrayUtil.java b/group07/178007127/001DataStructure/src/test/java/com/easy/codersing/array/TestArrayUtil.java
new file mode 100644
index 0000000000..a0477fb798
--- /dev/null
+++ b/group07/178007127/001DataStructure/src/test/java/com/easy/codersing/array/TestArrayUtil.java
@@ -0,0 +1,67 @@
+package com.easy.codersing.array;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class TestArrayUtil {
+	@Test
+	public void test_reverseArray(){
+		int[] origin =new int[]{1,2,3};
+		int[] dest =ArrayUtil.reverseArray(origin);
+		Assert.assertArrayEquals(new int[]{3,2,1}, dest);
+	}
+	
+	@Test
+	public void test_removeZero(){
+		int[] origin=new int[]{1,0,2,0,3,0};
+		int[] dest = ArrayUtil.removeZero(origin);
+		Assert.assertArrayEquals(new int[]{1,2,3}, dest);
+	}
+	
+	@Test
+	public void test_merge(){
+		int[] array1=new int[]{4,0,6,2};
+		int[] array2=new int[]{7,0,9,2,3};
+	    int[] array3=ArrayUtil.merge(array1, array2);
+	    //System.out.println(Arrays.toString(array3));
+	    Assert.assertArrayEquals(new int[]{0, 2, 3, 4, 6, 7, 9}, array3);
+	}
+	
+	@Test
+	public void test_sort(){
+		int[] arr=new int[]{4,6,2};
+		arr = ArrayUtil.sort(arr);
+		//System.out.println(Arrays.toString(arr));
+		Assert.assertArrayEquals(new int[]{2,4,6},arr);
+	}
+	
+	
+	@Test
+	public void test_getfabonacci(){
+		int max=15;
+		int[] intArr=ArrayUtil.fibonacci(max);
+		//System.out.println(Arrays.toString(intArr));
+		Assert.assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, intArr);
+	}
+	
+	@Test
+	public void test_getPrimes(){
+		int[] intArr =ArrayUtil.getPrimes(16);
+		Assert.assertArrayEquals(new int[]{2,3,5,7,11,13}, intArr);
+	}
+	
+	@Test
+	public void test_getPerfectNumbers(){
+		int[] intArr =ArrayUtil.getPerfectNumbers(10);
+		Assert.assertArrayEquals(new int[]{6}, intArr);
+	}
+	
+	@Test
+	public void test_join(){
+		int[] intArr=new int[]{1,2,3};
+		String s=ArrayUtil.join(intArr, "-");
+		Assert.assertEquals("1-2-3", s);
+	}
+}
diff --git a/group07/20409287/src/main/java/xdx/homework/first/ArrayList.java b/group07/20409287/src/main/java/xdx/homework/first/ArrayList.java
index b7ffc73d07..f8757c9a68 100644
--- a/group07/20409287/src/main/java/xdx/homework/first/ArrayList.java
+++ b/group07/20409287/src/main/java/xdx/homework/first/ArrayList.java
@@ -32,9 +32,9 @@ public boolean add(E e) {
 
         if (++position > size - 1) {
             grow();
-        } else {
-            elements[position] = e;
         }
+        elements[position] = e;
+
         return true;
     }
 
@@ -169,8 +169,10 @@ public Iterator<E> iterator() {
      * 数组增长
      */
     private void grow() {
-        Object[] newElements = new Object[size << 2];
-        System.arraycopy(elements, 0, elements, 0, this.size);
+
+        Object[] newElements = new Object[size << 1];
+        System.arraycopy(elements, 0, newElements, 0, this.size);
+        size = size << 1;
         elements = null;
         elements = newElements;
     }
diff --git a/group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java b/group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java
new file mode 100644
index 0000000000..2fa1237dbb
--- /dev/null
+++ b/group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java
@@ -0,0 +1,221 @@
+package xdx.homework.second.array;
+
+import xdx.homework.first.ArrayList;
+import xdx.homework.first.List;
+import xdx.homework.first.Queue;
+import xdx.homework.first.Stack;
+
+import java.util.Arrays;
+
+import static java.lang.StrictMath.sqrt;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+
+        int end = origin.length - 1;
+        for (int begin = 0; begin < end; begin++, end--) {
+            // 交换首尾
+            origin[begin] = origin[begin] ^ origin[end];
+            origin[end] = origin[begin] ^ origin[end];
+            origin[begin] = origin[begin] ^ origin[end];
+        }
+    }
+
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+
+        int[] newArray = new int[oldArray.length];
+        int newArrayIndex = 0;
+        int i = 0;
+        for (; i < oldArray.length; i++) {
+            if (oldArray[i] == 0) continue;
+            newArray[newArrayIndex++] = oldArray[i];
+        }
+        return Arrays.copyOfRange(newArray, 0, newArrayIndex);
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+
+        // 分别放进两个栈中,取小的出栈
+        Queue<Integer> queue1 = new Queue<>();
+        Queue<Integer> queue2 = new Queue<>();
+        ArrayList<Integer> newArray = new ArrayList<>();
+        for (int a : array1) {
+            queue1.enQueue(a);
+        }
+        for (int a : array2) {
+            queue2.enQueue(a);
+        }
+        while (!queue1.isEmpty() && !queue2.isEmpty()) {
+            if (queue1.getFront() < queue2.getFront()) {
+                newArray.add(queue1.deQueue());
+            } else if (queue1.getFront() > queue2.getFront()) {
+                newArray.add(queue2.deQueue());
+            } else {
+                newArray.add(queue2.deQueue());
+                queue1.deQueue();
+            }
+        }
+        while (!queue1.isEmpty()) newArray.add(queue1.deQueue());
+        while (!queue2.isEmpty()) newArray.add(queue2.deQueue());
+
+        int[] retArray = new int[newArray.size()];
+        for (int i = 0; i < newArray.size(); i++) {
+            retArray[i] = newArray.get(i);
+        }
+        return retArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+
+        int[] newArray = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+
+        int first = 1;
+        int second = 1;
+        if (max == 0) return new int[]{0};
+        if (max == 1) return new int[]{first, second};
+
+        List<Integer> fibList = new ArrayList<>();
+        fibList.add(first);
+        fibList.add(second);
+        int last = first + second;
+        while (last < max) {
+            fibList.add(last);
+            first = second;
+            second = last;
+            last = first + second;
+        }
+
+        return list2array(fibList);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+
+        if (max < 2) return new int[]{};
+        if (max == 2) return new int[]{2};
+
+        List<Integer> primeList = new ArrayList<>();
+        primeList.add(2);
+        for (int i = 3; i <= max; i += 2) {
+            // 判断i是不是素数
+            boolean isPrime = true;
+            for (int j = 2; j <= Math.sqrt(i); j++) {
+                if (i % j == 0) isPrime = false;
+            }
+            if (isPrime) primeList.add(i);
+        }
+
+        return list2array(primeList);
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+
+        if (max < 1) return new int[]{};
+
+        List<Integer> perfectNums = new ArrayList<>();
+
+        for (int aPerfectNum = 1; aPerfectNum <= max; aPerfectNum++) {
+            int sumFactors = 1;
+            for (int factor = 2; factor <= aPerfectNum / 2; factor++) {
+                if (aPerfectNum % factor == 0) {
+                    sumFactors += factor;
+                }
+            }
+            if (sumFactors == aPerfectNum) perfectNums.add(aPerfectNum);
+        }
+
+        return list2array(perfectNums);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int a : array) {
+            stringBuilder.append(a).append(seperator);
+        }
+        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+        return stringBuilder.toString();
+    }
+
+    private int[] list2array(List<Integer> list) {
+        int[] array = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
+
+}
diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java
new file mode 100644
index 0000000000..f59067088b
--- /dev/null
+++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java
@@ -0,0 +1,41 @@
+package xdx.homework.second.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author liuxin
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java
new file mode 100644
index 0000000000..0ba4f85313
--- /dev/null
+++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java
@@ -0,0 +1,149 @@
+package xdx.homework.second.litestruts;
+
+import org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Executable;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+    private static Map<String, LoginAction> actionMap;
+
+    private static Map<String, Map<String, String>> actionResultMap;
+
+    private static void init() {
+
+        if (actionMap != null) return;
+
+        actionMap = new HashMap<>();
+        actionResultMap = new HashMap<>();
+        Document strutsDocument = getDocumentFromFile();
+        if (strutsDocument == null) throw new RuntimeException("xml文件读取错误,请检查文件路径是否正确!");
+
+        try {
+            NodeList nodeList = strutsDocument.getFirstChild().getChildNodes();
+            for (int i = 0; i < nodeList.getLength(); i++) {
+                if (nodeList.item(i).getNodeType() != 1) continue;
+                Element child = (Element) nodeList.item(i);
+                Class actionClass = Class.forName(child.getAttribute("class"));
+                actionMap.put(child.getAttribute("name"), (LoginAction) actionClass.newInstance());
+
+                NodeList resultList = child.getElementsByTagName("result");
+                Map<String, String> params = new HashMap<>();
+                for (int j = 0; j < resultList.getLength(); j++) {
+                    Element result = (Element) resultList.item(j);
+                    params.put(result.getAttribute("name"), result.getTextContent());
+                }
+                actionResultMap.put(child.getAttribute("name"), params);
+            }
+
+        } catch (ClassNotFoundException e) {
+            System.out.println(e.getMessage());
+            throw new RuntimeException("xml文件内容有误!");
+        } catch (InstantiationException | IllegalAccessException e) {
+            System.out.println(e.getMessage());
+            throw new RuntimeException("无法创建接口或者抽象类的实例!");
+        }
+    }
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        // 读取struts文件并初始化相关类
+        init();
+
+        // 根据actionName找到相对应的class
+        LoginAction loginAction = actionMap.get(actionName);
+        if (loginAction == null) {
+            System.out.println("找不到该action: " + actionName);
+            return null;
+        }
+
+        View view = new View();
+        // 据parameters中的数据调用相应的方法
+        Class clazz = loginAction.getClass();
+        try {
+            for (String key : parameters.keySet()) {
+                String value = parameters.get(key);
+                if (value == null || value.isEmpty()) continue;
+                PropertyDescriptor descriptor = new PropertyDescriptor(key, clazz);
+                descriptor.getWriteMethod().invoke(loginAction, value);
+            }
+            // 调用对象的exectue方法， 并获得返回值
+            String executeReturn = loginAction.execute();
+            // 通过反射找到对象的所有getter方法, 把值和属性形成一个HashMap ,放到View对象的parameters
+            PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
+            HashMap<String, String> params = new HashMap<>();
+            for (PropertyDescriptor pd : pds) {
+                params.put(pd.getName(), pd.getReadMethod().invoke(loginAction).toString());
+            }
+            view.setParameters(params);
+            // 确定哪一个jsp
+            view.setJsp(actionResultMap.get(actionName).get(executeReturn));
+        } catch (IntrospectionException e) {
+            e.printStackTrace();
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        return view;
+    }
+
+
+    private static Document getDocumentFromFile() {
+
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        Document document = null;
+        try {
+            URL fileURL = Struts.class.getResource("struts.xml");
+            DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
+            document = documentBuilder.parse(new File(fileURL.getFile()));
+        } catch (ParserConfigurationException e) {
+            System.out.println("配置转化异常: " + e.getMessage());
+        } catch (SAXException e) {
+            System.out.println("SAX读取异常: " + e.getMessage());
+        } catch (IOException e) {
+            System.out.println("IO异常: " + e.getMessage());
+        }
+        return document;
+    }
+
+}
diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a56eec5e28
--- /dev/null
+++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java
@@ -0,0 +1,42 @@
+package xdx.homework.second.litestruts;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java
new file mode 100644
index 0000000000..0d7f02f86b
--- /dev/null
+++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java
@@ -0,0 +1,23 @@
+package xdx.homework.second.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml b/group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml
new file mode 100644
index 0000000000..da4d783426
--- /dev/null
+++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="xdx.homework.second.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="xdx.homework.second.litestruts.LoginAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java b/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java
index 2c71401873..d19cdb3dec 100644
--- a/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java
+++ b/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java
@@ -38,9 +38,14 @@ public void after() throws Exception {
     public void testAdd() throws Exception {
 
         List<Integer> testList = new ArrayList<>();
-        Assert.assertTrue(testList.add(1));
-        Assert.assertTrue(testList.add(2));
-        Assert.assertTrue(testList.add(3));
+        final int NUM = 1000000;
+        for (Integer i = 0; i < NUM; i++) {
+            testList.add(i);
+        }
+        for (Integer i = 0; i < NUM; i++) {
+            Assert.assertEquals(i, testList.get(i));
+        }
+        Assert.assertEquals(NUM, testList.size());
         System.out.println(testList.toString());
     }
 
diff --git a/group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java b/group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java
new file mode 100644
index 0000000000..ffafc94f7d
--- /dev/null
+++ b/group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java
@@ -0,0 +1,157 @@
+package xdx.homework.second;
+
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.After;
+import org.testng.Assert;
+import xdx.homework.second.array.ArrayUtil;
+
+import java.util.Arrays;
+
+/**
+ * ArrayUtil Tester.
+ *
+ * @author <Authors name>
+ * @since <pre>���� 4, 2017</pre>
+ * @version 1.0
+ */
+public class ArrayUtilTest {
+
+    ArrayUtil arrayUtil = new ArrayUtil();
+
+    @Before
+    public void before() throws Exception {
+    }
+
+    @After
+    public void after() throws Exception {
+    }
+
+    /**
+     *
+     * Method: reverseArray(int[] origin)
+     *
+     */
+    @Test
+    public void testReverseArray() throws Exception {
+
+        int[] array = {1,2,3,4,5,6,7,8,9};
+        System.out.println("===================数组反转开始===================");
+        System.out.println("原数组: " + Arrays.toString(array));
+        arrayUtil.reverseArray(array);
+        System.out.println("反转后的数组: " + Arrays.toString(array));
+        System.out.println("===================数组反转结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: removeZero(int[] oldArray)
+     *
+     */
+    @Test
+    public void testRemoveZero() throws Exception {
+
+        System.out.println("===================数组清零开始===================");
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        System.out.println("原数组: " + Arrays.toString(oldArr));
+        System.out.println("清零后的数组: " + Arrays.toString(arrayUtil.removeZero(oldArr)));
+        System.out.println("===================数组清零结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: merge(int[] array1, int[] array2)
+     *
+     */
+    @Test
+    public void testMerge() throws Exception {
+
+        System.out.println("===================数组合并开始===================");
+        int[] array1 = {1,2,4,5};
+        int[] array2 = {3,4,5,6,7,8,9};
+        System.out.println("原数组1: " + Arrays.toString(array1));
+        System.out.println("原数组2: " + Arrays.toString(array2));
+        int[] mergedArray = arrayUtil.merge(array1, array2);
+        System.out.println("合并后的数组: " + Arrays.toString(mergedArray));
+        System.out.println("===================数组合并结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: grow(int [] oldArray, int size)
+     *
+     */
+    @Test
+    public void testGrow() throws Exception {
+
+        System.out.println("===================数组增长开始===================");
+        int[] array2 = {3,4,5,6,7,8,9};
+        final int GROW_SIZE = 5;
+        int[] growArray = arrayUtil.grow(array2, GROW_SIZE);
+        Assert.assertEquals(array2.length + GROW_SIZE, growArray.length);
+        System.out.println("原数组: " + Arrays.toString(array2));
+        System.out.println("增长" + GROW_SIZE + "个单位后的数组: " + Arrays.toString(growArray));
+        System.out.println("===================数组增长结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: fibonacci(int max)
+     *
+     */
+    @Test
+    public void testFibonacci() throws Exception {
+
+        System.out.println("===================斐波那契数列开始===================");
+        final int MAX = 10000000;
+        System.out.println(MAX + "以内的斐波那契数列: " + Arrays.toString(arrayUtil.fibonacci(MAX)));
+        System.out.println("===================斐波那契数列结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: getPrimes(int max)
+     *
+     */
+    @Test
+    public void testGetPrimes() throws Exception {
+
+        System.out.println("===================素数计算开始===================");
+        final int MAX = 10000;
+        System.out.println(MAX + "以内的素数: " + Arrays.toString(arrayUtil.getPrimes(MAX)));
+        System.out.println("===================素数计算结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: getPerfectNumbers(int max)
+     *
+     */
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+
+        System.out.println("===================计算完美数列结束===================");
+        final int MAX = 10000;
+        System.out.println(MAX + "以内的完数分别是: " + Arrays.toString(arrayUtil.getPerfectNumbers(MAX)));
+        System.out.println("===================计算完美数列结束===================" + "\n");
+    }
+
+    /**
+     *
+     * Method: join(int[] array, String seperator)
+     *
+     */
+    @Test
+    public void testJoin() throws Exception {
+
+        System.out.println("===================数组分隔开始===================");
+        int[] array2 = {3,4,5,6,7,8,9};
+        final String SEP = "-";
+        System.out.println("原数组: " + Arrays.toString(array2));
+        System.out.println("分隔符: " + SEP);
+        System.out.println("分隔后的数组: " + arrayUtil.join(array2, SEP));
+        System.out.println("===================数组分隔结束===================" + "\n");
+    }
+
+
+}
diff --git a/group07/43819473/homework/pom.xml b/group07/43819473/homework/pom.xml
index b4c8775d15..e9da2d1a08 100644
--- a/group07/43819473/homework/pom.xml
+++ b/group07/43819473/homework/pom.xml
@@ -21,6 +21,16 @@
             <artifactId>fastjson</artifactId>
             <version>1.2.7</version>
         </dependency>
-
+        <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+        <dependency>
+            <groupId>jaxen</groupId>
+            <artifactId>jaxen</artifactId>
+            <version>1.1.1</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java b/group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..8ef221c5cf
--- /dev/null
+++ b/group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java
@@ -0,0 +1,238 @@
+package coderising.array;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public static int[] reverseArray(int[] origin) {
+        int[] result = new int[origin.length];
+        for (int i = 0; i <= origin.length - 1; i++) {
+            result[i] = origin[origin.length - 1 - i];
+        }
+        return result;
+    }
+
+    /**
+     * 现在有如下的一个数组：   int origin[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param origin
+     * @return
+     */
+
+    public static int[] removeZero(int[] origin) {
+        int[] tempArray = new int[origin.length];
+        int j = 0;
+        for (int i = 0; i <= origin.length - 1; i++) {
+            if (origin[i] != 0) {
+                tempArray[j++] = origin[i];
+            }
+        }
+
+        int[] result = new int[j];
+        System.arraycopy(tempArray, 0, result, 0, j);
+        return result;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public static int[] merge(int[] array1, int[] array2) {
+        if (array1.length == 0) {
+            return array2;
+        }
+        if (array2.length == 0) {
+            return array1;
+        }
+        int[] tempArray = new int[array1.length + array2.length];
+        int currentSize = array1.length;
+        System.arraycopy(array1, 0, tempArray, 0, array1.length);
+        for (int i = 0; i <= array2.length - 1; i++) {
+            for (int j = 0; j <= currentSize - 1; j++) {
+                if (array2[i] == tempArray[j]) {
+                    break;
+                } else if (array2[i] < tempArray[j]) {
+                    System.arraycopy(tempArray, j, tempArray, j + 1, currentSize - j);
+                    tempArray[j] = array2[i];
+                    currentSize++;
+                    break;
+                }
+                if (j == currentSize - 1) {
+                    tempArray[j + 1] = array2[i];
+                    currentSize++;
+                    break;
+                }
+            }
+        }
+
+        int[] result = new int[currentSize];
+        System.arraycopy(tempArray, 0, result, 0, currentSize);
+        return result;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public static int[] grow(int[] oldArray, int size) {
+        int[] result = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, result, 0, oldArray.length);
+        return result;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public static int[] fibonacci(int max) {
+        if (max <= 1) {
+            return new int[]{};
+        }
+
+        int[] temp = new int[max];
+        temp[0] = 1;
+        temp[1] = 1;
+
+        int i = 2;
+        while (i >= 2) {
+            int last = temp[i - 1] + temp[i - 2];
+            if (last < max) {
+                temp[i++] = last;
+            } else {
+                break;
+            }
+        }
+
+        int[] result = new int[i];
+        System.arraycopy(temp, 0, result, 0, i);
+        return result;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPrimes(int max) {
+        if (max <= 2) {
+            return new int[]{};
+        } else if (max == 3) {
+            return new int[]{2};
+        } else {
+            int[] temp = new int[max / 2 + 1];
+            temp[0] = 2;
+            int resultSize = 1;
+
+            for (int i = 3; i < max; i += 2) {
+                boolean isPrime = true;
+                for (int j = 0; j <= resultSize - 1; j++) {
+                    if (i % temp[j] == 0) {
+                        isPrime = false;
+                        break;
+                    }
+                }
+                if (isPrime) {
+                    temp[resultSize++] = i;
+                }
+            }
+            int[] result = new int[resultSize];
+            System.arraycopy(temp, 0, result, 0, resultSize);
+
+            return result;
+        }
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPerfectNumbers(int max) {
+        int[] tempResult = new int[max];
+        int resultSize = 0;
+
+        //对小于max的值逐个循环判断
+        for (int i = 2; i < max; i++) {
+//            System.out.println("==="+i);
+            int[] factors = new int[max];//因子数组
+            factors[0] = 1;
+            int factorSize = 1;
+
+            //获取因子
+            for (int j = 2; j < i / 2 + 1; j++) {
+                if (i % j == 0) {
+                    factors[factorSize++] = j;
+                }
+            }
+
+            //计算因子数组的和是否与当前值相等，相等则放入结果数组中
+            if (factorSize > 1) {
+                int sumValue = 0;
+                for (int factorIndex = 0; factorIndex <= factorSize - 1; factorIndex++) {
+                    sumValue += factors[factorIndex];
+                }
+                if (sumValue == i) {
+                    tempResult[resultSize++] = i;
+                }
+            }
+        }
+
+        int[] result = new int[resultSize];
+        System.arraycopy(tempResult, 0, result, 0, resultSize);
+        return result;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public static String join(int[] array, String seperator) {
+        int size = array.length;
+        String result = "";
+        if (size > 0) {
+            if (size == 1) {
+                result = String.valueOf(array[0]);
+            } else {
+                for (int i = 0; i < array.length - 1; i++) {
+                    result += String.valueOf(array[i]) + seperator;
+                }
+                result += String.valueOf(array[array.length - 1]);
+            }
+        }
+
+        return result;
+    }
+
+}
diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java b/group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..c528df798a
--- /dev/null
+++ b/group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java b/group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..c2b2ccad51
--- /dev/null
+++ b/group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java
@@ -0,0 +1,95 @@
+package coderising.litestruts;
+
+import org.dom4j.*;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+
+    /*
+    0. 读取配置文件struts.xml
+     1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+    据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+    ("name"="test" ,  "password"="1234") ,
+    那就应该调用 setName和setPassword方法
+    2. 通过反射调用对象的execute 方法， 并获得返回值，例如"success"
+    3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+    通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+    放到View对象的parameters
+    4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+    放到View对象的jsp字段中。
+    */
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        SAXReader reader = new SAXReader();
+        View view = new View();
+
+        try {
+            //读取xml，获取class，获取对象
+            Document document = reader.read(new File("src\\main\\java\\coderising\\litestruts\\struts.xml"));
+            Node node = document.selectSingleNode("//struts/action[@name='" + actionName + "']");
+            Element element = (Element) node;
+            String className = element.attribute("class").getText();
+            Class<?> clazz = Class.forName(className);
+            Object object = clazz.newInstance();
+
+            //调用set方法设置属性
+            for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1);
+                Method method = clazz.getMethod(methodName, entry.getValue().getClass());
+                method.invoke(object, entry.getValue());
+            }
+
+            //调用exectue 方法， 并获得返回值
+            Method methodExecute = clazz.getMethod("execute");
+            String executeResult = methodExecute.invoke(object).toString();
+
+            //找到所有getter，调用并将值放到resultMap中
+            Map<String, String> resultMap = new HashMap<String, String>();
+            Method[] getMethods = clazz.getMethods();
+            for (Method getMethod : getMethods) {
+                int index = getMethod.toString().lastIndexOf(".");
+                String pureName = getMethod.toString().substring(index + 1);
+                if (pureName.startsWith("get")) { //eg. getName()
+                    String tempStr= pureName.substring(3); //eg. Name()
+                    String attributeName = tempStr.substring(0, 1).toLowerCase() + tempStr.substring(1, tempStr.length() - 2); //eg. name
+                    String attributeResult = getMethod.invoke(object).toString();
+                    resultMap.put(attributeName, attributeResult);
+                }
+            }
+
+            //组装返回对象
+            Node resultNode = node.selectSingleNode("result[@name='" + executeResult + "']");
+            String resultTarget = resultNode.getText();
+            view.setJsp(resultTarget).setParameters(resultMap);
+
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } finally {
+            return view;
+        }
+    }
+
+    public static void main(String[] args) {
+
+    }
+
+}
diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java b/group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..024b5f196f
--- /dev/null
+++ b/group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/View.java b/group07/43819473/homework/src/main/java/coderising/litestruts/View.java
new file mode 100644
index 0000000000..22fdf877d8
--- /dev/null
+++ b/group07/43819473/homework/src/main/java/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml b/group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..57ad66abd0
--- /dev/null
+++ b/group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java b/group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..a19eb84269
--- /dev/null
+++ b/group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,81 @@
+package coderising.array;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by zj on 2017/3/4.
+ */
+public class ArrayUtilTest {
+    @Before
+    public void setUp() throws Exception {
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        Assert.assertArrayEquals(new int[]{3, 30, 9, 7}, ArrayUtil.reverseArray(new int[]{7, 9, 30, 3}));
+        Assert.assertArrayEquals(new int[]{6, 3, 30, 9, 7}, ArrayUtil.reverseArray(new int[]{7, 9, 30, 3, 6}));
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        Assert.assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5},
+                ArrayUtil.removeZero(new int[]{1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}));
+    }
+
+    @Test
+    public void merge() throws Exception {
+        Assert.assertArrayEquals(new int[]{}, ArrayUtil.merge(new int[]{}, new int[]{}));
+        Assert.assertArrayEquals(new int[]{1, 2}, ArrayUtil.merge(new int[]{}, new int[]{1, 2}));
+        Assert.assertArrayEquals(new int[]{1, 2}, ArrayUtil.merge(new int[]{1, 2}, new int[]{}));
+        Assert.assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, ArrayUtil.merge(new int[]{3, 5, 7, 8}, new int[]{4, 5, 6, 7}));
+        Assert.assertArrayEquals(new int[]{2, 3, 5, 6, 7, 8, 9}, ArrayUtil.merge(new int[]{3, 5, 7, 8}, new int[]{2, 5, 6, 9}));
+        Assert.assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, ArrayUtil.merge(new int[]{4, 5, 6, 7}, new int[]{3, 5, 7, 8}));
+        Assert.assertArrayEquals(new int[]{2, 3, 5, 6, 7, 8, 9}, ArrayUtil.merge(new int[]{2, 5, 6, 9}, new int[]{3, 5, 7, 8}));
+    }
+
+    @Test
+    public void grow() throws Exception {
+        Assert.assertArrayEquals(new int[]{2, 3, 6, 0, 0, 0}, ArrayUtil.grow(new int[]{2, 3, 6}, 3));
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        Assert.assertArrayEquals(new int[]{}, ArrayUtil.fibonacci(1));
+        Assert.assertArrayEquals(new int[]{1, 1}, ArrayUtil.fibonacci(2));
+        Assert.assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, ArrayUtil.fibonacci(15));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        Assert.assertArrayEquals(new int[]{}, ArrayUtil.getPrimes(2));
+        Assert.assertArrayEquals(new int[]{2}, ArrayUtil.getPrimes(3));
+        Assert.assertArrayEquals(new int[]{2, 3}, ArrayUtil.getPrimes(4));
+        Assert.assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13, 17, 19}, ArrayUtil.getPrimes(23));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        Assert.assertArrayEquals(new int[]{6,28}, ArrayUtil.getPerfectNumbers(100));
+//        System.out.println(Arrays.toString(ArrayUtil.getPerfectNumbers(40000000)));
+    }
+
+    @Test
+    public void join() throws Exception {
+        Assert.assertEquals("", ArrayUtil.join(new int[]{}, "-"));
+        Assert.assertEquals("3", ArrayUtil.join(new int[]{3}, "-"));
+        Assert.assertEquals("3-8-9", ArrayUtil.join(new int[]{3, 8, 9}, "-"));
+    }
+}
\ No newline at end of file
diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java
new file mode 100644
index 0000000000..fe9f8835f3
--- /dev/null
+++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java
@@ -0,0 +1,131 @@
+package com.coding.refactor.List;
+
+public class MyArrayList<T> implements MyList<T>{
+	private int size = 0;
+	private Object[] dataArray = new Object[0];
+	
+	@Override
+	public int size() {
+		return size;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	@Override
+	public void add(T o) {
+		ensureCapacity(size + 1);
+		dataArray[size++] = o;
+	}
+
+	@Override
+	public void add(int index, T o) {
+		if(index < 0 || index >= size){
+			throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
+		}
+		
+		ensureCapacity(size + 1);
+		System.arraycopy(dataArray, index, dataArray, index + 1, size - index);
+		dataArray[index] = o;
+	}
+
+	@Override
+	public boolean contains(Object o) {
+		for(Object ele : dataArray){
+			if(o.equals(ele)){
+				return true;
+			}
+		}
+		return false;
+	}
+
+	@Override
+	public Object[] toArray() {
+		Object[] newArray = new Object[size];
+		System.arraycopy(dataArray, 0, newArray, 0, size);
+		return newArray;
+	}
+
+	@Override
+	public boolean remove(T o) {
+		int index = indexOf(o);
+		if(index < 0){
+			return false;
+		}
+		System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index);
+		dataArray[--size] = null;
+		return true;
+	}
+
+	@Override
+	public T remove(int index) {
+		if(index < 0 || index >= size){
+			throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
+		}
+		
+		T ele = (T)dataArray[index];
+		System.arraycopy(dataArray, index, dataArray, index+1, size-1-index);
+		dataArray[--size] = null; 
+		return ele;
+	}
+
+	@Override
+	public T get(int index) {
+		if(index < 0 || index >= size){
+			throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
+		}
+		T ele = (T)dataArray[index];
+		return ele;
+	}
+	
+	@Override
+	public T set(int index, T element) {
+		if(index < 0 || index >= size){
+			throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
+		}
+		dataArray[index] = element;
+		return element;
+	}
+
+	@Override
+	public void clear() {
+		for(int i=0; i<size; i++){
+			dataArray[i] = null;
+		}
+		size = 0;
+		
+	}
+
+	@Override
+	public int indexOf(T o) {
+		for(int i=0; i<dataArray.length; i++){
+			if(o.equals(dataArray[i])){
+				return i;
+			}
+		}
+		return -1;
+	}
+
+	@Override
+	public MyIterator<T> iterator() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	private void ensureCapacity(int minCapacity) {
+		if(minCapacity > dataArray.length){
+			int newCapacity = Math.max(minCapacity, dataArray.length * 2);
+			Object[] newDataArray = new Object[newCapacity];
+			System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length);
+			dataArray = newDataArray;
+		}
+		
+	}
+	
+	private String OutOfBoundsMsg(int index) {
+		return "Index: "+index+", Size: "+size;
+	}
+	
+}
diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java
new file mode 100644
index 0000000000..04b3691d1c
--- /dev/null
+++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java
@@ -0,0 +1,12 @@
+package com.coding.refactor.List;
+
+/**
+ * 
+ * @author nelson
+ *
+ */
+public interface MyIterator<T> {
+	boolean hasNext();
+	
+	T next();
+}
diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java
new file mode 100644
index 0000000000..9daed38086
--- /dev/null
+++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java
@@ -0,0 +1,35 @@
+package com.coding.refactor.List;
+
+/**
+ * 
+ * created by nelson on 2017/03/03
+ *
+ */
+public interface MyList<T> {
+	
+	int size();
+	
+	boolean isEmpty();
+	
+	void add(T o);
+	
+	void add(int index, T o);
+	
+	boolean contains(Object o);
+	
+	Object[] toArray();
+	
+	boolean remove(T o);
+	
+	T remove(int index);
+	
+	T get(int index);
+	
+	T set(int index, T element);
+	
+	void clear();
+	
+	int indexOf(T o);
+	
+	MyIterator<T> iterator();
+}
diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java
new file mode 100644
index 0000000000..dbd5317f9c
--- /dev/null
+++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java
@@ -0,0 +1,11 @@
+package com.coding.refactor.List;
+
+public class TestFile {
+
+	public static void main(String[] args) {
+		int[] a = new int[]{1,2,3,4,5};
+		System.arraycopy(a, 1, a, 2, 3);
+
+	}
+
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtil.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtil.java
new file mode 100644
index 0000000000..0ada6b7ea8
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtil.java
@@ -0,0 +1,260 @@
+package com.LinkedList;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+
+public class LinkedListUtil<T extends Comparable> {
+	private Node<T> head;
+	private Node<T> current;
+	private int size = 0;
+		
+	public void add(T o){
+		if(head == null){
+			head = new Node<T>(o);
+			current = head;
+		}else{
+			Node<T> tmp = new Node<T>(o);
+			current.next = tmp;
+			current = tmp;
+		}
+		size++;
+	}
+	
+	public int[] toIntArray(){
+		if(size == 0) return null;
+		int[] intArray = new int[this.size()];
+		Node<T> tmp = head;
+		for(int i=0; i<size; i++){
+			intArray[i] = (int)tmp.data;
+			tmp = tmp.next;
+		}
+		return intArray;
+	}
+	
+	public void add(int index , Object o){
+		
+	}
+	public Node<T> get(int index){
+		checkBounds(index);
+		if (index == 0) {
+			return head;
+		} else {
+			Node<T> pos = findIndexPosition(index);
+			return pos;
+		}
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public void remove(Node<T> n){
+		Node<T> former = head;
+		while(former.next != n) former = former.next;
+		former.next = n.next;
+		size--;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	
+	public void addLast(Object o){
+		
+	}
+	public Node<T> removeFirst(){
+		if(head == null) return null;
+		Node<T> tmp = head;
+		head = head.next;
+		this.size--;
+		return tmp;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	public void checkBounds(int index) {
+		if (index < 0 || index > size - 1) {
+			// System.out.println("From MyLinkedList: Index out of bounds");
+			throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
+		}
+	}
+	
+	public String OutOfBoundsMsg(int index) {
+		return "Index: " + index + ", Size: " + size;
+	}
+	
+	public Node<T> findIndexPosition(int index) {
+		Node<T> pos = head;
+		for (int i = 0; i < index; i++) {
+			pos = pos.next;
+		}
+		return pos;
+	}
+	
+	
+	private static class Node<T>{
+		T data;
+		Node<T> next;
+		
+		public Node(T o){
+			this.data = o;
+			this.next = null;
+		}
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public void reverse(){		
+		if(head == null) return;
+		Node<T> newHead = head;
+		head = head.next;
+		newHead.next = null;
+		while(head != null){
+			Node<T> tmp = head;
+			head = head.next;
+			tmp.next = newHead;
+			newHead = tmp;
+		}
+		head = newHead;
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public void removeFirstHalf(){
+		int midLen = this.size()/2;
+		for(int i=0; i<midLen; i++){
+			removeFirst();
+		}
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public void remove(int i, int length){
+		if(i < 0 || i >= size) return;
+		if(length < 0 ||length >= size) return;
+		if(i == 0){
+			for(int j=0; j<length; j++){
+				removeFirst();
+			}
+		}else{
+			Node<T> startNode = head;
+			for(int j=0; j<i-1; j++){
+				startNode = startNode.next;
+			}
+			int cnt = 0;
+			Node<T> pointer = startNode;
+			while(cnt<length && pointer != null){
+				pointer = pointer.next;
+				cnt++;
+			}
+			startNode.next = pointer.next;
+			this.size = size - length;
+		}
+		
+	}
+	/**
+	 * 假定当前链表和list均包含已升序排列的整数
+	 * 从当前链表中取出那些list所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public int[] getElements(LinkedList list){
+		Iterator<Integer> it = list.iterator();
+		int[] restArray = new int[list.size()];
+		int cnt = 0;
+		while(it.hasNext()){
+			int index = it.next();
+			restArray[cnt++] = (int)get(index).data;
+		}
+		return restArray;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在list中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public void removeDuplicateValues(){
+		if(head == null) return;
+		Node<T> cur = head.next;
+		Node<T> former = head;
+		while(cur != null){
+			if(former.data.equals(cur.data)){
+				remove(cur);
+				cur = cur.next;
+			}else{
+				former = former.next;
+				cur = cur.next;
+			}
+		}
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public void removeRange(int min, int max){
+		if((int)head.data > min){
+			head = findMaxLocation(head, max);
+		}else{
+			Node<T> former = head;
+			while((int)former.data < min && former != null){
+				former = former.next;
+			}
+			Node<T> behind = findMaxLocation(former.next, max);
+			former.next = behind;
+			
+		}	
+	}
+	
+	public Node<T> findMaxLocation(Node<T> n, int max){
+		Node<T> tmp = n;
+		while((int)tmp.data < max && tmp != null){
+			tmp = tmp.next;
+			size--;
+		}
+		return tmp;
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection(LinkedList list){
+		if(head == null) return list;
+		
+		return null;
+	}
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java
new file mode 100644
index 0000000000..66302fec61
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java
@@ -0,0 +1,139 @@
+package com.LinkedList;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LinkedListUtilTest {
+	LinkedListUtil<Integer> llu;
+	@Before
+	public void setUp() throws Exception {
+		 llu = new LinkedListUtil<Integer>();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverse() {
+		llu.reverse();
+		assertArrayEquals(null, llu.toIntArray());
+		llu.add(3);
+		llu.add(7);
+		llu.add(10);
+		llu.reverse();
+		assertArrayEquals(new int[]{10,7,3}, llu.toIntArray());
+	}
+
+	@Test
+	public void testRemoveFirstHalf() {
+		llu.removeFirstHalf();
+		assertArrayEquals(null, llu.toIntArray());
+		llu.add(2);
+		llu.add(5);
+		llu.add(7);
+		llu.add(8);
+		llu.removeFirstHalf();
+		assertArrayEquals(new int[]{7,8}, llu.toIntArray());
+		llu = new LinkedListUtil<Integer>();
+		llu.add(2);
+		llu.add(5);
+		llu.add(7);
+		llu.add(8);
+		llu.add(10);
+		llu.removeFirstHalf();
+		assertArrayEquals(new int[]{7,8,10}, llu.toIntArray());
+		
+	}
+
+	@Test
+	public void testRemoveIntInt() {
+		llu.add(2);
+		llu.add(5);
+		llu.add(7);
+		llu.add(8);
+		llu.remove(1, 2);
+		assertArrayEquals(new int[]{2,8}, llu.toIntArray());
+	}
+
+	@Test
+	public void testGetElements() {
+		llu.add(11);
+		llu.add(101);
+		llu.add(201);
+		llu.add(301);
+		llu.add(401);
+		llu.add(501);
+		llu.add(601);
+		llu.add(701);
+		llu.add(801);
+		LinkedList<Integer> l = new LinkedList<Integer>();
+		l.add(1);
+		l.add(3);
+		l.add(4);
+		l.add(6);
+		assertArrayEquals(new int[]{101,301,401,601}, llu.getElements(l));
+	}
+
+	@Test
+	public void testSubtract() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testRemoveDuplicateValues() {
+		llu.add(1);
+		llu.add(1);
+		llu.add(2);
+		llu.add(3);
+		llu.add(3);
+		llu.add(5);
+		llu.add(6);
+		llu.add(6);
+		llu.add(8);
+		llu.removeDuplicateValues();
+		assertArrayEquals(new int[]{1,2,3,5,6,8}, llu.toIntArray());
+		
+	}
+
+	@Test
+	public void testRemoveRange() {
+		llu.add(1);
+		llu.add(1);
+		llu.add(2);
+		llu.add(3);
+		llu.add(4);
+		llu.add(5);
+		llu.add(6);
+		llu.add(6);
+		llu.add(8);
+		llu.removeRange(2, 5);
+		assertArrayEquals(new int[]{1,1,2,5,6,6,8}, llu.toIntArray());
+		llu = new LinkedListUtil<Integer>();
+		llu.add(2);
+		llu.add(2);
+		llu.add(2);
+		llu.add(3);
+		llu.add(4);
+		llu.add(5);
+		llu.add(6);
+		llu.add(6);
+		llu.add(8);
+		llu.removeRange(1, 5);
+		assertArrayEquals(new int[]{5,6,6,8}, llu.toIntArray());
+		
+	}
+
+	@Test
+	public void testIntersection() {
+		fail("Not yet implemented");
+	}
+
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java
new file mode 100644
index 0000000000..d18ebabe40
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java
@@ -0,0 +1,40 @@
+package com.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author chenran
+ *
+ */
+public class LoginAction {
+	
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java
new file mode 100644
index 0000000000..1715392c91
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java
@@ -0,0 +1,297 @@
+package com.litestruts;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class Struts {
+	public static View runAction(String actionName, Map<String,String> parameters) {
+		/*
+        
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+		try {
+			String path = "./src/com/litestruts/struts.xml";
+			Document document = readStruts(path);
+			NodeList actionList = document.getElementsByTagName("action");
+			String actionClassName = getActionClassName(actionName, actionList);
+			//System.out.println(actionClassName);
+			Class c = Class.forName(actionClassName);
+			Object o = c.newInstance();
+			String result = executeAction(c, o, actionClassName, parameters);
+			String message = getMessage(c, o);
+			String jsp = getJSP(document, result, actionName, actionList);
+			Map<String, String> m = new HashMap<String,String>();
+			m.put("message", message);
+			View view = new View();
+			view.setJsp(jsp);
+			view.setParameters(m);
+			return view;
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		}   	
+    	return null;
+    }    
+	
+	/**
+	 * get jsp message
+	 * @param document
+	 * @param result
+	 * @param actionName
+	 * @param actionList
+	 * @return
+	 */
+	private static String getJSP(Document document, String result, String actionName, NodeList actionList) {
+		Node actionNode = getactionNode(actionName, actionList);
+		NodeList childNodes = actionNode.getChildNodes();
+		String jsp = getContent(result, childNodes);
+		return jsp;
+	}
+
+	/**
+	 *
+	 * @param result
+	 * @param nodes: nodelist of childNode for action node
+	 * @return
+	 */
+	private static String getContent(String result, NodeList nodes) {
+		String jsp;
+		if(result.equals("success")){
+			jsp = getResultNodeForSuccess(nodes);
+		}else{
+			jsp = getResultNode(result, nodes);
+		}
+		return jsp;
+	}
+	
+	/**
+	 * get the certain result node while result is success
+	 * @param nodes
+	 * @return
+	 */
+	private static String getResultNodeForSuccess(NodeList nodes) {
+		for(int i=0; i<nodes.getLength(); i++){
+			Node node = nodes.item(i);
+			if(node.getNodeType() == Node.ELEMENT_NODE){
+				if(!node.hasAttributes()){
+					//success is default
+					return node.getTextContent();
+				}else{
+					NamedNodeMap attrs = node.getAttributes();
+					for(int j=0; j<attrs.getLength(); j++){
+						Node attr = attrs.item(j);
+						if((attr.getNodeName().toString().equals("name")) && (attr.getNodeValue().toString().equals("success"))){
+							String s = node.getTextContent();
+							return s;
+						}
+					}
+				
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * get the certain result node according to result
+	 * @param result
+	 * @param nodes
+	 * @return
+	 */
+	private static String getResultNode(String result, NodeList nodes) {
+		for(int i=0; i<nodes.getLength(); i++){
+			Node node = nodes.item(i);
+			if(node.getNodeType() == Node.ELEMENT_NODE){
+				NamedNodeMap attrs = node.getAttributes();
+				for(int j=0; j<attrs.getLength(); j++){
+					Node attr = attrs.item(j);
+					if((attr.getNodeName().toString().equals("name")) && (attr.getNodeValue().toString().equals(result))){
+						String s = node.getTextContent();
+						return s;
+					}
+				}
+			}			
+		}
+		return null;
+	}
+
+	/**
+	 * get message from action instance after running execute()
+	 * @param c
+	 * @param o
+	 * @return
+	 */
+	private static String getMessage(Class c, Object o) {
+				try {
+					Method[] methods = c.getMethods();
+					for(Method m : methods){
+						if(m.getName().equalsIgnoreCase("getMessage")){
+							String message = (String)m.invoke(o);
+							return message;
+						}
+					}
+				} catch (IllegalAccessException e) {
+					e.printStackTrace();
+				} catch (IllegalArgumentException e) {
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					e.printStackTrace();
+				}
+		return null;
+	}
+
+	/**
+	 * load struts.xml, return a Document
+	 * @param path
+	 * @return
+	 */
+	public static Document readStruts(String path){
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		try {
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			Document document = db.parse(path);
+			return document;
+		} catch (ParserConfigurationException e) {
+			e.printStackTrace();
+		} catch (SAXException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * get the name of actionClass
+	 * @param actionname
+	 * @param actionList
+	 * @return
+	 */
+	public static String getActionClassName(String actionname, NodeList actionList){
+		Node actionNode = getactionNode(actionname, actionList);//this is the node which name = actionName
+		NamedNodeMap attrs = actionNode.getAttributes();
+		
+		for(int i=0; i<attrs.getLength(); i++){
+			//find class name
+			Node attr = attrs.item(i);
+			if(attr.getNodeName().toString().equals("class")){
+				String s = attr.getNodeValue().toString();
+				return s;
+			}
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * get a certain action Node according to the action name
+	 * @param name
+	 * @param actionList
+	 * @return
+	 */
+	public static Node getactionNode(String classname, NodeList actionList){
+		for(int i=0; i<actionList.getLength(); i++){
+			Node action = actionList.item(i);
+			NamedNodeMap attrs = action.getAttributes();
+			for(int j=0; j<attrs.getLength(); j++){
+				Node attr = attrs.item(j);
+				if((attr.getNodeName().toString().equals("name")) && (attr.getNodeValue().toString().equals(classname))){
+					return action;
+				}
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * run execute() method
+	 * @param c
+	 * @param o
+	 * @param actionClassName
+	 * @param parameters
+	 * @return
+	 */
+	public static String executeAction(Class c, Object o, String actionClassName, Map<String, String> parameters){
+		try {
+			
+			setVar(c, o, parameters);
+			Method m = c.getMethod("execute");
+			String message = (String)m.invoke(o);
+			return message;
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * set variables of action class instance 
+	 * @param c
+	 * @param o
+	 * @param parameters
+	 */
+	public static void setVar(Class c, Object o, Map<String, String> parameters){
+		Method[] methods = c.getMethods();
+		Iterator<Map.Entry<String, String>> entries = parameters.entrySet().iterator();
+		while(entries.hasNext()){
+			Map.Entry<String, String> entry = entries.next();
+			String methodName = "set" + entry.getKey();
+			for(Method m : methods){
+				if(m.getName().equalsIgnoreCase(methodName)){
+					try {
+						m.invoke(o, entry.getValue());
+						//System.out.println(m.getName());
+					} catch (IllegalAccessException e) {
+						e.printStackTrace();
+					} catch (IllegalArgumentException e) {
+						e.printStackTrace();
+					} catch (InvocationTargetException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..8c8fdeda8d
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.litestruts;
+
+import org.junit.Test;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Assert;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java
new file mode 100644
index 0000000000..a7494563ef
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml
new file mode 100644
index 0000000000..daef9740c1
--- /dev/null
+++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/562247675/homework/homework-0305/pom.xml b/group07/562247675/homework/homework-0305/pom.xml
new file mode 100644
index 0000000000..655bab68b6
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+     http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>com.coding2017.group7</groupId>
+        <artifactId>homework</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coding2017.group7</groupId>
+    <artifactId>homework-0305</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java
new file mode 100644
index 0000000000..6e60b10eb9
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java
@@ -0,0 +1,267 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+public final class MyArrayUtil {
+
+    public static void main(String[] args) {
+        int[] reverse1 = {7, 9, 30, 3};
+        int[] reverse2 = {7, 9, 30, 3, 4};
+        reverseArray(reverse1);
+        reverseArray(reverse2);
+        System.out.println("reverseArray: " + Arrays.toString(reverse1) + " " + Arrays.toString(reverse2));
+        int[] removeZero = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        System.out.println("removeZero: " + Arrays.toString(removeZero(removeZero)));
+        int[] merge1 = {3, 5, 7, 8};
+        int[] merge2 = {4, 5, 6, 7};
+        System.out.println("merge: " + Arrays.toString(merge(merge1, merge2)));
+        System.out.println("merge: " + Arrays.toString(merge(merge2, merge1)));
+        int[] grow = {2, 3, 6};
+        System.out.println("grow: " + Arrays.toString(grow(grow, 3)));
+        System.out.println("fibonacci: f(15)=" + Arrays.toString(fibonacci(15)) + " f(1)=" + Arrays.toString(fibonacci(1)));
+        System.out.println("getPrimes: g(23)=" + Arrays.toString(getPrimes(23)));
+        System.out.println("getPerfectNumbers: g(500)=" + Arrays.toString(getPerfectNumbers(500)));
+        System.out.println("getPerfectNumbers: j(f(50))=" + join(fibonacci(50), "-"));
+
+    }
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public static void reverseArray(int[] origin) {
+        int len = origin.length;
+        for (int i = 0; i < len / 2; i++) {
+            int j = len - 1 - i;
+            int temp = origin[i];
+            origin[i] = origin[j];
+            origin[j] = temp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+    public static int[] removeZero(int[] oldArray) {
+        int length = oldArray.length;
+        // 空间换时间复杂度 O(2*n-m) n为数组长度 m为0的个数
+        int[] src = new int[length];
+        int last = 0;
+        for (int i = 0; i < length; i++) {
+            int m = oldArray[i];
+            if (m != 0) {
+                src[last++] = m;
+            }
+        }
+        int[] dest = new int[last];
+        System.arraycopy(src, 0, dest, 0, last);
+        return dest;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public static int[] merge(int[] array1, int[] array2) {
+        int[] src = new int[array1.length + array2.length];
+        int i = 0, j = 0, k = 0; //i=数组1游标 j=数组2游标 k=目标数组下标
+        // 时间复杂度 O(n+m-k) n为数组1长度 m为数组2长度 k为重复数组个数
+        while (i < array1.length && j < array2.length) {
+            if (array1[i] < array2[j]) { //大小比较入目标数组
+                src[k++] = array1[i++];
+            } else if (array1[i] > array2[j]) {
+                src[k++] = array2[j++];
+            } else { //等值同时移动，但只入1个目标值
+                src[k++] = array1[i++];
+                j++;
+            }
+        }
+        // 只要1个数组下表越界，就直接添加另1个数组尾部所有有序值
+        while (i < array1.length) {
+            src[k++] = array1[i++];
+        }
+        while (j < array2.length) {
+            src[k++] = array2[j++];
+        }
+        int[] dest = new int[k];
+        System.arraycopy(src, 0, dest, 0, k);
+        return dest;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public static int[] grow(int[] oldArray, int size) {
+        int[] newArr = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArr, 0, oldArray.length);
+        return newArr;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public static int[] fibonacci(int max) {
+        if (max < 2) { // 额外出口 f(1) = []
+            return new int[]{};
+        }
+        if (max == 2) { //递归出口 f(2) = [1, 1]
+            return new int[]{1, 1};
+        }
+        // f(3) = [1,1,2]
+        // f(5) = f(4) = [1,1,2,3]
+        // f(8) = f(7) = f(6) = [1,1,2,3,5]
+
+        // 递归拿上个数列最后的两个数
+        int[] src = fibonacci(max - 1);
+        // 判断这两个数的和值是否在max范围内
+        int m = src[src.length - 1] + src[src.length - 2];
+        if (m < max) {
+            int[] dest = new int[src.length + 1];
+            System.arraycopy(src, 0, dest, 0, src.length);
+            dest[src.length] = m;
+            return dest;
+        } else {
+            return src;
+        }
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPrimes(int max) {
+        if (max <= 2) { //特殊出口 g(1) = []
+            return new int[]{};
+        }
+        if (max == 3) { //递归出口 g(3) = [2]
+            return new int[]{2};
+        }
+        // g[3] = [2]
+        // g[5] = g[4] = [2,3]
+        // g[7] = g[6] = [2,3,5]
+        // g[11] = g[10] = g[9] = g[8] = [2,3,5,7]
+
+        // 递归拿上个数组最后的素数
+        int[] src = getPrimes(max - 1);
+        // 找上个素数和最大值之间的素数
+        int before = src[src.length - 1];
+        int next = before;
+        int start = 1 + before;
+        int end = max;
+        for (int num = start; num < end; num++) {
+            int i = 2;
+            for (; i <= num / 2; i++) {
+                if (num % i == 0) {
+                    break;
+                }
+            }
+            if (i > num / 2) {
+                next = num;
+                break;
+            }
+        }
+        // 判断这个值是否存在
+        if (next > before) {
+            int[] dest = new int[src.length + 1];
+            System.arraycopy(src, 0, dest, 0, src.length);
+            dest[src.length] = next;
+            return dest;
+        } else {
+            return src;
+        }
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPerfectNumbers(int max) {
+        if (max <= 6) { //特殊出口
+            return new int[]{};
+        }
+        if (max == 7) { //递归出口
+            return new int[]{6};
+        }
+        // 递归拿上个数组最后的完数
+        int[] src = getPerfectNumbers(max - 1);
+        // 找上个完数和最大值之间的完数
+        int before = src[src.length - 1];
+        int next = before;
+        int start = 1 + before;
+        int end = max;
+        for (int num = start; num < end; num++) {
+            int count = 0;
+            for (int i = 1; i <= num / 2; i++) {
+                if (num % i == 0) {
+                    count += i;
+                }
+            }
+            if (count == num) {
+                next = num;
+                break;
+            }
+        }
+        // 判断这个值是否存在
+        if (next > before) {
+            int[] dest = new int[src.length + 1];
+            System.arraycopy(src, 0, dest, 0, src.length);
+            dest[src.length] = next;
+            return dest;
+        } else {
+            return src;
+        }
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public static String join(int[] array, String seperator) {
+        StringBuilder sBuilder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            sBuilder.append(array[i]).append(seperator);
+        }
+        if (sBuilder.length() > 0) {
+            sBuilder.deleteCharAt(sBuilder.length() - 1);
+        }
+        return sBuilder.toString();
+    }
+
+
+}
diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..bf31612b74
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,41 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author liuxin
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java
new file mode 100644
index 0000000000..74354e8bce
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java
@@ -0,0 +1,200 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+
+public class MyStruts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        MyStrutsActioNode actioNode = strutsActions.get(actionName);
+        String actionString = actioNode.actionClass;
+        Class actionClass = null;
+        Object actionBean = null;
+        try {
+            actionClass = Class.forName(actionString);
+            actionBean = actionClass.newInstance();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (actionBean == null) return null; // 没有默认构造或没有找到字节码的情况
+        Map<String, Method> setterMethods = getSetterMethods(actionClass);
+        // #1.调用action中的set方法设置值
+        if (parameters != null && !parameters.isEmpty()) {
+            for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                String fieldName = entry.getKey();
+                String fieldValue = entry.getValue();
+                Method setterMethod = setterMethods.get(fieldName);
+                if (setterMethod != null) {
+                    try {
+                        setterMethod.invoke(actionBean, fieldValue);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        // #2.调用action的execute方法
+        Method method = getExecuteMethod(actionClass);
+        if (method == null) return null; // 未声明execute方法
+        String jspName = "";
+        try {
+            Object object = method.invoke(actionBean); // 获取execute方法返回值
+            if (object instanceof String) {
+                jspName = (String) object;
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // #3.查找execute方法返回值对应的jsp路径
+        View view = new View();
+        String jspValue = actioNode.actionResults.get(jspName).value;
+        view.setJsp(jspValue);
+
+        // #4.获取action中的get方法返回值封装到view对象中
+        Map<String, Method> getterMethods = getGetterMethods(actionClass);
+        if (getterMethods != null && !getterMethods.isEmpty()) {
+            HashMap<String, Object> resultMap = new HashMap<String, Object>(getterMethods.size());
+            for (Map.Entry<String, Method> entry : getterMethods.entrySet()) {
+                String fieldName = entry.getKey();
+                Method getterMethod = entry.getValue();
+                try {
+                    Object object = getterMethod.invoke(actionBean);
+                    resultMap.put(fieldName, object);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            view.setParameters(resultMap);
+        }
+        return view;
+    }
+
+    private static Method getExecuteMethod(Class<?> beanClass) {
+        Method method = null;
+        try {
+            method = beanClass.getMethod("execute");
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        }
+        return method;
+    }
+
+    private static Map<String, Method> getGetterMethods(Class<?> beanClass) {
+        Map<String, Method> resultMap = Collections.emptyMap();
+        Map<String, PropertyDescriptor> descriptorMap = getPropertyDescriptors(beanClass);
+        if (descriptorMap != null && !descriptorMap.isEmpty()) {
+            resultMap = new HashMap<String, Method>(descriptorMap.size() / 2);
+            for (PropertyDescriptor descriptor : descriptorMap.values()) {
+                String fieldName = descriptor.getName();
+                Method getterMethod = descriptor.getReadMethod();
+                resultMap.put(fieldName, getterMethod);
+            }
+        }
+        return resultMap;
+    }
+
+    private static Map<String, Method> getSetterMethods(Class<?> beanClass) {
+        Map<String, Method> resultMap = Collections.emptyMap();
+        Map<String, PropertyDescriptor> descriptorMap = getPropertyDescriptors(beanClass);
+        if (descriptorMap != null && !descriptorMap.isEmpty()) {
+            resultMap = new HashMap<String, Method>(descriptorMap.size() / 2);
+            for (PropertyDescriptor descriptor : descriptorMap.values()) {
+                String fieldName = descriptor.getName();
+                Method setterMethod = descriptor.getWriteMethod();
+                resultMap.put(fieldName, setterMethod);
+            }
+        }
+        return resultMap;
+    }
+
+    private static Map<String, PropertyDescriptor> getPropertyDescriptors(Class<?> beanClass) {
+        Map<String, PropertyDescriptor> resultMap = Collections.emptyMap();
+        try {
+            BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
+            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+            resultMap = new HashMap<String, PropertyDescriptor>(propertyDescriptors.length);
+            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+                String fieldName = propertyDescriptor.getName();
+                resultMap.put(fieldName, propertyDescriptor);
+            }
+        } catch (IntrospectionException e) {
+            e.printStackTrace();
+        }
+        return resultMap;
+    }
+
+    private static Map<String, MyStrutsActioNode> strutsActions;
+
+    static {
+        InputStream input = null;
+        try {
+            // dom4j解析xml文件封装到JavaBean
+            input = MyStruts.class.getClassLoader().getResourceAsStream("struts.xml");
+            SAXReader saxReader = new SAXReader();
+            Document document = saxReader.read(input);
+            strutsActions = new HashMap<String, MyStrutsActioNode>();
+            Element root = document.getRootElement();
+            // <action name="*"></action> 标签
+            for (Iterator i = root.elementIterator("action"); i.hasNext(); ) {
+                Element actionXmlNode = (Element) i.next();
+                MyStrutsActioNode actionNode = new MyStrutsActioNode();
+                actionNode.actionName = actionXmlNode.attributeValue("name");
+                actionNode.actionClass = actionXmlNode.attributeValue("class");
+                strutsActions.put(actionNode.actionName, actionNode);
+                actionNode.actionResults = new HashMap<String, MyActionResultNode>();
+                // <result name="*"></result> 标签
+                for (Iterator j = actionXmlNode.elementIterator("result"); j.hasNext(); ) {
+                    Element resultXmlNode = (Element) j.next();
+                    MyActionResultNode resultNode = new MyActionResultNode();
+                    resultNode.name = resultXmlNode.attributeValue("name");
+                    resultNode.value = resultXmlNode.getStringValue();
+                    actionNode.actionResults.put(resultNode.name, resultNode);
+                }
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } finally {
+            if (input != null) {
+                try {
+                    input.close();
+                } catch (IOException e) {
+                    // close quietly..
+                }
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+
+    }
+
+    private static class MyStrutsActioNode {
+        private String actionName;
+        private String actionClass;
+        private Map<String, MyActionResultNode> actionResults;
+
+    }
+
+    private static class MyActionResultNode {
+        private String name;
+        private String value;
+
+    }
+
+}
diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java
new file mode 100644
index 0000000000..a7e6b63019
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class MyStrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "1234");
+
+
+        View view = MyStruts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLoginActionFailed() {
+        String actionName = "login";
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = MyStruts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..ce596da106
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,26 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group07/562247675/homework/homework-0305/src/main/resources/struts.xml b/group07/562247675/homework/homework-0305/src/main/resources/struts.xml
new file mode 100644
index 0000000000..8a9789665d
--- /dev/null
+++ b/group07/562247675/homework/homework-0305/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/562247675/homework/pom.xml b/group07/562247675/homework/pom.xml
index 17a2c5f0fd..343c7dbe71 100644
--- a/group07/562247675/homework/pom.xml
+++ b/group07/562247675/homework/pom.xml
@@ -12,6 +12,7 @@
 
     <modules>
         <module>homework-0226</module>
+        <module>homework-0305</module>
     </modules>
 
     <packaging>pom</packaging>
@@ -22,11 +23,24 @@
     </properties>
     <dependencyManagement>
         <dependencies>
+            <!-- junit -->
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>4.12</version>
             </dependency>
+            <!-- dom4j core -->
+            <dependency>
+                <groupId>dom4j</groupId>
+                <artifactId>dom4j</artifactId>
+                <version>1.6.1</version>
+            </dependency>
+            <!-- dom4j xpath -->
+            <dependency>
+                <groupId>jaxen</groupId>
+                <artifactId>jaxen</artifactId>
+                <version>1.1.6</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
     <build>
diff --git a/group07/724319952/src/cn/fyl/second/ArrayUtil.java b/group07/724319952/src/cn/fyl/second/ArrayUtil.java
new file mode 100644
index 0000000000..a816ff4acd
--- /dev/null
+++ b/group07/724319952/src/cn/fyl/second/ArrayUtil.java
@@ -0,0 +1,235 @@
+package cn.fyl.second;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		//保存置换后的数组
+		int[] temp = new int[origin.length];				
+		
+		for (int i = 0,j = origin.length - 1; i < origin.length; i++,j--) {
+			//依次将origin的值赋给与temp前后对应位置上
+			temp[i] = origin[j];					
+			System.out.print(temp[i]+"  ");
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		//保存oldArray数组去0后的容量
+		int size = 0;
+		
+		for (int i = 0; i < oldArray.length; i++) {
+			int temp = oldArray[i];
+			if(temp != 0){
+				size++;
+			}
+		}
+		
+		//初始化与oldArray数组去0后容量一样的新数组
+		int[] newArray = new int[size];
+		
+		for (int i = 0,j = 0; i < oldArray.length; i++) {
+			int temp = oldArray[i];
+			//将不等于0的值赋给新数组
+			if(temp != 0){
+				newArray[j] = temp;
+				j++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素，
+	 *  并且仍然是有序的。
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		//保存新数组的容量
+		int size = array1.length + array2.length;
+		
+		int[] newArray = new int[size];
+		
+		//先将array1数组存入temp数组
+		for (int i = 0; i < array1.length; i++) {
+			newArray[i] = array1[i];
+		}			
+		
+		//增0，若相同的值是数组中倒数的二个的值，则需要一个零将最后一个覆盖掉
+		array2 = grow(array2, 1);
+		
+		//将array1数组中每一个值依次与array2数组中每一个进行比较，若相同，则将相同的值覆盖掉
+		for (int i = 0; i < array1.length; i++) {
+			for (int j = 0; j < array2.length; j++) {
+					if(array1[i] == array2[j]){
+						for (int k = j; k < array2.length - 1; k++) {
+							array2[k] = array2[k + 1];
+						}
+					}
+				}
+			}
+		//去0
+		array2 = removeZero(array2);
+		
+		//将array2的值插入newArray数组中
+		for (int i = 0; i < array2.length; i++) {
+			newArray[array1.length] = array2[i];
+		}
+		
+		newArray = removeZero(newArray);
+		
+		//冒泡排序
+		for (int i = 0; i < newArray.length - 1; i++) {
+			for (int j = 0; j < newArray.length - 1; j++) {
+				if(newArray[j] > newArray[j + 1]){
+					int temp = newArray[j + 1];
+					newArray[j+ 1] = newArray[j];
+					newArray[j] = temp;
+				}
+			}
+		}
+		
+		return  newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] array = {1,1,2,3,5,8,13,21};
+		int[] newArray = null;
+		for (int i = 0; i < array.length; i++) {
+			if(array[i] > max){
+				newArray = new int[i];
+				System.arraycopy(array, 0, newArray, 0, i);
+				break;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] array = {0};
+		if(max > 2){
+			array[0] = 2;
+			int k = 1;
+		for (int n = 3; n < max; n++) {
+			int i = 2;
+			
+			while(i < n){
+				//若等于0，则不是素数，跳出循环
+				if(n % i == 0)
+					break;
+				
+					i++;
+			}
+			
+			 //如果i==n则说明n不能被2~n-1整除，是素数
+			 if (i == n) {    
+				 //数组自增一个容量
+				 	array =grow(array, 1);
+				//将素数加入数组
+					array[k] = n;
+					k++;
+	         }
+			}
+		return array;
+		}
+		else{
+			return null;
+		}
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		 
+		int a =0;
+		for(int i=2;i<max;i++){
+			int sum=0;
+			//查找因数
+		for(int j=1;j<i;j++){
+			if(i % j==0){
+			sum += j;
+		}
+			if(sum==i)
+				a = i;
+			}
+		}
+		
+		int[] array ={a};
+		
+		return array;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String str  =null;
+		int num = array.length;
+		for (int i = 0; i < array.length; i++) {
+			str += array[i] + seperator;
+		}
+		str = str.substring(4, str.length()-1);
+		return str;
+	}
+
+}
diff --git a/group07/752262774/2.26/coding/src/main/java/ArrayList.java b/group07/752262774/2.26/coding/src/main/java/ArrayList.java
deleted file mode 100644
index a7b0f43aed..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/ArrayList.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package main.java;
-
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-/**
- * Created by yrs on 2017/2/21.
- */
-public class ArrayList implements List{
-
-    private int size = 0;
-
-    private Object[] elementData;
-
-    public ArrayList() {
-        this.elementData = new Object[10];
-    }
-
-    public ArrayList(int initialCapacity) {
-        if (initialCapacity > 0) {
-            this.elementData = new Object[initialCapacity];
-        } else if (initialCapacity == 0) {
-            this.elementData = new Object[0];
-        } else {
-            throw new IllegalArgumentException("Illegal Capacity: "+
-                    initialCapacity);
-        }
-    }
-
-    public void add(Object o) {
-        judegGrow();
-        elementData[size++] = o;
-    }
-
-    public void add(int index, Object o) {
-        if(index<0 || index>size) {
-            throw new IndexOutOfBoundsException();
-        }else if(index == size) {
-            add(o);
-        }else {
-            judegGrow();
-            System.arraycopy(elementData, index, elementData, index + 1,
-                    size - index);
-            elementData[index] = o;
-            size++;
-        }
-    }
-
-    public Object get(int index) {
-        rangeCheck(index);
-        return elementData[index];
-    }
-
-    public Object remove(int index) {
-        rangeCheck(index);
-        Object o = elementData[index];
-
-        int move = size - 1 -index;
-        if(move > 0) {
-            System.arraycopy(elementData, index+1, elementData, index, move);
-        }
-        elementData[--size] = null;
-
-        return o;
-    }
-
-    public int size() {
-        return size;
-    }
-
-    public Iterator iterator() {
-        return new ArrrayListIterator(this);
-    }
-
-    private class ArrrayListIterator implements Iterator {
-
-        ArrayList arrayList;
-
-        int pos;
-
-        private ArrrayListIterator(ArrayList arrayList) {
-            this.arrayList = arrayList;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return pos != arrayList.size;
-        }
-
-        @Override
-        public Object next() {
-            if(pos < size) {
-                int i = pos;
-                pos++;
-                return elementData[i];
-            }else {
-                throw new NoSuchElementException();
-            }
-        }
-    }
-
-    private void judegGrow() {
-        if(size == elementData.length) {
-            elementData = Arrays.copyOf(elementData, elementData.length + 1);
-        }
-    }
-
-    private void rangeCheck(int index) {
-        if(index<0 || index>=size) {
-            throw new IndexOutOfBoundsException();
-        }
-    }
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/2.26/coding/src/main/java/BinaryTreeNode.java b/group07/752262774/2.26/coding/src/main/java/BinaryTreeNode.java
deleted file mode 100644
index cf8ade9193..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/BinaryTreeNode.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package main.java;
-
-/**
- * Created by yrs on 2017/2/25.
- */
-public class BinaryTreeNode {
-
-    private Object data;
-
-    private BinaryTreeNode left;
-
-    private BinaryTreeNode right;
-
-    public BinaryTreeNode(BinaryTreeNode left, Object o, BinaryTreeNode right) {
-        setData(o);
-        setLeft(left);
-        setRight(right);
-    }
-
-    public Object getData() {
-        return data;
-    }
-
-    public void setData(Object data) {
-        this.data = data;
-    }
-
-    public BinaryTreeNode getLeft() {
-        return left;
-    }
-
-    public void setLeft(BinaryTreeNode left) {
-        this.left = left;
-    }
-
-    public BinaryTreeNode getRight() {
-        return right;
-    }
-
-    public void setRight(BinaryTreeNode right) {
-        this.right = right;
-    }
-
-    public BinaryTreeNode insert(Object o) {
-        return null;
-    }
-
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/2.26/coding/src/main/java/Iterator.java b/group07/752262774/2.26/coding/src/main/java/Iterator.java
deleted file mode 100644
index 74a0b35573..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/Iterator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package main.java;
-
-/**
- * Created by yrs on 2017/2/25.
- */
-public interface Iterator {
-
-    public boolean hasNext();
-
-    public Object next();
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/2.26/coding/src/main/java/LinkedList.java b/group07/752262774/2.26/coding/src/main/java/LinkedList.java
deleted file mode 100644
index 4f37c1a31c..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/LinkedList.java
+++ /dev/null
@@ -1,210 +0,0 @@
-package main.java;
-
-
-import java.util.NoSuchElementException;
-
-/**
- * Created by yrs on 2017/2/23.
- */
-public class LinkedList implements List{
-
-    private int size;
-
-    private Node first;
-
-    private Node last;
-
-    public LinkedList() {
-        this.first = null;
-        this.last =null;
-    }
-
-    public void add(Object o) {
-        Node l = this.last;
-        Node newNode = new Node(l, o, null);
-        this.last = newNode;
-        if(null == l) {
-            this.first = newNode;
-        }else {
-            l.next = newNode;
-        }
-        this.size++;
-    }
-
-    public void add(int index, Object o) {
-        if(index<0 || index>size) {
-            throw new IndexOutOfBoundsException();
-        }else if(index == this.size) {
-            this.add(o);
-        }else {
-            Node target = targetNode(index);
-            Node before = target.prev;
-            Node newNode = new Node(before, o, target);
-            target.prev = newNode;
-            if(null == before) {
-                this.first = newNode;
-            }else {
-                before.next = newNode;
-            }
-            this.size++;
-        }
-    }
-
-    public Object get(int index) {
-        rangeCheck(index);
-        return targetNode(index).data;
-    }
-
-    public Object remove(int index) {
-        rangeCheck(index);
-        Node target = targetNode(index);
-        Node before = target.prev;
-        Node after = target.next;
-        Object o = target.data;
-
-        if(null == before) {
-            this.first = null;
-        }else {
-            before.next = after;
-            target.prev = null;
-        }
-
-        if(null == after) {
-            this.last = before;
-        }else {
-            after.prev = before;
-            target.next = null;
-        }
-        target.data = null;
-        this.size--;
-
-        return o;
-    }
-
-    public int size() {
-        return this.size;
-    }
-
-    public void addFirst(Object o) {
-        Node node = first;
-        Node newNode = new Node(null, o, node);
-        this.first = newNode;
-        if(null == node) {
-            this.last = newNode;
-        }else {
-            node.prev = newNode;
-        }
-        this.size++;
-    }
-
-    public void addLast(Object o) {
-        add(o);
-    }
-
-    public Object removeFirst() {
-        Node node = first;
-        if (node == null)
-            throw new NoSuchElementException();
-
-        first = node.next;
-        Object o = node.data;
-        if(null == node.next) {
-            this.last = null;
-        }else {
-            first.prev = null;
-        }
-        node.data = null;
-        node.next = null;
-        this.size--;
-        return o;
-    }
-
-    public Object removeLast() {
-        Node node = last;
-        if (node == null)
-            throw new NoSuchElementException();
-
-        last = node.prev;
-        Object o = node.data;
-        if(null == node.prev) {
-            this.first = null;
-        }else {
-            last.next = null;
-        }
-        node.data = null;
-        node.prev = null;
-        this.size--;
-        return o;
-    }
-
-    public Iterator iterator() {
-        return new LinkedListIterator(this);
-    }
-
-    private class LinkedListIterator implements Iterator {
-
-        LinkedList linkedList;
-
-        int pos;
-
-        private LinkedListIterator(LinkedList linkedList) {
-            this.linkedList = linkedList;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return pos != linkedList.size;
-        }
-
-        @Override
-        public Object next() {
-            if(pos < size) {
-                int i = pos;
-                pos++;
-                return linkedList.get(i);
-            }else {
-                throw new NoSuchElementException();
-            }
-        }
-    }
-
-    private void rangeCheck(int index) {
-        if(index<0 || index>=size) {
-            throw new IndexOutOfBoundsException();
-        }
-    }
-
-    private Node targetNode(int index) {
-        //由index值在链表的前半部分还是后半部分，决定是从前向后，还是从后向前查找。
-        Node target = new Node();
-        if(index < (this.size >> 1)) {
-            target = this.first;
-            for(int i=0; i<index; i++) {
-                target = target.next;
-            }
-        }else {
-            target = this.last;
-            for(int i=size-1; i>index; i--) {
-                target = target.prev;
-            }
-        }
-        return target;
-    }
-
-    private static class Node{
-        Object data;
-        Node next;
-        Node prev;
-
-        Node() {
-        }
-
-        Node(Node prev, Object o, Node next) {
-            this.data = o;
-            this.next = next;
-            this.prev = prev;
-        }
-    }
-
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/2.26/coding/src/main/java/List.java b/group07/752262774/2.26/coding/src/main/java/List.java
deleted file mode 100644
index 0f1d979332..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/List.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package main.java;
-
-/**
- * Created by yrs on 2017/2/23.
- */
-public interface List {
-
-    public void add(Object o);
-
-    public void add(int index, Object o);
-
-    public Object get(int index);
-
-    public Object remove(int index);
-
-    public int size();
-
-}
diff --git a/group07/752262774/2.26/coding/src/main/java/Queue.java b/group07/752262774/2.26/coding/src/main/java/Queue.java
deleted file mode 100644
index 59a120f51c..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/Queue.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package main.java;
-
-/**
- * Created by yrs on 2017/2/25.
- */
-public class Queue {
-
-    private LinkedList elementData = new LinkedList();
-
-    public void enQueue(Object o) {
-        elementData.add(o);
-    }
-
-    public Object deQueue() {
-        return elementData.removeFirst();
-    }
-
-    public boolean isEmpty() {
-        return elementData.size() == 0;
-    }
-
-    public int size() {
-        return elementData.size();
-    }
-
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/2.26/coding/src/main/java/Stack.java b/group07/752262774/2.26/coding/src/main/java/Stack.java
deleted file mode 100644
index efaa2498b9..0000000000
--- a/group07/752262774/2.26/coding/src/main/java/Stack.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package main.java;
-
-/**
- * Created by yrs on 2017/2/25.
- */
-public class Stack {
-    private ArrayList elementData = new ArrayList();
-
-    public void push(Object o) {
-        elementData.add(o);
-    }
-
-    public Object pop() {
-        Object o = elementData.remove(elementData.size()-1);
-        return o;
-    }
-
-    public Object peek() {
-        Object o = elementData.get(elementData.size() - 1);
-        return o;
-    }
-
-    public boolean isEmpty() {
-        return elementData.size() == 0;
-    }
-
-    public int size() {
-        return elementData.size();
-    }
-
-    public static void main(String [] args) {
-        Stack stack = new Stack();
-        stack.push(1);
-        System.out.println(stack.size() + " " + stack.peek() + " " + stack.pop() + " " + stack.isEmpty());
-
-    }
-
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/2.26/coding/src/main/test/test.java b/group07/752262774/2.26/coding/src/main/test/test.java
deleted file mode 100644
index b32a0b6406..0000000000
--- a/group07/752262774/2.26/coding/src/main/test/test.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package main.test;
-
-
-import javax.swing.tree.TreeNode;
-import java.util.*;
-
-/**
- * Created by yrs on 2017/2/21.
- */
-public class test {
-    public static void main(String [] args) {
-        ArrayList list = new ArrayList(4);
-        list.add(9);
-        System.out.println(list);
-        list.add(1,3);
-//        list.add(2,3);   //error IndexOutOfBoundsException
-        list.remove(1);
-        System.out.println(list.size());
-
-        Object[] target = new Object[0];
-        System.out.println(target);
-        Object[] EMPTY_ELEMENTDATA = {};
-        System.out.println(EMPTY_ELEMENTDATA);
-
-
-        //LinkedList
-        LinkedList linkedList = new LinkedList();
-        linkedList.add(1);
-        System.out.println(linkedList.get(0));
-        linkedList.add(1,3);
-        System.out.println(linkedList.size());
-        System.out.println(3 >> 1);
-
-        for(int i=0; i<1; i++) {
-            System.out.println("dd");
-        }
-
-        Stack stack = new Stack();
-
-        Queue queue;
-        TreeNode treeNode;
-
-        List<Integer> lstint = new ArrayList<Integer>();
-        lstint.add(1);
-        lstint.add(2);
-        lstint.add(3);
-
-        // Iterator遍历一
-        Iterator<Integer> iterator = lstint.iterator();
-        iterator.hasNext();
-        while (iterator.hasNext())
-        {
-            int i = (Integer) iterator.next();
-            System.out.println(i);
-        }
-
-
-    }
-}
-                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coderising/array/ArrayUtil.java b/group07/752262774/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..91419d3128
--- /dev/null
+++ b/group07/752262774/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,237 @@
+package com.coderising.array;
+
+
+import java.util.ArrayList;
+
+/**
+ * Created by yrs on 2017/3/3.
+ */
+public class ArrayUtil {
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin){
+        if(null == origin || 0 == origin.length || 1 == origin.length) {
+            return;
+        }else {
+            for(int i=0; i < (origin.length/2); i++) {
+                int stmp = origin[i];
+                origin[i] = origin[origin.length-1-i];
+                origin[origin.length-1-i] = stmp;
+            }
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   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 || 0 == oldArray.length) {
+            return oldArray;
+        }
+        ArrayList stmp = new ArrayList();
+        for(int item: oldArray) {
+            if(item != 0)
+            stmp.add(item);
+        }
+        int[] newArray = arrayListToIntArray(stmp);
+
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2){
+        ArrayList<Integer> arrayList = new ArrayList();
+        int i=0,j=0;
+        while (i<array1.length && j<array2.length)  {
+            if(array1[i] < array2[j]) {
+                arrayList.add(array1[i++]);
+            }else {
+                if(array1[i] == array2[j])
+                    i++;
+                arrayList.add(array2[j++]);
+            }
+        }
+        while (i<array1.length) {
+            arrayList.add(array1[i++]);
+        }
+        while (j<array2.length) {
+            System.out.println(j);
+            arrayList.add(array2[j++]);
+        }
+        int[] newArray = arrayListToIntArray(arrayList);
+
+        return newArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int [] oldArray,  int size){
+        if(size < 0) {
+            throw new IndexOutOfBoundsException();
+        }
+        if(null == oldArray || 0 == oldArray.length) {
+            int[] newArray = new int[size];
+            return newArray;
+        }
+
+        int[] newArray = new int[oldArray.length+size];
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max){
+        if(max < 0) {
+            throw new IndexOutOfBoundsException("max value error, max = " + max);
+        }
+        if(1 == max) {
+            int[] fib = {};
+            return fib;
+        }
+
+        ArrayList<Integer> fibAL = new ArrayList();
+        int before = 1;
+        int next = 1;
+        int stmp;
+        fibAL.add(before);
+        fibAL.add(next);
+        while ((before + next) <max) {
+            fibAL.add(before+next);
+            stmp = before;
+            before = next;
+            next = next + stmp;
+        }
+        int[] fib = arrayListToIntArray(fibAL);
+        return fib;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max){
+        if(max < 2) {
+            return null;
+        }
+        ArrayList<Integer> arrayList = new ArrayList();
+        for (int i=2; i<max; i++) {
+            if (isPrime(i)){
+                arrayList.add(i);
+            }
+        }
+        int[] primes = arrayListToIntArray(arrayList);
+        return primes;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max){
+        if(max < 6){
+            return null;
+        }
+        ArrayList<Integer> arrayList = new ArrayList();
+        for(int i=6; i<max; i++) {
+            if(isPerfect(i)){
+                arrayList.add(i);
+            }
+        }
+        int[] perfect = arrayListToIntArray(arrayList);
+        return perfect;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator){
+        if(null == array || 0 == array.length) {
+            return seperator;
+        }
+        String str = "";
+        for(int i=0; i<array.length-1; i++) {
+            str += (array[i] + seperator);
+        }
+        str += array[array.length-1];
+        return str;
+    }
+
+    private int[] arrayListToIntArray(ArrayList<Integer> arrayList) {
+        int[] array = new int[arrayList.size()];
+        for(int i=0; i<arrayList.size(); i++) {
+            array[i] = arrayList.get(i);
+        }
+        return array;
+    }
+
+    private boolean isPrime(int a) {
+        boolean result = true;
+        for(int i=2; i<=Math.sqrt(a); i++) {
+            if(a%i == 0) {
+                result = false;
+                break;
+            }
+        }
+        return result;
+    }
+
+    private boolean isPerfect(int a) {
+        ArrayList<Integer> arrayList = new ArrayList();
+        for(int i=1; i<=Math.sqrt(a); i++) {
+            if(a % i == 0) {
+                arrayList.add(i);
+                arrayList.add(a / i);
+            }
+        }
+        int sum = 0;
+        for(int item: arrayList) {
+            sum += item;
+        }
+        if(sum-a == a) {
+            return true;
+        }
+
+        return false;
+    }
+}
+                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coderising/array/ArrayUtilTest.java b/group07/752262774/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..ecad9623b8
--- /dev/null
+++ b/group07/752262774/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,95 @@
+package com.coderising.array;
+
+/**
+ * Created by yrs on 2017/3/4.
+ */
+public class ArrayUtilTest {
+
+    @org.junit.Test
+    public void testReverseArray() throws Exception {
+        int[] array = new int[5];
+        for(int i=0; i<5; i++) {
+            array[i] = i;
+        }
+        ArrayUtil util = new ArrayUtil();
+        util.reverseArray(array);
+        for(int i=0; i<5; i++) {
+            assert (array[i] == 4-i);
+        }
+    }
+
+    @org.junit.Test
+    public void testRemoveZero() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        ArrayUtil util = new ArrayUtil();
+        int[] newArr = util.removeZero(oldArr);
+        for(int item: newArr) {
+            System.out.println(item);
+            assert (item != 0);
+        }
+    }
+
+    @org.junit.Test
+    public void testMerge() throws Exception {
+        int[] a1 = {3,5,7,8,22};
+        int[] a2 = {4,5,6,7,8,9,11};
+        int[] a3 = {3,4,5,6,7,8,9,11,22};
+        ArrayUtil util = new ArrayUtil();
+        int[] merge = util.merge(a1, a2);
+        for(int i=0;i<a3.length;i++) {
+            assert (merge[i] == a3[i]);
+        }
+
+    }
+
+    @org.junit.Test
+    public void testGrow() throws Exception {
+        int[] oldArray = {1,2,3};
+        int[] newArray = {1,2,3,0,0,0,0};
+        ArrayUtil util = new ArrayUtil();
+        int[] grow = util.grow(oldArray, 4);
+        for(int i=0; i<newArray.length; i++) {
+            assert (newArray[i] == grow[i]);
+        }
+    }
+
+    @org.junit.Test
+    public void testFibonacci() throws Exception {
+        int[] fib = {1,1,2,3,5,8,13,21};
+        ArrayUtil util = new ArrayUtil();
+        int[] test = util.fibonacci(25);
+        for(int i=0; i<fib.length; i++) {
+            assert (fib[i] == test[i]);
+        }
+    }
+
+    @org.junit.Test
+    public void testGetPrimes() throws Exception {
+        int[] primes = {2,3,5,7,11,13,17,19,23,29};
+        ArrayUtil util = new ArrayUtil();
+        int[] test = util.getPrimes(30);
+        for(int i=0; i<primes.length; i++) {
+            assert (primes[i] == test[i]);
+        }
+
+    }
+
+    @org.junit.Test
+    public void testGetPerfectNumbers() throws Exception {
+        int[] perfect = {6,28,496,8128};
+        ArrayUtil util = new ArrayUtil();
+        int[] test = util.getPerfectNumbers(10000);
+        for(int i=0; i<perfect.length; i++) {
+            assert (perfect[i] == test[i]);
+        }
+    }
+
+    @org.junit.Test
+    public void testJoin() throws Exception {
+        String str = "2-3-4-5-6";
+        int[] array = {2,3,4,5,6};
+        ArrayUtil util = new ArrayUtil();
+        String test = util.join(array, "-");
+        assert (str.equals(test));
+    }
+}
\ No newline at end of file
diff --git a/group07/752262774/src/com/coderising/litestruts/LoginAction.java b/group07/752262774/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group07/752262774/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/752262774/src/com/coderising/litestruts/Struts.java b/group07/752262774/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..29a5d51fd6
--- /dev/null
+++ b/group07/752262774/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,97 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+
+public class Struts {
+
+	private static Map<String, String> targetMap = null;
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws Exception {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+		targetMap = getTargetMap(actionName);
+		if(!targetMap.containsKey(actionName)) {
+			throw new Exception("this xml file not found" + actionName + "action");
+		}
+		String className = targetMap.get(actionName);
+		Class<?> classEntity = Class.forName(className);
+		Object obj = classEntity.newInstance();
+		Field[] fields = classEntity.getDeclaredFields();
+
+		for(Field field: fields) {
+			field.setAccessible(true);
+			if(parameters.containsKey(field.getName())) {
+				field.set(obj, parameters.get(field.getName()));
+			}
+		}
+
+		Method execute = classEntity.getMethod("execute");
+		String result = (String)execute.invoke(obj);
+		String jsp = targetMap.get(result);
+		Field message = classEntity.getDeclaredField("message");
+		message.setAccessible(true);
+		Map<String, String> parats = new HashMap<String, String>();
+		parats.put("message", (String)message.get(obj));
+
+		View view = new View();
+		view.setJsp(jsp);
+		view.setParameters(parats);
+
+    	return view;
+    }
+
+	private static Map<String, String> getTargetMap(String actionName) throws DocumentException {
+		Map<String,String> targetMap = new HashMap<String, String>();
+		//创建SAXReader对象
+		SAXReader reader = new SAXReader();
+		//读取文件 转换成Document
+		Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml"));
+		//获取根节点元素对象
+		Element root = document.getRootElement();
+		List<Element> actionList = root.elements("action");
+		for(Element action: actionList) {
+			org.dom4j.Attribute attribute = action.attribute("name");
+			if(attribute.getValue().equals("login")){
+				targetMap.put(attribute.getValue(), action.attribute("class").getValue());
+				List<Element> resultList = action.elements("result");
+				for(Element result: resultList) {
+					targetMap.put(result.attribute("name").getValue(),""+result.getData());
+				}
+				break;
+			}
+		}
+		return targetMap;
+	}
+
+}
diff --git a/group07/752262774/src/com/coderising/litestruts/StrutsTest.java b/group07/752262774/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..70c71c2ab0
--- /dev/null
+++ b/group07/752262774/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,53 @@
+package com.coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+
+
+        View view  = null;
+        try {
+            view = Struts.runAction(actionName, params);
+        }  catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = null;
+        try {
+            view = Struts.runAction(actionName, params);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/752262774/src/com/coderising/litestruts/View.java b/group07/752262774/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group07/752262774/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group07/752262774/src/com/coderising/litestruts/struts.xml b/group07/752262774/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..6f23f0a83d
--- /dev/null
+++ b/group07/752262774/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group07/752262774/src/com/coding/basic/ArrayList.java b/group07/752262774/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..59b22d2c53
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,114 @@
+package com.coding.basic;
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+/**
+ * Created by yrs on 2017/2/21.
+ */
+public class ArrayList implements List{
+
+    private int size = 0;
+
+    private Object[] elementData;
+
+    public ArrayList() {
+        this.elementData = new Object[10];
+    }
+
+    public ArrayList(int initialCapacity) {
+        if (initialCapacity > 0) {
+            this.elementData = new Object[initialCapacity];
+        } else if (initialCapacity == 0) {
+            this.elementData = new Object[0];
+        } else {
+            throw new IllegalArgumentException("Illegal Capacity: "+
+                    initialCapacity);
+        }
+    }
+
+    public void add(Object o) {
+        judegGrow();
+        elementData[size++] = o;
+    }
+
+    public void add(int index, Object o) {
+        if(index<0 || index>size) {
+            throw new IndexOutOfBoundsException();
+        }else if(index == size) {
+            add(o);
+        }else {
+            judegGrow();
+            System.arraycopy(elementData, index, elementData, index + 1,
+                    size - index);
+            elementData[index] = o;
+            size++;
+        }
+    }
+
+    public Object get(int index) {
+        rangeCheck(index);
+        return elementData[index];
+    }
+
+    public Object remove(int index) {
+        rangeCheck(index);
+        Object o = elementData[index];
+
+        int move = size - 1 -index;
+        if(move > 0) {
+            System.arraycopy(elementData, index+1, elementData, index, move);
+        }
+        elementData[--size] = null;
+
+        return o;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public Iterator iterator() {
+        return new ArrrayListIterator(this);
+    }
+
+    private class ArrrayListIterator implements Iterator {
+
+        ArrayList arrayList;
+
+        int pos;
+
+        private ArrrayListIterator(ArrayList arrayList) {
+            this.arrayList = arrayList;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return pos != arrayList.size;
+        }
+
+        @Override
+        public Object next() {
+            if(pos < size) {
+                int i = pos;
+                pos++;
+                return elementData[i];
+            }else {
+                throw new NoSuchElementException();
+            }
+        }
+    }
+
+    private void judegGrow() {
+        if(size == elementData.length) {
+            elementData = Arrays.copyOf(elementData, elementData.length + 1);
+        }
+    }
+
+    private void rangeCheck(int index) {
+        if(index<0 || index>=size) {
+            throw new IndexOutOfBoundsException();
+        }
+    }
+}
+                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coding/basic/BinaryTreeNode.java b/group07/752262774/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..275a1e66f9
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,49 @@
+package com.coding.basic;
+
+/**
+ * Created by yrs on 2017/2/25.
+ */
+public class BinaryTreeNode {
+
+    private Object data;
+
+    private BinaryTreeNode left;
+
+    private BinaryTreeNode right;
+
+    public BinaryTreeNode(BinaryTreeNode left, Object o, BinaryTreeNode right) {
+        setData(o);
+        setLeft(left);
+        setRight(right);
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public BinaryTreeNode getLeft() {
+        return left;
+    }
+
+    public void setLeft(BinaryTreeNode left) {
+        this.left = left;
+    }
+
+    public BinaryTreeNode getRight() {
+        return right;
+    }
+
+    public void setRight(BinaryTreeNode right) {
+        this.right = right;
+    }
+
+    public BinaryTreeNode insert(Object o) {
+        return null;
+    }
+
+}
+                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coding/basic/Iterator.java b/group07/752262774/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..c13e8e3b35
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/Iterator.java
@@ -0,0 +1,12 @@
+package com.coding.basic;
+
+/**
+ * Created by yrs on 2017/2/25.
+ */
+public interface Iterator {
+
+    public boolean hasNext();
+
+    public Object next();
+}
+                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coding/basic/LinkedList.java b/group07/752262774/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..60831251d3
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,210 @@
+package com.coding.basic;
+
+
+import java.util.NoSuchElementException;
+
+/**
+ * Created by yrs on 2017/2/23.
+ */
+public class LinkedList implements List{
+
+    private int size;
+
+    private Node first;
+
+    private Node last;
+
+    public LinkedList() {
+        this.first = null;
+        this.last =null;
+    }
+
+    public void add(Object o) {
+        Node l = this.last;
+        Node newNode = new Node(l, o, null);
+        this.last = newNode;
+        if(null == l) {
+            this.first = newNode;
+        }else {
+            l.next = newNode;
+        }
+        this.size++;
+    }
+
+    public void add(int index, Object o) {
+        if(index<0 || index>size) {
+            throw new IndexOutOfBoundsException();
+        }else if(index == this.size) {
+            this.add(o);
+        }else {
+            Node target = targetNode(index);
+            Node before = target.prev;
+            Node newNode = new Node(before, o, target);
+            target.prev = newNode;
+            if(null == before) {
+                this.first = newNode;
+            }else {
+                before.next = newNode;
+            }
+            this.size++;
+        }
+    }
+
+    public Object get(int index) {
+        rangeCheck(index);
+        return targetNode(index).data;
+    }
+
+    public Object remove(int index) {
+        rangeCheck(index);
+        Node target = targetNode(index);
+        Node before = target.prev;
+        Node after = target.next;
+        Object o = target.data;
+
+        if(null == before) {
+            this.first = null;
+        }else {
+            before.next = after;
+            target.prev = null;
+        }
+
+        if(null == after) {
+            this.last = before;
+        }else {
+            after.prev = before;
+            target.next = null;
+        }
+        target.data = null;
+        this.size--;
+
+        return o;
+    }
+
+    public int size() {
+        return this.size;
+    }
+
+    public void addFirst(Object o) {
+        Node node = first;
+        Node newNode = new Node(null, o, node);
+        this.first = newNode;
+        if(null == node) {
+            this.last = newNode;
+        }else {
+            node.prev = newNode;
+        }
+        this.size++;
+    }
+
+    public void addLast(Object o) {
+        add(o);
+    }
+
+    public Object removeFirst() {
+        Node node = first;
+        if (node == null)
+            throw new NoSuchElementException();
+
+        first = node.next;
+        Object o = node.data;
+        if(null == node.next) {
+            this.last = null;
+        }else {
+            first.prev = null;
+        }
+        node.data = null;
+        node.next = null;
+        this.size--;
+        return o;
+    }
+
+    public Object removeLast() {
+        Node node = last;
+        if (node == null)
+            throw new NoSuchElementException();
+
+        last = node.prev;
+        Object o = node.data;
+        if(null == node.prev) {
+            this.first = null;
+        }else {
+            last.next = null;
+        }
+        node.data = null;
+        node.prev = null;
+        this.size--;
+        return o;
+    }
+
+    public Iterator iterator() {
+        return new LinkedListIterator(this);
+    }
+
+    private class LinkedListIterator implements Iterator {
+
+        LinkedList linkedList;
+
+        int pos;
+
+        private LinkedListIterator(LinkedList linkedList) {
+            this.linkedList = linkedList;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return pos != linkedList.size;
+        }
+
+        @Override
+        public Object next() {
+            if(pos < size) {
+                int i = pos;
+                pos++;
+                return linkedList.get(i);
+            }else {
+                throw new NoSuchElementException();
+            }
+        }
+    }
+
+    private void rangeCheck(int index) {
+        if(index<0 || index>=size) {
+            throw new IndexOutOfBoundsException();
+        }
+    }
+
+    private Node targetNode(int index) {
+        //由index值在链表的前半部分还是后半部分，决定是从前向后，还是从后向前查找。
+        Node target = new Node();
+        if(index < (this.size >> 1)) {
+            target = this.first;
+            for(int i=0; i<index; i++) {
+                target = target.next;
+            }
+        }else {
+            target = this.last;
+            for(int i=size-1; i>index; i--) {
+                target = target.prev;
+            }
+        }
+        return target;
+    }
+
+    private static class Node{
+        Object data;
+        Node next;
+        Node prev;
+
+        Node() {
+        }
+
+        Node(Node prev, Object o, Node next) {
+            this.data = o;
+            this.next = next;
+            this.prev = prev;
+        }
+    }
+
+}
+                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coding/basic/List.java b/group07/752262774/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..55658370ae
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/List.java
@@ -0,0 +1,18 @@
+package com.coding.basic;
+
+/**
+ * Created by yrs on 2017/2/23.
+ */
+public interface List {
+
+    public void add(Object o);
+
+    public void add(int index, Object o);
+
+    public Object get(int index);
+
+    public Object remove(int index);
+
+    public int size();
+
+}
diff --git a/group07/752262774/src/com/coding/basic/Queue.java b/group07/752262774/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..c967b45fa2
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/Queue.java
@@ -0,0 +1,27 @@
+package com.coding.basic;
+
+/**
+ * Created by yrs on 2017/2/25.
+ */
+public class Queue {
+
+    private LinkedList elementData = new LinkedList();
+
+    public void enQueue(Object o) {
+        elementData.add(o);
+    }
+
+    public Object deQueue() {
+        return elementData.removeFirst();
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() == 0;
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+
+}
+                
\ No newline at end of file
diff --git a/group07/752262774/src/com/coding/basic/Stack.java b/group07/752262774/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..d47eb07427
--- /dev/null
+++ b/group07/752262774/src/com/coding/basic/Stack.java
@@ -0,0 +1,39 @@
+package com.coding.basic;
+
+/**
+ * Created by yrs on 2017/2/25.
+ */
+public class Stack {
+    private ArrayList elementData = new ArrayList();
+
+    public void push(Object o) {
+        elementData.add(o);
+    }
+
+    public Object pop() {
+        Object o = elementData.remove(elementData.size()-1);
+        return o;
+    }
+
+    public Object peek() {
+        Object o = elementData.get(elementData.size() - 1);
+        return o;
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() == 0;
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+
+    public static void main(String [] args) {
+        Stack stack = new Stack();
+        stack.push(1);
+        System.out.println(stack.size() + " " + stack.peek() + " " + stack.pop() + " " + stack.isEmpty());
+
+    }
+
+}
+                
\ No newline at end of file
diff --git a/group07/764189149/.classpath b/group07/764189149/.classpath
index fb5011632c..1fc7a9a529 100644
--- a/group07/764189149/.classpath
+++ b/group07/764189149/.classpath
@@ -2,5 +2,9 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/dom4j.jar"/>
+	<classpathentry kind="lib" path="lib/jaxen-1.1-beta-7.jar"/>
+	<classpathentry kind="lib" path="lib/junit-3.8.1.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group07/764189149/src/com/coderising/download/DownloadThread.java b/group07/764189149/src/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..d9514ac5cf
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/DownloadThread.java
@@ -0,0 +1,38 @@
+package com.coderising.download;
+
+import java.io.RandomAccessFile;
+import java.util.concurrent.CyclicBarrier;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+	CyclicBarrier barrier ;
+	String filePath;
+
+	public DownloadThread(CyclicBarrier barrier , Connection conn, int startPos, int endPos , String filePath){
+		
+		this.barrier = barrier;
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+		this.filePath = filePath;
+	}
+	public void run(){	
+		try{
+			System.out.println("begin download startPos="+startPos+",endPos="+endPos);
+			byte[] buffer = conn.read(startPos , endPos);
+			RandomAccessFile file = new RandomAccessFile(filePath, "rw");
+			file.seek(startPos);
+			file.write(buffer, 0, buffer.length);
+			file.close();
+			barrier.await();
+		}catch(Exception e){
+			System.out.println("download error:startPos="+startPos+",endPos="+endPos);
+		}
+		
+	}
+}
diff --git a/group07/764189149/src/com/coderising/download/FileDownloader.java b/group07/764189149/src/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..f63b39d0af
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/FileDownloader.java
@@ -0,0 +1,127 @@
+package com.coderising.download;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.concurrent.CyclicBarrier;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+
+	boolean isFinished = false;
+
+	String url;
+
+	DownloadListener listener;
+
+	ConnectionManager cm;
+
+	private static final int THREAD_NUM = 3;
+
+	private static final String BASE_PATH = "F:/download/";
+
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		File baseFile = new File(BASE_PATH);
+		if(!baseFile.exists()){
+			baseFile.mkdirs();
+		}
+
+	}
+
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		CyclicBarrier barrier = new CyclicBarrier(THREAD_NUM, new Runnable() {
+
+			@Override
+			public void run() {
+				listener.notifyFinished();
+			}
+		});
+		Connection conn = null;
+		try {
+
+			conn = cm.open(this.url);
+
+			int length = conn.getContentLength();
+			String filePath = BASE_PATH + "download."+getFileType(this.url);
+			//System.out.println(filePath);
+			
+			File file = new File(filePath);
+			if(!file.exists()){
+				try {
+					file.createNewFile();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			try{
+				FileOutputStream fos = new FileOutputStream(file);
+				fos.write(new byte[length], 0, length);//占位
+				fos.close();
+			}
+			catch (IOException e) {
+				System.out.println(e.getMessage());
+			}
+
+			int blockSize = (length % THREAD_NUM == 0 ) ? length / THREAD_NUM : (length / THREAD_NUM + 1);
+			for (int i = 0; i < THREAD_NUM; i++) {
+				int startPos = i * blockSize;
+				int endPos = startPos + blockSize - 1;
+				if(endPos >= length - 1){
+					endPos = length - 1;
+				}
+				new DownloadThread(barrier , conn, startPos, endPos , filePath).start();	
+			}
+
+		} catch (ConnectionException e) {			
+			System.out.println(e.getMessage());
+		} finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+
+
+
+
+	}
+
+	private String getFileType(String url) {
+		int index = url.lastIndexOf(".");
+		return url.substring(index + 1 , url.length());
+	}
+
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+
+
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+
+}
diff --git a/group07/764189149/src/com/coderising/download/FileDownloaderTest.java b/group07/764189149/src/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..5e325db7a4
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,55 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488796402240&di=8ca9322617d5338cad61232a06f6ed7a&imgtype=0&src=http%3A%2F%2Fjiangsu.china.com.cn%2Fuploadfile%2F2017%2F0212%2F1486868426284307.jpg";
+		FileDownloader downloader = new FileDownloader(url);
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/group07/764189149/src/com/coderising/download/api/Connection.java b/group07/764189149/src/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/group07/764189149/src/com/coderising/download/api/ConnectionException.java b/group07/764189149/src/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..c2a0b14c82
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+	String message;
+	public ConnectionException(String message){
+		super("message:"+message);
+		this.message = message;
+	}
+
+}
diff --git a/group07/764189149/src/com/coderising/download/api/ConnectionManager.java b/group07/764189149/src/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/group07/764189149/src/com/coderising/download/api/DownloadListener.java b/group07/764189149/src/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java b/group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..8881230f80
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLConnection;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	private URLConnection connection;
+	
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+//		connection.setAllowUserInteraction(true);  
+//		connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); 
+		InputStream inputstream = connection.getInputStream();
+		byte[] buffer = new byte[endPos - startPos + 1];
+		inputstream.skip(startPos);
+		inputstream.read(buffer);
+		inputstream.close();
+		return buffer;
+	}
+
+	@Override
+	public int getContentLength(){
+		return connection.getContentLength();
+	}
+
+	@Override
+	public void close() {
+	}
+
+	public void setConnection(URLConnection connection) {
+		this.connection = connection;
+	}
+	
+	
+
+}
diff --git a/group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..20dfaaad80
--- /dev/null
+++ b/group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,30 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		URL urlObj;
+		ConnectionImpl connection = null;
+		try {
+			urlObj = new URL(url);
+			connection = new ConnectionImpl();
+			connection.setConnection(urlObj.openConnection());
+		} catch (MalformedURLException e) {
+			throw new ConnectionException("URL格式错误");
+		}catch (IOException e) {
+			throw new ConnectionException("IO异常");
+		}
+
+		return connection;
+	}
+
+}
diff --git a/group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java b/group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..544b788ffb
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java
@@ -0,0 +1,279 @@
+package com.leijing.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+/**
+ * @author: leijing
+ * @date: 2017年3月2日 下午5:30:38
+ */
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 * @throws Exception 
+	 */
+	public void reverseArray(int[] origin) throws Exception{
+		if(origin.length < 1){
+			throw new Exception("array origin is empty");
+		}
+		int size = origin.length;
+		int[] copy = Arrays.copyOf(origin, size);
+		for (int i = 0; i < size; i++) {
+			origin[size - i - 1] = copy[i];
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray){
+		int newSize = countNotZero(oldArray);//先计算非零元素个数
+		int[] newArray = new int[newSize];//创建新数组
+		int newIndex = 0;//新数组索引
+		int oldIndex = 0;//旧数组索引
+		while(newIndex < newSize){
+			if(oldArray[oldIndex] != 0){
+				newArray[newIndex++] = oldArray[oldIndex];
+			}
+
+			oldIndex++;
+		}
+
+		return newArray;
+	}
+
+	private int countNotZero(int[] oldArray) {
+		int count = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] != 0){
+				count++;
+			}
+		}
+		return count;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2){
+		int size = getSize(array1 , array2);
+		int[] newArray = new int[size];
+
+		int minIndex1 = 0;
+		int minIndex2 = 0;
+
+		for (int i = 0; i < newArray.length; i++) {
+
+			if(minIndex1 < array1.length && minIndex2 == array2.length ){//如果array2的元素取完了，就取array1的元素
+				newArray[i] = array1[minIndex1++];
+			}else if(minIndex1 == array1.length && minIndex2 < array2.length){//如果array1的元素取完了，就取array2的元素
+				newArray[i] = array2[minIndex2++];
+			}else{//两个数组都没有取完
+				if(array1[minIndex1] < array2[minIndex2]){//第一个数组的元素小
+					newArray[i] = array1[minIndex1++];
+				}else if(array1[minIndex1] == array2[minIndex2]){//元素相等，保留第一个数组的，第二个数组索引加一
+					newArray[i] = array1[minIndex1++];
+					minIndex2++;
+				}
+				else{//第二个数组元素小
+					newArray[i] = array2[minIndex2++];
+				}
+			}
+		}
+
+		return  newArray;
+	}
+
+	private int getSize(int[] array1 , int[] array2) {
+		Set<Integer> set = new HashSet<Integer>();
+		int sameNum = 0;
+
+		for (int i = 0; i < array1.length; i++) {
+			set.add(array1[i]);
+		}
+
+		for (int i = 0; i < array2.length; i++) {
+			if(!set.add(array2[i])){
+				sameNum++;
+			}
+		}
+		return array1.length + array2.length - sameNum;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(size < 1){
+			return oldArray;
+		}
+		int[] newArray = new int[oldArray.length + size];
+
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max == 1){
+			return new int[0];
+		}
+		List<Integer> list = new ArrayList<Integer>();
+		list.add(1);
+		list.add(1);
+		
+		int next = 0;
+		int i = 2;
+		while(next < max) {
+			next = list.get(i - 1) + list.get(i - 2 );
+			list.add(next);
+			i++;
+		}
+		int[] array = new int[list.size()];
+		list2Array(list , array);
+		return array;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		List<Integer> list = new ArrayList<Integer>();
+		for (int i = 2; i < max; i++) {
+			if(isPrimes(i)){
+				list.add(i);
+			}
+		}
+		int[] array = new int[list.size()];
+		list2Array(list , array);
+		return array;
+	}
+
+	private boolean isPrimes(int num) {
+		for (int i = 2; i <= num / 2; i++) {
+			if(num % i == 0){
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+
+		List<Integer> list = new ArrayList<Integer>();
+		for (int i = 1; i < max; i++) {
+			if(isPerfectNum(i)){
+				list.add(i);
+			}
+		}
+		int[] array = new int[list.size()];
+		list2Array(list , array);
+		return array;
+	}
+
+	private void list2Array(List<Integer> list, int[] array) {
+		for (int i = 0; i < list.size(); i++) {
+			array[i] = list.get(i);
+		}
+	}
+
+	private boolean isPerfectNum(int num) {
+		Set<Integer> list = new HashSet<Integer>();
+		if(num == 1){
+			return false;
+		}else{
+			list.add(1);
+		}
+		for (int i = 2; i <= num / 2; i++) {
+			if(num % i == 0){
+				list.add(i);
+				list.add(num / i);
+			}
+		}
+		Iterator<Integer> iter = list.iterator();
+		int sum = 0;
+		while (iter.hasNext()) {
+			Integer val = iter.next();
+			sum += val;
+		}
+
+		if(sum == num){
+			System.out.println("num:"+num+","+list.toString());
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			sb.append(array[i]);
+			if(i < array.length - 1){
+				sb.append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+
+	public void printArray(int[] array , String msg){
+		System.out.print(msg+"[");
+		for (int i = 0; i < array.length; i++) {
+			System.out.print(array[i]);
+			if(i < array.length - 1){
+				System.out.print(",");
+			}
+		}
+		System.out.println("]");
+	}
+
+
+}
diff --git a/group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java b/group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..235ffb0f15
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,77 @@
+package com.leijing.coderising.array;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	private ArrayUtil arrayUtil = new ArrayUtil();
+
+	@Test
+	public void testReverseArray() {
+		int[] origin = {7, 9 , 30, 3 , 18 , 21};
+		arrayUtil.printArray(origin,"before:");
+		
+		try {
+			arrayUtil.reverseArray(origin);
+			arrayUtil.printArray(origin , "after:");
+		} catch (Exception e) {
+			System.out.println(e);
+		}
+	}
+
+	@Test
+	public void testRemoveZero() {
+		 int[] oldArray={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};  
+		 arrayUtil.printArray(oldArray , "before:");
+		 int[] newArray = arrayUtil.removeZero(oldArray);
+		 arrayUtil.printArray(newArray , "after:");
+	}
+
+	@Test
+	public void testMerge() {
+		int[] array1 = {3, 5, 7,8};
+		int[] array2 = {4, 5, 6,7}; 
+		arrayUtil.printArray(array1 , "array1:");
+		arrayUtil.printArray(array2 , "array2:");
+		int[] newArray = arrayUtil.merge(array1, array2);
+		arrayUtil.printArray(newArray , "mergre after:");
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = {2,3,6}; 
+		int size = 3;
+		arrayUtil.printArray(oldArray , "grow before:");
+		int[] newArray = arrayUtil.grow(oldArray, size);
+		arrayUtil.printArray(newArray , "grow after:");
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 20;
+		int[] array = arrayUtil.fibonacci(max);
+		arrayUtil.printArray(array , max + "以内的所有斐波那契数列:");
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max = 100;
+		int[] array = arrayUtil.getPrimes(max);
+		arrayUtil.printArray(array , max + "以内的所有素数:");
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max = 1000;
+		int[] array = arrayUtil.getPerfectNumbers(max);
+		arrayUtil.printArray(array , max + "以内的所有完数:");
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = {3,8,9};
+		String seperator = "-";
+		String result = arrayUtil.join(array, seperator);
+		System.out.println(result);
+	}
+
+}
diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java b/group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..833e1464b4
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.leijing.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/Struts.java b/group07/764189149/src/com/leijing/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..fbabd397ed
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/litestruts/Struts.java
@@ -0,0 +1,134 @@
+package com.leijing.coderising.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+/**
+ * @Description: 解析Struts文件、处理action请求
+ * @author: leijing
+ * @date: 2017年3月3日 下午3:03:38
+ */
+public class Struts {
+	private static String STRUTS_XML = "struts.xml";
+
+	private static Map<String,String> actionsMap = new HashMap<String, String>();
+	private static Map<String,String> resultMap = new HashMap<String, String>();
+	private Struts(){
+		try {
+			init();
+		} catch (Exception e) {
+			System.out.println("Struts init error:"+e.getMessage());
+		}
+
+	}
+
+	/**
+	 * @Description: 确保配置的是需要的节点
+	 * @param xmlName
+	 * @param name
+	 * @return: void
+	 * @author: leijing  
+	 * @date: 2017年3月3日 下午3:20:31
+	 */
+	private void checkTag(String xmlName , String name) throws Exception{
+		if(xmlName == null || name == null || !xmlName.equals(name)){
+			throw new Exception("xml parse error,"+xmlName+"can not be parsed,"+name+" is required!");
+		}
+	}
+	private void init() throws Exception{
+		InputStream inputStream = this.getClass().getResourceAsStream(STRUTS_XML);
+		SAXReader reader = new SAXReader();//创建SAXReader对象                
+		Document  document = reader.read(inputStream); //用SAXReader对象加载配置文件得到Document对象
+		Element struts = document.getRootElement();//得到根节点
+		checkTag(struts.getName(), "struts");
+		List<Element> actions = struts.elements();//得到所有action节点
+
+		for(Iterator<Element> it = actions.iterator() ; it.hasNext();){//遍历action节点
+			Element action = (Element) it.next();
+			checkTag(action.getName(), "action");
+			Attribute actionName = action.attribute("name");
+			Attribute actionClazz = action.attribute("class");
+			actionsMap.put(actionName.getText(), actionClazz.getText());
+			System.out.println("add to actionsMap:"+actionName.getText()+":"+actionClazz.getText());
+
+			List<Element> results = action.elements();//得到配置的result节点
+			for(Iterator<Element> rit = results.iterator() ; rit.hasNext();){//遍历result节点
+				Element result = (Element) rit.next();
+				checkTag(result.getName(), "result");
+				Attribute resultName = result.attribute("name");
+				resultMap.put(actionName.getText()+"_"+resultName.getText() , result.getData().toString());
+				System.out.println("add to resultMap: result:"+resultName.getText()+",url:"+result.getData());
+			}
+		}
+
+
+	}
+
+	public static View runAction(String actionName, Map<String,String> parameters) throws Exception {
+		/*
+
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+
+		 */
+		if(!actionsMap.containsKey(actionName)){
+			throw new Exception("action "+actionName+"not found!");
+		}
+
+		String className = actionsMap.get(actionName);
+		Class<?> clazz = Class.forName(className);
+		Object obj = clazz.newInstance();
+		Field[] fields = clazz.getDeclaredFields();
+		
+		for (Field field : fields) {
+			field.setAccessible(true);
+			if(parameters.containsKey(field.getName())){
+				field.set(obj, parameters.get(field.getName()));
+			}
+		}
+		Method execute = clazz.getDeclaredMethod("execute");
+		String result = (String) execute.invoke(obj, new Object[]{});
+		String jsp = resultMap.get(actionName+"_"+result);
+		if(null == jsp){
+			throw new Exception("jsp config at action:"+actionName +",result:"+ result+" not found !");
+		}
+		Field message = clazz.getDeclaredField("message");
+		message.setAccessible(true);
+		View view = new View();
+		view.setJsp(jsp);
+		Map<String,Object> params = new HashMap<String,Object>();
+		params.put("message", message.get(obj));
+		view.setParameters(params);
+		return view;
+	}    
+	public static Struts getInstance(){
+		return StrutsHoldler.INSTANCE;
+	}
+	private static class  StrutsHoldler{
+		private static Struts INSTANCE = new Struts();//struts对象应该是单例的
+	}
+}
diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java b/group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..787d2bcd28
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,44 @@
+package com.leijing.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+private Struts struts = Struts.getInstance();//struts对象应该是单例的
+	
+	@Test
+	public void testLoginActionSuccess() throws Exception {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/View.java b/group07/764189149/src/com/leijing/coderising/litestruts/View.java
new file mode 100644
index 0000000000..3411bf9130
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/litestruts/View.java
@@ -0,0 +1,38 @@
+package com.leijing.coderising.litestruts;
+
+import java.util.Map;
+import java.util.Set;
+
+public class View {
+	private String jsp;
+	private Map<String , Object> parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("jsp:").append(jsp);
+		if(null == parameters){
+			return sb.toString();
+		}
+		Set<String> keys =  parameters.keySet();
+				
+		for (String key : keys) {
+			sb.append(",").append(key).append(":").append(parameters.get(key));
+		}
+		return sb.toString();
+	}
+}
diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/struts.xml b/group07/764189149/src/com/leijing/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..0ef54148e1
--- /dev/null
+++ b/group07/764189149/src/com/leijing/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.leijing.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.leijing.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group10/1363044717/struts/homework/homework/pom.xml b/group10/1363044717/struts/homework/homework/pom.xml
new file mode 100644
index 0000000000..54675f52ac
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com</groupId>
+    <artifactId>code</artifactId>
+    <version>1.0</version>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.1</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..aee11e5122
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java
@@ -0,0 +1,318 @@
+package com.code.coderising.array;
+
+import org.junit.Test;
+import java.util.Arrays;
+
+/**
+ * Created by Mori on 2017/3/2.
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        int n = origin.length;
+        for (int i = 0, j = n >> 1; i < j; i++) {
+            int temp = origin[i];
+            origin[i] = origin[n - i - 1];
+            origin[n - i - 1] = temp;
+        }
+    }
+
+    @Test
+    public void testReverseArray() {
+        int[] a = {7, 9, 30, 3};
+        System.out.println("原数组:" + Arrays.toString(a));
+        reverseArray(a);
+        System.out.println("reverseArray后:" + Arrays.toString(a));
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+    public int[] removeZero(int[] oldArray) {
+        Arrays.sort(oldArray);
+        int[] newArr = null;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                newArr = new int[oldArray.length - i];
+                System.arraycopy(oldArray, i, newArr, 0, oldArray.length - i);
+                break;
+            }
+        }
+        return newArr;
+    }
+
+    @Test
+    public void testRemoveZero() {
+        int[] a = {7, 9, 0, 30, 0, 0, 3};
+        System.out.println("原数组:" + Arrays.toString(a));
+        int[] newArr = removeZero(a);
+        System.out.println("removeZero后:" + Arrays.toString(newArr));
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        int m = array1.length;
+        int n = array2.length;
+        int[] newArr = new int[m + n];
+        int i = 0, j = 0, k = 0;
+        for (; i < m && j < n; ) {
+            if (array1[i] < array2[j]) {
+                newArr[k++] = array1[i++];
+            } else {
+                newArr[k++] = array2[j++];
+            }
+
+        }
+        while (i < m) {
+            newArr[k++] = array1[i++];
+        }
+        while (j < n) {
+            newArr[k++] = array2[j++];
+        }
+        if (newArr.length < 1)
+            return null;
+        int slow = 1;
+        int count = 0;
+        for (int fast = 1; fast < newArr.length; fast++) {
+            if (newArr[fast] != newArr[slow - 1]) {
+                newArr[slow++] = newArr[fast];
+            } else {
+                count++;
+            }
+        }
+        int[] arr = new int[newArr.length - count];
+        System.arraycopy(newArr, 0, arr, 0, newArr.length - count);
+        return arr;
+    }
+
+    @Test
+    public void testMerge() {
+        int[] a1 = {3, 5, 7, 8, 10, 10, 10, 10, 10};
+        int[] a2 = {4, 5, 6, 7, 10, 12};
+        int[] newArray = merge(a1, a2);
+        System.out.println("merge:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        for (int i = 0; i < oldArray.length; i++) {
+            newArray[i] = oldArray[i];
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testGrow() {
+        int[] arr = {2, 3, 6};
+        int[] newArray = grow(arr, 3);
+        System.out.println("grow:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (max == 1) {
+            return new int[0];
+        }
+        int a = 1;
+        int b = 1;
+        int temp;
+        StringBuilder str = new StringBuilder("1,1,");
+        while (a + b < max) {
+            temp = b;
+            b = a + b;
+            a = temp;
+            str.append(b + ",");
+        }
+        String[] arr = str.toString().split(",");
+        int[] newArray = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            newArray[i] = Integer.valueOf(arr[i]);
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testFibonacci() {
+        int[] newArray = fibonacci(500);
+        System.out.println("Fibonacci:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        StringBuilder str = new StringBuilder();
+        for (int i = 2; i < max; i++) {
+            if (i < 4) {
+                str.append(i + ",");
+                continue;
+            } else if (i % 2 == 0) {
+                continue;
+            } else if (i < 9) {
+                str.append(i + ",");
+                continue;
+            } else if (i % 3 == 0) {
+                continue;
+            } else {
+                int f = 5;
+                boolean flag = true;
+                while (f <= i/f) {
+                    if (i % f == 0) {
+                        flag = false;
+                        break;
+                    } else if (i % (f + 2) == 0) {
+                        flag = false;
+                        break;
+                    }
+                    f += 6;
+                }
+                if (flag) {
+                    str.append(i + ",");
+                    continue;
+                }
+            }
+        }
+        String[] arr = str.toString().split(",");
+        int[] newArray = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            newArray[i] = Integer.valueOf(arr[i]);
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testGetPrimes() {
+        int[] newArray = getPrimes(5000);
+        System.out.println("getPrimes:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        if(max<7){
+            return new int[0];
+        }
+        boolean flag = true;
+        StringBuilder str = new StringBuilder("6,");
+        for (int i = 6; i < max; ) {
+            int sum = 1;
+            if (i % 3 == 1 && i % 9 == 1) {
+                //如果以8结尾，那么就肯定是以28结尾
+                if(!flag){
+                    if(i%100!=28){
+                        i += 8;
+                        flag = true;
+                        continue;
+                    }
+                }
+                    for (int j = 2; j <= i / j; j++) {
+                        if (i % j == 0) {
+                            sum += j;
+                            sum += i / j;
+                        }
+                    }
+                    if (sum == i) {
+                        str.append(i+",");
+                    }
+            }
+            if (flag) {
+                i += 2;
+                flag = false;
+            } else {
+                i += 8;
+                flag = true;
+            }
+        }
+        String[] arr = str.toString().split(",");
+        int[] newArray = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            newArray[i] = Integer.valueOf(arr[i]);
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testGetPerfectNumbers() {
+        int[] newArray = getPerfectNumbers(33550337);
+        System.out.println("getPerfectNumbers:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        if (array == null)
+            return "null";
+        int n = array.length - 1;
+        if (n == -1) {
+            return "";
+        }
+        StringBuilder b = new StringBuilder();
+        for (int i = 0; ; i++) {
+            b.append(array[i]);
+            if (i == n) {
+                return b.toString();
+            }
+            b.append(seperator);
+        }
+    }
+
+    @Test
+    public void testJoin() {
+        int[] a1 = {3, 5, 7};
+        System.out.println(join(a1, "-"));
+    }
+
+}
diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..cd1753941c
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.code.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..262b4bca59
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java
@@ -0,0 +1,79 @@
+package com.code.coderising.litestruts;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        SAXReader reader = new SAXReader();
+        View view=new View();
+        try {
+            Document e = reader.read(ClassLoader.getSystemResource("struts.xml"));
+            //得到根节点
+            Element struts = e.getRootElement();
+            Iterator it = struts.elementIterator();
+            while(it.hasNext()) {//action遍历
+                Element action = (Element)it.next();
+                // 找到 name=actionName 的action
+                List<Attribute> actionAtr = action.attributes();
+                if(!actionAtr.get(0).getValue().equals(actionName))
+                    continue;
+                String className= actionAtr.get(1).getValue();
+                //得到actionName 对应的class
+                Class classz=Class.forName(className);
+                Object o=classz.newInstance();
+                Field field;
+                for(Map.Entry<String, String> entry:parameters.entrySet()){
+                    field = classz.getDeclaredField(entry.getKey());
+                    field.setAccessible(true);
+                    field.set(o, entry.getValue());
+                }
+                Method m = classz.getMethod("execute");
+                String resultString=(String)m.invoke(o);
+                Method m2 = classz.getMethod("getMessage");
+                String message=(String)m2.invoke(o);
+
+                Map<String,String> map=new HashMap<>();
+
+                map.put("message",message);
+                view.setParameters(map);
+                it=action.elementIterator();
+                //遍历 <result>
+                while (it.hasNext()){
+                    Element result = (Element)it.next();
+                    String s= result.attribute(0).getValue();
+                    if(resultString.equals(s)){
+                        view.setJsp(result.getStringValue());
+                        return view;
+                    }
+                }
+            }
+        } catch (DocumentException var9) {
+            var9.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}
diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..fe414cf1a7
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.code.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f55dae45fa
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.code.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group10/1363044717/struts/homework/homework/src/main/resources/struts.xml b/group10/1363044717/struts/homework/homework/src/main/resources/struts.xml
new file mode 100644
index 0000000000..b9489dad6d
--- /dev/null
+++ b/group10/1363044717/struts/homework/homework/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.code.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.code.coderising.litestruts.LoginAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group10/1363044717/struts/homework/pom.xml b/group10/1363044717/struts/homework/pom.xml
new file mode 100644
index 0000000000..54675f52ac
--- /dev/null
+++ b/group10/1363044717/struts/homework/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com</groupId>
+    <artifactId>code</artifactId>
+    <version>1.0</version>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.1</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..aee11e5122
--- /dev/null
+++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java
@@ -0,0 +1,318 @@
+package com.code.coderising.array;
+
+import org.junit.Test;
+import java.util.Arrays;
+
+/**
+ * Created by Mori on 2017/3/2.
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        int n = origin.length;
+        for (int i = 0, j = n >> 1; i < j; i++) {
+            int temp = origin[i];
+            origin[i] = origin[n - i - 1];
+            origin[n - i - 1] = temp;
+        }
+    }
+
+    @Test
+    public void testReverseArray() {
+        int[] a = {7, 9, 30, 3};
+        System.out.println("原数组:" + Arrays.toString(a));
+        reverseArray(a);
+        System.out.println("reverseArray后:" + Arrays.toString(a));
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+    public int[] removeZero(int[] oldArray) {
+        Arrays.sort(oldArray);
+        int[] newArr = null;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                newArr = new int[oldArray.length - i];
+                System.arraycopy(oldArray, i, newArr, 0, oldArray.length - i);
+                break;
+            }
+        }
+        return newArr;
+    }
+
+    @Test
+    public void testRemoveZero() {
+        int[] a = {7, 9, 0, 30, 0, 0, 3};
+        System.out.println("原数组:" + Arrays.toString(a));
+        int[] newArr = removeZero(a);
+        System.out.println("removeZero后:" + Arrays.toString(newArr));
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        int m = array1.length;
+        int n = array2.length;
+        int[] newArr = new int[m + n];
+        int i = 0, j = 0, k = 0;
+        for (; i < m && j < n; ) {
+            if (array1[i] < array2[j]) {
+                newArr[k++] = array1[i++];
+            } else {
+                newArr[k++] = array2[j++];
+            }
+
+        }
+        while (i < m) {
+            newArr[k++] = array1[i++];
+        }
+        while (j < n) {
+            newArr[k++] = array2[j++];
+        }
+        if (newArr.length < 1)
+            return null;
+        int slow = 1;
+        int count = 0;
+        for (int fast = 1; fast < newArr.length; fast++) {
+            if (newArr[fast] != newArr[slow - 1]) {
+                newArr[slow++] = newArr[fast];
+            } else {
+                count++;
+            }
+        }
+        int[] arr = new int[newArr.length - count];
+        System.arraycopy(newArr, 0, arr, 0, newArr.length - count);
+        return arr;
+    }
+
+    @Test
+    public void testMerge() {
+        int[] a1 = {3, 5, 7, 8, 10, 10, 10, 10, 10};
+        int[] a2 = {4, 5, 6, 7, 10, 12};
+        int[] newArray = merge(a1, a2);
+        System.out.println("merge:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        for (int i = 0; i < oldArray.length; i++) {
+            newArray[i] = oldArray[i];
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testGrow() {
+        int[] arr = {2, 3, 6};
+        int[] newArray = grow(arr, 3);
+        System.out.println("grow:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (max == 1) {
+            return new int[0];
+        }
+        int a = 1;
+        int b = 1;
+        int temp;
+        StringBuilder str = new StringBuilder("1,1,");
+        while (a + b < max) {
+            temp = b;
+            b = a + b;
+            a = temp;
+            str.append(b + ",");
+        }
+        String[] arr = str.toString().split(",");
+        int[] newArray = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            newArray[i] = Integer.valueOf(arr[i]);
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testFibonacci() {
+        int[] newArray = fibonacci(500);
+        System.out.println("Fibonacci:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        StringBuilder str = new StringBuilder();
+        for (int i = 2; i < max; i++) {
+            if (i < 4) {
+                str.append(i + ",");
+                continue;
+            } else if (i % 2 == 0) {
+                continue;
+            } else if (i < 9) {
+                str.append(i + ",");
+                continue;
+            } else if (i % 3 == 0) {
+                continue;
+            } else {
+                int f = 5;
+                boolean flag = true;
+                while (f <= i/f) {
+                    if (i % f == 0) {
+                        flag = false;
+                        break;
+                    } else if (i % (f + 2) == 0) {
+                        flag = false;
+                        break;
+                    }
+                    f += 6;
+                }
+                if (flag) {
+                    str.append(i + ",");
+                    continue;
+                }
+            }
+        }
+        String[] arr = str.toString().split(",");
+        int[] newArray = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            newArray[i] = Integer.valueOf(arr[i]);
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testGetPrimes() {
+        int[] newArray = getPrimes(5000);
+        System.out.println("getPrimes:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        if(max<7){
+            return new int[0];
+        }
+        boolean flag = true;
+        StringBuilder str = new StringBuilder("6,");
+        for (int i = 6; i < max; ) {
+            int sum = 1;
+            if (i % 3 == 1 && i % 9 == 1) {
+                //如果以8结尾，那么就肯定是以28结尾
+                if(!flag){
+                    if(i%100!=28){
+                        i += 8;
+                        flag = true;
+                        continue;
+                    }
+                }
+                    for (int j = 2; j <= i / j; j++) {
+                        if (i % j == 0) {
+                            sum += j;
+                            sum += i / j;
+                        }
+                    }
+                    if (sum == i) {
+                        str.append(i+",");
+                    }
+            }
+            if (flag) {
+                i += 2;
+                flag = false;
+            } else {
+                i += 8;
+                flag = true;
+            }
+        }
+        String[] arr = str.toString().split(",");
+        int[] newArray = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            newArray[i] = Integer.valueOf(arr[i]);
+        }
+        return newArray;
+    }
+
+    @Test
+    public void testGetPerfectNumbers() {
+        int[] newArray = getPerfectNumbers(33550337);
+        System.out.println("getPerfectNumbers:" + Arrays.toString(newArray));
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        if (array == null)
+            return "null";
+        int n = array.length - 1;
+        if (n == -1) {
+            return "";
+        }
+        StringBuilder b = new StringBuilder();
+        for (int i = 0; ; i++) {
+            b.append(array[i]);
+            if (i == n) {
+                return b.toString();
+            }
+            b.append(seperator);
+        }
+    }
+
+    @Test
+    public void testJoin() {
+        int[] a1 = {3, 5, 7};
+        System.out.println(join(a1, "-"));
+    }
+
+}
diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..cd1753941c
--- /dev/null
+++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.code.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..262b4bca59
--- /dev/null
+++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java
@@ -0,0 +1,79 @@
+package com.code.coderising.litestruts;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        SAXReader reader = new SAXReader();
+        View view=new View();
+        try {
+            Document e = reader.read(ClassLoader.getSystemResource("struts.xml"));
+            //得到根节点
+            Element struts = e.getRootElement();
+            Iterator it = struts.elementIterator();
+            while(it.hasNext()) {//action遍历
+                Element action = (Element)it.next();
+                // 找到 name=actionName 的action
+                List<Attribute> actionAtr = action.attributes();
+                if(!actionAtr.get(0).getValue().equals(actionName))
+                    continue;
+                String className= actionAtr.get(1).getValue();
+                //得到actionName 对应的class
+                Class classz=Class.forName(className);
+                Object o=classz.newInstance();
+                Field field;
+                for(Map.Entry<String, String> entry:parameters.entrySet()){
+                    field = classz.getDeclaredField(entry.getKey());
+                    field.setAccessible(true);
+                    field.set(o, entry.getValue());
+                }
+                Method m = classz.getMethod("execute");
+                String resultString=(String)m.invoke(o);
+                Method m2 = classz.getMethod("getMessage");
+                String message=(String)m2.invoke(o);
+
+                Map<String,String> map=new HashMap<>();
+
+                map.put("message",message);
+                view.setParameters(map);
+                it=action.elementIterator();
+                //遍历 <result>
+                while (it.hasNext()){
+                    Element result = (Element)it.next();
+                    String s= result.attribute(0).getValue();
+                    if(resultString.equals(s)){
+                        view.setJsp(result.getStringValue());
+                        return view;
+                    }
+                }
+            }
+        } catch (DocumentException var9) {
+            var9.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}
diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..fe414cf1a7
--- /dev/null
+++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.code.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f55dae45fa
--- /dev/null
+++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.code.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group10/1363044717/struts/homework/src/main/resources/struts.xml b/group10/1363044717/struts/homework/src/main/resources/struts.xml
new file mode 100644
index 0000000000..b9489dad6d
--- /dev/null
+++ b/group10/1363044717/struts/homework/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.code.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.code.coderising.litestruts.LoginAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java"
index 620e8ead95..73a0b0ae33 100644
--- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java"
+++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java"
@@ -89,18 +89,15 @@ public boolean isEmpty() {
 	}
 
 	public Iterator iterator(){
-		return new ArrayListIterator(this);
+		return new ArrayListIterator();
 	}
 
 	private class ArrayListIterator<E> implements Iterator{
 
-		private Object [] array;
-		private int endIndex = 0;
+		private int endIndex = size - 1;
 		private int index = 0;
 
-		public ArrayListIterator(ArrayList list){
-			this.array=list.elementData;
-			this.endIndex = list.size();
+		public ArrayListIterator(){
 		}
 		@Override
 		public boolean hasNext() {
@@ -112,7 +109,7 @@ public E next() {
 			if(!this.hasNext()) {
 				throw new NoSuchElementException();//没有元素了
 			} else {
-				return (E)Array.get(this.array, this.index++);
+				return (E)elementData[this.index++];
 			}
 		}
 	}
diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java"
index 760fec91e9..9a1ae01119 100644
--- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java"
+++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java"
@@ -61,19 +61,16 @@ public E remove(int index) {
             E e = removeFirst();
             return e;
         }
-        if (index == size) {
+        if (index == size - 1) {
             E e = removeLast();
             return e;
         }
         Node temp = head;
-        Node temp2 = null;
         for (int i = 0; i < index - 1; i++) {
             temp = temp.next;
         }
         E e = (E) temp.next.data;
-        temp2 = temp.next.next;
-        temp.next = null;
-        temp.next = temp2;
+        temp.next = temp.next.next;
         size--;
         return e;
     }
@@ -139,7 +136,7 @@ private class LinkedListIterator<E> implements Iterator{
         public LinkedListIterator(LinkedList list){
             this.head=list.head;
             this.tail=list.tail;
-            this.endIndex = list.size();
+            this.endIndex = list.size() - 1;
             node=head;
         }
         @Override
diff --git a/group10/205301442/src/com/coding/week2/ArrayUtil.java b/group10/205301442/src/com/coding/week2/ArrayUtil.java
new file mode 100644
index 0000000000..b11f5ee71d
--- /dev/null
+++ b/group10/205301442/src/com/coding/week2/ArrayUtil.java
@@ -0,0 +1,199 @@
+package com.coding.week2;
+
+public class ArrayUtil {
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+	int j=origin.length-1;
+		for(int i=0;i<origin.length/2;i++){
+			int temp = origin[i];
+			origin[i] = origin[j];
+			origin[j] = temp;
+			j--;
+		}
+		return origin;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		int[] removeZero=new int[oldArray.length];
+		int size = 0;
+		for(int i=0;i<oldArray.length;i++ ){
+			if(oldArray[i]!=0){
+				removeZero[size]=oldArray[i] ;
+				size++;
+			}
+		}
+		
+		
+		return copyArray(removeZero, size);
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int[] array3 =copyArray(array2, array1.length+array2.length);
+		int size = array2.length;
+	
+			for(int i=0;i<array1.length;i++){
+				boolean insert = false;
+				for(int j=0;j<size;j++){
+					if(array1[i]<array3[j]){
+						System.arraycopy(array3,j , array3,j+1 , size-j);
+						array3[j]=array1[i];
+						insert = true;
+						size++;
+						break;
+					}else if(array1[i]==array3[j]){
+						insert = true;
+						break;
+					}
+				}
+				if(!insert){
+					array3[size]=array1[i];
+					size++;
+				}
+			}
+		
+		return copyArray(array3, size);
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		int[] nums = new int[max];
+		int a = 1;
+		int b = 1;
+		int c = 0;
+		int index = 2;
+		nums[0] = 1;
+		nums[1] = 1;
+		 int temp =0;
+		while(temp<max){
+		    temp = nums[index-1]+nums[index-2];
+		    if(temp<max){
+		    	nums[index] = temp;
+		    	index++;
+		    }
+			
+			
+		}
+		return copyArray(nums, index);
+		
+	}
+
+	private  static int[] copyArray(int[] nums, int size) {
+		int[] newNums = new int[size];
+		int length = size>=nums.length?nums.length:size;
+		
+		System.arraycopy(nums, 0, newNums, 0, length);
+		return newNums;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	//这里为什么是开平方根
+	public static  int[] getPrimes(int max){
+		int i=2;
+		int[] nums = new int[max];
+		int index=0;
+		while(i<max){
+			boolean isSu = true;
+			for(int j=1;j<Math.sqrt(i);j++){
+				if(i%j==0){
+					isSu=false;
+				}
+				
+			}
+			if(isSu){
+				nums[index] = i;
+			}
+		}
+		copyArray(nums, index+1);
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		int[] nums = new int[max];
+		int sum = 0;
+		int size=0;
+		for(int i=0;i<=max;i++){
+			sum+=(i+1);
+			nums[i]=i+1;
+			size++;
+			if(sum==max){
+				break;
+			}
+		}
+		return copyArray(nums, size);
+		
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public  static 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]+seperator);
+			}else{
+				sb.append(array[i]);
+			}
+			
+		}
+		return sb.toString();
+	}
+}
diff --git a/group10/205301442/src/com/coding/week2/ArrayUtilTest.java b/group10/205301442/src/com/coding/week2/ArrayUtilTest.java
new file mode 100644
index 0000000000..a64ac51502
--- /dev/null
+++ b/group10/205301442/src/com/coding/week2/ArrayUtilTest.java
@@ -0,0 +1,73 @@
+package com.coding.week2;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		int[] a = {1,2,3,4,5,6};
+		int[] b=ArrayUtil.reverseArray(a);
+		for(int i =0;i<b.length;i++){
+	//		System.out.print(b[i]+"  ");		
+	   }
+	}
+     
+	@Test
+	public void testRemoveZero() {
+		int[] a = {0,1,2,3,0,0,4,0,5,6,0};
+		int[] b=ArrayUtil.removeZero(a);
+		printArray(b, "removeZero");
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a = {2,3,6,8};
+		int[] b = {1,3,5,7};
+	  int[] newA= ArrayUtil.merge(a, b);
+	  printArray(newA, "merge");
+	}
+
+	private void printArray(int[] newA,String name) {
+		System.out.println("------------------"+name+"---------------------");
+		  for(int i=0;i<newA.length;i++){
+			  System.out.print(newA[i]+"\t");
+			 
+		  }
+		  System.out.println();
+	}
+
+	@Test
+	public void testGrow() {
+		
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] arr = ArrayUtil.fibonacci(18);
+		printArray(arr, "Fibonacci");
+	}
+
+	@Test
+	public void testGetPrimes() {
+		
+		int[] arr = ArrayUtil.getPrimes(9);
+		printArray(arr,"Primes");
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] arr = ArrayUtil.getPerfectNumbers(10);
+		printArray(arr,"Perfect");
+	}
+
+	@Test
+	public void testJoin() {
+		int[] a = {1,2,3,4,5,6};
+		String b=ArrayUtil.join(a, "-");
+		//System.out.println(b);
+	}
+
+}
diff --git a/group10/205301442/src/com/coding/week2/litestruts/LoginAction.java b/group10/205301442/src/com/coding/week2/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1034f41d4e
--- /dev/null
+++ b/group10/205301442/src/com/coding/week2/litestruts/LoginAction.java
@@ -0,0 +1,34 @@
+package com.coding.week2.litestruts;
+
+public class LoginAction {
+	 private String name ;
+	    private String password;
+	    private String message;
+
+	    public String getName() {
+	        return name;
+	    }
+
+	    public String getPassword() {
+	        return password;
+	    }
+
+	    public String execute(){
+	            if("test".equals(name) && "1234".equals(password)){
+	                this.message = "login successful";
+	                return "success";
+	            }
+	            this.message = "login failed,please check your user/pwd";
+	            return "fail";
+	    }
+
+	    public void setName(String name){
+	        this.name = name;
+	    }
+	    public void setPassword(String password){
+	        this.password = password;
+	    }
+	    public String getMessage(){
+	        return this.message;
+	    }
+}
diff --git a/group10/205301442/src/com/coding/week2/litestruts/Struts.java b/group10/205301442/src/com/coding/week2/litestruts/Struts.java
new file mode 100644
index 0000000000..41cde31aef
--- /dev/null
+++ b/group10/205301442/src/com/coding/week2/litestruts/Struts.java
@@ -0,0 +1,153 @@
+package com.coding.week2.litestruts;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class Struts {
+	public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+		File f1 = new File("config/struts.xml");
+		
+		File f = new File(f1.getAbsolutePath());
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+		try {
+			DocumentBuilder builder = factory.newDocumentBuilder();
+			Document doc=builder.parse(f);
+			Element root =  doc.getDocumentElement();
+		
+			Map<String,Map<String,String>> actions = new HashMap<String,Map<String,String>>();
+			if (root.getNodeType() == Node.ELEMENT_NODE) {  
+				NodeList actionList = root.getChildNodes();
+				
+			     for (int i = 0; i < actionList.getLength(); i++) {  
+			    	 Node n = actionList.item(i);
+	                 if (n.getNodeType() == Node.ELEMENT_NODE) {  
+	                	 NamedNodeMap nnmap = n.getAttributes();  
+	                	 Map<String,String> action = new HashMap<String,String>();
+	                	 action.put(nnmap.item(0).getNodeValue(),nnmap.item(1).getNodeValue());
+	                	 NodeList result= n.getChildNodes();
+	                
+	                	 for(int j = 0;j<result.getLength();j++){
+	                		 Node r = result.item(j);
+	                	
+	                		 if(r.getNodeType() ==  Node.ELEMENT_NODE){
+	                			 NamedNodeMap nn = r.getAttributes();  
+	                			
+		                		 action.put(nn.item(0).getNodeValue(), r.getFirstChild().toString());
+	                		 }
+	                		
+	                		 
+	                	 }
+	                	 actions.put(nnmap.item(0).getNodeValue(), action);
+	                	
+	                 }  
+	            }  
+			}
+			
+			Map<String,String> requestAction=null;
+			if(actionName!=null){
+				requestAction=actions.get(actionName);
+			}else{
+				System.err.println("没有actionName");
+			}
+			
+			try {
+				if(requestAction!=null){
+					Class<?>  c = Class.forName(requestAction.get(actionName));
+					Object co = c.newInstance();
+					if("login".equals(actionName)){
+						String name = parameters.get("name");
+						String password = parameters.get("password");
+						Method m1=c.getMethod("setName", String.class);
+						Method m2=c.getMethod("setPassword", String.class);
+						Method m3 = c.getMethod("execute");
+						m1.invoke(co, name);
+						m2.invoke(co, password);
+						String rest = (String)m3.invoke(co);
+						Method m4 = c.getMethod("getMessage");
+						String message = (String)m4.invoke(co);
+						Map<String,String> pras =new HashMap<String,String>();
+						pras.put("message", message);
+						View view = new View();
+						view.setJsp(requestAction.get(rest));
+						view.setParameters(pras);
+						return view;
+					}
+				}else{
+					System.out.println("没有找到对应action");
+				}
+				
+			} catch (ClassNotFoundException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (NoSuchMethodException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (SecurityException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (InstantiationException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (IllegalArgumentException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (InvocationTargetException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} 
+			
+		} catch (ParserConfigurationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SAXException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return null;
+    }    
+	
+}
diff --git a/group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java b/group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..99e41bd0f4
--- /dev/null
+++ b/group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java
@@ -0,0 +1,40 @@
+package com.coding.week2.litestruts;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        System.out.println( view.getJsp());
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        System.out.println( view.getJsp());
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/205301442/src/com/coding/week2/litestruts/View.java b/group10/205301442/src/com/coding/week2/litestruts/View.java
new file mode 100644
index 0000000000..bf7bd0d6c8
--- /dev/null
+++ b/group10/205301442/src/com/coding/week2/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coding.week2.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath"
new file mode 100644
index 0000000000..fb565a588d
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath"
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project"
new file mode 100644
index 0000000000..34d5612cf4
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project"
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>DataStructure_One</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs"
new file mode 100644
index 0000000000..7341ab1683
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs"
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java"
new file mode 100644
index 0000000000..1d3f5bf099
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java"
@@ -0,0 +1,236 @@
+package list;
+
+import java.util.Arrays;
+import java.util.ConcurrentModificationException;
+import java.util.NoSuchElementException;
+
+public class ArrayList implements List{
+	private int size ;
+	private Object [] elementData;
+	private static final Object [] EMPTY_ELEMENTDATA ={};
+	private static final int DEFAULT_CAPACITY = 10;
+	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
+	public ArrayList(){
+		this.elementData = EMPTY_ELEMENTDATA;
+	}
+	public ArrayList(int limit){
+		if(limit<0)
+			throw new IllegalArgumentException("Illegal Capacity: "+limit);
+		this.elementData = new Object[limit];
+	}
+	/**
+	 * 添加元素
+	 * @param o 元素
+	 * @return 是否成功添加
+	 */
+	public boolean add(Object o){
+		ensureCapacityInternal(size+1);
+		elementData[size++]=o;
+		return true;
+	}
+	/**
+	 * 添加元素
+	 * @param index 添加位置
+	 * @param o 元素
+	 * @return 是否成功添加
+	 */
+	public void  add(int index, Object o) {
+		if (index > size || index < 0) {
+			throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
+		}
+		ensureCapacityInternal(size + 1);
+		//将A数组的的a位置开始 复制至B数组的a+1位置进行覆盖--->等于将B数组a位置后面的所有元素向后移了一位。
+		System.arraycopy(elementData, index, elementData, index+1, size-index);
+		elementData[index] = o;
+		size++;
+	}
+	
+	/**
+	 * 删除元素
+	 * @param o 元素
+	 * @return 是否成功删除
+	 */
+	public boolean remove(Object o) {
+		if (o == null) {
+			for (int index = 0; index < size; index++) {
+				if (elementData[index] == null) {
+					fastRemove(index);
+					return true;
+				}
+			}
+		} else {
+			for (int i = 0; i < size; i++) {
+				if(elementData[i].equals(o)){
+					fastRemove(i);
+					return true;
+				}	
+			}
+		}
+
+		return false;
+	}
+	/**
+	 * 删除元素
+	 * @param index 需要删除的元素的位置
+	 * @return 被删除的元素
+	 */
+	public Object remove(int index) {
+		if (index < 0 || index >= size) {
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
+		}
+		Object o =elementData[index];
+		fastRemove(index);
+		return o;
+	}
+	
+	
+	
+	/**
+	 * 查询元素
+	 * @param index 位置 
+	 * @return 被查询的元素
+	 */
+	public Object get(int index){
+		if(index>=size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);		
+		return elementData[index];
+	}
+	
+	
+	
+
+	private void fastRemove(int index) {
+		//需要移动的个数
+		int move = size-index-1;
+		System.arraycopy(elementData, index+1, elementData, index, move);
+		elementData[size]=null;
+		size--;
+	}
+	private void ensureCapacityInternal(int newLength) {
+		 if (elementData == EMPTY_ELEMENTDATA) {
+			 newLength = Math.max(DEFAULT_CAPACITY, newLength);
+	        }
+		 //如果长度超过了elementData分配的内存上限 则需要继续分配内存
+		 if(newLength-elementData.length>0){
+			 grow(newLength);
+		 }
+	}
+
+	private void grow(int newLength) {
+		int oldCapacity = elementData.length;
+		int newCapacity = (oldCapacity >> 1) + oldCapacity;
+		if (newCapacity - newLength < 0) {
+			newCapacity = newLength;
+		}
+		// int 上限：2147483648
+		if (newCapacity > MAX_ARRAY_SIZE) {
+			newCapacity = newLength > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
+		}
+		// 扩容
+		elementData = Arrays.copyOf(elementData, newLength);
+	}
+	
+	@Override
+	public void clear() {
+		for (int i = 0; i < size; i++) {
+			elementData[i]=null;
+		}
+		size=0;
+	}
+	
+	
+	@Override
+	public boolean contains(Object o) {
+		if (indexOf(o) >= 0)
+			return true;
+		return false;
+	}
+	
+	@Override
+	public int indexOf(Object o) {
+		if(o==null){
+			for (int i = 0; i < size; i++) {
+				if(elementData[i]==null)
+					return i;				
+			}
+		}else{
+			for (int i = 0; i < size; i++) {
+				if(elementData[i].equals(o))
+					return i;
+			}
+		}
+		return -1;
+	}
+	
+	@Override
+	public boolean isEmpty() {
+		return size==0;
+	}
+	
+	
+	@Override
+	public Object set(int index, Object o) {
+		if(index<0||index>=size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
+		Object oldO=elementData[index];
+		elementData[index]=o;
+		return oldO;
+	}
+	@Override
+	public int size() {
+		
+		return size;
+	}
+	
+	@Override
+	public Iterator iterator() {
+		return new ArrayIterator();
+	}
+	private class ArrayIterator implements Iterator{
+		
+		int limit=ArrayList.this.size;
+		int cursor;   
+        int lastRet = -1; 
+
+		@Override
+		public boolean hasNext() {
+			return cursor < limit;
+		}
+
+		@Override
+		public Object next() {
+			int i = cursor;
+			if (cursor >= size) {
+				throw new NoSuchElementException();
+			}
+			Object[] o = ArrayList.this.elementData;
+			if (cursor > o.length)
+				throw new ConcurrentModificationException();
+			cursor = i + 1;
+			return o[lastRet = i];
+		}
+
+		@Override
+		public void remove() {
+			  if (lastRet < 0)
+	                throw new IllegalStateException();
+			  try {
+	                ArrayList.this.remove(lastRet);
+	                cursor = lastRet;
+	                lastRet = -1;
+	                limit--;
+	            } catch (IndexOutOfBoundsException ex) {
+	                throw new ConcurrentModificationException();
+	            }
+		}
+		
+	}
+	
+	
+	
+
+
+	
+	
+
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java"
new file mode 100644
index 0000000000..142fc4bafe
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java"
@@ -0,0 +1,20 @@
+package list;
+
+public interface Iterator {
+	/**
+	 * 是否有第一个值
+	 * @return
+	 */
+	boolean hasNext();
+	
+	/**
+	 * 获取下一个值
+	 * @return
+	 */
+	Object next();
+	
+	/**
+	 * 删除
+	 */
+	void remove();
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java"
new file mode 100644
index 0000000000..c311e183c8
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java"
@@ -0,0 +1,211 @@
+package list;
+
+public class LinkedList implements List {
+
+	public Node getFirst() {
+		return first;
+	}
+
+	public Node getLast() {
+		return last;
+	}
+
+	private int size;
+	private Node first;
+	private Node last;
+
+	@Override
+	public void add(int paramInt, Object paramE) {
+		checkPositionIndex(paramInt);
+		if (paramInt == size) {
+			linkLast(paramE);
+		} else {
+			linkBefore(paramE, node(paramInt));
+		}
+
+	}
+
+	// 寻找到需要插入的那个node
+	Node node(int paramInt) {
+		if (paramInt < size >> 1) {
+			Node x = first;
+			for (int i = 0; i < paramInt; i++) {
+				x = x.next;
+			}
+			return x;
+		} else {
+			Node x = last;
+			for (int i = size - 1; i > paramInt; i--) {
+				x = x.prev;
+			}
+			return x;
+		}
+	}
+
+	private void linkBefore(Object o, Node node) {
+		Node pred = node.prev;
+		Node newNode = new Node(pred, o, node);
+		node.prev = newNode;
+		if (pred == null) {
+			first = newNode;
+		} else {
+			pred.next = newNode;
+		}
+
+	}
+
+	private void checkPositionIndex(int paramInt) {
+		if (paramInt < 0 || paramInt > size) {
+			throw new IndexOutOfBoundsException("Index: " + paramInt + ", Size: " + size);
+		}
+	}
+
+	@Override
+	public boolean add(Object paramE) {
+		linkLast(paramE);
+		return true;
+	}
+
+	private void linkLast(Object paramE) {
+		Node l = last;
+		Node newNode = new Node(l, paramE, null);
+		last = newNode;
+		if (l == null) {
+			first = newNode;
+		} else {
+			l.next = newNode;
+		}
+		size++;
+	}
+
+	@Override
+	public void clear() {
+		for (Node x = first; x != null;) {
+			Node next = x.next;
+			x.next = null;
+			x.prev = null;
+			x.item = null;
+			x = next;
+		}
+		first = last = null;
+		size = 0;
+	}
+
+	@Override
+	public boolean contains(Object paramObject) {
+		return false;
+	}
+
+	@Override
+	public Object get(int paramInt) {
+		checkPositionIndex(paramInt);
+		return node(paramInt).item;
+	}
+
+	@Override
+	public int indexOf(Object paramObject) {
+		return 0;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0 ? true : false;
+	}
+
+	@Override
+	public Iterator iterator() {
+		return new LinkedIterator();
+	}
+
+	@Override
+	public Object remove(int paramInt) {
+		checkPositionIndex(paramInt);
+		return unlink(node(paramInt));
+	}
+
+	private Object unlink(Node node) {
+		Object item = node.item;
+		Node prev = node.prev;
+		Node next = node.next;
+		if (prev == null) {
+			first = next;
+		} else {
+			prev.next = next;
+			node.prev = null;
+		}
+		if (next == null) {
+			last = prev;
+		} else {
+			next.prev = prev;
+			node.next = null;
+		}
+		node.item = null;
+		size--;
+
+		return item;
+
+	}
+
+	@Override
+	public boolean remove(Object paramObject) {
+		return false;
+	}
+
+	@Override
+	public Object set(int paramInt, Object paramE) {
+		return null;
+	}
+
+	@Override
+	public int size() {
+		return size;
+	}
+
+	public static class Node {
+		public Object item;
+		public Node next;
+		public Node prev;
+
+		public Node(Node prev, Object item, Node next) {
+			this.item = item;
+			this.next = next;
+			this.prev = prev;
+		}
+
+	}
+
+	private class LinkedIterator implements Iterator {
+
+		int cursor = 0;
+		int lastRet = -1;
+
+		@Override
+		public boolean hasNext() {
+			return cursor < size();
+		}
+
+		@Override
+		public Object next() {
+			int i = cursor;
+			Object node = get(i);
+			lastRet = i;
+			cursor = i + 1;
+			return node;
+		}
+
+		@Override
+		public void remove() {
+			if (lastRet < 0) {
+				throw new IllegalStateException();
+			}
+			LinkedList.this.remove(lastRet);
+			if (lastRet < cursor) {
+				cursor--;
+			}
+			lastRet = -1;// 防止对一个数据多次remove操作
+
+		}
+
+	}
+
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java"
new file mode 100644
index 0000000000..05b2c99294
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java"
@@ -0,0 +1,32 @@
+package list;
+
+
+public interface List{
+	
+	public abstract void add(int paramInt, Object paramE);
+
+	public abstract boolean add(Object paramE);
+
+	public abstract void clear();
+
+	public abstract boolean contains(Object paramObject);
+
+	public abstract boolean equals(Object paramObject);
+
+	public abstract Object get(int paramInt);
+
+	public abstract int indexOf(Object paramObject);
+
+	public abstract boolean isEmpty();
+
+	public abstract Iterator iterator();
+
+	public abstract Object remove(int paramInt);
+
+	public abstract boolean remove(Object paramObject);
+
+	public abstract Object set(int paramInt, Object paramE);
+
+	public abstract int size();
+
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java"
new file mode 100644
index 0000000000..80c52f2d53
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java"
@@ -0,0 +1,56 @@
+package queue;
+
+import list.LinkedList;
+
+public class ListQueue {
+
+	LinkedList list;
+
+	public ListQueue() {
+		list = new LinkedList();
+	}
+
+	public int size() {
+		return list.size();
+	}
+
+	public boolean isEmpty() {
+		return list.size() == 0 ? true : false;
+	}
+
+	public boolean remove(Object o) {
+		return list.remove(o);
+	}
+
+	public void clear() {
+		list.clear();
+	}
+
+	public boolean add(Object e) {
+		return list.add(e);
+	}
+
+	public boolean offer(Object e) {
+		return false;
+	}
+
+	public Object poll() {
+		if (list.size() == 0) {
+			return null;
+		}else{
+			Object item = list.getFirst().item;
+			list.remove(0);
+			return item;
+		}
+	}
+
+
+	public Object peek() {
+		if (list.size() == 0) {
+			return null;
+		}else{
+			return list.getFirst().item;
+		}
+	}
+
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java"
new file mode 100644
index 0000000000..4bbffc1e0f
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java"
@@ -0,0 +1,31 @@
+package stack;
+
+import java.util.NoSuchElementException;
+
+import list.ArrayList;
+import list.List;
+
+public class Stack {
+	
+	List list ;
+	public Stack(){
+		list = new ArrayList();
+	}
+	
+	public void push(Object o) {
+		list.add(o);
+	}
+	public Object poll(){		
+		Object remove = list.remove(list.size()-1);
+		if(remove==null)
+			throw new NoSuchElementException();
+		return remove;
+	}
+	
+	public Object peak(){
+		if(list.size()==0)
+			throw new NoSuchElementException();
+		return list.get(list.size()-1);
+	}
+
+}
diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java"
new file mode 100644
index 0000000000..420e131537
--- /dev/null
+++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java"
@@ -0,0 +1,74 @@
+package tree;
+
+public class BinaryTree {
+	private TreeNode parent;
+	
+	public BinaryTree(){
+		parent = new TreeNode(null,null,null);
+	}
+	
+	public void insert(Object o ){
+		TreeNode  node = new TreeNode(null,o,null);
+		if(parent.item==null){
+			parent= node;	
+			return;
+		}
+		insertNode(parent,node);		
+	}			
+	
+	private void insertNode(TreeNode parentNode, TreeNode newNode) {
+		if(parentNode.compareTo(newNode)<= 0){
+			if(parentNode.right==null){
+				parentNode.right = newNode;
+			}else{
+				insertNode(parentNode.right,newNode);
+			}
+				
+		}else{
+			if(parentNode.left==null){
+				parentNode.left=newNode;
+			}else{
+				insertNode(parentNode.left, newNode);
+			}
+		}
+	}
+	
+	public void printTree(){
+		printNode(this.parent);
+	}
+
+
+
+
+	private void printNode(TreeNode node) {
+		if (node == null) {
+			System.out.println("node :" + node.item);
+			printNode(node.left);
+			printNode(node.right);
+		}
+
+	}
+
+
+
+
+	class TreeNode implements Comparable<TreeNode>{
+		Object item;
+		TreeNode left;
+		TreeNode right;
+		TreeNode(TreeNode left,Object item,TreeNode right){
+			this.item=item;
+			this.left =left;
+			this.right=right;
+		}
+		
+		@Override
+		public int compareTo(TreeNode o) {
+			Integer parentItem = (Integer) this.item;
+			Integer oItem = (Integer) o.item;
+			
+			return parentItem.compareTo(oItem);
+		}
+	}
+
+}
diff --git a/group10/3314793852/second/.classpath b/group10/3314793852/second/.classpath
new file mode 100644
index 0000000000..373dce4005
--- /dev/null
+++ b/group10/3314793852/second/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group10/3314793852/second/.gitignore b/group10/3314793852/second/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group10/3314793852/second/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group14/296933284/DataStructuresTest/.project b/group10/3314793852/second/.project
similarity index 100%
rename from group14/296933284/DataStructuresTest/.project
rename to group10/3314793852/second/.project
diff --git a/group10/3314793852/second/.settings/org.eclipse.core.resources.prefs b/group10/3314793852/second/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..5855257b83
--- /dev/null
+++ b/group10/3314793852/second/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/com/coderising/litestruts=UTF-8
+encoding//src/com/coderising/litestruts/Struts.java=UTF-8
+encoding/<project>=UTF-8
diff --git a/group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs b/group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group10/3314793852/second/src/com/coderising/array/ArrayUtil.java b/group10/3314793852/second/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..5742ea09f9
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,236 @@
+	
+	package com.coderising.array;
+
+	import java.util.Arrays;
+
+public class ArrayUtil {
+		
+		/**
+		 * 给定一个整形数组a , 对该数组的值进行置换
+			例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+			如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+		 * @param origin
+		 * @return
+		 */
+		public void reverseArray(int[] origin){
+			int size=origin.length-1;
+			int[] arr=new int[origin.length];
+			for(int i=0;i<origin.length;i++){
+				arr[size]=origin[i];
+				size--;
+			}
+			
+			//输出结果
+			for(int i=0;i<arr.length;i++){
+				System.out.println(arr[i]);
+			}
+		}
+		
+		/**
+		 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+		 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+		 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+		 * @param oldArray
+		 * @return
+		 */
+		
+		public int[] removeZero(int[] oldArray){
+			
+			int[] arr=new int[oldArray.length];
+			int size=0;
+			for(int i=0;i<oldArray.length;i++){
+				if(oldArray[i]!=0){
+					arr[size]=oldArray[i];
+					size++;
+				}
+			}
+			
+			int[] newArr=new int[size];//将不为零的数赋值给一个新的数组。
+			for(int i=0;i<size;i++){
+				newArr[i]=arr[i];
+			}
+			return newArr;
+		}
+		
+		/**
+		 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+		 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+		 * @param array1
+		 * @param array2
+		 * @return
+		 */
+		
+		public int[] merge(int[] array1, int[] array2){
+			
+			int strLen1=array1.length;								//保存第一个数组长度
+		    int strLen2=array2.length;								//保存第二个数组长度
+		    array1= Arrays.copyOf(array1,strLen1+ strLen2);			//扩容
+		    System.arraycopy(array2, 0, array1, strLen1,strLen2 );	//将第二个数组与第一个数组合并
+		    System.out.println(Arrays.toString(array1));			//输出数组
+			
+		    //冒泡排序，并除去重复项。
+		   for(int i=0;i<array1.length;i++){
+			   for(int j=i+1;j<array1.length;j++){
+				   if(array1[i]>array1[j]&&array1[i]!=0&&array1[j]!=0){
+					   int temp;
+					   temp=array1[i];
+					   array1[i]=array1[j];
+					   array1[j]=temp;
+				   }
+				   if(array1[i]==array1[j]&&array1[i]!=0&&array1[j]!=0){
+					   array1[j]=0;
+				   }
+			   }
+		   }
+		   
+		   System.out.println(Arrays.toString(array1));
+		   
+		   int[] array3=removeZero(array1);	//除零操作。
+			return  array3;
+		}
+		/**
+		 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+		 * 注意，老数组的元素在新数组中需要保持
+		 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+		 * [2,3,6,0,0,0]
+		 * @param oldArray
+		 * @param size
+		 * @return
+		 */
+		public int[] grow(int [] oldArray,  int size){
+			int[] newArr=new int[oldArray.length+size];
+			for(int i=0;i<oldArray.length;i++){
+				newArr[i]=oldArray[i];
+			}
+			return newArr;
+		}
+		
+		/**
+		 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+		 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+		 * max = 1, 则返回空数组 []
+		 * @param max
+		 * @return
+		 */
+		public int[] fibonacci(int max){
+			int first=1;
+			int second=1;
+			int[] arr=new int[2];
+			if(max==1){
+				arr=new int[0];
+			}
+			if(max==2){
+				arr[0]=1;
+				arr[1]=1;
+			}
+			if(max>2){
+				arr[0]=1;
+				arr[1]=1;
+				while(second<max){
+					
+					int temp;
+					temp=second;
+					second=second+first;
+					first=temp;
+					if(second<max){
+						arr=grow(arr,1);
+						arr[arr.length-1]=second;	
+					}
+									
+				}
+			}
+			
+			
+			return arr;
+		}
+		
+		/**
+		 * 返回小于给定最大值max的所有素数数组
+		 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+		 * @param max
+		 * @return
+		 */
+		public int[] getPrimes(int max){
+			int[] arr=new int[max];
+			int size=0;
+			for(int i=2;i<max;i++){	//从2开始一次遍历到最大数max
+				boolean flag=false;
+				
+				for(int j=2;j<i;j++){
+					if(i%j==0){	//存在公约数，跳出。
+						flag=true;
+						break;
+					}
+				}
+				if(!flag){//不存在公约数
+					System.out.println(i);
+					arr[size]=i;
+					size++;
+				}
+			}
+			int[] newArr=removeZero(arr);
+			return newArr;
+		}
+		
+		/**
+		 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+		 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+		 * @param max
+		 * @return
+		 */
+		public int[] getPerfectNumbers(int max){
+			
+			int[] arr=new int[10];
+			int size=1;
+			arr[0]=1;
+			
+			for(int i=1;i<max;i++){
+				
+				int sum=0;
+				for(int j=1;j<i;j++){	//获取一个数除其本身全部的因数。
+					if(i%j==0){			//为当前数的因数.
+						sum=sum+j;		//将当前的因数相加。
+					}
+				}
+
+				if(sum==i){
+					arr[size]=i;
+					size++;
+				}
+			
+							
+			}
+			int[] a=removeZero(arr);	
+			return a;
+		}
+		
+		/**
+		 * 用seperator 把数组 array给连接起来
+		 * 例如array= [3,8,9], seperator = "-"
+		 * 则返回值为"3-8-9"
+		 * @param array
+		 * @param s
+		 * @return
+		 */
+		public String join(int[] array, String seperator){
+			String a="";
+			for(int i=0;i<array.length;i++){
+				if(i<(array.length-1)){
+					a=a+""+array[i]+seperator;
+				}
+				else{
+					a=a+""+array[i];
+				}
+			}
+			return a;
+		}
+		
+	
+		
+		
+		
+		
+		
+		
+		//over
+	}
diff --git a/group10/3314793852/second/src/com/coderising/array/Test.java b/group10/3314793852/second/src/com/coderising/array/Test.java
new file mode 100644
index 0000000000..1753da82ba
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/array/Test.java
@@ -0,0 +1,63 @@
+	
+	package com.coderising.array;
+
+	import java.util.Arrays;
+
+public class Test {
+	
+		public static void main(String[] args) {
+			ArrayUtil a=new ArrayUtil();
+			
+			
+//			int[] arr={1,2,3,5,6};
+//			a.reverseArray(arr);//结果：6，5，3,2,1
+			
+//			
+//			int[] arr={0,2,8,0,8,6,0,5,10};
+//			int[] newArr=a.removeZero(arr);
+//			for(int i=0;i<newArr.length;i++){
+//				System.out.println(newArr[i]);
+//			}
+			//结果2,8,8,6,5,10
+			
+			
+//			int[] arr1={1,3,4,8};
+//			int[] arr2={2,3,5,7};
+//			int[] arr3=a.merge(arr1, arr2);
+//			
+//			System.out.println(Arrays.toString(arr3));
+			
+//			
+//			
+//			int[] arr={1,2,3,4};
+//			int[] newArr=a.grow(arr, 10);
+//			System.out.println(Arrays.toString(newArr));
+			
+			
+//			int[] arr=a.fibonacci(8);
+//			System.out.println(Arrays.toString(arr));
+			
+			
+//			int[] arr=a.getPrimes(35);
+//			System.out.println(Arrays.toString(arr));
+			
+			
+//			int[] arr=a.getPerfectNumbers(1000);
+//			System.out.println(Arrays.toString(arr));
+//			1, 6, 28, 496
+			
+//			
+//			int[] arr={1,2,3,4};
+//			String seperator="#";
+//			String re=a.join(arr, seperator);
+//			System.out.println(re);
+//			1#2#3#4
+			
+			
+			
+			
+			
+			//结束
+		}
+	
+	}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/DealWithInfo.java b/group10/3314793852/second/src/com/coderising/litestruts/DealWithInfo.java
new file mode 100644
index 0000000000..64bf892799
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/DealWithInfo.java
@@ -0,0 +1,90 @@
+	/*
+	 * 该类用于读取处理XML文件。
+	 */
+	package com.coderising.litestruts;
+
+	import java.awt.List;
+	import java.util.ArrayList;
+	import java.util.HashMap;
+	import java.util.Map;
+	
+	import org.xml.sax.Attributes;
+	import org.xml.sax.SAXException;
+	import org.xml.sax.helpers.DefaultHandler;
+
+
+
+
+	
+	
+	public class DealWithInfo extends DefaultHandler {
+		
+		private String key;
+		private String value;
+		private HashMap<String, String> aMap=new HashMap<String,String>();	//一个用来存储。
+
+		private ArrayList<HashMap<String, String>> list=new ArrayList<HashMap<String,String>>();;						//List集合用来保存Map集合。
+		
+		private String currentTag;
+		
+		@Override
+		public void startElement(String uri, String localName, String qName, Attributes attributes)
+				throws SAXException {
+			currentTag =qName;
+			
+			if("action".equals(currentTag)){
+				key=attributes.getValue(0);		//action的name属性。
+				value=attributes.getValue(1);	//action的class属性。
+				
+				//在将属性成对的保存到一个Map集合中。
+				aMap.put(key, value);
+				
+				//保存后将中间变量变为null.
+				key=null;
+				value=null;
+			}
+			
+			if("result".equals(currentTag)){
+				key=attributes.getValue(0);		//result的name属性。
+			}
+			
+		}
+
+		
+		@Override
+		public void characters(char[] ch, int start, int length) throws SAXException {
+			if("result".equals(currentTag)){
+				String name=new String(ch,start,length);
+				value=name;
+				//将属性成对的保存到一个Map集合中。
+				
+				aMap.put(key, value);
+				
+				//保存后将中间变量清空。
+				key=null;
+				value=null;
+				currentTag=null;
+			}
+			
+		}
+		
+		
+		@Override
+		public void endElement(String uri, String localName, String qName) throws SAXException {
+			if("action".equals(qName)){
+				
+				list.add(aMap);
+				
+				
+			aMap=new HashMap<String,String>();
+				
+				
+			}
+			
+		}
+		
+		//返回list集合。
+		public ArrayList<HashMap<String, String>> getDate(){
+					return list;
+		}
+	}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java b/group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java b/group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java
new file mode 100644
index 0000000000..52dd35961d
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java
@@ -0,0 +1,42 @@
+	/*
+	 *该类用于读取struts.xml文件中的数据，并把它存储到ActionType类的对象中去。 
+	 */
+	package com.coderising.litestruts;
+	
+	import java.io.File;
+	import java.io.FileInputStream;
+	import java.io.IOException;
+	import java.io.InputStream;
+	import java.util.ArrayList;
+	import java.util.HashMap;
+
+	import javax.xml.parsers.ParserConfigurationException;
+	import javax.xml.parsers.SAXParser;
+	import javax.xml.parsers.SAXParserFactory;
+
+	import org.xml.sax.InputSource;
+	import org.xml.sax.SAXException;
+	import org.xml.sax.XMLReader;
+
+	 
+	
+	public class SAXGetInfo {
+		
+		public ArrayList<HashMap<String, String>> getDate() throws SAXException, IOException, ParserConfigurationException{
+			//创建解析工厂
+			SAXParserFactory factory=SAXParserFactory.newInstance();
+			
+			//创建解析器
+			SAXParser parser=factory.newSAXParser();
+			
+			//文件地址
+			String fileName="E:/CODING2017/Code/coding2017/group10/3314793852/second/src/com/coderising/litestruts/struts.xml";
+			//设置内容处理器
+			DealWithInfo handler=new DealWithInfo();
+			parser.parse(fileName, handler);
+			
+			ArrayList<HashMap<String, String>> list=handler.getDate();
+			return list;	//将保存在list集合中的配置信息返回。
+		}
+				
+	}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/Struts.java b/group10/3314793852/second/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..5312535300
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,165 @@
+	
+	package com.coderising.litestruts;
+	
+	import java.io.IOException;
+	import java.util.ArrayList;
+	import java.util.HashMap;
+	import java.util.Iterator;
+	import java.util.Map;
+	
+	import javax.xml.parsers.ParserConfigurationException;
+
+	import org.xml.sax.SAXException;
+
+	import java.lang.reflect.InvocationTargetException;
+	import java.lang.reflect.Method;
+		
+	
+	
+	public class Struts {
+	
+	    public static View runAction(String actionName, Map<String,String> parameters) {
+	    	View view=new View();
+	    	
+	    	String execute=null;	//execute返回值。
+	    	String placeOfJsp=null;	//JSP地址。
+	    	String classname=getClassName(actionName);
+	    	
+	    	Class<?> classAction = null;
+	    	Object obj=null;
+	    	try {
+				classAction=Class.forName(classname);		//根据类名反射实例化class类。
+			} catch (ClassNotFoundException e) {
+				e.printStackTrace();
+			}
+	    	
+	    	//ClassAction类使用newInstance();方法调用LoginAction类的默认构造方法创建LoginAction类。
+	    	try {
+				obj=classAction.newInstance();		//Object类型的对象。
+			} catch (InstantiationException e) {
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			}
+	    	
+	    	//调用对象的setter方法,设置用户名和密码，即把name和password的值设置到当前LoginAction的对象中。
+	    	try {
+				setter(obj,"name",parameters.get("name"),String.class);
+				setter(obj,"password",parameters.get("password"),String.class);
+			} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
+					| InvocationTargetException e) {
+				e.printStackTrace();
+			}
+	    	
+	    	//调用对象的exectue方法。
+	    	try{
+		    	Method method=classAction.getMethod("execute");
+				execute=(String) method.invoke(obj);
+	    	}catch(Exception e){
+	    		e.printStackTrace();
+	    	}
+	    	
+	    	//调用对象的所有getter方法,把值设置到view对象的parameters属性中。
+	    	Map<String, String> para=new HashMap<String, String>();
+	    	try{
+	    		para.put("name", getter(obj,"name"));
+	    		para.put("password", getter(obj,"password"));
+	    		para.put("message", getter(obj,"message"));
+	    	}catch(Exception e){
+	    		e.printStackTrace();
+	    	}
+	    	view.setParameters(para);
+	    	
+	    	//根据execute返回值和<result>配置，将JSP地址赋值给View对象的jsp成员中。
+	    	placeOfJsp=getResultName(actionName,execute);
+	    	view.setJsp(placeOfJsp);
+	    	
+	    	//System.out.println(view.getJsp()+" "+view.getParameters());
+	    	return view;
+	    }    
+	    
+	    
+	    /*
+	     * 第一个参数为操作对象，第二个参数为操作的数据的数据成员，第三个参数为set的值，第四个参数为参数的类型
+	     */
+	    private static void setter(Object obj, String att, Object value, Class<?> type) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+				//实例化一个set方法
+				Method method=obj.getClass().getMethod("set"+initStr(att), type);
+				method.invoke(obj, value);
+		}
+	    
+	    /*
+	     * getter方法
+	     */
+	    private static String getter(Object obj,String att) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
+	    	Method method=obj.getClass().getMethod("get"+initStr(att));
+	    	method.invoke(obj);
+			return (String) method.invoke(obj);
+	    }
+	    
+	    /*
+	     * 根据java的命名规则，数据成员的第一个单词都要小写，其他单词的首字母大写。
+	     * 所以把set和get方法后面的单词的首字母大写，如setName中的N
+	     * 和getName中的N.
+	     */
+		private static String initStr(String old) {
+			String str=old.substring(0,1).toUpperCase()+old.substring(1);
+			//把首字母大写。
+			return str;
+		}
+
+		public static void main(String args[]){
+	    	String actionName = "login";
+	    	Map<String,String> params = new HashMap<String,String>();
+	        params.put("name","test");
+	        params.put("password","1234");
+	    	 runAction(actionName,params);
+	    }
+	    
+	    //查找action类,查找result时，必须要通过查找action才行。
+	    private static String getClassName(String actionName){
+	    	String className=getData(actionName).get(actionName);
+	    	
+	    	return className;
+	    }
+	    
+	    //查找result时，必须要通过查找action才行。
+	    private static String getResultName(String actionName,String result){
+	    	String placeOfJsp=getData(actionName).get(result);
+	    	
+	    	return placeOfJsp;
+	    }
+	    
+	    //从配置信息中获取数据,获取
+		private static HashMap<String,String> getData(String actionName) {
+			SAXGetInfo a=new SAXGetInfo();
+	    	ArrayList<HashMap<String, String>> x;
+	    	HashMap<String,String> y=null;
+	    	Object[] arr=new Object[10];
+	    	int size=0;
+	    	
+			try {
+				x = a.getDate();
+				Iterator it=x.iterator();
+				while(it.hasNext()){ 
+					arr[size]=(Object)it.next();
+					size++;
+					
+				}
+			} catch (SAXException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			} catch (ParserConfigurationException e) {
+				e.printStackTrace();
+			}
+			if(actionName.equals("login")){
+				y=(HashMap<String, String>) arr[0];
+			}
+			if(actionName.equals("logout")){
+				y=(HashMap<String, String>) arr[1];
+			}
+			return y;
+		}
+	
+	}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java b/group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/View.java b/group10/3314793852/second/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/struts.out.xml b/group10/3314793852/second/src/com/coderising/litestruts/struts.out.xml
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group10/3314793852/second/src/com/coderising/litestruts/struts.xml b/group10/3314793852/second/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group10/3314793852/second/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group10/569420966/struct/pom.xml b/group10/569420966/struct/pom.xml
index 2fc5902e7a..bc0c11f1c3 100644
--- a/group10/569420966/struct/pom.xml
+++ b/group10/569420966/struct/pom.xml
@@ -7,6 +7,14 @@
     <groupId>com.rishy</groupId>
     <artifactId>struct</artifactId>
     <version>1.0-SNAPSHOT</version>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 
 
 </project>
\ No newline at end of file
diff --git a/group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java b/group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java
new file mode 100644
index 0000000000..b41e849acc
--- /dev/null
+++ b/group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+        if("test".equals(name) && "1234".equals(password)){
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group10/569420966/struct/src/main/java/com/litestruts/Struts.java b/group10/569420966/struct/src/main/java/com/litestruts/Struts.java
new file mode 100644
index 0000000000..875b35d223
--- /dev/null
+++ b/group10/569420966/struct/src/main/java/com/litestruts/Struts.java
@@ -0,0 +1,147 @@
+package com.litestruts;
+
+import com.myutil.JavaBeanUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+
+    private static Map<String, Map<String, String>> xmlInfo = new HashMap<>();
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+
+        /*
+
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		("name"="test" ,  "password"="1234") ,
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+
+        */
+
+        // 【0】
+        getInfo();
+
+
+        Map<String, String> action = xmlInfo.get(actionName);
+        Class<?> classForName;
+        View view = new View();
+        try {
+            // 【1】
+            Object aObj = Class.forName(action.get("class")).newInstance();
+            classForName = aObj.getClass();
+            Method[] methods = classForName.getMethods();
+            for (Method method : methods) {
+                for (String key : parameters.keySet()) {
+                    if (JavaBeanUtil.getSetMethodName(key).equals(method.getName())) {
+                        Method declaredMethod = classForName.getDeclaredMethod(method.getName(), method.getParameterTypes());
+                        declaredMethod.invoke(aObj, parameters.get(key));
+                    }
+                }
+            }
+            // 【2】
+            Map<String, String> resultMap = new HashMap<>();
+            Method execute = classForName.getDeclaredMethod("execute");
+            String invoke = (String) execute.invoke(aObj);
+            // 【3】
+            Field[] fields = classForName.getDeclaredFields();
+            for (Field field : fields) {
+                for (Method method : methods) {
+                    if (JavaBeanUtil.getGetMethodName(field.getName()).equals(method.getName())) {
+                        Method declaredMethod = classForName.getDeclaredMethod(method.getName());
+                        String invoke1 = (String)declaredMethod.invoke(aObj);
+                        resultMap.put(field.getName(), invoke1);
+                    }
+                }
+            }
+            view.setParameters(resultMap);
+            // 【4】
+            view.setJsp(action.get(invoke));
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+
+        return view;
+    }
+
+    private static void getInfo() {
+        try {
+            File file = new File("D:\\Own\\Code\\Java\\coding2017\\group10\\569420966\\struct\\src\\main\\resources\\struts.xml");
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            Document doc = builder.parse(file);
+            NodeList nl = doc.getElementsByTagName("struts");
+
+            if (nl.getLength() > 0) {
+                NodeList actions = doc.getElementsByTagName("action");
+                if (actions.getLength() > 0) {
+                    Map<String, String> actionInfo;
+                    for (int i = 0; i < actions.getLength(); i++) {
+                        actionInfo = new HashMap<>();
+                        NamedNodeMap attributes = actions.item(i).getAttributes();
+                        for (int j = 0; j < attributes.getLength(); j++) {
+                            attributes.item(j).getNodeName();
+                            actionInfo.put(attributes.item(j).getNodeName(), attributes.item(j).getNodeValue());
+                        }
+                        NodeList childNodes = actions.item(i).getChildNodes();
+                        for (int j = 0; j < childNodes.getLength(); j++) {
+                            if (childNodes.item(j).getNodeType() == 1) { // 元素节点
+                                NodeList childNodes1 = childNodes.item(j).getChildNodes();
+                                NamedNodeMap attributes1 = childNodes.item(j).getAttributes();
+                                NodeList childNodes2 = childNodes.item(j).getChildNodes();
+                                actionInfo.put(attributes1.item(0).getNodeValue(), childNodes2.item(0).getNodeValue());
+                            }
+                        }
+                        if (actionInfo.get("name") != null) {
+                            xmlInfo.put(actionInfo.get("name"), actionInfo);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+        getInfo();
+    }
+
+}
\ No newline at end of file
diff --git a/group10/569420966/struct/src/main/java/com/litestruts/View.java b/group10/569420966/struct/src/main/java/com/litestruts/View.java
new file mode 100644
index 0000000000..5567568114
--- /dev/null
+++ b/group10/569420966/struct/src/main/java/com/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+    public Map getParameters() {
+        return parameters;
+    }
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
\ No newline at end of file
diff --git a/group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java b/group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java
new file mode 100644
index 0000000000..bf7e794488
--- /dev/null
+++ b/group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java
@@ -0,0 +1,257 @@
+package com.myutil;
+
+import java.util.Arrays;
+
+/**
+ * 数组工具类
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果   a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin 源数组
+     */
+    public static void reverseArray(int[] origin) {
+        if (origin == null) {
+            return;
+        }
+        int originLen = origin.length;
+        int[] copyArray = new int[originLen];
+        System.arraycopy(origin, 0, copyArray, 0, originLen);
+        for (int i = 0; i < originLen; i++) {
+            origin[i] = copyArray[originLen - 1 - i];
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray 老数组
+     * @return 去除零后的数组
+     */
+
+    public static int[] removeZero(int[] oldArray) {
+        if (oldArray == null) {
+            return null;
+        }
+        int size = 0;
+        for (int i : oldArray) {
+            size += i == 0 ? 0 : 1;
+        }
+        int[] newArray = new int[size];
+        int newIndex = 0;
+        for (int old : oldArray) {
+            if (old != 0) {
+                newArray[newIndex++] = old;
+            }
+        }
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1 第一个数组
+     * @param array2 第二个数组
+     * @return 合并后的数组
+     */
+
+    public static int[] merge(int[] array1, int[] array2) {
+        if (array1 == null || array2 == null) {
+            return null;
+        }
+        int len1 = array1.length;
+        int len2 = array2.length;
+        int[] newArray = new int[len1 + len2];
+        int size = 0;
+        int i = 0;
+        int j = 0;
+        int k = 0;
+        while (i < len1 && j < len2) {
+            if (array1[i] < array2[j]) {
+                if (k == 0 || newArray[k] != array2[i]) {
+                    newArray[k++] = array1[i++];
+                    size++;
+                } else {
+                    i++;
+                }
+            } else if (array1[i] > array2[j]) {
+                if (k == 0 || newArray[k] != array2[j]) {
+                    newArray[k++] = array2[j++];
+                    size++;
+                } else {
+                    j++;
+                }
+            } else {
+                if (k == 0 || newArray[k] != array2[i]) {
+                    newArray[k++] = array2[j];
+                    i++;
+                    j++;
+                    size++;
+                } else {
+                    i++;
+                    j++;
+                }
+            }
+        }
+        while (i < len1) {
+            if (k == 0 || newArray[k] != array1[i]) {
+                newArray[k++] = array1[i++];
+                size++;
+            } else {
+                i++;
+            }
+        }
+        while (j < len2) {
+            if (k == 0 || newArray[k] != array2[j]) {
+                newArray[k++] = array2[j++];
+                size++;
+            } else {
+                j++;
+            }
+        }
+        int[] resizeArray = new int[size];
+        System.arraycopy(newArray, 0, resizeArray, 0, size);
+        return resizeArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray 老数组
+     * @param size     需扩容大小
+     * @return 扩容后数组
+     */
+    public int[] grow(int[] oldArray, int size) {
+        if (oldArray == null || size <= 0) {
+            return oldArray;
+        }
+        int[] newArray = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max 最大值
+     * @return 小于最大值的fibonacci数列的数组
+     */
+    public static int[] fibonacci(int max) {
+        ArrayList<Integer> fibonacciList = new ArrayList<>();
+        int a1 = 1;
+        int a2 = 1;
+        int t;
+        if (a1 < max) {
+            fibonacciList.add(a1);
+        }
+        while (a2 < max) {
+            fibonacciList.add(a2);
+            t = a2;
+            a2 = a1 + a2;
+            a1 = t;
+        }
+        int[] fibonacciArray = new int[fibonacciList.size()];
+        for (int i = 0; i < fibonacciList.size(); i++) {
+            fibonacciArray[i] = fibonacciList.get(i);
+        }
+        return fibonacciArray;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max 最大值
+     * @return 小于最大值的所有素数
+     */
+    public static int[] getPrimes(int max) {
+        ArrayList<Integer> primeList = new ArrayList<>();
+        for (int i = 2; i < max; i++) {
+            if (isPrime(i)) {
+                primeList.add(i);
+            }
+        }
+        int[] primeArray = new int[primeList.size()];
+        for (int i = 0; i < primeList.size(); i++) {
+            primeArray[i] = primeList.get(i);
+        }
+        return primeArray;
+    }
+
+    private static boolean isPrime(int num) {
+        for (int i = 2; i <= Math.sqrt(num); i++) {
+            if (num % i == 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max 最大值
+     * @return 小于最大值的所有完数
+     */
+    public static int[] getPerfectNumbers(int max) {
+        ArrayList<Integer> perfectList = new ArrayList<>();
+        for (int i = 2; i < max; i++) {
+            if (isPrefectNumber(i)) {
+                perfectList.add(i);
+            }
+        }
+        int[] perfectArray = new int[perfectList.size()];
+        for (int i = 0; i < perfectList.size(); i++) {
+            perfectArray[i] = perfectList.get(i);
+        }
+        return perfectArray;
+    }
+
+    private static boolean isPrefectNumber(int num) {
+        int sum = 0;
+        for (int i = 1; i < num; i++) {
+            if (num % i == 0) {
+                sum += i;
+            }
+        }
+        return num == sum;
+    }
+
+    /**
+     * 用separator 把数组 array给连接起来
+     * 例如array= [3,8,9], separator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array     数组
+     * @param separator 分隔符
+     * @return 用分隔符连接的数字字符串
+     */
+    public static String join(int[] array, String separator) {
+        if (array == null || separator == null) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int i : array) {
+            sb.append(i).append(separator);
+        }
+        return sb.length() > 0 ? sb.substring(0, sb.length() - 1) : "";
+    }
+
+    public static void main(String[] args) {
+        System.out.println(Arrays.toString(getPerfectNumbers(1000)));
+    }
+}
\ No newline at end of file
diff --git a/group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java b/group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java
new file mode 100644
index 0000000000..614ca57bfb
--- /dev/null
+++ b/group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java
@@ -0,0 +1,35 @@
+package com.myutil;
+
+import java.util.regex.Pattern;
+
+/**
+ * javaBean工具
+ */
+public class JavaBeanUtil {
+    public static String getGetMethodName(String attributeName) {
+        if ((Character.isLowerCase(attributeName.charAt(0)) && Character.isUpperCase(attributeName.charAt(1)))
+                || (Character.isUpperCase(attributeName.charAt(0)))) {
+            return "get" + attributeName;
+        } else if (attributeName.indexOf("is") == 0 && Character.isUpperCase(attributeName.charAt(1))) {
+            return attributeName;
+        } else {
+            char[] chars = attributeName.toCharArray();
+            chars[0] -= 32;
+            return "get" + String.valueOf(chars);
+        }
+    }
+
+    public static String getSetMethodName(String attributeName) {
+        if ((Character.isLowerCase(attributeName.charAt(0)) && Character.isUpperCase(attributeName.charAt(1)))
+                || (Character.isUpperCase(attributeName.charAt(0)))) {
+            return "set" + attributeName;
+        } else if (attributeName.indexOf("is") == 0 && Character.isUpperCase(attributeName.charAt(2))) {
+            return "set" + attributeName.replace("is", "");
+        } else {
+            char[] chars = attributeName.toCharArray();
+            chars[0] -= 32;
+            return "set" + String.valueOf(chars);
+        }
+    }
+
+}
diff --git a/group10/569420966/struct/src/main/resources/struts.xml b/group10/569420966/struct/src/main/resources/struts.xml
new file mode 100644
index 0000000000..cdf0277794
--- /dev/null
+++ b/group10/569420966/struct/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java b/group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java
new file mode 100644
index 0000000000..4a03024cfc
--- /dev/null
+++ b/group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java
@@ -0,0 +1,45 @@
+package com.litestruts.test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.litestruts.Struts;
+import com.litestruts.View;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
\ No newline at end of file
diff --git a/group10/595128841/src/org/le/b/ArrayUtil.java b/group10/595128841/src/org/le/b/ArrayUtil.java
new file mode 100644
index 0000000000..29f1b3567a
--- /dev/null
+++ b/group10/595128841/src/org/le/b/ArrayUtil.java
@@ -0,0 +1,197 @@
+/**
+ * 
+ */
+package org.le.b;
+
+import java.util.Arrays;
+
+/**
+ * @author yue
+ * @time 2017年2月28日
+ */
+public class ArrayUtil {
+
+	/**  
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		//int[] origin = {7, 9 , 30, 3};
+		//int[] n = reverseArray(origin);
+//		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+//		int[] n = removeZero(oldArr);
+//		int[] a1 = {3, 5, 7,8,9,12};
+//		int[] a2 = {4, 5, 6,7,8,12,14,5};
+//		int[] n =merge(a1, a2);
+//		int[] n = grow(a1,5);
+		int[] n = fibonacci(100);
+		System.out.println(Arrays.toString(n));
+	}
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+		int[] newArry = new int[origin.length];
+		int i= 0,j = origin.length;
+		while(j > 0){
+			newArry[i++] = origin[--j];
+		}
+		return newArry;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		int[]  tempArray = new int[oldArray.length];
+		int j = 0;
+		for(int i = 0; i < oldArray.length;i++){
+			if(oldArray[i] > 0){
+				tempArray[j++] = oldArray[i];
+			}
+		}
+		int[]  newArray = new int[j];
+		System.arraycopy(tempArray, 0, newArray, 0, j);
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int len = array1.length;
+		int[] newArray = new int[array1.length+array2.length];
+		System.arraycopy(array1, 0, newArray, 0, array1.length);
+		for(int i = 0; i < array2.length; i++){
+			boolean flag = true;
+			for(int j = 0; j <  array1.length; j++){
+				if(array2[i] == array1[j]){
+					flag = false;
+				}
+			}
+			if(flag){
+				newArray[len++] = array2[i];
+			}
+		}
+		int[] aa = new int[len];
+		System.arraycopy(newArray, 0, aa, 0, len);
+		for(int i = 0; i < aa.length; i++){
+			for(int j = i+1; j <  aa.length; j++){
+				if(aa[i] > aa[j]){
+					int temp =  aa[i];
+					aa[i] = aa[j];
+					aa[j] = temp;
+				}
+			}
+		}
+		return  aa;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int[] aa = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, aa, 0, oldArray.length);
+		return aa;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * Fn = F(n-1)+F(n-2)(n >= 2)
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max <2){
+			return new int[0];
+		}
+		int[] temp = new int[8];
+		int count = 0;
+		for(int i = 1;i < max;i ++){
+			int len = createFibo(i);
+			if(len > max)
+				break;
+			temp = growInt(temp,count);
+			temp[count++] = len;
+		}
+		int[] res = new int[count];
+		System.arraycopy(temp, 0, res, 0, count);
+		return res;
+	}
+	
+	private static int[] growInt(int[] temp,int count){
+		int[] n = temp;
+		if(count >= temp.length){
+			n = new int[temp.length + (temp.length >> 1)];
+			System.arraycopy(temp, 0, n, 0, temp.length);
+		}
+		return n;
+	}
+	
+	private static int createFibo(int n){
+		if(n <= 2){
+			return 1;
+		}
+		return createFibo(n-1)+createFibo(n-2);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder str = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			str.append(seperator).append(array[i]);
+		}
+		return str.substring(1).toString();
+	}
+
+}
diff --git a/group10/595128841/src/org/le/b/LoginAction.java b/group10/595128841/src/org/le/b/LoginAction.java
new file mode 100644
index 0000000000..d895f6b5e6
--- /dev/null
+++ b/group10/595128841/src/org/le/b/LoginAction.java
@@ -0,0 +1,35 @@
+package org.le.b;
+
+public class LoginAction {
+
+	private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group10/595128841/src/org/le/b/Struts.java b/group10/595128841/src/org/le/b/Struts.java
new file mode 100644
index 0000000000..303286690f
--- /dev/null
+++ b/group10/595128841/src/org/le/b/Struts.java
@@ -0,0 +1,155 @@
+package org.le.b;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentFactory;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+	private static Map<String,ActionBean> actionMap;
+
+	public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+		if(actionMap == null){
+			actionMap = strutsXmlSax("struts2.xml");
+		}
+		ActionBean actionBean = actionMap.get(actionName);
+    	return  processAction(actionBean,parameters);
+    }   
+	
+	
+	private static View processAction(ActionBean actionBean, Map<String, String> parameters) {
+		String clazzStr = actionBean.getClazz();
+		Map<String, String> 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<String,Object> 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<String,ActionBean> 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<Element> actions = pack.elements("action");
+		Map<String,ActionBean> actionMap  = new HashMap<>();
+		for(Element action : actions){
+			Attribute name = action.attribute("name");
+			Attribute clazz = action.attribute("class");
+			List<Element> results = action.elements("result");
+			Map<String,String> 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<String,String> results;
+
+		public ActionBean(String name, String clazz, Map<String,String> 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<String,String> getResults() {
+			return results;
+		}
+
+		public void setResults(Map<String,String> results) {
+			this.results = results;
+		}
+		
+	}
+
+}
diff --git a/group10/595128841/src/org/le/b/StrutsTest.java b/group10/595128841/src/org/le/b/StrutsTest.java
new file mode 100644
index 0000000000..3733a6a777
--- /dev/null
+++ b/group10/595128841/src/org/le/b/StrutsTest.java
@@ -0,0 +1,38 @@
+package org.le.b;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/595128841/src/org/le/b/View.java b/group10/595128841/src/org/le/b/View.java
new file mode 100644
index 0000000000..39a9f8a644
--- /dev/null
+++ b/group10/595128841/src/org/le/b/View.java
@@ -0,0 +1,28 @@
+package org.le.b;
+
+import java.util.Map;
+
+public class View {
+
+	private String jsp;
+	private Map<String,Object> parameters;
+	
+	public View(String resultJsp, Map<String, Object> pramMap) {
+		this.jsp = resultJsp;
+		this.parameters = pramMap;
+	}
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map<String,Object> getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map<String,Object> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group10/595128841/src/org/le/ArrayList.java b/group10/595128841/src/org/le/list/ArrayList.java
similarity index 100%
rename from group10/595128841/src/org/le/ArrayList.java
rename to group10/595128841/src/org/le/list/ArrayList.java
diff --git a/group10/595128841/src/org/le/LinkedList.java b/group10/595128841/src/org/le/list/LinkedList.java
similarity index 100%
rename from group10/595128841/src/org/le/LinkedList.java
rename to group10/595128841/src/org/le/list/LinkedList.java
diff --git a/group10/595128841/src/org/le/List.java b/group10/595128841/src/org/le/list/List.java
similarity index 100%
rename from group10/595128841/src/org/le/List.java
rename to group10/595128841/src/org/le/list/List.java
diff --git a/group10/630505243/.classpath b/group10/630505243/.classpath
new file mode 100644
index 0000000000..2d7497573f
--- /dev/null
+++ b/group10/630505243/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group10/630505243/.gitignore b/group10/630505243/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group10/630505243/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group10/630505243/.project b/group10/630505243/.project
new file mode 100644
index 0000000000..f1cd4e602e
--- /dev/null
+++ b/group10/630505243/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>630505243Learning</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group10/630505243/src/com/coderising/array/ArrayUtil.java b/group10/630505243/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..6c251f5fa0
--- /dev/null
+++ b/group10/630505243/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,238 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+		int arrLength = origin.length;
+		int[] newArray = new int[arrLength];
+		//判断数组不为空
+		if (arrLength > 0) {
+			for (int i = 0; i < arrLength; i++) {
+				newArray[i] = origin[arrLength-1-i];
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		int position = 0;
+		int zeroCount = 0;
+		int[] rtnArr = null;
+		int[] newArray = new int[oldArray.length];
+		if(oldArray.length>0){
+			for(int i=0;i<oldArray.length;i++){
+				if(oldArray[i]!=0){
+					newArray[position] = oldArray[i];
+					position++;
+				}else{
+					zeroCount++;
+				}
+			}
+		}
+		if(zeroCount>0){
+			rtnArr =new int[oldArray.length-zeroCount];
+			System.arraycopy(newArray, 0, rtnArr, 0, rtnArr.length);
+		}
+		return rtnArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		//去重
+		int repeatCount=0;
+		int len = array1.length-array2.length>0?array2.length:array1.length;
+		for(int i=0;i<len;i++){
+			for(int j=0;j<len;j++){
+				if(array1.length<=len && array2.length<=len && array1[i]==array2[j]){
+					array1[i]=-1;
+					repeatCount++;
+				}
+			}
+		}
+		for(int i=0;i<array1.length;i++){
+			if(array1[i]==-1){
+				if(i+1<array1.length)
+					array1[i]=array1[i+1];
+			}
+		}
+		int[] temp = new int[array1.length-repeatCount];
+		System.arraycopy(array1, 0, temp, 0, temp.length);
+		
+		//合并
+		int[] newArray = new int[temp.length+array2.length];
+		System.arraycopy(array1, 0, newArray, 0, temp.length);
+		System.arraycopy(array2, 0, newArray, temp.length, array2.length);
+		
+		//排序
+		for(int i=0;i<newArray.length;i++){
+			for(int j=0;j<newArray.length;j++){
+				if(newArray[i]<newArray[j]){
+					int temp1 = newArray[j];
+					newArray[j] = newArray[i];
+					newArray[i] = temp1;
+				}
+			}
+		}
+		return  newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max==1)
+			return new int[]{};
+		int[] fbncArr = new int[max];
+		int len = 0;
+		for(int i=1;i<max;i++){
+			if(fibonacciImpl(i)<max){
+				fbncArr[i-1]=fibonacciImpl(i);
+				len++;
+			}else{
+				break ;
+			}
+		}
+		int[] rtnArr = new int[len];
+		System.arraycopy(fbncArr, 0, rtnArr, 0, len);
+		return rtnArr;
+	}
+	private static int fibonacciImpl(int a){
+		if(a==0)
+			return 0;
+		if(a==1)
+			return 1;
+		if(a>1)
+			return fibonacciImpl(a-1)+fibonacciImpl(a-2);
+		return -1;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		int[] primes = new int[max];
+		int arrCount = 0;
+		for(int i=1;i<max;i++){
+			if(isPrime(i)){
+				primes[arrCount] = i;
+				arrCount++;
+			}
+		}
+		if(arrCount<max-1){
+			int[] rtnArr = new int[arrCount	];
+			System.arraycopy(primes, 0, rtnArr, 0, arrCount);
+			return rtnArr;
+		}
+		return primes;
+	}
+	private static boolean isPrime(int a){
+		if(a==1)
+			return false;
+		if(a<3){
+			return true;
+		}else{
+			for(int i=3;i<a;i++){
+				for(int j=2;j<i;j++){
+					if(a%j==0)
+						return false;
+				}
+			}
+			return true;
+		}
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		int[] arrays = new int[max];
+		int count = 0;
+		for(int i=3;i<max;i++){
+			int sum = 0;
+			for(int j=1;j<i;j++){
+				if(i%j==0){
+					sum +=j;
+				}
+			}
+			if(sum==i){
+				arrays[count]= i;
+				count++;
+			}
+		}
+		if(count<max){
+			int[] rtnArr = new int[count];
+			System.arraycopy(arrays, 0, rtnArr, 0, count);
+			return rtnArr;
+		}
+		return arrays;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuffer sb = new StringBuffer();
+		if(array.length>0){
+			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/group10/630505243/src/com/coderising/array/ArrayUtilTest.java b/group10/630505243/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..c1ddc7e9d6
--- /dev/null
+++ b/group10/630505243/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,97 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] a = {0,1,2,3,4,5,6,7,8,9};
+		int[] rtnArray = ArrayUtil.reverseArray(a);
+		for(int i=0;i<rtnArray.length;i++){
+			System.out.print(rtnArray[i]);
+			if(i<rtnArray.length-1){
+				System.out.print(",");
+			}
+		}
+		assertArrayEquals(rtnArray, new int[]{9,8,7,6,5,4,3,2,1,0});
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArray[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} ;
+		int[] newArray = ArrayUtil.removeZero(oldArray);
+		for(int i=0;i<newArray.length;i++){
+			System.out.print(newArray[i]);
+			if(i<newArray.length-1){
+				System.out.print(",");
+			}
+		}
+		int[] eq = {1,3,4,5,6,6,5,4,7,6,7,5};
+		assertArrayEquals(newArray,eq);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] rtnArr = ArrayUtil.merge(new int[]{3,4,6,10}, new int[]{2,5,7,10});
+		for(int i=0;i<rtnArr.length;i++){
+			System.out.print(rtnArr[i]+",");
+		}
+	}
+
+	@Test
+	public void testGrow() {
+		int oldArray[] ={1,2,3,4,5};
+		int[] newArray = ArrayUtil.grow(oldArray, 5);
+		for(int i=0;i<newArray.length;i++){
+			System.out.print(newArray[i]);
+			if(i<newArray.length-1){
+				System.out.print(",");
+			}
+		}
+		assertArrayEquals(newArray, new int[]{1,2,3,4,5,0,0,0,0,0});
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] rtnarr = ArrayUtil.fibonacci(15);
+		for(int i=0;i<rtnarr.length;i++){
+			System.out.print(rtnarr[i]+",");
+		}
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] arrs = ArrayUtil.getPrimes(23);
+		for(int i=0;i<arrs.length;i++){
+			System.out.print(arrs[i]+",");
+		}
+		assertArrayEquals(arrs, new int[]{2,3,5,7,11,13,17,19});
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] rtnArr = ArrayUtil.getPerfectNumbers(10000);
+		for(int i=0;i<rtnArr.length;i++){
+			System.out.println(rtnArr[i]);
+		}
+		assertArrayEquals(rtnArr, new int[]{6,28,496,8128});
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = new int[]{1,3,5,79,123};
+		String seperator = "-";
+		String arrStr = ArrayUtil.join(array, seperator);
+		System.out.println(arrStr);
+		assertEquals(arrStr, "1-3-5-79-123");
+	}
+
+}
diff --git a/group10/630505243/src/com/coderising/litestruts/LoginAction.java b/group10/630505243/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group10/630505243/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group10/630505243/src/com/coderising/litestruts/Struts.java b/group10/630505243/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..52cf302407
--- /dev/null
+++ b/group10/630505243/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,136 @@
+package com.coderising.litestruts;
+
+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.Map;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+    	View view = new View();
+    	//读取配置文件
+    	try {
+    		File f = new File("src/com/coderising/litestruts/struts.xml");
+    		DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+			Document doc = docBuilder.parse(f);
+
+			NodeList actionList = doc.getElementsByTagName("action");
+			for(int i=0;i<actionList.getLength();i++){
+				Node actionNode = actionList.item(i);
+				if(actionNode.getNodeType()==Node.ELEMENT_NODE	){
+					Element actionElement = (Element)actionNode;
+					String actionNm = actionElement.getAttribute("name");
+					String actionClass = actionElement.getAttribute("class");
+					if(actionNm.equals(actionName)){
+						Class clazz = Class.forName(actionClass);
+						Object nobj = clazz.newInstance();
+						Set<Map.Entry<String, String>> set = parameters.entrySet();
+						Map<String,String> viewparam = new HashMap<String,String>();
+						for(Map.Entry<String, String> entry:set){
+							String key = entry.getKey();
+							String value = entry.getValue();
+							Method method = clazz.getMethod("set"+key.substring(0,1).toUpperCase()+key.substring(1,key.length()), String.class);
+							method.invoke(nobj, value);
+							//viewparam.put(key, value);
+						}
+						Method m = clazz.getMethod("execute", null);
+						String rtnStr = (String) m.invoke(nobj, null);
+						NodeList resultList = actionElement.getChildNodes();
+						for(int j=0;j<resultList.getLength();j++){
+							Node resultNode = resultList.item(j);
+							if(resultNode.getNodeType()==Node.ELEMENT_NODE){
+								Element resultElement = (Element)resultNode;
+								String resultNm = resultElement.getAttribute("name");
+								String resultVal = resultElement.getTextContent();
+								if(rtnStr.equals(resultNm)){
+									
+									view.setJsp(resultVal);
+									Field[] fields = nobj.getClass().getDeclaredFields();
+									
+									for(Field fld:fields){
+										fld.setAccessible(true);
+										viewparam.put(fld.getName().toString(),fld.get(nobj).toString());
+									}
+									view.setParameters(viewparam);
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			
+		} 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();
+		}catch (ClassNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} 
+        /*
+         
+		0. 读取配置文件struts.xml
+		
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */ 
+    	
+    	return view;
+    }    
+
+}
diff --git a/group10/630505243/src/com/coderising/litestruts/StrutsTest.java b/group10/630505243/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group10/630505243/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/630505243/src/com/coderising/litestruts/View.java b/group10/630505243/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group10/630505243/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group10/630505243/src/com/coderising/litestruts/struts.xml b/group10/630505243/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..94b96a89a5
--- /dev/null
+++ b/group10/630505243/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result  name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group10/630505243/src/com/coding/basic/ArrayList.java b/group10/630505243/src/com/coding/basic/ArrayList.java
index 396dc96ae7..9d32776b61 100644
--- a/group10/630505243/src/com/coding/basic/ArrayList.java
+++ b/group10/630505243/src/com/coding/basic/ArrayList.java
@@ -21,9 +21,8 @@ public void add(Object o){
 		
 	}
 	public void add(int index, Object o){
-		if(index<=size){
-			
-			if(index<elementData.length-1){
+		if(index<elementData.length-1){
+			if(index<size-1){
 			//����Ԫ��λ�ô��������ڲ�
 				Object tmp = elementData[index];
 				//����Ԫ��λ�ú������Ԫ�غ���һλ
@@ -38,18 +37,21 @@ public void add(int index, Object o){
 				}
 				elementData = temps;
 				
-			}else if(index==elementData.length-1){
-			//����Ԫ��λ�ô��������ұ߽�
-				Object[] temp = new Object[(size+1)+100];
-				System.arraycopy(elementData, 0, temp, 0, size);
-				elementData = temp;
-				elementData[index] = o;
+			}else if(index>=size-1){
+				elementData[size] = o;
 			}
+		}else{
+			//����Ԫ��λ�ô��������ұ߽�
+			Object[] temp = new Object[(size+1)+100];
+			System.arraycopy(elementData, 0, temp, 0, size);
+			elementData = temp;
+			elementData[index] = o;
 		}
+		size++;
 	}
 	
 	public Object get(int index){
-		if(index<=size){
+		if(index<=elementData.length){
 			return elementData[index];
 		}else{
 			return null;
@@ -82,8 +84,29 @@ public int size(){
 		return this.size;
 	}
 	
+	class ArrayIterator implements Iterator{
+		private ArrayList array;
+		private int position = 0;
+		public ArrayIterator(ArrayList list){
+			this.array = list;
+		}
+		@Override
+		public boolean hasNext() {
+			if(array.get(position)!=null){
+				this.position++;
+				return true;
+			}else
+				return false;
+		}
+		@Override
+		public Object next() {
+			return array.get(position-1);
+		}
+		
+	}
 	public Iterator iterator(){
-		return null;
+		ArrayIterator aIterator = new ArrayIterator(this);
+		return aIterator;
 	}
 	
 }
diff --git a/group10/630505243/src/com/coding/basic/ArrayListTest.java b/group10/630505243/src/com/coding/basic/ArrayListTest.java
index fdd7cb07f7..bd7f4685dd 100644
--- a/group10/630505243/src/com/coding/basic/ArrayListTest.java
+++ b/group10/630505243/src/com/coding/basic/ArrayListTest.java
@@ -15,6 +15,7 @@ public class ArrayListTest {
 	@Before
 	public void setUp() throws Exception {
 		list = new ArrayList();
+		
 	}
 
 	@After
@@ -26,7 +27,7 @@ public void testAddObject() {
 		list.add(a);
 		list.add(b);
 		list.add(c);
-		System.out.println(list.size());
+	/*	System.out.println(list.size());
 		for(int i=0;i<list.size();i++){
 			System.out.println(list.get(i));
 		}
@@ -34,8 +35,7 @@ public void testAddObject() {
 		list.remove(3);
 		for(int i=0;i<list.size();i++){
 			System.out.println(list.get(i));
-		}
-		fail("Not yet implemented");
+		}*/
 	}
 
 	@Test
@@ -60,7 +60,11 @@ public void testSize() {
 
 	@Test
 	public void testIterator() {
-		fail("Not yet implemented");
+		testAddObject();
+		Iterator i = list.iterator();
+		while(i.hasNext()){
+			System.out.println(i.next());
+		}
 	}
 
 }
diff --git a/group10/630505243/src/com/coding/basic/BinaryTreeNode.java b/group10/630505243/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..36195a475a
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,84 @@
+package com.coding.basic;
+
+public class BinaryTreeNode<T extends Comparable<T>>{
+	
+	private T data;
+	private BinaryTreeNode<T> left;
+	private BinaryTreeNode<T> right;
+	private BinaryTreeNode<T> root;
+	private LinkedList tree = new LinkedList();
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(T o){
+		BinaryTreeNode<T> currNode = null;
+		if(root==null){
+			currNode = new BinaryTreeNode<T>();
+			currNode.data = o;
+			this.root = currNode;
+			tree.addFirst(currNode);
+		}else{
+			currNode = findTheParentPosition(root,o);
+			if(o.compareTo(currNode.data)>0){
+				BinaryTreeNode<T> tNode = new BinaryTreeNode<T>();
+				tNode.data = o;
+				tree.add(tNode);
+			}else{
+				BinaryTreeNode<T> tNode = new BinaryTreeNode<T>();
+				tNode.data = o;
+				currNode.left  = tNode;
+				tree.add(tNode);
+			}
+		}
+		return  currNode;
+	}
+	
+	private BinaryTreeNode<T> findTheParentPosition(BinaryTreeNode<T> node ,T o){
+		if(o.compareTo(node.data) >0){
+			if(node.getRight()!=null)
+				return findTheParentPosition(node.getRight(),o);
+			else
+				return node;
+		}else{
+			if(node.getLeft()!=null)
+				return findTheParentPosition(node.getLeft(),o);
+			else
+				return node;
+		}
+	}
+	
+	public void printTree(){
+		if(this.tree!=null){
+			Iterator i = tree.iterator();
+			while(i.hasNext()){
+				System.out.println(i.next());
+			}
+		}
+	}
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		sb.append("[Node data:"+this.data+"]");
+		return sb.toString();
+	}
+	
+	
+	
+}
diff --git a/group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java b/group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..07cf012318
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java
@@ -0,0 +1,23 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class BinaryTreeNodeTest {
+	BinaryTreeNode<Integer> root  = new BinaryTreeNode<Integer>();
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testInsert() {
+		root.insert(5);
+		root.insert(3);
+		root.insert(8);
+
+		root.printTree();
+	}
+
+}
diff --git a/group10/630505243/src/com/coding/basic/Iterator.java b/group10/630505243/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..dbe8b9afb2
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group10/630505243/src/com/coding/basic/LinkedList.java b/group10/630505243/src/com/coding/basic/LinkedList.java
index 891c6bb034..d519789c36 100644
--- a/group10/630505243/src/com/coding/basic/LinkedList.java
+++ b/group10/630505243/src/com/coding/basic/LinkedList.java
@@ -74,6 +74,7 @@ public int size(){
 	public void addFirst(Object o){
 		Node node = new Node(o,head);
 		this.head = node;
+		this.last = head;
 		this.size++;
 	}
 	public void addLast(Object o){
@@ -112,8 +113,10 @@ public Object removeLast(){
 			return orgLast;
 		}
 	}
+
 	public Iterator iterator(){
-		return null;
+		LinkedIterator linkIterator = new LinkedIterator(this);
+		return linkIterator;
 	}
 	
 	
@@ -137,7 +140,27 @@ public String toString() {
 			sb.append("]");
 			return sb.toString();
 		}
-		
+	}
+	class LinkedIterator implements Iterator{
+		private LinkedList list;
+		private int position=0;
+		public LinkedIterator(LinkedList list){
+			this.list = list;
+		}
+
+		@Override
+		public boolean hasNext() {
+			if(list.get(position)!=null){
+				this.position++;
+				return true;
+			}else
+				return false;
+		}
+
+		@Override
+		public Object next() {
+			return list.get(position-1);
+		}
 		
 	}
 }
diff --git a/group10/630505243/src/com/coding/basic/LinkedListTest.java b/group10/630505243/src/com/coding/basic/LinkedListTest.java
index 54937f26c2..dc1108746d 100644
--- a/group10/630505243/src/com/coding/basic/LinkedListTest.java
+++ b/group10/630505243/src/com/coding/basic/LinkedListTest.java
@@ -94,7 +94,10 @@ public void testRemoveLast() {
 
 	@Test
 	public void testIterator() {
-		fail("Not yet implemented");
+		Iterator i = lkLst.iterator();
+		while(i.hasNext()){
+			System.out.println(i.next());
+		}
 	}
 
 }
diff --git a/group10/630505243/src/com/coding/basic/Queue.java b/group10/630505243/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..eb684306d5
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/Queue.java
@@ -0,0 +1,46 @@
+package com.coding.basic;
+
+public class Queue {
+	private int size = 0;
+	private Object[] datas;
+	private int capacity = 10;
+	public void enQueue(Object o){		
+		if(datas==null){
+			datas = new Object[capacity];
+		}
+		if(this.size>=datas.length){
+			Object[] newDatas = new Object[capacity+10];
+			System.arraycopy(datas,0,newDatas,0,datas.length);
+			datas = newDatas;
+		}
+		datas[size] = o;
+		size++;
+	}
+	
+	public Object deQueue(){
+		Object o = null;
+		if(datas!=null && datas.length>0){
+			o = datas[0];
+		}else{
+			System.out.println("����Ϊ��");
+		}
+		for(int i=0;i<datas.length-1;i++){
+			datas[i] = datas[i+1];
+		}
+		datas[datas.length-1] = null;
+		size--;
+		return o;
+	}
+	
+	public boolean isEmpty(){
+		if(datas!=null && datas.length>0){
+			return false;
+		}else{
+			return true;
+		}
+	}
+	
+	public int size(){
+		return this.size;
+	}
+}
diff --git a/group10/630505243/src/com/coding/basic/QueueTest.java b/group10/630505243/src/com/coding/basic/QueueTest.java
new file mode 100644
index 0000000000..3658467490
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/QueueTest.java
@@ -0,0 +1,46 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class QueueTest {
+	Queue queue = null;
+	String str1 = "First";
+	String str2 = "Second";
+	String str3 = "Third";
+	String str4 = "Forth";
+	@Before
+	public void setUp() throws Exception {
+		queue = new Queue();
+	}
+
+	@Test
+	public void testEnQueue() {
+		queue.enQueue(str1);
+		queue.enQueue(str2);
+		queue.enQueue(str3);
+		queue.enQueue(str4);
+		assertEquals(queue.size(),4);
+		assertFalse(queue.isEmpty());
+	}
+
+	@Test
+	public void testDeQueue() {
+		queue.enQueue(str1);
+		queue.enQueue(str2);
+		queue.enQueue(str3);
+		queue.enQueue(str4);
+		assertEquals(str1,(String) queue.deQueue());
+		assertEquals(queue.size(),3);
+		assertEquals(str2,(String) queue.deQueue());
+		assertEquals(queue.size(),2);
+		assertEquals(str3,(String) queue.deQueue());
+		assertEquals(queue.size(),1);
+		assertEquals(str4,(String) queue.deQueue());
+		assertEquals(queue.size(),0);
+		assertFalse(queue.isEmpty());
+	}
+
+}
diff --git a/group10/630505243/src/com/coding/basic/Stack.java b/group10/630505243/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..dd0a7c61a2
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/Stack.java
@@ -0,0 +1,58 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int size = 0;
+	
+	/**
+	 * ����ѹ���ջ����
+	 * @param o
+	 */
+	public void push(Object o){		
+		elementData.add(size,o);
+		size++;
+	}
+	
+	/**
+	 * �Ƴ���ջ�����Ķ��󣬲���Ϊ�˺�����ֵ�����ظö���
+	 * @return
+	 */
+	public Object pop(){
+		if(this.elementData.size()>0){
+			Object o = elementData.get(size-1);
+			elementData.remove(size);
+			size--;
+			return o;
+		}else{
+			return null;
+		}
+	}
+	
+	/**
+	 * �鿴��ջ�����Ķ��󣬵����Ӷ�ջ���Ƴ���
+	 * @return
+	 */
+	public Object peek(){
+		if(size>0){
+			return elementData.get(size-1);
+		}else{
+			return null;
+		}
+	}
+	
+	/**
+	 * ���Զ�ջ�Ƿ�Ϊ��
+	 * @return
+	 */
+	public boolean isEmpty(){
+		return size>0?false:true;
+	}
+	
+	/**
+	 * ��ȡ��ջ��С
+	 * @return
+	 */
+	public int size(){
+		return this.size;
+	}
+}
diff --git a/group10/630505243/src/com/coding/basic/StackTest.java b/group10/630505243/src/com/coding/basic/StackTest.java
new file mode 100644
index 0000000000..9ad98e67b5
--- /dev/null
+++ b/group10/630505243/src/com/coding/basic/StackTest.java
@@ -0,0 +1,62 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class StackTest {
+
+	Stack s = null;
+	String a = "A";
+	String b = "B";
+	String c = "C";
+	@Before
+	public void setUp() throws Exception {
+		s = new Stack();
+		s.push(a);
+		//System.out.println(s.peek());
+		s.push(b);
+		//System.out.println(s.peek());
+		s.push(c);
+		//System.out.println(s.peek());
+	}
+
+	@Test
+	public void testPush() {
+		String d = "D";
+		String e = "E";
+		s.push(d);
+		System.out.println(s.peek());
+		s.push(e);
+		System.out.println(s.peek());
+		assertEquals(s.size(), 5);
+	}
+
+	@Test
+	public void testPop() {
+		int len = s.size();
+		for(int i=0;i<len;i++){
+			System.out.println(s.pop());
+		}
+		//assertEquals(s.size(), 0);
+	}
+
+	@Test
+	public void testPeek() {
+		System.out.println(s.peek());
+	}
+
+	@Test
+	public void testIsEmpty() {
+		System.out.println(s.isEmpty());
+		assertFalse(s.isEmpty());
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testSize() {
+		assertEquals(s.size(), 3);
+	}
+
+}
diff --git a/group10/875867419/.classpath b/group10/875867419/.classpath
index d171cd4c12..674784c5d7 100644
--- a/group10/875867419/.classpath
+++ b/group10/875867419/.classpath
@@ -2,5 +2,8 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="D:/GitSpace/jar包/dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="D:/GitSpace/jar包/hamcrest-core-1.3.jar"/>
+	<classpathentry kind="lib" path="D:/GitSpace/jar包/junit-4.11.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group10/875867419/src/com/work/week02/ArrayUtil.java b/group10/875867419/src/com/work/week02/ArrayUtil.java
new file mode 100644
index 0000000000..cd22eba6ef
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/ArrayUtil.java
@@ -0,0 +1,198 @@
+package com.work.week02;
+
+/**
+ * �ڶ������ݽṹ��ҵ
+ * @author denghuaijun
+ *
+ */
+public class ArrayUtil {
+
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+		int[] dest = new int[origin.length];
+		for(int i=0;i<origin.length;i++){
+			dest[origin.length-1-i] = origin[i];
+		}
+		return dest;
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   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];
+				j++;
+			}
+		}
+		int[] newArray = new int[j];
+		System.arraycopy(tempArray, 0, newArray, 0, j);
+		return newArray;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int[] dest = new int[array1.length + array2.length];
+		int i = 0;			//���array1
+		int j = 0;			//���array2
+		int k = 0;			//���dest
+		//array1��array2ͬʱ����ʱ
+		while(i < array1.length && j < array2.length){
+			if(array1[i] < array2[j]){
+				dest[k++] = array1[i++];
+				continue;
+			}
+			if(array1[i] == array2[j]){
+				dest[k++] = array1[i++];
+				j++;
+				continue;
+			}
+			if(array1[i] > array2[j]){
+				dest[k++] = array2[j++];
+				continue;
+			}
+		}
+		//ֻʣarray1ʱ
+		while(i < array1.length){
+			dest[k++] = array1[i++];
+		}
+		//ֻʣarray2ʱ
+		while(j < array2.length){
+			dest[k++] = array2[j++];
+		}
+		return  removeZero(dest);
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int newLength = oldArray.length + size;
+		int[] newArray = new int[newLength];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		int[] dest = null;
+		if(max == 1){
+			return dest;
+		}
+		dest = new int[max+3];
+		dest[0] = dest[1] = 1;
+		for(int i=2; i<dest.length && (dest[i-1] + dest[i-2])<=max; i++){
+			dest[i] = dest[i-1] + dest[i-2];
+		}
+		
+		return removeZero(dest);
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		int[] dest = null;
+		if(max < 2){
+			return dest;
+		}
+		dest = new int[max];
+		int k = 0;						//���dest
+		for(int i=2;i<=max;i++){	
+			boolean flag = true;		//����Ƿ��ܱ�����������
+			for(int j=2;j<i;j++){		//i=2ʱ flag�������
+				if(i%j == 0){			//i�ܱ�����������
+					flag = false;
+					break;
+				}
+			}
+			if(flag){
+				dest[k++] = i;
+			}
+		}
+		return removeZero(dest);
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		int[] dest = new int[max]; 
+		int k = 0;					//���dest
+		for(int i=1; i<=max; i++){
+			//�ж�i�Ƿ�Ϊ����
+			int sum = 0;
+			for(int j=1;j<i;j++){
+				if(i%j == 0){		//���������
+					sum += j;
+				}
+			}
+			if(sum == i){		//����֮��=����
+				dest[k++] = i;
+			}
+		}
+		return removeZero(dest);
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuilder temp = new StringBuilder();
+		for(int i=0; i<array.length; i++){
+			temp.append(array[i]).append(seperator);
+		}
+		String dest = temp.toString();
+		return dest.substring(0, dest.lastIndexOf(seperator));
+	}
+	
+	public static void main(String[] args) {
+		int[] arr = getPerfectNumbers(1000);
+		for (int i : arr) {
+			System.out.println(i);
+		}
+	}
+}
diff --git a/group10/875867419/src/com/work/week02/ArrayUtilTest.java b/group10/875867419/src/com/work/week02/ArrayUtilTest.java
new file mode 100644
index 0000000000..37728f6d15
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/ArrayUtilTest.java
@@ -0,0 +1,67 @@
+package com.work.week02;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		int[] a = {7, 9 , 30, 3};
+		int[] b = {3, 30, 9,7};
+		Assert.assertArrayEquals(b, ArrayUtil.reverseArray(a));
+	}
+
+	@Test
+	public void testRemoveZero() {
+		 int[] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		 int[] newArr={1,3,4,5,6,6,5,4,7,6,7,5};
+		 Assert.assertArrayEquals(newArr, ArrayUtil.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a = {3, 5, 7,8};
+		int[] b = {4, 5, 6,7};
+		int[] c = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(c, ArrayUtil.merge(a, b));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArr = {2,3,6};
+		int size = 3;
+		int[] newArr = {2,3,6,0,0,0};
+		Assert.assertArrayEquals(newArr, ArrayUtil.grow(oldArr, size));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15;
+		int[] expecteds = {1,1,2,3,5,8,13};
+		Assert.assertArrayEquals(expecteds, ArrayUtil.fibonacci(max));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max = 23;
+		int[] expecteds = {2,3,5,7,11,13,17,19,23};
+		Assert.assertArrayEquals(expecteds, ArrayUtil.getPrimes(max));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max = 1000;
+		int[] expecteds = {6,28,496};
+		Assert.assertArrayEquals(expecteds, ArrayUtil.getPerfectNumbers(max));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = {3,8,9};
+		String seperator = "-";
+		String expecteds = "3-8-9";
+		Assert.assertEquals(expecteds, ArrayUtil.join(array, seperator));
+	}
+
+}
diff --git a/group10/875867419/src/com/work/week02/LoginAction.java b/group10/875867419/src/com/work/week02/LoginAction.java
new file mode 100644
index 0000000000..98365d9749
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/LoginAction.java
@@ -0,0 +1,34 @@
+package com.work.week02;
+
+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/875867419/src/com/work/week02/Struts.java b/group10/875867419/src/com/work/week02/Struts.java
new file mode 100644
index 0000000000..7b44498a2f
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/Struts.java
@@ -0,0 +1,111 @@
+package com.work.week02;
+
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters){
+    	View view = new View();
+    	try{
+    		StrutsXmlDao dao = loadXmlByDom4j(actionName);
+    		view = reflectCreateObj(dao, parameters);
+    	}catch(Exception e) {
+    		e.printStackTrace();
+    	}
+    	return view;
+    }    
+    
+    /**
+     * 读取xml文件
+     * @throws DocumentException 
+     */
+    @SuppressWarnings("unchecked")
+	private static StrutsXmlDao loadXmlByDom4j(String actionName) throws DocumentException{
+    	StrutsXmlDao dao = new StrutsXmlDao();
+    	SAXReader reader = new SAXReader();			//创建SAXReader对象
+    	Document doc = reader.read(new File("src/com/work/week02/struts.xml"));		//创建Document对象
+    	Element root = doc.getRootElement();				//获取根节点
+    	
+    	List<Element> list = root.elements();
+    	for (Element element : list) {
+    		if(element.attributeValue("name").equals(actionName)){
+    			dao.setActionName(element.attributeValue("name"));
+    			dao.setActionClass(element.attributeValue("class"));
+    			List<Element> branchs = element.elements();
+    			List<Map<String, Object>> actionResult = new ArrayList<Map<String, Object>>();
+    			for (Element branch : branchs) {
+    				Map<String, Object> map = new HashMap<String, Object>();
+    				map.put(branch.attributeValue("name"), branch.getTextTrim());
+    				actionResult.add(map);
+				}
+    			dao.setActionResult(actionResult);
+    		}
+			
+		}
+    	
+    	return dao;
+    }
+    
+    /**
+     * 通过反射创建指定对象
+     * @throws ClassNotFoundException 
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
+     * @throws SecurityException 
+     * @throws NoSuchMethodException 
+     * @throws InvocationTargetException 
+     * @throws IllegalArgumentException 
+     */
+    private static View reflectCreateObj(StrutsXmlDao dao, Map<String,String> parameters) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
+		View view = new View();
+		Class<?> clazz = Class.forName(dao.getActionClass());
+    	//实例化对象
+    	Object obj = clazz.newInstance();
+    	//调用set方法设置参数
+    	Set<String> keys = parameters.keySet();
+    	for (String key : keys) {
+			String value = parameters.get(key);
+			Method setMethod = clazz.getDeclaredMethod("set"+key.substring(0, 1).toUpperCase()+key.substring(1), new Class[]{String.class});
+			setMethod.invoke(obj, value);
+		}
+    	
+    	//调用execute()方法执行
+    	Method execute = clazz.getMethod("execute");
+    	Object reuslt = execute.invoke(obj);			//execute()方法返回值
+    	List<Map<String, Object>> actionResult = dao.getActionResult();
+    	//获取返回值对应的跳转jsp
+    	for (Map<String, Object> map : actionResult) {
+			if(map.containsKey(reuslt)){
+				view.setJsp(map.get(reuslt).toString());
+			}
+		}
+    	
+    	Map<String, Object> params = new HashMap<String, Object>();
+    	//调用get方法将参数存入view中
+    	Field[] fields = clazz.getDeclaredFields();
+    	for (Field field : fields) {
+			String name = field.getName();
+			Method getMethod = clazz.getDeclaredMethod("get"+name.substring(0, 1).toUpperCase()+name.substring(1));
+			String value = getMethod.invoke(obj).toString();
+			params.put(name, value);
+		}
+    	view.setParameters(params);
+    	
+    	return view;
+    }
+}
diff --git a/group10/875867419/src/com/work/week02/StrutsTest.java b/group10/875867419/src/com/work/week02/StrutsTest.java
new file mode 100644
index 0000000000..b2c3ab11a3
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/StrutsTest.java
@@ -0,0 +1,40 @@
+package com.work.week02;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        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/875867419/src/com/work/week02/StrutsXmlDao.java b/group10/875867419/src/com/work/week02/StrutsXmlDao.java
new file mode 100644
index 0000000000..4d355d189a
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/StrutsXmlDao.java
@@ -0,0 +1,49 @@
+package com.work.week02;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+public class StrutsXmlDao implements Serializable {
+
+	private static final long serialVersionUID = -3117497421210403602L;
+
+	private String actionName;
+	private String actionClass;
+	private List<Map<String, Object>> actionResult;
+	
+	public StrutsXmlDao(){
+		super();
+	}
+
+	public String getActionName() {
+		return actionName;
+	}
+
+	public void setActionName(String actionName) {
+		this.actionName = actionName;
+	}
+
+	public String getActionClass() {
+		return actionClass;
+	}
+
+	public void setActionClass(String actionClass) {
+		this.actionClass = actionClass;
+	}
+
+	public List<Map<String, Object>> getActionResult() {
+		return actionResult;
+	}
+
+	public void setActionResult(List<Map<String, Object>> actionResult) {
+		this.actionResult = actionResult;
+	}
+
+	@Override
+	public String toString() {
+		return "StrutsXmlDao [actionName=" + actionName + ", actionClass=" + actionClass + ", actionResult="
+				+ actionResult + "]";
+	}
+	
+}
diff --git a/group10/875867419/src/com/work/week02/View.java b/group10/875867419/src/com/work/week02/View.java
new file mode 100644
index 0000000000..a4a2830750
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/View.java
@@ -0,0 +1,30 @@
+package com.work.week02;
+
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<String, Object> parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	
+	public Map<String, Object> getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map<String, Object> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+	@Override
+	public String toString() {
+		return "View [jsp=" + jsp + ", parameters=" + parameters + "]";
+	}
+	
+}
diff --git a/group10/875867419/src/com/work/week02/struts.xml b/group10/875867419/src/com/work/week02/struts.xml
new file mode 100644
index 0000000000..da643f1f65
--- /dev/null
+++ b/group10/875867419/src/com/work/week02/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.work.week02.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.work.week02.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git "a/group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" "b/group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt"
new file mode 100644
index 0000000000..d1dace46cf
--- /dev/null
+++ "b/group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt"
@@ -0,0 +1 @@
+���ܲ�����ҵ���ӵ�ַ��https://my.oschina.net/u/3080511/blog/851907
\ No newline at end of file
diff --git a/group10/904627477/.classpath b/group10/904627477/.classpath
new file mode 100644
index 0000000000..e6a94f0acc
--- /dev/null
+++ b/group10/904627477/.classpath
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**/*.java" kind="src" output="target/classes" path="src">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/group10/904627477/.gitignore b/group10/904627477/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group10/904627477/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group10/904627477/.project b/group10/904627477/.project
new file mode 100644
index 0000000000..9cd9b13ae3
--- /dev/null
+++ b/group10/904627477/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>testGit</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group10/904627477/.settings/org.eclipse.jdt.core.prefs b/group10/904627477/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..bbcbc93486
--- /dev/null
+++ b/group10/904627477/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/group10/904627477/.settings/org.eclipse.m2e.core.prefs b/group10/904627477/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000000..14b697b7bb
--- /dev/null
+++ b/group10/904627477/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/group10/904627477/pom.xml b/group10/904627477/pom.xml
new file mode 100644
index 0000000000..2346e64026
--- /dev/null
+++ b/group10/904627477/pom.xml
@@ -0,0 +1,40 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>testGit</groupId>
+  <artifactId>testGit</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  
+  
+  
+  <dependencies>
+  	<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
+	<dependency>
+	    <groupId>dom4j</groupId>
+	    <artifactId>dom4j</artifactId>
+	    <version>1.6.1</version>
+	</dependency> 
+  </dependencies>
+  
+ <!-- 编译环境 --> 
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+    <resources>
+      <resource>
+        <directory>src</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.1</version>
+        <configuration>
+			<source>1.7</source>
+			<target>1.7</target>
+		</configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/group10/904627477/src/com/coding/ArrayList.java b/group10/904627477/src/com/coding/ArrayList.java
new file mode 100644
index 0000000000..3053e54114
--- /dev/null
+++ b/group10/904627477/src/com/coding/ArrayList.java
@@ -0,0 +1,107 @@
+package com.coding;
+
+import java.util.NoSuchElementException;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	private void addLength(){
+		int len = elementData.length;
+		Object[] temp = new Object[len+50];
+		for(int i=0;i<len;i++){
+			temp[i] = elementData[i];
+		}
+		elementData = temp;
+	}	
+	
+	public void add(Object o){
+		if(size()<elementData.length){
+			elementData[size] = o;
+			size++;
+		}else{
+			addLength();
+			elementData[size] = 0;
+			size ++;
+		}
+	}
+	public void add(int index, Object o){
+		if(index<0||index>size()){
+			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){
+				return true;
+			}
+			return false;
+		}
+
+		@Override
+		public Object next() {
+			if(index<0||index>=array.length){
+				throw new NoSuchElementException();
+			}
+			Object temp = array[index];
+			index ++;
+			return temp;
+		}
+		
+	}
+	
+	
+}
diff --git a/group10/904627477/src/com/coding/BinaryTreeNode.java b/group10/904627477/src/com/coding/BinaryTreeNode.java
new file mode 100644
index 0000000000..fe50e3d1ae
--- /dev/null
+++ b/group10/904627477/src/com/coding/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group10/904627477/src/com/coding/Iterator.java b/group10/904627477/src/com/coding/Iterator.java
new file mode 100644
index 0000000000..d2c1b79572
--- /dev/null
+++ b/group10/904627477/src/com/coding/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group10/904627477/src/com/coding/LinkedList.java b/group10/904627477/src/com/coding/LinkedList.java
new file mode 100644
index 0000000000..f878f75820
--- /dev/null
+++ b/group10/904627477/src/com/coding/LinkedList.java
@@ -0,0 +1,175 @@
+package com.coding;
+
+import java.util.NoSuchElementException;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		addLast(o);
+	}	
+	
+	public void add(int index , Object o){		
+		Node node = new Node();
+		node.data = o;
+		if(index==0){
+			addFirst(o);
+			return ;
+		}
+		Node before = getNode(index-1);
+		Node next = before.next;
+		before.next = node;
+		node.next = next;
+	}
+	
+	private Node getLastNode(){
+		Node temp = head;		
+		if(head!=null){
+			while(true){
+				if(temp.next!=null){
+					temp = temp.next;
+				}else{
+					break;
+				}
+			}
+		}else{
+			throw new NoSuchElementException();
+		}
+		return temp;
+	}
+	
+	private Node getNode(int index){
+		if(index<0){
+			throw new IndexOutOfBoundsException();
+		}
+		int i = 0;
+		Node temp = head;
+		while(true){
+			if(temp==null){
+				throw new IndexOutOfBoundsException();
+			}
+			if(i==index){
+				break;
+			}else{
+				i++;
+				temp = temp.next;
+			}
+		}
+		return temp;
+	}
+	
+	public Object get(int index){
+		Node node = getNode(index);
+		return node.data;
+	}
+	
+	public Object remove(int index){
+		if(index==0){
+			removeFirst();
+		}
+		Node before = getNode(index-1);
+		Node temp = getNode(index);
+		before.next = temp.next;
+		return temp.data;
+	}
+	
+	public int size(){
+		int size = 0;
+		Node temp = head;
+		while(true){
+			if(temp==null){
+				break;
+			}else{
+				size++;
+				temp = temp.next;
+			}
+		}
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node node = new Node();
+		node.data = o;
+		node.next = head;
+		head = node;
+	}
+	
+	public void addLast(Object o){
+		Node node = new Node();
+		node.data = o;
+		if(head==null){
+			head = node;
+			return;
+		}
+		Node last = getLastNode();
+		last.next = node;
+	}
+	public Object removeFirst(){
+		if(head == null){
+			throw new NoSuchElementException();
+		}
+		Object obj = head.data;
+		head = head.next;
+		return obj;
+	}
+	public Object removeLast(){
+		if(head == null){
+			throw new NoSuchElementException();
+		}
+		if(head.next == null){
+			return removeFirst();
+		}
+		Node before = head;
+		Node temp = head.next;
+		while(true){
+			if(temp.next==null){
+				break;
+			}else{
+				before = temp;
+				temp = temp.next;
+			}
+		}
+		before.next = null;
+		return temp.data;
+	}
+	
+	public Iterator iterator(){
+		return new LinkedIterator();
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;		
+	}
+	
+	private class LinkedIterator implements Iterator{
+		
+		private Node node;
+		
+		public LinkedIterator(){
+			node = head;
+		}
+
+		@Override
+		public boolean hasNext() {
+			if(node!=null){
+				return true;
+			}
+			return false;
+		}
+
+		@Override
+		public Object next() {
+			if(node==null){
+				throw new NoSuchElementException();
+			}else{
+				Object obj = node.data;
+				node = node.next;
+				return obj;
+			}
+		}
+		
+	}
+}
diff --git a/group10/904627477/src/com/coding/List.java b/group10/904627477/src/com/coding/List.java
new file mode 100644
index 0000000000..5e78eced11
--- /dev/null
+++ b/group10/904627477/src/com/coding/List.java
@@ -0,0 +1,9 @@
+package com.coding;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group10/904627477/src/com/coding/Queue.java b/group10/904627477/src/com/coding/Queue.java
new file mode 100644
index 0000000000..8fd01bef96
--- /dev/null
+++ b/group10/904627477/src/com/coding/Queue.java
@@ -0,0 +1,28 @@
+package com.coding;
+
+public class Queue {
+	
+	private ArrayList elementData = new ArrayList();
+	
+	public void enQueue(Object o){
+		elementData.add(o);
+	}
+	
+	public Object deQueue(){
+		if(elementData.size()==0){
+			return null;
+		}
+		return elementData.remove(0);
+	}
+	
+	public boolean isEmpty(){
+		if(elementData.size()==0){
+			return true;
+		}
+		return false;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group10/904627477/src/com/coding/Stack.java b/group10/904627477/src/com/coding/Stack.java
new file mode 100644
index 0000000000..3f8b319607
--- /dev/null
+++ b/group10/904627477/src/com/coding/Stack.java
@@ -0,0 +1,36 @@
+package com.coding;
+
+import java.util.EmptyStackException;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){	
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		if(elementData.size()==0){
+			throw new EmptyStackException();
+		}
+		Object obj = elementData.remove(size()-1);
+		return obj;
+	}
+	
+	public Object peek(){
+		if(elementData.size()==0){
+			throw new EmptyStackException();
+		}
+		Object obj = elementData.get(size()-1);
+		return obj;
+	}
+	public boolean isEmpty(){
+		if(elementData.size()==0){
+			return true;
+		}
+		return false;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group10/904627477/src/com/coding/array/ArrayUtil.java b/group10/904627477/src/com/coding/array/ArrayUtil.java
new file mode 100644
index 0000000000..37f230812a
--- /dev/null
+++ b/group10/904627477/src/com/coding/array/ArrayUtil.java
@@ -0,0 +1,215 @@
+package com.coding.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int len = origin.length;
+		for (int i = 0; i < len/2 ; i++) {
+			int temp = origin[len-1-i];
+			origin[len-1-i] = origin[i];
+			origin[i] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int[] tempArr = new int[oldArray.length];
+		int size = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i]!=0){
+				tempArr[size] = oldArray[i];
+				size++;
+			}
+		}		
+		int[] newArr = new int[size];
+		System.arraycopy(tempArr, 0, newArr, 0, size);
+		return newArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] arr3 = new int[array1.length+array2.length];
+		int len1 = array1.length;
+		int len2 = array2.length; 
+		int i=0,j=0,k=0;
+		while(true){
+			if(i<len1&&j<len2){
+				if(array1[i]<array2[j]){
+					arr3[k++] = array1[i++];
+				}else if(array1[i]>array2[j]){
+					arr3[k++]=array2[j++];
+				}else{
+					arr3[k++] = array1[i++];
+					j++;
+				}
+			}else if(i>=len1&&j<len2){
+				arr3[k++]=array2[j++];
+			}else if(i<len1&&j>=len2){
+				arr3[k++]=array1[i++];
+			}else{
+				break;
+			}
+		}
+		int[] newArr = new int[k];
+		System.arraycopy(arr3, 0, newArr, 0, k);
+		return newArr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(size<0){
+			throw new IllegalArgumentException();
+		}
+		int[] newArr = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArr[i] = oldArray[i];
+		}
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max<1){
+			throw new IllegalArgumentException();
+		}
+		int[] arr = new int[0];
+		int temp = 1;
+		for (int i = 0; max > temp; i++) {
+			arr = grow(arr, 1);
+			arr[arr.length-1] = temp;
+			temp = getFibonacci(i+1);
+		}
+		return arr;
+	}
+	
+	public int getFibonacci(int n){
+		if(n==0||n==1){
+			return 1;
+		}else{
+			return getFibonacci(n-1)+getFibonacci(n-2);
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	//对大于1的自然数n，如果用2到  开根号n 之间的所有整数去除，均无法整除，则n为质数
+	public int[] getPrimes(int max){
+		int[] arr = new int[0];
+		if(max<2){
+			return arr;
+		}
+		for(int i=2;i<max;i++){
+			if(isPrimes(i)){
+				arr = grow(arr, 1);
+				arr[arr.length-1] = i;
+			}
+		}
+		return arr;
+	}
+	
+	public boolean isPrimes(int n){
+		if(n<=3){
+			return n>1;
+		}		
+		for(int i=2;i<=Math.sqrt(n);i++){
+			if(n%i==0){
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] arr = new int[0];
+		if(max<1){
+			return arr;
+		}
+		for (int i = 0; i < max; i++) {
+			if(isPerfectNumber(i)){
+				arr = grow(arr, 1);
+				arr[arr.length-1] = i;
+			}
+		}
+		return arr;
+	}
+	
+	public boolean isPerfectNumber(int n){
+		if(n<=1){
+			return false;
+		}
+		int result = 1;
+		for (int i = 2; i <= Math.sqrt(n); i++) {
+			if(n%i==0){
+				result = result + i + n/i;
+			}
+		}
+		if(result==n){
+			return true;
+		}else{
+			return false;
+		}
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String result = "";
+		for (int i = 0; i < array.length; i++) {
+			result = result + array[i] + seperator;
+		}
+		int index = result.lastIndexOf(seperator);
+		return result.substring(0, index);
+	}
+	
+
+}
diff --git a/group10/904627477/src/com/coding/litestruts/LoginAction.java b/group10/904627477/src/com/coding/litestruts/LoginAction.java
new file mode 100644
index 0000000000..ec16031fee
--- /dev/null
+++ b/group10/904627477/src/com/coding/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coding.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group10/904627477/src/com/coding/litestruts/ReflectUtil.java b/group10/904627477/src/com/coding/litestruts/ReflectUtil.java
new file mode 100644
index 0000000000..789275aa02
--- /dev/null
+++ b/group10/904627477/src/com/coding/litestruts/ReflectUtil.java
@@ -0,0 +1,145 @@
+package com.coding.litestruts;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+public class ReflectUtil {
+	
+	
+    public static Object exectue(Object o,String methodName){
+    	Object result = null;
+    	try {
+			Method m = o.getClass().getMethod(methodName);
+			result = m.invoke(o);
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+    	return result;
+    }
+    
+	public static Object getObject(String className, Map<String, String> parameters){
+		Object action = null;
+		try {
+			action = Class.forName(className).newInstance();
+			if(parameters==null){
+				return action;
+			}
+			Iterator<String> ite = parameters.keySet().iterator();
+			while(ite.hasNext()){
+				String name = ite.next();
+				String value = parameters.get(name);
+				setAttribute(action, name, value);
+			}
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+		return action;
+	}    
+    
+    /**
+     * 
+     * @param o
+     * @param name
+     * @param value
+     */
+    public static void setAttribute(Object o,String name,String value){
+    	try {
+    		Class<?> c = o.getClass();
+    		String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
+    		Class<?> attType = c.getDeclaredField(name).getType();
+			Method m = c.getMethod(methodName, attType);
+			m.invoke(o, typeCase(value, attType));
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchFieldException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+    }
+    
+    public static Map<String,Object> getAttributes(Object o){
+    	Map<String,Object> param = new HashMap<String, Object>();
+    	Class<?> c = o.getClass();
+    	Field[] attrs = c.getDeclaredFields();
+    	for (Field att : attrs) {
+    		String name = att.getName();
+    		String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
+			Object reslut = exectue(o, methodName);
+			if(reslut!=null){
+				param.put(name, reslut);
+			}
+		}
+    	return param;
+    }
+    
+    /**
+	 * 将Sting类型数据转换成指定类型数据,暂支持简单和常见类型
+	 * @param oldValue 需要转换的数据值
+	 * @param type 目标类型
+	 * @return 返回转换后的数据
+	 */
+	public static Object typeCase(String oldValue,Class<?> type){
+		Object value = null;
+		String typeName = type.getName();
+		if("int".equals(typeName)){
+			value = Integer.parseInt(oldValue);
+		}else if("float".equals(typeName)){
+			value = Float.parseFloat(oldValue);
+		}else if("boolean".equals(typeName)){
+			value = Boolean.parseBoolean(oldValue);
+		}else if("long".equals(typeName)){
+			value = Long.parseLong(oldValue);
+		}else if("byte".equals(typeName)){
+			value = Byte.parseByte(oldValue);
+		}else if("double".equals(typeName)){
+			value = Double.parseDouble(oldValue);
+		}else if("short".equals(typeName)){
+			value = Short.parseShort(oldValue);
+		}else if("char".equals(typeName)){
+			value = oldValue.charAt(0);
+		}else if("java.util.Date".equals(typeName)){
+			try {
+				if(Pattern.matches("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{3}", oldValue)){
+					value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").parse(oldValue);
+				}else if(Pattern.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}", oldValue)){
+					value = new SimpleDateFormat("yyyy-MM-dd").parse(oldValue);
+				}else{
+					value = null;
+				}
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+		}else if("java.lang.String".equals(typeName)){
+			value = oldValue;
+		}else{
+			throw new ClassCastException();
+		}
+		return value;
+	}
+}
diff --git a/group10/904627477/src/com/coding/litestruts/Struts.java b/group10/904627477/src/com/coding/litestruts/Struts.java
new file mode 100644
index 0000000000..eb68fa9441
--- /dev/null
+++ b/group10/904627477/src/com/coding/litestruts/Struts.java
@@ -0,0 +1,106 @@
+package com.coding.litestruts;
+
+import java.util.List;
+import java.util.Map;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+
+public class Struts {
+
+	/*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+	 */
+    public static View runAction(String actionName, Map<String,String> parameters) {
+    	if(actionName==null){
+    		return null;
+    	}
+    	View view = new View();
+    	String path = getStrutsXMLPath();
+    	Element actionEle = getActionElement(path, actionName);
+    	if(actionEle==null){
+    		return null;
+    	}
+    	String className = actionEle.attributeValue("class");
+		Object action = ReflectUtil.getObject(className, parameters);
+		if(action==null){
+			return null;
+		}
+		String methodName = actionEle.attributeValue("method");
+		methodName = methodName==null?"execute":methodName;
+		Object reslut = ReflectUtil.exectue(action, methodName);
+		String jsp = getElementJsp(actionEle, reslut!=null?reslut.toString():null);
+		view.setJsp(jsp);
+		view.setParameters(ReflectUtil.getAttributes(action));
+		return view;
+    }
+    
+    private static String getStrutsXMLPath(){
+    	String path = Struts.class.getResource("").getPath()+"struts.xml";
+    	path = path.substring(1);
+    	return path;
+    }
+    
+    @SuppressWarnings("unchecked")
+	public static Element getActionElement(String path,String actionName){
+    	if(path==null||actionName==null){
+    		return null;
+    	}
+    	Element actionEle = null;
+    	try {
+			SAXReader read = new SAXReader();
+			Document doc = read.read(path);
+			Element root = doc.getRootElement();
+			List<Element> actions = root.elements("action");
+			for (Element element : actions) {
+				String name = element.attributeValue("name");
+				if(actionName.equals(name)){
+					actionEle = element;
+					break;
+				}
+			}
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+    	return actionEle;
+    }
+    
+	@SuppressWarnings("unchecked")
+	public static String getElementJsp(Element actionEle, String reslut) {
+		String jsp = null;
+		if(reslut!=null){
+			List<Element> results = actionEle.elements("result");
+			for (Element reslutEle : results) {
+				String resName = reslutEle.attributeValue("name");
+				resName = resName==null?"success":resName;
+				if(reslut.equals(resName)){
+					jsp = reslutEle.getText().trim();
+				}
+			}
+		}
+		return jsp;
+	}
+
+}
diff --git a/group10/904627477/src/com/coding/litestruts/StrutsTest.java b/group10/904627477/src/com/coding/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..fe43a16de8
--- /dev/null
+++ b/group10/904627477/src/com/coding/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coding.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group10/904627477/src/com/coding/litestruts/View.java b/group10/904627477/src/com/coding/litestruts/View.java
new file mode 100644
index 0000000000..9ee1d76628
--- /dev/null
+++ b/group10/904627477/src/com/coding/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coding.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<String,Object> parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map<String, Object> getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map<String, Object> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group10/904627477/src/com/coding/litestruts/struts.xml b/group10/904627477/src/com/coding/litestruts/struts.xml
new file mode 100644
index 0000000000..b494d6b52f
--- /dev/null
+++ b/group10/904627477/src/com/coding/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group10/904627477/src/com/coding/test/ArrayListTest.java b/group10/904627477/src/com/coding/test/ArrayListTest.java
new file mode 100644
index 0000000000..d65a692351
--- /dev/null
+++ b/group10/904627477/src/com/coding/test/ArrayListTest.java
@@ -0,0 +1,71 @@
+package com.coding.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coding.ArrayList;
+import com.coding.Iterator;
+
+public class ArrayListTest {
+	
+	private static ArrayList list = new ArrayList();
+
+	@Before
+	public void setUp() throws Exception {
+		list = new ArrayList();
+		list.add("1111");
+		list.add("2222");
+		list.add("3333");
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		list = null;
+	}
+
+	@Test
+	public void testAddObject() {
+		list.add("4444");
+		assertEquals("4444", list.get(3));
+		assertEquals(4, list.size());
+	}
+
+	@Test
+	public void testAddIntObject() {
+		list.add(1, "4444");
+		assertEquals("4444", list.get(1));
+		assertEquals(4, list.size());
+		assertEquals("2222", list.get(2));
+	}
+
+	@Test
+	public void testGet() {
+		assertEquals("1111", list.get(0));
+	}
+
+	@Test
+	public void testRemove() {
+		Object sss = list.remove(1);
+		assertEquals(2, list.size());
+		assertEquals("2222", sss);
+	}
+
+	@Test
+	public void testSize() {
+		assertEquals(3, list.size());
+	}
+
+	@Test
+	public void testIterator() {
+		Iterator it = list.iterator();
+		assertEquals(true, it.hasNext());
+		assertEquals("1111", it.next());
+		assertEquals("2222", it.next());
+		assertEquals("3333", it.next());
+		assertEquals(false, it.hasNext());
+	}
+
+}
diff --git a/group10/904627477/src/com/coding/test/ArrayUtilTest.java b/group10/904627477/src/com/coding/test/ArrayUtilTest.java
new file mode 100644
index 0000000000..f6bf45f1cc
--- /dev/null
+++ b/group10/904627477/src/com/coding/test/ArrayUtilTest.java
@@ -0,0 +1,128 @@
+package com.coding.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coding.array.ArrayUtil;
+
+public class ArrayUtilTest {
+	
+	private ArrayUtil arrayUtil;
+
+	@Before
+	public void setUp() throws Exception {
+		this.arrayUtil = new ArrayUtil();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		this.arrayUtil = null;
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] origin1 = {7, 9 , 30, 3};
+		int[] origin2 = {7, 9, 30, 3, 4};
+		this.arrayUtil.reverseArray(origin1);
+		assertEquals(3, origin1[0]);
+		assertEquals(30, origin1[1]);
+		assertEquals(9, origin1[2]);
+		assertEquals(7, origin1[3]);
+		this.arrayUtil.reverseArray(origin2);
+		assertEquals(4, origin2[0]);
+		assertEquals(3, origin2[1]);
+		assertEquals(30, origin2[2]);
+		assertEquals(9, origin2[3]);
+		assertEquals(7, origin2[4]);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		 int[] newArr = this.arrayUtil.removeZero(oldArr);
+		 assertEquals(12, newArr.length);
+		 assertEquals(6, newArr[4]);
+		 int oldArr1[]={0,0,0,0};
+		 int[] newArr1 = this.arrayUtil.removeZero(oldArr1);
+		 assertEquals(0, newArr1.length);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		//[3,4,5,6,7,8]
+		int[] a3 = this.arrayUtil.merge(a1, a2);
+		assertEquals(6, a3.length);
+		assertEquals(3, a3[0]);
+		assertEquals(8, a3[5]);
+		int[] arr1 = {3, 5, 7};
+		int[] arr2 = {9,12,15,19};
+		int[] arr3 = this.arrayUtil.merge(arr1, arr2);
+		int[] arr4 = this.arrayUtil.merge(arr2, arr1);
+		assertEquals(7, arr3.length);
+		assertEquals(3, arr3[0]);
+		assertEquals(19, arr3[6]);
+		//assertEquals(arr3, arr4);
+		assertEquals(7, arr4.length);
+		assertEquals(3, arr4[0]);
+		assertEquals(19, arr4[6]);
+		int[] a = {};
+		int[] arr =  this.arrayUtil.merge(a, a1);
+		assertEquals(4, arr.length);
+		assertEquals(3, arr[0]);
+		assertEquals(8, arr[3]);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] a1 = {2,3,6};
+		int[] a2 = this.arrayUtil.grow(a1, 3);
+		assertEquals(6, a2.length);
+		assertEquals(3, a1[1]);
+		assertEquals(0, a2[3]);
+		int[] a3 = this.arrayUtil.grow(a1, 0);
+		assertEquals(3, a3.length);
+		int[] a4 = this.arrayUtil.grow(new int[0], 3);
+		assertEquals(3, a4.length);
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] arr = this.arrayUtil.fibonacci(15);
+		assertEquals(7, arr.length);
+		assertEquals(13, arr[6]);
+		int[] arr1 = this.arrayUtil.fibonacci(1);
+		assertEquals(0, arr1.length);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] arr = this.arrayUtil.getPrimes(23);
+		assertEquals(8, arr.length);
+		assertEquals(true, arr[arr.length-1]<23);
+		int[] arr1 = this.arrayUtil.getPrimes(2);
+		assertEquals(0, arr1.length);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		//6 28 496 8128 33550336
+		int[] arr = this.arrayUtil.getPerfectNumbers(10000);
+		assertEquals(4, arr.length);
+		assertEquals(8128, arr[3]);
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array= {3,8,9};
+		String str = this.arrayUtil.join(array, "-");
+		assertEquals("3-8-9", str);
+		String str1 = this.arrayUtil.join(array, "9");
+		assertEquals("39899", str1);
+	}
+
+}
diff --git a/group10/904627477/src/com/coding/test/LinkedListTest.java b/group10/904627477/src/com/coding/test/LinkedListTest.java
new file mode 100644
index 0000000000..af48a6fb0b
--- /dev/null
+++ b/group10/904627477/src/com/coding/test/LinkedListTest.java
@@ -0,0 +1,118 @@
+package com.coding.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coding.Iterator;
+import com.coding.LinkedList;
+
+public class LinkedListTest {
+	
+	private static LinkedList link;
+
+	@Before
+	public void setUp() throws Exception {
+		link = new LinkedList();
+		link.add("111");
+		link.add("222");
+		link.add("333");
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		link = null;
+	}
+
+	@Test
+	public void testAddObject() {
+		link.add("444");
+		assertEquals(4, link.size());
+		assertEquals("444", link.get(3));
+		link = new LinkedList();
+		link.add("000");
+		assertEquals(1, link.size());
+		assertEquals("000", link.get(0));
+	}
+
+	@Test
+	public void testAddIntObject() {
+		link.add(2,"444");
+		assertEquals(4, link.size());
+		assertEquals("444", link.get(2));
+		assertEquals("333", link.get(3));
+		assertEquals("222", link.get(1));
+		link = new LinkedList();
+		link.add(0,"000");
+		assertEquals(1, link.size());
+		assertEquals("000", link.get(0));
+	}
+
+	@Test
+	public void testGet() {
+		assertEquals("222", link.get(1));
+	}
+
+	@Test
+	public void testRemove() {
+		Object obj = link.remove(1);
+		assertEquals("222", obj);
+		assertEquals("333", link.get(1));
+		assertEquals(2, link.size());
+	}
+
+	@Test
+	public void testSize() {
+		assertEquals(3, link.size());
+	}
+
+	@Test
+	public void testAddFirst() {
+		link.addFirst("000");
+		assertEquals(4, link.size());
+		assertEquals("000", link.get(0));
+		link = new LinkedList();
+		link.addFirst("000");
+		assertEquals(1, link.size());
+		assertEquals("000", link.get(0));
+	}
+
+	@Test
+	public void testAddLast() {
+		link.addLast("444");
+		assertEquals(4, link.size());
+		assertEquals("444", link.get(3));
+		link = new LinkedList();
+		link.addLast("444");
+		assertEquals(1, link.size());
+		assertEquals("444", link.get(0));
+	}
+
+	@Test
+	public void testRemoveFirst() {
+		Object obj = link.removeFirst();
+		assertEquals("111", obj);
+		assertEquals(2, link.size());
+		assertEquals("222", link.get(0));
+	}
+
+	@Test
+	public void testRemoveLast() {
+		Object obj = link.removeLast();
+		assertEquals(2, link.size());
+		assertEquals("333", obj);
+	}
+
+	@Test
+	public void testIterator() {
+		Iterator it = link.iterator();
+		assertEquals(true, it.hasNext());
+		assertEquals("111", it.next());
+		assertEquals("222", it.next());
+		assertEquals("333", it.next());
+		assertEquals(false, it.hasNext());
+	}
+
+}
diff --git a/group10/904627477/src/com/coding/test/QueueTest.java b/group10/904627477/src/com/coding/test/QueueTest.java
new file mode 100644
index 0000000000..779120c0fb
--- /dev/null
+++ b/group10/904627477/src/com/coding/test/QueueTest.java
@@ -0,0 +1,53 @@
+package com.coding.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coding.Queue;
+
+public class QueueTest {
+	
+	private static Queue queue;
+
+	@Before
+	public void setUp() throws Exception {
+		queue = new Queue();
+		queue.enQueue("111");
+		queue.enQueue("222");
+		queue.enQueue("333");
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		queue = null;
+	}
+
+	@Test
+	public void testEnQueue() {
+		queue.enQueue("444");
+		assertEquals(4, queue.size());
+	}
+
+	@Test
+	public void testDeQueue() {
+		Object obj = queue.deQueue();
+		assertEquals(2, queue.size());
+		assertEquals("111",obj);
+	}
+
+	@Test
+	public void testIsEmpty() {
+		assertEquals(false, queue.isEmpty());
+		queue = new Queue();
+		assertEquals(true, queue.isEmpty());
+	}
+
+	@Test
+	public void testSize() {
+		assertEquals(3, queue.size());
+	}
+
+}
diff --git a/group10/904627477/src/com/coding/test/StackTest.java b/group10/904627477/src/com/coding/test/StackTest.java
new file mode 100644
index 0000000000..38de36c9d9
--- /dev/null
+++ b/group10/904627477/src/com/coding/test/StackTest.java
@@ -0,0 +1,61 @@
+package com.coding.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coding.Stack;
+
+public class StackTest {
+	
+	private static Stack stack;
+
+	@Before
+	public void setUp() throws Exception {
+		stack = new Stack();
+		stack.push("111");
+		stack.push("222");
+		stack.push("333");
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		stack = null;
+	}
+
+	@Test
+	public void testPush() {
+		stack.push("444");
+		assertEquals(4, stack.size());
+		assertEquals("444", stack.pop());
+	}
+
+	@Test
+	public void testPop() {
+		Object obj = stack.pop();
+		assertEquals("333", obj);
+		assertEquals(2, stack.size());
+	}
+
+	@Test
+	public void testPeek() {
+		Object obj = stack.peek();
+		assertEquals("333", obj);
+		assertEquals(3, stack.size());
+	}
+
+	@Test
+	public void testIsEmpty() {
+		assertEquals(false, stack.isEmpty());
+		stack = new Stack();
+		assertEquals(true, stack.isEmpty());
+	}
+
+	@Test
+	public void testSize() {
+		assertEquals(3,stack.size());
+	}
+
+}
diff --git a/group10/904627477/src/com/coding/test/Test.java b/group10/904627477/src/com/coding/test/Test.java
new file mode 100644
index 0000000000..c8024a8c97
--- /dev/null
+++ b/group10/904627477/src/com/coding/test/Test.java
@@ -0,0 +1,29 @@
+package com.coding.test;
+
+
+
+
+
+public class Test {
+	
+	public static void main(String[] args) {
+		/*int[] origin = {7, 9 , 30, 3};
+		ArrayUtil au = new ArrayUtil();
+		au.reverseArray(origin);
+		for (int i : origin) {
+			System.out.println(i);
+		}
+		*/
+/*		int a = 5;
+		System.out.println(5/2);
+		int[] a1 = new int[0];
+		System.out.println(a1.length);
+		System.out.println(Math.sqrt(2));*/
+//		int[] a2 = new ArrayUtil().getPerfectNumbers(100);
+//		for (int i = 0; i < a2.length; i++) {
+//			System.out.println(a2[i]);
+//		}
+		System.out.println(Test.class.getResource("").getPath());
+	}
+
+}
diff --git a/group15/1500_369516660/.classpath b/group11/1059156023/Array/.classpath
similarity index 100%
rename from group15/1500_369516660/.classpath
rename to group11/1059156023/Array/.classpath
diff --git a/group11/1059156023/Array/.gitignore b/group11/1059156023/Array/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group11/1059156023/Array/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group11/1059156023/Array/.project b/group11/1059156023/Array/.project
new file mode 100644
index 0000000000..1b5c14fe3f
--- /dev/null
+++ b/group11/1059156023/Array/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Array</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java b/group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java
new file mode 100644
index 0000000000..2b47957623
--- /dev/null
+++ b/group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java
@@ -0,0 +1,158 @@
+package com.coding.basic;
+
+import java.util.Arrays;
+import java.util.HashSet;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+        for (int i = 0; i < origin.length/2; i++) {//前后交换元素
+            int temp = origin[i];
+            origin[i] = origin[origin.length-i-1];
+            origin[origin.length-i-1]= temp;
+        }
+        System.out.println(Arrays.toString(origin));//输出数组
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray){
+		int[] arr = new int[oldArray.length];
+		int count = 0;
+		for(int i=0;i<oldArray.length;i++){
+			if (oldArray[i]!=0) {
+				arr[count] = oldArray[i];
+				count++;
+			}
+		}
+		
+		int[] newArr = new int[count];
+		System.arraycopy(arr, 0, newArr, 0, count);
+		
+		return newArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		HashSet set1 = new HashSet(Arrays.asList(array1));
+		HashSet set2 = new HashSet(Arrays.asList(array2));
+		set1.addAll(set2);
+		/*
+		HashSet<Integer> set1 = new HashSet(Arrays.asList(array1));//以array1建立集合
+		HashSet<Integer> set2 = new HashSet(Arrays.asList(array2));
+		set1.addAll(set2);//求并集
+		Integer[] arr = set1.toArray(new Integer[set1.size()]);//获取并集后的数组
+		Arrays.sort(arr);//数组排序
+		for(int i=0;i<arr.length;i++){
+			System.out.print(arr[i]+" ");
+		}
+		*/
+
+		
+		
+		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[] newArr = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArr, 0, oldArray.length);
+		
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String aString = "";
+		String bString = "";
+		for(int a:array){
+			aString = a+seperator;
+			bString = bString+aString;
+		}
+		return bString;
+	}
+	
+	public static void main(String [] args){
+		ArrayUtil arrayUtil = new ArrayUtil();
+		int[] a = {7,9,30,3,0,6,0};
+		arrayUtil.reverseArray(a);
+		
+		System.out.println(arrayUtil.join(a, "-"));
+		
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		System.out.println(Arrays.toString(arrayUtil.removeZero(oldArr)));
+		
+		System.out.println(Arrays.toString(arrayUtil.grow(a, 4)));
+		
+
+	}
+	
+
+}
diff --git a/group11/1059156023/dataStructure/.classpath b/group11/1059156023/dataStructure/.classpath
new file mode 100644
index 0000000000..fb5011632c
--- /dev/null
+++ b/group11/1059156023/dataStructure/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group11/1059156023/dataStructure/.gitignore b/group11/1059156023/dataStructure/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group11/1059156023/dataStructure/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group11/1059156023/dataStructure/.project b/group11/1059156023/dataStructure/.project
new file mode 100644
index 0000000000..35bb23a0fc
--- /dev/null
+++ b/group11/1059156023/dataStructure/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>dataStructure</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java b/group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..c853dcaea3
--- /dev/null
+++ b/group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,71 @@
+package com.coding.basic;
+
+import java.util.List;
+
+public class ArrayList implements List{
+	private int size;
+	
+	//设置一个默认容量，当调用默认构造函数实例化数组后，需要扩容时可用
+	private static final int DEFAULT_CAPACITY=10;
+	
+	//Integer.MAX_VALUE:2147483647，MAX_ARRAY_SIZE：2147483639
+	private static final int MAX_ARRAY_SIZE=Integer.MAX_VALUE-8;   
+	
+	private Object[] elementData;
+	
+	//定义一个默认为空的数组，供默认构造函数使用
+	private static final Object[] EMPTY_ELEMENTDATA={};
+	
+	//定义默认构造函数,实例化为空数组
+	public ArrayList(){
+		this.elementData=EMPTY_ELEMENTDATA;
+	}
+	
+	//定义一个有参的构造函数
+	public ArrayList(int initialCapacity){
+		if(initialCapacity<0)
+			throw new IllegalArgumentException("Illegal Capacity:"+initialCapacity);
+		this.elementData = new Object[initialCapacity];
+	}
+	
+	//定义add(Object o)方法,默认在数组末尾添加
+	public boolean add(Object o){
+		//要添加一个数，所以用ensureCapacityInternal()判断size+1个的数，数组是否放得下
+		ensureCapacityInternal(size+1);  
+		elementData[size++]=o;
+		return true;
+	}
+
+	private void ensureCapacityInternal(int minCapacity) {
+		if(elementData == EMPTY_ELEMENTDATA)
+			minCapacity = DEFAULT_CAPACITY;
+		
+		//如果需要扩容，则调用grow()
+		if(minCapacity-elementData.length>0)
+			grow(minCapacity);
+	}
+
+	private void grow(int minCapacity) {
+		int oldCapacity = elementData.length;
+		int newCapacity = oldCapacity+(oldCapacity>>1);
+		
+		//原始长度是0时，即原来是空数组时
+		if(newCapacity-minCapacity<0)        
+			newCapacity = minCapacity;
+		
+		//如果新的容量超过了数组最大容量，就调用hugeCapacity()把能给的最大容量给它
+		if(newCapacity-MAX_ARRAY_SIZE>0)
+			newCapacity = hugeCapacity(minCapacity);
+			
+		
+	}
+
+	private static int hugeCapacity(int minCapacity) {
+		if (minCapacity<0) {
+			throw new OutOfMemoryError();   //抛出内存溢出异常
+		}
+		//如果minCapacity比MAX_ARRAY_SIZE大，则返回int类型所能表示的最大值，否则返回MAX_ARRAY_SIZE
+		return (minCapacity>MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
+	}
+
+}
diff --git a/group11/1059156023/struts/.classpath b/group11/1059156023/struts/.classpath
new file mode 100644
index 0000000000..400cc1471c
--- /dev/null
+++ b/group11/1059156023/struts/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="C:/Users/admin/Downloads/dom4j_完整版/dom4j-1.6.1/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group11/1059156023/struts/.gitignore b/group11/1059156023/struts/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group11/1059156023/struts/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group11/1059156023/struts/.project b/group11/1059156023/struts/.project
new file mode 100644
index 0000000000..2c00c2049a
--- /dev/null
+++ b/group11/1059156023/struts/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>struts</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group11/1059156023/struts/src/com/coding/basic/LoginAction.java b/group11/1059156023/struts/src/com/coding/basic/LoginAction.java
new file mode 100644
index 0000000000..23683995f2
--- /dev/null
+++ b/group11/1059156023/struts/src/com/coding/basic/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coding.basic;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group11/1059156023/struts/src/com/coding/basic/Struts.java b/group11/1059156023/struts/src/com/coding/basic/Struts.java
new file mode 100644
index 0000000000..a0d26a207b
--- /dev/null
+++ b/group11/1059156023/struts/src/com/coding/basic/Struts.java
@@ -0,0 +1,59 @@
+package com.coding.basic;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.experimental.theories.Theories;
+
+import com.sun.corba.se.impl.orbutil.graph.Node;
+import com.sun.org.apache.bcel.internal.classfile.Attribute;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws DocumentException {
+    	//创建SAXReader对象  
+        SAXReader reader = new SAXReader();  
+        //读取文件 转换成Document  
+        Document document = reader.read(new File("src/com/coding/basic/struts.xml"));
+        //获取根节点元素对象
+        Element root = document.getRootElement();
+        //遍历根节点
+        listNodes(root);
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }
+
+	public static void listNodes(Element node) {
+		String name;
+		List<Attribute> list = node.attributes();
+		
+	}    
+
+}
diff --git a/group11/1059156023/struts/src/com/coding/basic/StrutsTest.java b/group11/1059156023/struts/src/com/coding/basic/StrutsTest.java
new file mode 100644
index 0000000000..5bac52805d
--- /dev/null
+++ b/group11/1059156023/struts/src/com/coding/basic/StrutsTest.java
@@ -0,0 +1,51 @@
+package com.coding.basic;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.DocumentException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testLoginActionSuccess() throws DocumentException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws DocumentException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+}
diff --git a/group11/1059156023/struts/src/com/coding/basic/View.java b/group11/1059156023/struts/src/com/coding/basic/View.java
new file mode 100644
index 0000000000..9e479018c8
--- /dev/null
+++ b/group11/1059156023/struts/src/com/coding/basic/View.java
@@ -0,0 +1,23 @@
+package com.coding.basic;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/1059156023/struts/src/com/coding/basic/struts.xml b/group11/1059156023/struts/src/com/coding/basic/struts.xml
new file mode 100644
index 0000000000..b3b576c15f
--- /dev/null
+++ b/group11/1059156023/struts/src/com/coding/basic/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.basic.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coding.basic.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/1178243325/DataStructure/build.gradle b/group11/1178243325/DataStructure/build.gradle
index 5c3694d8ec..9c6bc859e6 100644
--- a/group11/1178243325/DataStructure/build.gradle
+++ b/group11/1178243325/DataStructure/build.gradle
@@ -1,10 +1,20 @@
+
 apply plugin: 'java'
 apply plugin: 'eclipse'
 
 jar {
+	from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
 	manifest {
-		attributes 'Main-Class' : 'com.coding.Main' 
+		attributes 'Main-Class' : 'com.Main' 
 	}
 }
 
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+	compile 'junit:junit:4.12'
+	compile 'dom4j:dom4j:1.6.1'
+}
 
diff --git a/group11/1178243325/DataStructure/src/main/java/com/Main.java b/group11/1178243325/DataStructure/src/main/java/com/Main.java
new file mode 100644
index 0000000000..f5e5a36ebd
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/Main.java
@@ -0,0 +1,56 @@
+package com;
+
+import java.util.*;
+import com.coderising.litestruts.*;
+import com.coderising.array.*;
+public class Main {
+	public static void main(String[] args) {
+		int[] array = {1, 2, 3, 4, 5};
+		System.out.print("reverseArray测试:");
+		ArrayUtil.reverseArray(array);
+		for (int i : array)
+			System.out.print(i + " ");
+		System.out.print("\nremoveZero测试:");
+
+		int[] oldArray = {1, 3, 4, 5, 0, 0, 8 , 0, 9};
+		oldArray = ArrayUtil.removeZero(oldArray);
+		for (int i : oldArray) {
+			System.out.print(i + " ");
+		}
+		
+		System.out.print("\nmerge测试:");
+	 	int[] a1 = {3, 5,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] arrays = ArrayUtil.merge(a1, a2);		
+		for (int i : arrays)
+			System.out.print(i + " ");
+		
+		System.out.print("\ngrow测试:");
+	
+		int[] growArray = ArrayUtil.grow(a1, 5);
+		for (int i : growArray)
+			System.out.print(i + " ");
+		
+		System.out.print("\nfibonacci测试");
+		int[] fArray = ArrayUtil.fibonacci(1);
+		System.out.print(fArray);
+		System.out.println();
+		fArray = ArrayUtil.fibonacci(15);
+		for (int i : fArray)
+			System.out.print(i + " ");
+		System.out.print("\ngetPrimes测试:");
+		int[] primesArray = ArrayUtil.getPrimes(23);
+		for (int i : primesArray)
+			System.out.print(i + " ");
+		System.out.print("\ngetPerfectNumbers测试:");
+		int[] pArray = ArrayUtil.getPerfectNumbers(100);
+		for (int i : pArray)
+			System.out.print(i + " ");
+		System.out.print("\njoin测试:");
+		int[] jArray = new int[]{2, 3, 8};
+		System.out.print(ArrayUtil.join(jArray, "-"));
+		Map<String, String> map = new HashMap<>();
+		Struts.runAction("login", map);
+
+	}
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..f94d5d01c4
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,229 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		if (origin == null) {
+			return;
+		}
+
+		int length = origin.length; 
+		int[] temp = new int[length];
+		for (int i = 0; i < length; i++)
+			temp[i] = origin[i];
+		for (int i = length - 1, j = 0; i >= 0 && j < length; i--, j++)
+			origin[j] = temp[i];
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){ 
+		if (oldArray == null) {
+			return null;
+		}
+
+		int zeroCount = 0;	
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0)
+				zeroCount++;
+		}
+		int[] newArray = new int[oldArray.length-zeroCount];
+		for (int i = 0, j = 0; i < oldArray.length && j < newArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		if (array1 == null && array2 == null)
+			return null;
+		int index1 = 0, index2 = 0;
+		int[] array3 = new int[array1.length + array2.length];
+		int index = 0;
+		while (index1 != array1.length && index2 != array2.length) {
+			if (array1[index1] < array2[index2]) {
+				array3[index++] = array1[index1++];
+			} else if (array1[index1] > array2[index2]) {
+				array3[index++] = array2[index2++];
+			} else if (array1[index1] == array2[index2]){
+				array3[index++] = array1[index1++];
+				index2++;
+			}
+		}
+
+		if (index1 == array1.length && index2 != array2.length) {
+			for (int i = index2; i < array2.length; i++)
+				array3[index++] = array2[i];
+		} else if (index2 == array2.length && index1 != array1.length) {
+			for (int i = index1; i < array1.length; i++) {
+				array3[index++] = array1[i];
+			}
+		}
+		
+		int[] newArray = new int[index];
+		for (int i = 0; i < newArray.length; i++)
+			newArray[i] = array3[i];
+		return  newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 *
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		if (size <= 0)
+			return null;
+		int[] newArray = new int[oldArray.length + size]; 	
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}			
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if (max < 1)
+			return null;
+		if (max == 1)
+			return null;
+		int[] array = new int[max];
+		int i = 0;
+		int value = fibonaccis(i+1);
+		while ( value < max) {
+			array[i++] = value;
+			value = fibonaccis(i+1);
+		}
+		int[] newArray = new int[i];
+		for (int j = 0; j < newArray.length; j++) {
+			newArray[j] = array[j];
+		}
+		return newArray;
+	}
+
+	private static int fibonaccis(int n) {
+		if (n <=0)
+			return 0;
+		if (n == 1 || n ==2 ) 
+			return 1;
+		return fibonaccis(n-1)+fibonaccis(n-2);
+	} 
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		if (max <= 1) {
+			return null;
+		}
+		int[] array = new int[max];
+		int index = 0;
+		for (int i = 2; i < max; i++) {
+			if (i == 2 || i == 3 || i == 5 || i == 7)
+				array[index++] = i;
+			if (i%2 !=0 && i%3 != 0 && i%5 != 0 && i%7 != 0)
+				array[index++] = i;
+		}
+		int[] newArray = new int[index];
+		for (int i = 0; i < newArray.length; i++) {
+			newArray[i] = array[i];
+		}
+
+		return newArray;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		if (max <= 0) 
+			return null;
+		int[] array = new int[max];
+		int index = 0;
+		for (int i = 1; i < max; i++) {
+			if (isPerfectNumber(i))
+				array[index++] = i;
+		}
+
+		int[] newArray = new int[index];
+		for (int i = 0; i < newArray.length; i++)
+			newArray[i] = array[i];
+
+		return newArray;
+	}
+	
+	private static boolean isPerfectNumber(int n) {
+		int sum = 0;
+		int i = 1;
+		while (i < n) {
+			if (n%i == 0)
+				sum += i;
+			i++;
+		}
+		if (sum == n)
+			return true;
+		return false;
+	}
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		if (array == null)
+			return null;
+		StringBuilder str = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			if (i == array.length-1)
+				str.append(array[i]);
+			else 
+				str.append(array[i] + seperator);
+		}
+		return str.toString();
+	}
+	
+
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/.Struts.java.swp b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/.Struts.java.swp
new file mode 100644
index 0000000000..1f45a5f25e
Binary files /dev/null and b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/.Struts.java.swp differ
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..b3bd421435
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,62 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.lang.reflect.Method;
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml*/
+ 		/*
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+		try {
+			String targetClassName = XmlUtil.parseXML("struts.xml", actionName);
+			Class<?> targetClass = Class.forName(targetClassName);
+			
+			Method setName = targetClass.getMethod("setName", String.class);
+			Method setPassword = targetClass.getMethod("setPassword", String.class);
+			Object object = targetClass.newInstance();
+
+			setName.invoke(object, parameters.get("name"));
+			setPassword.invoke(object, parameters.get("password"));
+
+			Method execute = targetClass.getMethod("execute");
+			String result = (String)execute.invoke(object);
+
+			Method getMessage = targetClass.getMethod("getMessage");
+			String message = (String)getMessage.invoke(object);
+
+			Map<String, String> params = new HashMap<String, String>();
+			params.put("message", message);
+			String jspUrl = XmlUtil.getJspUrl("struts.xml", actionName, result);
+			View view = new View();
+			view.setJsp(jspUrl);
+			view.setParameters(params);
+			return view;
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		   
+    	
+    	return null;
+    }    
+	
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java
new file mode 100644
index 0000000000..d200452cc8
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java
@@ -0,0 +1,59 @@
+package com.coderising.litestruts;
+
+import java.io.*;
+import java.util.*;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+public class XmlUtil {
+
+	public static String parseXML(String filePath, String actionName) {
+		try {
+			File file = new File(filePath);  
+			SAXReader reader = new SAXReader();  
+			Document doc = reader.read(file);  
+			Element root = doc.getRootElement();
+			for (Iterator iter = root.elementIterator("action"); iter.hasNext();) {
+				Element element = (Element)iter.next();	
+				Attribute nameAttr = element.attribute("name");
+				if (nameAttr.getValue().equals(actionName)) {
+					Attribute classAttr = element.attribute("class");
+					return classAttr.getValue();
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			System.out.println("parse error");
+		}
+		return null;
+	}
+
+	public static String getJspUrl(String filePath, String actionName, String resultName) {
+		try {
+		File file = new File(filePath);
+		SAXReader reader = new SAXReader();
+		Document doc = reader.read(file);
+		Element root = doc.getRootElement();
+		for (Iterator iter = root.elementIterator("action"); iter.hasNext();) {
+			Element element = (Element)iter.next();
+			Attribute nameAttr = element.attribute("name");
+			if (nameAttr.getValue().equals(actionName)) {
+				for (Iterator ite = element.elementIterator("result"); ite.hasNext();) {
+					Element ele = (Element)ite.next();
+					Attribute resultAttr = ele.attribute("name");
+					if (resultAttr.getValue().equals(resultName)) {
+						return ele.getText();
+					}
+				}
+			}
+		}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..ae0ce37fd8
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/Main.java b/group11/1178243325/DataStructure/src/main/java/com/coding/Main.java
deleted file mode 100644
index 31d2f2f277..0000000000
--- a/group11/1178243325/DataStructure/src/main/java/com/coding/Main.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.coding;
-
-import com.coding.basic.*;
-public class Main {
-	public static void main(String[] args) {
-		ArrayList list = new ArrayList();
-		
-		list.add(0, "2xxx");
-		list.add(1, "we");
-		list.add(2, "sss");
-		list.add("xing");
-		list.remove(2);
-		System.out.println(list.get(2));
-		Iterator iterator = list.iterator();
-		while(iterator.hasNext()) {
-			System.out.println(iterator.next());
-		}
-		System.out.println(list.size());
-
-		LinkedList llist = new LinkedList();
-		llist.add("hu");
-		llist.add("zhao");
-		llist.add(2,"xing");
-		llist.addFirst("身骑白马");
-		llist.addLast("德州小老虎");
-		llist.add(5, "sf");
-		llist.remove(5);
-		llist.removeFirst();
-		llist.removeLast();
-		for (int i = 2; i >=0; i--) 
-			System.out.print(llist.get(i));
-		System.out.println(llist.size());
-
-		Iterator literator = llist.iterator();
-		while(literator.hasNext()) {
-			System.out.println(literator.next());
-		}
-		
-		Stack stack = new Stack();
-		stack.push(1);
-		stack.push(2);
-		stack.push(3);
-		stack.push(4);
-		System.out.println(stack.peek());
-		while(!stack.isEmpty())	
-		System.out.println(stack.pop());
-
-		Queue queue = new Queue();
-		queue.enQueue(1);
-		queue.enQueue(2);
-		queue.enQueue(3);
-		System.out.println(queue.size());
-		while (!queue.isEmpty()) {
-			System.out.println(queue.deQueue());
-		}
-		
-	}
-}
diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java
index 266eff3d56..1cf38aee30 100644
--- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java
+++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -9,24 +9,25 @@ public class 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){
-		return  null;
-	}
-	
 }
diff --git a/group11/1178243325/DataStructure/src/main/resources/struts.xml b/group11/1178243325/DataStructure/src/main/resources/struts.xml
new file mode 100644
index 0000000000..ae0ce37fd8
--- /dev/null
+++ b/group11/1178243325/DataStructure/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
diff --git a/group11/1178243325/DataStructure/struts.xml b/group11/1178243325/DataStructure/struts.xml
new file mode 100644
index 0000000000..0582b7d4ea
--- /dev/null
+++ b/group11/1178243325/DataStructure/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
diff --git a/group11/171535320/ArrayList.java b/group11/171535320/ArrayList.java
deleted file mode 100644
index e277814cc9..0000000000
--- a/group11/171535320/ArrayList.java
+++ /dev/null
@@ -1,62 +0,0 @@
-import java.util.Arrays;
-import java.util.Objects;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData = new Object[100];
-
-	private void ensureCapacity(int minCapacity) {
-		if(minCapacity > elementData.length) {
-			Object[] temp = elementData;
-			int newCapacity = elementData.length * 3 / 2 + 1;
-			Object[] newArray = new Object[newCapacity];
-			System.arraycopy(temp, 0, newArray, 0, elementData.length);
-			elementData = newArray;
-		}
-	}
-
-	public void add(Object o){
-
-
-		ensureCapacity(size + 1);
-		elementData[size++] = o;
-	}
-
-	public void add(int index, Object o){
-		ensureCapacity(size + 1);
-		System.arraycopy(elementData, index, elementData, index + 1, size - index);
-		elementData[index] = o;
-		size++;
-	}
-	
-	public Object get(int index){
-		if(index >= size || index < 0) {
-			return null;
-		}
-		return elementData[index];
-	}
-	
-	public Object remove(int index){
-		if(index < 0 || index >= size) {
-			return null;
-		}
-		Object obj = elementData[index];
-
-		System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
-
-		elementData[--size] = null;
-
-		return obj;
-	}
-	
-	public int size(){
-		return size;
-	}
-	
-	public Iterator iterator(){
-		return null;
-	}
-
-}
diff --git a/group11/171535320/ArrayUtil.java b/group11/171535320/ArrayUtil.java
new file mode 100644
index 0000000000..6b6cb818d0
--- /dev/null
+++ b/group11/171535320/ArrayUtil.java
@@ -0,0 +1,211 @@
+import sun.security.util.Length;
+
+import java.util.ArrayList;
+import java.util.InputMismatchException;
+import java.util.List;
+
+/**
+ * Created by dengdechao on 2017/2/27.
+ */
+public class ArrayUtil {
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * @param origin
+     * @return
+     */
+
+    public static void reverseArray(int[] origin){
+        if(origin == null) {
+            return ;
+        }
+        int i = 0;
+        int j = origin.length - 1;
+        while(i != j) {
+            int temp = origin[i];
+            origin[i] = origin[j];
+            origin[j] = temp;
+            i++;
+            j--;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     * @param oldArray
+     * @return
+     */
+
+    public static int[] removeZero(int[] oldArray){
+        if(oldArray == null) {
+            return null;
+        }
+        int i = 0;
+        int j = oldArray.length - 1;
+
+        while(i != j) {
+            if(oldArray[i] != 0) {
+                i++;
+                continue;
+            }
+            if(oldArray[j] == 0) {
+                j--;
+                continue;
+            }
+            int temp = oldArray[i];
+            oldArray[i] = oldArray[j];
+            oldArray[j] = temp;
+        }
+        int[] array = new int[i];
+        for(int n = 0; n < i; ++n) {
+            array[n] = oldArray[n];
+        }
+        return array;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public static int[] merge(int[] array1, int[] array2){
+        int[] result = new int[array1.length + array2.length];
+        int len1 = 0;
+        int len2 = 0;
+        int i = 0;
+        while(len1 != array1.length || len2 != array2.length) {
+            if(len1 < array1.length && len2 < array2.length) {
+                if(array1[len1] < array2[len2]) {
+                    result[i++] = array1[len1++];
+                } else if(array1[len1] > array2[len2]) {
+                    result[i++] = array2[len2++];
+                } else {
+                    result[i++] = array1[len1];
+                    len1++;
+                    len2++;
+                }
+            } else if(len1 < array1.length){
+                result[i++] = array1[len1++];
+            } else {
+                result[i++] = array2[len2++];
+            }
+
+        }
+        int[] last = new int[i];
+        System.arraycopy(result,0,last,0,i);
+        return last;
+    }
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int [] oldArray,  int size){
+        int len = oldArray.length + size;
+        int[] result = new int[len];
+        for(int i = 0; i < oldArray.length; ++i) {
+            result[i] = oldArray[i];
+        }
+        return result;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max){
+        return null;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max){
+        List<Integer> list = new ArrayList();
+
+        for(int i = 2; i <= max; ++i) {
+            int temp = 2;
+            while(temp < i) {
+                if(i % temp == 0) {
+                    break;
+                }
+                ++temp;
+            }
+            if(i == temp) {
+                list.add(i);
+            }
+        }
+
+        int[] result = new int[list.size()];
+
+        for(int i = 0; i < list.size(); ++i) {
+            result[i] = list.get(i);
+        }
+        return result;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max){
+        List<Integer> list = new ArrayList();
+
+        for(int j = 0; j < max; ++j) {
+            int temp = 0;
+            for(int i = 0; i < j / 2 + 1; ++i) {
+                if(j % i == 0) {
+                    temp += i;
+                }
+            }
+            if(temp == j) {
+                list.add(j);
+            }
+        }
+
+        int[] result = new int[list.size()];
+
+        for(int i = 0; i < list.size(); ++i) {
+            result[i] = list.get(i);
+        }
+        return result;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     * @param array
+     * @param s
+     * @return
+     */
+    public String join(int[] array, String seperator){
+        StringBuilder str = new StringBuilder();
+        for(int i = 0; i < array.length; ++i) {
+            str.append(array[i]);
+            if(i + 1 < array.length) {
+                str.append(seperator);
+            }
+        }
+        String s = str.toString();
+        return s;
+    }
+}
diff --git a/group11/171535320/BinaryTreeNode.java b/group11/171535320/BinaryTreeNode.java
deleted file mode 100644
index 3c8d543355..0000000000
--- a/group11/171535320/BinaryTreeNode.java
+++ /dev/null
@@ -1,43 +0,0 @@
-public class BinaryTreeNode {
-
-	private Node root = null;
-
-	public void insert(int value) {
-		if(root == null) {
-			root = new Node(value);
-			root.leftNode = null;
-			root.rightNode = null;
-		} else {
-			Node current = root;
-			Node old = root;
-			while(true) {
-				if(value < current.value) {
-					if(current.leftNode == null) {
-						current.leftNode = new Node(value);
-						break;
-					}
-					old = current;
-					current = current.leftNode;
-				} else {
-					if(current.rightNode == null) {
-						current.rightNode = new Node(value);
-						break;
-					}
-					old = current;
-					current = current.rightNode;
-				}
-			}
-		}
-	}
-
-}
-
-class Node {
-	int value;
-	Node leftNode;
-	Node rightNode;
-
-	public Node(int value) {
-		this.value = value;
-	}
-}
diff --git a/group11/171535320/DataStruct/ArrayList.java b/group11/171535320/DataStruct/ArrayList.java
new file mode 100644
index 0000000000..4340deecf4
--- /dev/null
+++ b/group11/171535320/DataStruct/ArrayList.java
@@ -0,0 +1,64 @@
+package DataStruct;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+
+	private void ensureCapacity(int minCapacity) {
+		if(minCapacity > elementData.length) {
+			Object[] temp = elementData;
+			int newCapacity = elementData.length * 3 / 2 + 1;
+			Object[] newArray = new Object[newCapacity];
+			System.arraycopy(temp, 0, newArray, 0, elementData.length);
+			elementData = newArray;
+		}
+	}
+
+	public void add(Object o){
+
+
+		ensureCapacity(size + 1);
+		elementData[size++] = o;
+	}
+
+	public void add(int index, Object o){
+		ensureCapacity(size + 1);
+		System.arraycopy(elementData, index, elementData, index + 1, size - index);
+		elementData[index] = o;
+		size++;
+	}
+	
+	public Object get(int index){
+		if(index >= size || index < 0) {
+			return null;
+		}
+		return elementData[index];
+	}
+	
+	public Object remove(int index){
+		if(index < 0 || index >= size) {
+			return null;
+		}
+		Object obj = elementData[index];
+
+		System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
+
+		elementData[--size] = null;
+
+		return obj;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+
+}
diff --git a/group11/171535320/DataStruct/BinaryTreeNode.java b/group11/171535320/DataStruct/BinaryTreeNode.java
new file mode 100644
index 0000000000..e0cc417a43
--- /dev/null
+++ b/group11/171535320/DataStruct/BinaryTreeNode.java
@@ -0,0 +1,45 @@
+package DataStruct;
+
+public class BinaryTreeNode {
+
+	private Node root = null;
+
+	public void insert(int value) {
+		if(root == null) {
+			root = new Node(value);
+			root.leftNode = null;
+			root.rightNode = null;
+		} else {
+			Node current = root;
+			Node old = root;
+			while(true) {
+				if(value < current.value) {
+					if(current.leftNode == null) {
+						current.leftNode = new Node(value);
+						break;
+					}
+					old = current;
+					current = current.leftNode;
+				} else {
+					if(current.rightNode == null) {
+						current.rightNode = new Node(value);
+						break;
+					}
+					old = current;
+					current = current.rightNode;
+				}
+			}
+		}
+	}
+
+}
+
+class Node {
+	int value;
+	Node leftNode;
+	Node rightNode;
+
+	public Node(int value) {
+		this.value = value;
+	}
+}
diff --git a/group11/171535320/DataStruct/Iterator.java b/group11/171535320/DataStruct/Iterator.java
new file mode 100644
index 0000000000..012d28806a
--- /dev/null
+++ b/group11/171535320/DataStruct/Iterator.java
@@ -0,0 +1,12 @@
+package DataStruct;
+
+/**
+ * Created by dengdechao on 2017/2/27.
+ */
+
+    public interface Iterator {
+        public boolean hasNext();
+        public Object next();
+
+    }
+
diff --git a/group11/171535320/DataStruct/LinkedList.java b/group11/171535320/DataStruct/LinkedList.java
new file mode 100644
index 0000000000..24a99466ca
--- /dev/null
+++ b/group11/171535320/DataStruct/LinkedList.java
@@ -0,0 +1,154 @@
+package DataStruct;
+
+import DataStruct.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		if(head == null) {
+			head = new Node();
+			head.data = o;
+		} else {
+			Node temp = head;
+			while(temp.next != null) {
+				temp = temp.next;
+			}
+			temp.next = new Node();
+			temp.next.data = o;
+		}
+	}
+
+	public void add(int index , Object o){
+		if(index > size()) {
+			return ;
+		}
+		if(index == 0) {
+			Node newNode = new Node();
+			newNode.data = o;
+			newNode.next = head;
+			head = newNode;
+		} else {
+			int temp = 0;
+			Node newNode = new Node();
+			newNode.data = o;
+			Node tempNode = head;
+			while(temp != index - 1) {
+				tempNode = tempNode.next;
+				++temp;
+			}
+			Node tempNode2 = tempNode.next;
+			tempNode.next = newNode;
+			newNode.next = tempNode2;
+		}
+	}
+
+	public Object get(int index){
+		if(index > size() || size() == 0) {
+			return null;
+		}
+		Node temp = head;
+		for(int i = 0; i < index; ++i) {
+			temp = temp.next;
+		}
+
+		return temp.data;
+	}
+
+
+	public Object remove(int index){
+		if(size() == 0) {
+			return null;
+		}
+		if(size() == 1) {
+			Object obj = head.data;
+			head = null;
+			return obj;
+		}
+		if(index == 0) {
+			Node temp = head;
+			head = head.next;
+			temp.next = null;
+		} else if(index > size()) {
+			return null;
+		} else {
+			int t = 0;
+			Node temp = head;
+			while(t != index - 1) {
+				temp = temp.next;
+				++t;
+			}
+			Node result = temp.next;
+			temp.next = temp.next.next;
+			return result.data;
+		}
+		return null;
+	}
+	
+	public int size(){
+		int len = 0;
+		Node temp = head;
+		while(temp != null) {
+			temp = temp.next;
+			++len;
+		}
+		return len;
+	}
+	
+	public void addFirst(Object o){
+		Node temp = new Node();
+		temp.data = o;
+		temp.next = head;
+		head = temp;
+	}
+	public void addLast(Object o){
+		Node newNode = new Node();
+		newNode.data = o;
+
+		if(size() == 0) {
+			head = newNode;
+		}
+		Node temp = head;
+		while(temp.next != null) {
+			temp = temp.next;
+		}
+		temp.next = newNode;
+	}
+	public Object removeFirst(){
+		if(size() == 0) {
+			return null;
+		}
+		Node temp = head;
+		head = head.next;
+		return temp.data;
+	}
+	public Object removeLast(){
+		if(size() == 0) {
+			return null;
+		}
+		if(size() == 1) {
+			Node temp = head.next;
+			head = head.next;
+			return temp.data;
+		}
+		Node temp1 = head;
+		Node temp2 = head.next;
+		while(temp2.next != null) {
+			temp1 = temp1.next;
+			temp2 = temp2.next;
+		}
+		temp1.next = null;
+		return temp2.data;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+}
diff --git a/group11/171535320/DataStruct/List.java b/group11/171535320/DataStruct/List.java
new file mode 100644
index 0000000000..125407436c
--- /dev/null
+++ b/group11/171535320/DataStruct/List.java
@@ -0,0 +1,9 @@
+package DataStruct;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group11/171535320/Iterator.java b/group11/171535320/Iterator.java
deleted file mode 100644
index 96a43dbe0a..0000000000
--- a/group11/171535320/Iterator.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/group11/171535320/LinkedList.java b/group11/171535320/LinkedList.java
deleted file mode 100644
index 43bb74e516..0000000000
--- a/group11/171535320/LinkedList.java
+++ /dev/null
@@ -1,152 +0,0 @@
-import java.util.Objects;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	
-	public void add(Object o){
-		if(head == null) {
-			head = new Node();
-			head.data = o;
-		} else {
-			Node temp = head;
-			while(temp.next != null) {
-				temp = temp.next;
-			}
-			temp.next = new Node();
-			temp.next.data = o;
-		}
-	}
-
-	public void add(int index , Object o){
-		if(index > size()) {
-			return ;
-		}
-		if(index == 0) {
-			Node newNode = new Node();
-			newNode.data = o;
-			newNode.next = head;
-			head = newNode;
-		} else {
-			int temp = 0;
-			Node newNode = new Node();
-			newNode.data = o;
-			Node tempNode = head;
-			while(temp != index - 1) {
-				tempNode = tempNode.next;
-				++temp;
-			}
-			Node tempNode2 = tempNode.next;
-			tempNode.next = newNode;
-			newNode.next = tempNode2;
-		}
-	}
-
-	public Object get(int index){
-		if(index > size() || size() == 0) {
-			return null;
-		}
-		Node temp = head;
-		for(int i = 0; i < index; ++i) {
-			temp = temp.next;
-		}
-
-		return temp.data;
-	}
-
-
-	public Object remove(int index){
-		if(size() == 0) {
-			return null;
-		}
-		if(size() == 1) {
-			Object obj = head.data;
-			head = null;
-			return obj;
-		}
-		if(index == 0) {
-			Node temp = head;
-			head = head.next;
-			temp.next = null;
-		} else if(index > size()) {
-			return null;
-		} else {
-			int t = 0;
-			Node temp = head;
-			while(t != index - 1) {
-				temp = temp.next;
-				++t;
-			}
-			Node result = temp.next;
-			temp.next = temp.next.next;
-			return result.data;
-		}
-		return null;
-	}
-	
-	public int size(){
-		int len = 0;
-		Node temp = head;
-		while(temp != null) {
-			temp = temp.next;
-			++len;
-		}
-		return len;
-	}
-	
-	public void addFirst(Object o){
-		Node temp = new Node();
-		temp.data = o;
-		temp.next = head;
-		head = temp;
-	}
-	public void addLast(Object o){
-		Node newNode = new Node();
-		newNode.data = o;
-
-		if(size() == 0) {
-			head = newNode;
-		}
-		Node temp = head;
-		while(temp.next != null) {
-			temp = temp.next;
-		}
-		temp.next = newNode;
-	}
-	public Object removeFirst(){
-		if(size() == 0) {
-			return null;
-		}
-		Node temp = head;
-		head = head.next;
-		return temp.data;
-	}
-	public Object removeLast(){
-		if(size() == 0) {
-			return null;
-		}
-		if(size() == 1) {
-			Node temp = head.next;
-			head = head.next;
-			return temp.data;
-		}
-		Node temp1 = head;
-		Node temp2 = head.next;
-		while(temp2.next != null) {
-			temp1 = temp1.next;
-			temp2 = temp2.next;
-		}
-		temp1.next = null;
-		return temp2.data;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-		
-	}
-}
diff --git a/group11/171535320/List.java b/group11/171535320/List.java
deleted file mode 100644
index 4f7bcc71a8..0000000000
--- a/group11/171535320/List.java
+++ /dev/null
@@ -1,7 +0,0 @@
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/group11/252308879/dataStructure/pom.xml b/group11/252308879/dataStructure/pom.xml
index 4b756e4f0d..0bf21adba4 100644
--- a/group11/252308879/dataStructure/pom.xml
+++ b/group11/252308879/dataStructure/pom.xml
@@ -21,5 +21,15 @@
       <version>4.12</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>dom4j</groupId>
+      <artifactId>dom4j</artifactId>
+      <version>1.6.1</version>
+    </dependency>
   </dependencies>
 </project>
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java
deleted file mode 100644
index 3d2a685f35..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java
+++ /dev/null
@@ -1,212 +0,0 @@
-package org.apn.coding2017.basic;
-
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-/**
- * Created by QiPan on 2017/2/23.
- */
-public class ArrayList implements List {
-
-    private int size;
-
-    // 设置默认容量 不可变
-    private static final int DEFAULT_CAPACITY = 10;
-
-    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
-
-    private Object[] elementData;
-
-    // 定义一个默认的空的数组,引用不可变
-    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
-
-    public ArrayList(int initialCapacity) {
-        if (initialCapacity > 0) {
-            this.elementData = new Object[initialCapacity];
-        } else if (initialCapacity == 0) {
-            this.elementData = new Object[]{};
-        } else {
-            throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
-        }
-    }
-
-    public ArrayList() { // 如果调用默认构造函数，设置容器为空的默认数组
-        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
-    }
-
-
-    public boolean add(Object o) {
-        ensureCapacityInternal(size + 1);
-        elementData[size++] = o;
-        return true;
-    }
-
-    @Override
-    public boolean add(int index, Object o) {
-        if (index > size || index < 0) {
-            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-        }
-        ensureCapacityInternal(size + 1);
-        // 从插入位置开发，所有的数据需要往后移动
-        System.arraycopy(elementData, index, elementData, index + 1,
-                size - index);
-        elementData[index] = o;
-        size++;
-        return true;
-    }
-
-    public Object set(int index, Object element) {
-        checkIndexOutOf(index);
-        Object oldEle = elementData[index];
-        elementData[index] = element;
-        return oldEle;
-    }
-
-    public Object get(int index) {
-        checkIndexOutOf(index);
-        return elementData[index];
-    }
-
-    public Object remove(int index) {
-        checkIndexOutOf(index);
-        Object oldValue = elementData[index];
-
-        // 计算需要移动的位数
-        int needMoveNum = size - index - 1;
-
-        if (needMoveNum > 0) {
-            /*
-             * src：源数组；
-             * srcPos：源数组要复制的起始位置；
-             * dest：目的数组；
-             * destPos：目的数组放置的起始位置；
-             * length：复制的长度。
-             */
-            System.arraycopy(elementData, index + 1, elementData, index, needMoveNum);
-        }
-        // 避免对象游离,是的gcc能工作回收
-        elementData[--size] = null;
-        return oldValue;
-    }
-
-    public int size() {
-        return this.size;
-    }
-
-    public boolean isEmpty() {
-        return this.size == 0;
-    }
-
-    public Iterator iterator() {
-        return new Itr();
-    }
-
-
-    private String outOfBoundsMsg(int index) {
-        return "Index: " + index + ", Size: " + size;
-    }
-
-    /**
-     * 检查数组越界
-     *
-     * @param index
-     */
-    private void checkIndexOutOf(int index) {
-        if (index >= size) {
-            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-        }
-    }
-
-    private void ensureCapacityInternal(int minCapacity) {
-        // 如果是容器是默认的空的数组
-        if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
-            // 取得为与默认容量相比的较大值
-            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
-        }
-        // 调用确保有能力放下那么多元素
-        ensureExplicitCapacity(minCapacity);
-    }
-
-    private void ensureExplicitCapacity(int minCapacity) {
-        // 防止容量溢出。所需的最小容器大于数组长度
-        if (minCapacity - elementData.length > 0) {
-            grow(minCapacity);
-        }
-    }
-
-    /**
-     * 扩充容量
-     *
-     * @param minCapacity
-     */
-    private void grow(int minCapacity) {
-        int oldCapacity = elementData.length;
-        // 得到一个新的容量大小，为 oldCapacity 的1.5倍
-        int newCapacity = oldCapacity + (oldCapacity >> 1);
-        // 如果扩容后的大小比，最小容量（DEFAULT_CAPACITY： 10）小
-        if (newCapacity - minCapacity < 0) {
-            newCapacity = minCapacity;
-        } else if (newCapacity - MAX_ARRAY_SIZE > 0) { // 扩容后比最大的还大，考虑溢出
-            //
-            newCapacity = hugeCapacity(minCapacity);
-        }
-
-        elementData = Arrays.copyOf(elementData, newCapacity);
-    }
-
-    /**
-     * 这个很少用到这个判断，毕竟基本不会使用那么大容量存储
-     *
-     * @param minCapacity
-     * @return
-     */
-    private static int hugeCapacity(int minCapacity) {
-        if (minCapacity < 0) {
-            throw new OutOfMemoryError();
-        }
-        return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
-    }
-
-    private class Itr implements Iterator {
-
-        /**
-         * 当前游标
-         */
-        int cursor;
-        int lastRet = -1; // 是否是返回最后一个结果
-
-        @Override
-        public boolean hasNext() {
-            return cursor != size;
-        }
-
-        @Override
-        public Object next() {
-            int i = cursor;
-            // 游标已经超过数组的大小
-            if (i >= size) {
-                throw new NoSuchElementException();
-            }
-            Object[] elementData = ArrayList.this.elementData;
-
-            // 指向下一个元素
-            cursor = i + 1;
-            Object elementDatum = elementData[i];
-            lastRet = i;
-            return elementDatum;
-        }
-
-        @Override
-        public void remove() {
-            if (lastRet < 0) {
-                throw new IllegalStateException();
-            }
-            // 实际上这个时候的 lastRet,为 next方法时候的 i = cursor
-            ArrayList.this.remove(lastRet);
-            cursor = lastRet;
-            lastRet = -1;
-        }
-    }
-
-
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java
deleted file mode 100644
index 3725e5c71b..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.apn.coding2017.basic;
-
-/**
- * Created by QiPan on 2017/2/23.
- */
-public class BinaryTreeNode<Key extends Comparable<Key>, Value> {
-
-    private Node root;
-
-    private class Node {
-        private Key key;
-        private Value value;
-        private Node left, right;  //指向子树的链接
-        private int N;             // 以该节点为根的子树节点总数
-        public Node(Key key, Value value, int N) {
-            this.key = key;
-            this.value = value;
-            this.N = N;
-        }
-    }
-
-    public int size() {
-        return size(root);
-    }
-
-    private int size(Node x) {
-        if (x == null) return 0;
-        else return x.N;
-    }
-    
-    public Value get(Key key){
-        return get(root, key);
-    }
-
-    private Value get(Node x, Key key) {
-        // 如果根节点也是Null 那么返回null
-        if (x == null){
-            return null;
-        }
-        // 拿需要查询的key 与 根节点的 key 比较
-        int cmp = key.compareTo(x.key);
-        if (cmp < 0){ // 如果小于0 那么去左子树上查询,并且递归调用
-            return get(x.left, key);
-        }else if (cmp > 0){// 如果大于0 那么去右子树上查询,并且递归调用
-            return get(x.right, key);
-        }else {
-            return x.value;
-        }
-    }
-
-    public void push(Key key, Value value){
-        // 查询key, 找到则更新它的值，否则就创建
-        root = put(root, key, value);
-    }
-
-    private Node put(Node x, Key key, Value value) {
-        // 如果key 存在于以 x 为根节点的子树中 则更新它的值
-        // 否则将以key 和 value 为键值对的新节点插入到该子树中
-
-        if (x == null){
-            return new Node(key, value, 1);
-        }
-        int cmp = key.compareTo(x.key);
-        if (cmp < 0 ){
-            x.left  = put(x.left, key, value);
-        }else if (cmp > 0){
-            x.right = put(x.right, key, value);
-        }else { // 存在更新值
-            x.value = value;
-        }
-        // 重新统计节点总数
-        x.N = size(x.left) + size(x.right) + 1;
-        return x;
-    }
-
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java
deleted file mode 100644
index 94dc84dfdc..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apn.coding2017.basic;
-
-/**
- * Created by QiPan on 2017/2/23.
- */
-public interface Iterator {
-    boolean hasNext();
-
-    Object next();
-
-    void remove();
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java
deleted file mode 100644
index e83de27c11..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.apn.coding2017.basic;
-
-/**
- * Created by QiPan on 2017/2/23.
- */
-public class LinkedList {
-
-    private Node head;
-    private int size;
-    public LinkedList() {
-        head = new Node(null, null);
-        size = 0;
-    }
-
-    public void add(Object o){
-        add(size, o);
-    }
-
-    public void add(int index , Object o){
-        if (index > size || index < 0) {
-            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-        }
-        Node frontNode = getNode(index-1);
-        Node newNode = new Node(o, frontNode.next);
-        frontNode.next = newNode;
-        size++;
-
-    }
-
-    private Node getNode(int index) {
-        Node node = head;
-        int i = 0;
-        while(node.next != null && i <= index) {
-            node = node.next;
-            i++;
-        }
-        return node;
-    }
-
-    public Object get(int index){
-        if (index >= size || index < 0) {
-            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-        }
-
-        Node node = getNode(index);
-        return node.data;
-    }
-
-    public Object remove(int index){
-        if (index >= size || index < 0) {
-            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-        }
-        Node frontNode = getNode(index-1);
-        Node oldNode = getNode(index);
-        frontNode.next = oldNode.next;
-        size--;
-        return oldNode.data;
-    }
-
-    public int size(){
-        return size;
-    }
-
-    public void addFirst(Object o){
-        add(0, o);
-    }
-
-    public void addLast(Object o){
-        add(size, o);
-    }
-
-    public Object removeFirst(){
-        return remove(0);
-    }
-
-    public Object removeLast(){
-        return remove(size-1);
-    }
-
-    public Iterator iterator(){
-        return new LinkedListIterator();
-    }
-
-    private class LinkedListIterator implements Iterator {
-        int index;
-        final int capacity = size;
-        LinkedListIterator() {
-            index = 0;
-        }
-        @Override
-        public boolean hasNext() {
-            return index < capacity;
-        }
-
-        @Override
-        public Object next() {
-            return get(index++);
-        }
-
-        @Override
-        public void remove() {
-
-        }
-    }
-
-    private String outOfBoundsMsg(int index) {
-        return "index:" + index + ", size:" + size;
-    }
-
-    private static  class Node {
-        Object data;
-        Node next;
-
-        Node(Object data, Node next) {
-            this.data = data;
-            this.next = next;
-        }
-    }
-
-
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java
deleted file mode 100644
index 15c9d9d3be..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.apn.coding2017.basic;
-
-
-/**
- * Created by QiPan on 2017/2/23.
- */
-public interface List {
-
-    boolean add(Object o);
-
-    boolean add(int index, Object o);
-
-    Object set(int index, Object element);
-
-    Object get(int index);
-
-    Object remove(int index);
-
-    int size();
-
-    boolean isEmpty();
-
-    Iterator iterator();
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java
deleted file mode 100644
index d51695b148..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.apn.coding2017.basic;
-
-/**
- * Created by QiPan on 2017/2/23.
- * 队列，链表实现版本
- */
-public class Queue<E> {
-
-    private Node first;
-    private Node last;
-    private int N;
-
-    private class Node {
-        E item;
-        Node next;
-    }
-
-    public void enQueue(E e) {
-        // 向表尾添加元素
-        Node oldLast = last;
-        last = new Node();
-        last.item = e;
-        last.next = null;
-        if (isEmpty()){// 如果是往空的队列里面添加东西。那么首尾链表都是指向第一个元素
-            first = last;
-        }else {
-
-            oldLast.next = last;
-        }
-        N++;
-    }
-
-    public E deQueue() {
-        E item = first.item;
-        first = first.next;
-        if (isEmpty()){
-            last = null;
-        }
-        N--;
-        return item;
-    }
-
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public int size() {
-        return N;
-    }
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java
deleted file mode 100644
index 3233954cf8..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.apn.coding2017.basic;
-
-/**
- * Created by QiPan on 2017/2/23.
- */
-public class Stack<E> {
-
-    private E[] elements;
-    // 记录元素当前位置
-    private int N;
-
-    public Stack(int cap) {
-        elements = (E[]) new Object[cap];
-    }
-
-    public boolean isEmpty() {
-        return N == 0;
-    }
-
-    public int size() {
-        return N;
-    }
-
-    public void push(E e) {
-        // 如果 N 和数组的长度已经相同，就进行扩容
-        if (N == elements.length) {
-            resize(2 * elements.length);
-        }
-        elements[N++] = e;
-    }
-
-    public E pop() {
-        E element = elements[--N];
-        elements[N] = null;// 避免对象游离
-        // 如果元素值剩下容量的1/4，那么就把数组容量变成现在的一半
-        if (N > 0 && N == elements.length / 4) {
-            resize(elements.length / 2);
-        }
-        return element;
-    }
-
-    private void resize(int max) {
-        E[] elementTmps = (E[]) new Object[max];
-        for (int i = 0; i < N; i++) {
-            elementTmps[i] = elements[i];
-        }
-        // 指向扩容的数组
-        elements = elementTmps;
-    }
-
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java
deleted file mode 100644
index 2769c72485..0000000000
--- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.apn.coding2017.basic;
-
-/**
- * Created by Pan on 2017/2/25.
- * 栈（链表实现）： 下压栈。操作栈顶元素
- */
-public class Stack2<E> {
-
-    private Node first;
-    private int N;
-
-    private class Node {
-        E item;
-        Node next;
-    }
-
-    public boolean isEmpty(){
-        return first == null;
-    }
-
-    public int size(){
-        return  N;
-    }
-
-    /**
-     * 向栈顶添加元素
-     * @param element
-     */
-    public void push (E element){
-        Node oldFirst = first;
-        first = new Node();
-        first.item = element;
-        first.next = oldFirst;
-        N++;
-    }
-
-    /**
-     * 弹出栈顶元素
-     * @return
-     */
-    public E pop(){
-        E item = first.item;
-        first = first.next;
-        N--;
-        return item;
-    }
-}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java
new file mode 100644
index 0000000000..82d7073a0f
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java
@@ -0,0 +1,282 @@
+package org.pan.coding2017.array;
+
+import java.util.Arrays;
+
+/**
+ * Created by QiPan on 2017/2/27.
+ */
+public class ArrayUtil {
+
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public static void reverseArray(int[] origin) {
+
+        // 如果是null, 或者长度小于等于1， 直接返回
+        if (origin == null || origin.length <= 1) {
+            return;
+        }
+        for (int i = 0; i < origin.length / 2; i++) {
+            int tmp = origin[i];
+            origin[i] = origin[origin.length - 1 - i];
+            origin[origin.length - 1 - i] = tmp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public static int[] removeZero(int[] oldArray) {
+
+        if (oldArray == null) {
+            return oldArray;
+        }
+        int[] newArray = null;
+        int count = 0; //统计被移出的数组的个数
+        for (int i = 0; i < oldArray.length; i++) {
+            int num = oldArray[i];
+            if (num == 0) {
+                count++;
+                System.arraycopy(oldArray, i + 1, oldArray, i, oldArray.length - i - 1);
+                i--;
+            }
+        }
+        if (count == 0) {
+            newArray = oldArray;
+        } else {
+            newArray = new int[oldArray.length - count];
+            System.arraycopy(oldArray, 0, newArray, 0, oldArray.length - count);
+        }
+        return newArray;
+    }
+
+    /**
+     * 不用JavaAPI来做
+     *
+     * @param oldArray
+     * @return
+     */
+    public static int[] removeZero_2(int[] oldArray) {
+
+        if (oldArray == null) {
+            return oldArray;
+        }
+        int count = 0;
+        for (int num : oldArray) {
+            if (num == 0) {
+                count++;
+            }
+        }
+        int[] newArray = new int[oldArray.length - count];
+        for (int i = 0, j = 0; i < oldArray.length; i++, j++) {
+            int num = oldArray[i];
+            if (num == 0) {
+                j--;
+            } else {
+                newArray[j] = num;
+            }
+        }
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public static int[] merge(int[] array1, int[] array2) {
+        //先初始化一个array3，但不是最后返回的数组
+        int[] array3 = new int[array1.length + array2.length];
+        int i = 0, j = 0;
+        int array3Size = 0; // 统计实际上合并数组后的大小
+        while (i < array1.length && j < array2.length) {
+            if (array1[i] < array2[j]) {// 如果array1中元素小，则插入到array3中
+                array3[array3Size++] = array1[i];
+                ++i;
+            } else if (array1[i] > array2[j]) {//如果array2中元素小，则插入到array3中
+                array3[array3Size++] = array2[j];
+                ++j;
+            } else {//否则随便插入一个,但是计数要同时加1
+                array3[array3Size++] = array1[i];
+                ++i;
+                ++j;
+            }
+        }
+
+        if (i == array1.length) { //如果array1中全部循环完毕了，那么需要去处理array2中剩余的元素
+            for (int n = j; n < array2.length; n++) {
+                array3[array3Size++] = array2[n];
+            }
+        } else if (j == array2.length) {// 如果array2中全部循环完毕,那么需要去处理array1中剩余的元素
+            for (int n = i; n < array1.length; n++) {
+                array3[array3Size++] = array1[n];
+            }
+        }
+        int[] returnResultArray = new int[array3Size];
+        System.arraycopy(array3, 0, returnResultArray, 0,
+                array3Size);
+        return returnResultArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public static int[] grow(int[] oldArray, int size) {
+        if (oldArray == null) {
+            oldArray = new int[size];
+        }
+        oldArray = Arrays.copyOf(oldArray, oldArray.length + size);
+        return oldArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public static int[] fibonacci(int max) {
+        if (max <= 1) {
+            return new int[0];
+        }
+        int[] arrays = new int[max / 2];
+        int firstNum = 1; //第一个数字
+        int secondNum = 1; // 第二个数字
+        int arraySize = 0;
+        arrays[arraySize++] = 1; // 初始化第一位
+        while (secondNum < max) {
+            arrays[arraySize++] = secondNum;
+            int tmpNum = secondNum; // 保存第二个数，得会需要付给第一个数
+            secondNum = firstNum + secondNum; // 为前两个数之和
+            firstNum = tmpNum; // 第一个数，后移
+        }
+        return Arrays.copyOf(arrays, arraySize);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPrimes(int max) {
+        int[] returnResultArray = new int[max + 1];
+        int arraySize = 0;
+        for (int i = 2; i < max; i++) {
+            if (isPrime(i)) {
+                returnResultArray[arraySize++] = i;
+            }
+
+        }
+        if (arraySize == returnResultArray.length) {
+            return returnResultArray;
+        }
+        return Arrays.copyOf(returnResultArray, arraySize);
+    }
+
+    private static boolean isPrime(final int number) {
+        if (number < 2) {
+            return false;
+        }
+        // 因为不可能将一个数除与所有小于它的数字，只要检查到N的平方根就好了。
+        // 但直接开根号还有个精度的问题。这个可能会产生误差。 索性将判断条件写成 i*i<=number
+        for (int i = 2; i * i <= number; i++) {
+            if (number % i == 0) {//查看所有小于number平方根的数，能够被整除
+                return false;
+            }
+        }
+        // 如果一个都没有，那么就是素数
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPerfectNumbers(int max) {
+        int[] array = new int[max];
+        int arraySize = 0;
+        for (int n = 0; n < max; n++) {
+            int fac,// 被除的因子
+                    sum,// 用来统计因子之和
+                    num;// 除数的因子，中间变量
+            for (sum = 1, num = n, fac = 2; fac < num; fac++) {
+
+                if (n % fac == 0) {// 如果余数为0，那么说明有因子
+                    sum += fac;    // 统计因子和
+                    num = n / fac; // num=等于除数的最大因子
+                    if (num == fac)  // 如果最大和最小相等跳出循环
+                        break;
+                    sum += num; // 再统计因子
+                }
+            }
+
+            if (sum == n) { //因子和与整数相等，那么就是一个完美数
+                if (n != 1) {
+                    System.out.println(n + "是一个完全数，其因子为:");
+                }
+                for (fac = 1; fac < n; fac++) {
+                    if (n % fac == 0) {// 列出所有的因子
+                        System.out.print(fac + " ");
+                    }
+                }
+                System.out.println();
+                array[arraySize++] = n; // 放到数组中
+            }
+        }
+        return Arrays.copyOf(array, arraySize);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public static String join(int[] array, String seperator) {
+        if (array == null) {
+            return null;
+        }
+        StringBuilder str = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            if (i == array.length - 1) {
+                str.append(array[i]);
+                continue;
+            }
+            str.append(array[i]).append(seperator);
+        }
+        return str.toString();
+    }
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java
new file mode 100644
index 0000000000..73dd4b7a5f
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java
@@ -0,0 +1,212 @@
+package org.pan.coding2017.basic;
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+/**
+ * Created by QiPan on 2017/2/23.
+ */
+public class ArrayList implements List {
+
+    private int size;
+
+    // 设置默认容量 不可变
+    private static final int DEFAULT_CAPACITY = 10;
+
+    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
+
+    private Object[] elementData;
+
+    // 定义一个默认的空的数组,引用不可变
+    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
+
+    public ArrayList(int initialCapacity) {
+        if (initialCapacity > 0) {
+            this.elementData = new Object[initialCapacity];
+        } else if (initialCapacity == 0) {
+            this.elementData = new Object[]{};
+        } else {
+            throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
+        }
+    }
+
+    public ArrayList() { // 如果调用默认构造函数，设置容器为空的默认数组
+        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
+    }
+
+
+    public boolean add(Object o) {
+        ensureCapacityInternal(size + 1);
+        elementData[size++] = o;
+        return true;
+    }
+
+    @Override
+    public boolean add(int index, Object o) {
+        if (index > size || index < 0) {
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+        }
+        ensureCapacityInternal(size + 1);
+        // 从插入位置开发，所有的数据需要往后移动
+        System.arraycopy(elementData, index, elementData, index + 1,
+                size - index);
+        elementData[index] = o;
+        size++;
+        return true;
+    }
+
+    public Object set(int index, Object element) {
+        checkIndexOutOf(index);
+        Object oldEle = elementData[index];
+        elementData[index] = element;
+        return oldEle;
+    }
+
+    public Object get(int index) {
+        checkIndexOutOf(index);
+        return elementData[index];
+    }
+
+    public Object remove(int index) {
+        checkIndexOutOf(index);
+        Object oldValue = elementData[index];
+
+        // 计算需要移动的位数
+        int needMoveNum = size - index - 1;
+
+        if (needMoveNum > 0) {
+            /*
+             * src：源数组；
+             * srcPos：源数组要复制的起始位置；
+             * dest：目的数组；
+             * destPos：目的数组放置的起始位置；
+             * length：复制的长度。
+             */
+            System.arraycopy(elementData, index + 1, elementData, index, needMoveNum);
+        }
+        // 避免对象游离,是的gcc能工作回收
+        elementData[--size] = null;
+        return oldValue;
+    }
+
+    public int size() {
+        return this.size;
+    }
+
+    public boolean isEmpty() {
+        return this.size == 0;
+    }
+
+    public Iterator iterator() {
+        return new Itr();
+    }
+
+
+    private String outOfBoundsMsg(int index) {
+        return "Index: " + index + ", Size: " + size;
+    }
+
+    /**
+     * 检查数组越界
+     *
+     * @param index
+     */
+    private void checkIndexOutOf(int index) {
+        if (index >= size) {
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+        }
+    }
+
+    private void ensureCapacityInternal(int minCapacity) {
+        // 如果是容器是默认的空的数组
+        if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
+            // 取得为与默认容量相比的较大值
+            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
+        }
+        // 调用确保有能力放下那么多元素
+        ensureExplicitCapacity(minCapacity);
+    }
+
+    private void ensureExplicitCapacity(int minCapacity) {
+        // 防止容量溢出。所需的最小容器大于数组长度
+        if (minCapacity - elementData.length > 0) {
+            grow(minCapacity);
+        }
+    }
+
+    /**
+     * 扩充容量
+     *
+     * @param minCapacity
+     */
+    private void grow(int minCapacity) {
+        int oldCapacity = elementData.length;
+        // 得到一个新的容量大小，为 oldCapacity 的1.5倍
+        int newCapacity = oldCapacity + (oldCapacity >> 1);
+        // 如果扩容后的大小比，最小容量（DEFAULT_CAPACITY： 10）小
+        if (newCapacity - minCapacity < 0) {
+            newCapacity = minCapacity;
+        } else if (newCapacity - MAX_ARRAY_SIZE > 0) { // 扩容后比最大的还大，考虑溢出
+            //
+            newCapacity = hugeCapacity(minCapacity);
+        }
+
+        elementData = Arrays.copyOf(elementData, newCapacity);
+    }
+
+    /**
+     * 这个很少用到这个判断，毕竟基本不会使用那么大容量存储
+     *
+     * @param minCapacity
+     * @return
+     */
+    private static int hugeCapacity(int minCapacity) {
+        if (minCapacity < 0) {
+            throw new OutOfMemoryError();
+        }
+        return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
+    }
+
+    private class Itr implements Iterator {
+
+        /**
+         * 当前游标
+         */
+        int cursor;
+        int lastRet = -1; // 是否是返回最后一个结果
+
+        @Override
+        public boolean hasNext() {
+            return cursor != size;
+        }
+
+        @Override
+        public Object next() {
+            int i = cursor;
+            // 游标已经超过数组的大小
+            if (i >= size) {
+                throw new NoSuchElementException();
+            }
+            Object[] elementData = ArrayList.this.elementData;
+
+            // 指向下一个元素
+            cursor = i + 1;
+            Object elementDatum = elementData[i];
+            lastRet = i;
+            return elementDatum;
+        }
+
+        @Override
+        public void remove() {
+            if (lastRet < 0) {
+                throw new IllegalStateException();
+            }
+            // 实际上这个时候的 lastRet,为 next方法时候的 i = cursor
+            ArrayList.this.remove(lastRet);
+            cursor = lastRet;
+            lastRet = -1;
+        }
+    }
+
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..80f7f78751
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java
@@ -0,0 +1,76 @@
+package org.pan.coding2017.basic;
+
+/**
+ * Created by QiPan on 2017/2/23.
+ */
+public class BinaryTreeNode<Key extends Comparable<Key>, Value> {
+
+    private Node root;
+
+    private class Node {
+        private Key key;
+        private Value value;
+        private Node left, right;  //指向子树的链接
+        private int N;             // 以该节点为根的子树节点总数
+        public Node(Key key, Value value, int N) {
+            this.key = key;
+            this.value = value;
+            this.N = N;
+        }
+    }
+
+    public int size() {
+        return size(root);
+    }
+
+    private int size(Node x) {
+        if (x == null) return 0;
+        else return x.N;
+    }
+    
+    public Value get(Key key){
+        return get(root, key);
+    }
+
+    private Value get(Node x, Key key) {
+        // 如果根节点也是Null 那么返回null
+        if (x == null){
+            return null;
+        }
+        // 拿需要查询的key 与 根节点的 key 比较
+        int cmp = key.compareTo(x.key);
+        if (cmp < 0){ // 如果小于0 那么去左子树上查询,并且递归调用
+            return get(x.left, key);
+        }else if (cmp > 0){// 如果大于0 那么去右子树上查询,并且递归调用
+            return get(x.right, key);
+        }else {
+            return x.value;
+        }
+    }
+
+    public void push(Key key, Value value){
+        // 查询key, 找到则更新它的值，否则就创建
+        root = put(root, key, value);
+    }
+
+    private Node put(Node x, Key key, Value value) {
+        // 如果key 存在于以 x 为根节点的子树中 则更新它的值
+        // 否则将以key 和 value 为键值对的新节点插入到该子树中
+
+        if (x == null){
+            return new Node(key, value, 1);
+        }
+        int cmp = key.compareTo(x.key);
+        if (cmp < 0 ){
+            x.left  = put(x.left, key, value);
+        }else if (cmp > 0){
+            x.right = put(x.right, key, value);
+        }else { // 存在更新值
+            x.value = value;
+        }
+        // 重新统计节点总数
+        x.N = size(x.left) + size(x.right) + 1;
+        return x;
+    }
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java
new file mode 100644
index 0000000000..3d1849f1a0
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java
@@ -0,0 +1,12 @@
+package org.pan.coding2017.basic;
+
+/**
+ * Created by QiPan on 2017/2/23.
+ */
+public interface Iterator {
+    boolean hasNext();
+
+    Object next();
+
+    void remove();
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java
new file mode 100644
index 0000000000..015ac3d59d
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java
@@ -0,0 +1,121 @@
+package org.pan.coding2017.basic;
+
+/**
+ * Created by QiPan on 2017/2/23.
+ */
+public class LinkedList {
+
+    private Node head;
+    private int size;
+    public LinkedList() {
+        head = new Node(null, null);
+        size = 0;
+    }
+
+    public void add(Object o){
+        add(size, o);
+    }
+
+    public void add(int index , Object o){
+        if (index > size || index < 0) {
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+        }
+        Node frontNode = getNode(index-1);
+        Node newNode = new Node(o, frontNode.next);
+        frontNode.next = newNode;
+        size++;
+
+    }
+
+    private Node getNode(int index) {
+        Node node = head;
+        int i = 0;
+        while(node.next != null && i <= index) {
+            node = node.next;
+            i++;
+        }
+        return node;
+    }
+
+    public Object get(int index){
+        if (index >= size || index < 0) {
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+        }
+
+        Node node = getNode(index);
+        return node.data;
+    }
+
+    public Object remove(int index){
+        if (index >= size || index < 0) {
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+        }
+        Node frontNode = getNode(index-1);
+        Node oldNode = getNode(index);
+        frontNode.next = oldNode.next;
+        size--;
+        return oldNode.data;
+    }
+
+    public int size(){
+        return size;
+    }
+
+    public void addFirst(Object o){
+        add(0, o);
+    }
+
+    public void addLast(Object o){
+        add(size, o);
+    }
+
+    public Object removeFirst(){
+        return remove(0);
+    }
+
+    public Object removeLast(){
+        return remove(size-1);
+    }
+
+    public Iterator iterator(){
+        return new LinkedListIterator();
+    }
+
+    private class LinkedListIterator implements Iterator {
+        int index;
+        final int capacity = size;
+        LinkedListIterator() {
+            index = 0;
+        }
+        @Override
+        public boolean hasNext() {
+            return index < capacity;
+        }
+
+        @Override
+        public Object next() {
+            return get(index++);
+        }
+
+        @Override
+        public void remove() {
+
+        }
+    }
+
+    private String outOfBoundsMsg(int index) {
+        return "index:" + index + ", size:" + size;
+    }
+
+    private static  class Node {
+        Object data;
+        Node next;
+
+        Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java
new file mode 100644
index 0000000000..daa8253313
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java
@@ -0,0 +1,24 @@
+package org.pan.coding2017.basic;
+
+
+/**
+ * Created by QiPan on 2017/2/23.
+ */
+public interface List {
+
+    boolean add(Object o);
+
+    boolean add(int index, Object o);
+
+    Object set(int index, Object element);
+
+    Object get(int index);
+
+    Object remove(int index);
+
+    int size();
+
+    boolean isEmpty();
+
+    Iterator iterator();
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java
new file mode 100644
index 0000000000..af478b4288
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java
@@ -0,0 +1,50 @@
+package org.pan.coding2017.basic;
+
+/**
+ * Created by QiPan on 2017/2/23.
+ * 队列，链表实现版本
+ */
+public class Queue<E> {
+
+    private Node first;
+    private Node last;
+    private int N;
+
+    private class Node {
+        E item;
+        Node next;
+    }
+
+    public void enQueue(E e) {
+        // 向表尾添加元素
+        Node oldLast = last;
+        last = new Node();
+        last.item = e;
+        last.next = null;
+        if (isEmpty()){// 如果是往空的队列里面添加东西。那么首尾链表都是指向第一个元素
+            first = last;
+        }else {
+
+            oldLast.next = last;
+        }
+        N++;
+    }
+
+    public E deQueue() {
+        E item = first.item;
+        first = first.next;
+        if (isEmpty()){
+            last = null;
+        }
+        N--;
+        return item;
+    }
+
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return N;
+    }
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java
new file mode 100644
index 0000000000..918db8f70d
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java
@@ -0,0 +1,51 @@
+package org.pan.coding2017.basic;
+
+/**
+ * Created by QiPan on 2017/2/23.
+ */
+public class Stack<E> {
+
+    private E[] elements;
+    // 记录元素当前位置
+    private int N;
+
+    public Stack(int cap) {
+        elements = (E[]) new Object[cap];
+    }
+
+    public boolean isEmpty() {
+        return N == 0;
+    }
+
+    public int size() {
+        return N;
+    }
+
+    public void push(E e) {
+        // 如果 N 和数组的长度已经相同，就进行扩容
+        if (N == elements.length) {
+            resize(2 * elements.length);
+        }
+        elements[N++] = e;
+    }
+
+    public E pop() {
+        E element = elements[--N];
+        elements[N] = null;// 避免对象游离
+        // 如果元素值剩下容量的1/4，那么就把数组容量变成现在的一半
+        if (N > 0 && N == elements.length / 4) {
+            resize(elements.length / 2);
+        }
+        return element;
+    }
+
+    private void resize(int max) {
+        E[] elementTmps = (E[]) new Object[max];
+        for (int i = 0; i < N; i++) {
+            elementTmps[i] = elements[i];
+        }
+        // 指向扩容的数组
+        elements = elementTmps;
+    }
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java
new file mode 100644
index 0000000000..2a056b8bbf
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java
@@ -0,0 +1,47 @@
+package org.pan.coding2017.basic;
+
+/**
+ * Created by Pan on 2017/2/25.
+ * 栈（链表实现）： 下压栈。操作栈顶元素
+ */
+public class Stack2<E> {
+
+    private Node first;
+    private int N;
+
+    private class Node {
+        E item;
+        Node next;
+    }
+
+    public boolean isEmpty(){
+        return first == null;
+    }
+
+    public int size(){
+        return  N;
+    }
+
+    /**
+     * 向栈顶添加元素
+     * @param element
+     */
+    public void push (E element){
+        Node oldFirst = first;
+        first = new Node();
+        first.item = element;
+        first.next = oldFirst;
+        N++;
+    }
+
+    /**
+     * 弹出栈顶元素
+     * @return
+     */
+    public E pop(){
+        E item = first.item;
+        first = first.next;
+        N--;
+        return item;
+    }
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java
new file mode 100644
index 0000000000..f38cbcb084
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java
@@ -0,0 +1,39 @@
+package org.pan.coding2017.parsingXML;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java
new file mode 100644
index 0000000000..90c5443c23
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java
@@ -0,0 +1,110 @@
+package org.pan.coding2017.parsingXML;
+
+import org.pan.coding2017.utils.JaxpDomUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        try {
+            Document document = JaxpDomUtil.getDocument();
+            NodeList actionNodeList = document.getElementsByTagName("action");
+            for (int i = 0; i < actionNodeList.getLength(); i++) {
+                NamedNodeMap attributes = actionNodeList.item(i).getAttributes();
+                String methodName = attributes.getNamedItem("name").getTextContent();
+                if (!actionName.equals(methodName)) {
+                    continue;
+                }
+                // 获取全类名对象，反射创建对象
+                String className = attributes.getNamedItem("class").getTextContent();
+                Class<?> actionClass = Class.forName(className);
+
+                // 获取反射的方法名称, 因为是public修饰所以用的是getMethod，获取私有方法需要用 getDeclaredMethod
+                Method setName = actionClass.getMethod("setName", String.class);
+                Method setPassword = actionClass.getMethod("setPassword", String.class);
+                // 创建对象
+                Object actionObject = actionClass.newInstance();
+
+                // 调用反射的setter方法,给参数赋值
+                setName.invoke(actionObject, parameters.get("name"));
+                setPassword.invoke(actionObject, parameters.get("password"));
+
+                // 获取execute方法
+                Method execute = actionClass.getMethod("execute");
+                // 返回结果
+                String result = (String) execute.invoke(actionObject);
+
+                // 获取getMessage方法
+                Method getMessage = actionClass.getMethod("getMessage");
+                String message = (String) getMessage.invoke(actionObject);
+                // 创建一个Map 用来放置在 View中
+                Map<String, String> params = new HashMap<String, String>();
+                params.put("message", message);
+
+                // 获取返回的JSP路径，这个需要比较result节点的name属性
+                //获取action的子节点
+                NodeList resultNodes = actionNodeList.item(i).getChildNodes();
+                String viewUrl = "";
+                for (int n = 0; n < resultNodes.getLength(); n++) {
+                    Node item = resultNodes.item(n);
+                    NamedNodeMap resultAttributes = item.getAttributes();
+                    if (resultAttributes == null) {
+                        continue;
+                    }
+                    String name = resultAttributes.getNamedItem("name").getTextContent();
+                    if (result.equals(name)) {
+                        viewUrl = item.getTextContent();
+                        break;
+                    }
+                }
+                View view = new View();
+                view.setJsp(viewUrl);
+                view.setParameters(params);
+                return view;
+            }
+
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java
new file mode 100644
index 0000000000..ccdacc514c
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java
@@ -0,0 +1,43 @@
+package org.pan.coding2017.parsingXML;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java
new file mode 100644
index 0000000000..3271ab4ed1
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java
@@ -0,0 +1,23 @@
+package org.pan.coding2017.parsingXML;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java
new file mode 100644
index 0000000000..f1679f6bef
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java
@@ -0,0 +1,41 @@
+package org.pan.coding2017.utils;
+
+import java.io.FileWriter;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+
+public class Dom4JUtil {
+	
+	public static Document getDocument(String xmlPath) {
+
+		try {
+			//创建解析器
+			SAXReader saxReader = new SAXReader();
+			//得到Documment
+			Document document = saxReader.read(xmlPath);
+			return document;
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+	
+	public static void xmlWrite(Document document,String xmlPath){
+		
+		try {
+			OutputFormat format = OutputFormat.createPrettyPrint();
+			XMLWriter xmlWriter = new XMLWriter(new FileWriter(xmlPath),format);
+			xmlWriter.write(document);
+			xmlWriter.close();
+		} catch (Exception  e) {
+			e.printStackTrace();
+		}
+		
+		
+	}
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java
new file mode 100644
index 0000000000..d8fe537e35
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java
@@ -0,0 +1,152 @@
+package org.pan.coding2017.utils;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class JaxpDomUtil {
+	public static final String XMLPATH = JaxpDomUtil.class.getClassLoader().getResource("struts.xml").getPath();
+
+	/**
+	 *  通过 解析器 获取到 Document
+	 * @return
+	 */
+	public static Document getDocument() {
+		try {
+			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
+					.newInstance();
+			DocumentBuilder documentBuilder = documentBuilderFactory
+					.newDocumentBuilder();
+			Document document = documentBuilder.parse(XMLPATH);
+			return document;
+		} catch (Exception e) {
+			e.printStackTrace();
+
+		}
+		return null;
+	}
+
+	/**
+	 *  回写 XML 方法
+	 * @param document
+	 */
+	public static void tranFormMethod(Document document) {
+		try {
+			TransformerFactory transformerFactory = TransformerFactory
+					.newInstance();
+			Transformer transformer = transformerFactory.newTransformer();
+			transformer.transform(new DOMSource(document), new StreamResult(
+					XMLPATH));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 递归调用  获取所有的元素 并打印元素名称
+	 * @param node
+	 */
+	private static void listElement(Node node) {
+		// 判断是元素类型时才打印
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			System.out.println(node.getNodeName());
+		}
+
+		// 获得一层子节点
+		NodeList nodelist = node.getChildNodes();
+		for (int i = 0; i < nodelist.getLength(); i++) {
+			// 得到每一个子节点
+			Node nodeChild = nodelist.item(i);
+
+			// 递归调用
+			listElement(nodeChild);
+		}
+
+	}
+
+	/**
+	 * 获取所有的 元素名称
+	 */
+	public static void getListElement() {
+
+		Document document = JaxpDomUtil.getDocument();
+		listElement(document);
+	}
+
+	/**
+	 * 删除<sex>nan</sex>节点
+	 */
+	public static void delSex() {
+
+		Document document = JaxpDomUtil.getDocument();
+
+		// 获取<sex>元素
+		Node nodeSex = document.getElementsByTagName("sex").item(0);
+
+		// 得到父节点
+		Node parent = nodeSex.getParentNode();
+
+		// 通过父节点删除
+		parent.removeChild(nodeSex);
+
+		// 回写XML
+		JaxpDomUtil.tranFormMethod(document);
+
+	}
+	
+	/**
+	 * 修改 sex 标签的 内容为nv
+	 */
+	public  static void modifySex() {
+		Document document = JaxpDomUtil.getDocument();
+		Node nodeSex = document.getElementsByTagName("sex").item(0);
+		nodeSex.setTextContent("nv");
+		JaxpDomUtil.tranFormMethod(document);
+		
+	}
+	
+	/**
+	 *  为第一个p1 增加 <sex>nv</sex>
+	 */
+	public static void addSex(){
+		Document document = JaxpDomUtil.getDocument();
+		Node p1Node = document.getElementsByTagName("p1").item(0);
+		
+		//通过 Document 创建 Element
+		Element sexElement = document.createElement("sex");
+		sexElement.setTextContent("nv");
+		p1Node.appendChild(sexElement);
+		JaxpDomUtil.tranFormMethod(document);
+		
+	}
+	
+	/**
+	 * 查询xml中第一个name元素的值
+	 */
+	public static void selectSin(){
+		Document document = JaxpDomUtil.getDocument();
+		Node nameNode = document.getElementsByTagName("name").item(0);
+		String name = nameNode.getTextContent();
+		System.out.println(name);
+	}
+	
+	/**
+	 *  查询所有name元素的值
+	 */
+	public  static void selectAll(){
+		Document document = JaxpDomUtil.getDocument();
+		NodeList nodeList = document.getElementsByTagName("name");
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			System.out.println(nodeList.item(i).getTextContent());
+		}
+	}
+
+}
diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java
new file mode 100644
index 0000000000..8756c8ab95
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java
@@ -0,0 +1,89 @@
+package org.pan.coding2017.utils;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class JaxpSAXPUtil {
+	public static void main(String[] args) {
+		/*
+		 *	1、创建解析器工厂
+		 *	2、创建解析器
+		 *	3、执行 parse 方法
+		 *
+		 * 	4、自己创建一个类、继承DefaultHandler
+		 * 	5、重写类里面的三个方法
+		 */
+		
+		try {
+			SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+			SAXParser saxParser = saxParserFactory.newSAXParser();
+			saxParser.parse("src/p1.xml",new MyDeafultHandler2() );
+		}  catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		
+	}
+	
+}
+
+class MyDeafultHandler1 extends DefaultHandler{
+
+	@Override
+	public void startElement(String uri, String localName, String qName,
+			Attributes attributes) throws SAXException {
+		System.out.println("<"+qName+">");
+	}
+
+	@Override
+	public void characters(char[] ch, int start, int length)
+			throws SAXException {
+		System.out.println(new String(ch,start,length));
+	}
+	
+	@Override
+	public void endElement(String uri, String localName, String qName)
+			throws SAXException {
+		System.out.println("<"+qName+"/>");
+	}
+	
+}
+
+//实现获取所有的name元素的值
+class MyDeafultHandler2 extends DefaultHandler{
+
+	boolean flag = false;
+	int index = 1;
+	
+	@Override
+	public void startElement(String uri, String localName, String qName,
+			Attributes attributes) throws SAXException {
+		//判断qName 是否为 name 元素
+		if("name".equals(qName) && index == 2){
+			flag = true;
+		}
+	}
+	
+	@Override
+	public void characters(char[] ch, int start, int length)
+			throws SAXException {
+		if(flag ==  true){
+			System.out.println(new String(ch, start, length));
+		}
+	}
+
+	@Override
+	public void endElement(String uri, String localName, String qName)
+			throws SAXException {
+		if("name".equals(qName)){
+			flag = false;
+			index++ ;
+		}
+	}
+
+	
+}
diff --git a/group11/252308879/dataStructure/src/main/resources/struts.xml b/group11/252308879/dataStructure/src/main/resources/struts.xml
new file mode 100644
index 0000000000..35830922ba
--- /dev/null
+++ b/group11/252308879/dataStructure/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.pan.coding2017.parsingXML.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.pan.coding2017.parsingXML.LoginAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java
deleted file mode 100644
index a52647b7df..0000000000
--- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.apn.coding2017.basic;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by Pan on 2017/2/26.
- */
-public class ArrayListTest {
-
-    ArrayList arrayList;
-
-    @Before
-    public void  before(){
-        arrayList = new ArrayList();
-        arrayList.add(1);
-        arrayList.add(2);
-        arrayList.add(3);
-    }
-
-    @Test
-    public void add() throws Exception {
-        ArrayList arrayList = new ArrayList();
-        arrayList.add(3);
-        System.out.println(arrayList);
-    }
-
-    @Test
-    public void set() throws Exception {
-        arrayList.add(3);
-        arrayList.set(0, 4);
-        System.out.println(arrayList);
-    }
-
-    @Test
-    public void get() throws Exception {
-        arrayList.add(1);
-        arrayList.add(2);
-        arrayList.add(3);
-        Object o = arrayList.get(1);
-        System.out.println(o);
-    }
-
-    @Test
-    public void remove() throws Exception {
-        arrayList.add(1);
-        arrayList.add(2);
-        arrayList.add(3);
-        arrayList.remove(1);
-        System.out.println(arrayList);
-    }
-
-    @Test
-    public void size() throws Exception {
-        System.out.println(arrayList.size());
-    }
-
-    @Test
-    public void isEmpty() throws Exception {
-        System.out.println(arrayList.isEmpty());
-    }
-
-    @Test
-    public void iterator() throws Exception {
-        Iterator iterator = arrayList.iterator();
-        while (iterator.hasNext()){
-            Object next = iterator.next();
-            System.out.println(next);
-            iterator.remove();
-        }
-        System.out.println(arrayList.isEmpty());
-    }
-
-}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java
deleted file mode 100644
index 8b15597ed2..0000000000
--- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.apn.coding2017.basic;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by Pan on 2017/2/26.
- */
-public class BinaryTreeNodeTest {
-
-    BinaryTreeNode binaryTreeNode;
-
-    @Before
-    public void setUp() throws Exception {
-        binaryTreeNode = new BinaryTreeNode();
-        binaryTreeNode.push(1, "A");
-        binaryTreeNode.push(2, "B");
-        binaryTreeNode.push(3, "C");
-        binaryTreeNode.push(4, "D");
-    }
-
-    @Test
-    public void size() throws Exception {
-        System.out.println(binaryTreeNode.size());
-    }
-
-    @Test
-    public void get() throws Exception {
-        System.out.println(binaryTreeNode.get(3));
-    }
-
-    @Test
-    public void push() throws Exception {
-        binaryTreeNode.push(5, "E");
-        System.out.println(binaryTreeNode);
-    }
-
-}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java
deleted file mode 100644
index f932e49cf0..0000000000
--- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.apn.coding2017.basic;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by Pan on 2017/2/26.
- */
-public class LinkedListTest {
-
-    LinkedList linkedList;
-
-    @Before
-    public void setUp() throws Exception {
-        linkedList = new LinkedList();
-        linkedList.add(0);
-        linkedList.add(1);
-        linkedList.add(2);
-        linkedList.add(3);
-    }
-
-    @Test
-    public void add() throws Exception {
-        linkedList.add(0);
-        System.out.println(linkedList);
-    }
-
-    @Test
-    public void get() throws Exception {
-        Object o = linkedList.get(1);
-        System.out.println(o);
-    }
-
-    @Test
-    public void remove() throws Exception {
-        linkedList.remove(1);
-        System.out.println(linkedList);
-    }
-
-    @Test
-    public void size() throws Exception {
-        System.out.println(linkedList.size());
-    }
-
-    @Test
-    public void addFirst() throws Exception {
-        linkedList.addFirst(4);
-        System.out.println(linkedList);
-    }
-
-    @Test
-    public void addLast() throws Exception {
-        linkedList.addLast(5);
-        System.out.println(linkedList);
-    }
-
-    @Test
-    public void removeFirst() throws Exception {
-        linkedList.removeFirst();
-        System.out.println(linkedList);
-    }
-
-    @Test
-    public void removeLast() throws Exception {
-        linkedList.removeLast();
-        System.out.println(linkedList);
-    }
-
-    @Test
-    public void iterator() throws Exception {
-        Iterator iterator = linkedList.iterator();
-        while (iterator.hasNext()){
-            Object next = iterator.next();
-            System.out.println(next);
-            iterator.remove();
-        }
-        System.out.println(linkedList);
-    }
-
-}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java
deleted file mode 100644
index 0d52d8585f..0000000000
--- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.apn.coding2017.basic;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by Pan on 2017/2/26.
- */
-public class QueueTest {
-
-    Queue queue;
-
-    @Before
-    public void setUp() throws Exception {
-        queue = new Queue();
-        queue.enQueue(1);
-        queue.enQueue(2);
-        queue.enQueue(3);
-
-    }
-
-    @Test
-    public void enQueue() throws Exception {
-        queue.enQueue(1);
-        System.out.println(queue);
-    }
-
-    @Test
-    public void deQueue() throws Exception {
-        queue.deQueue();
-        System.out.println(queue);
-    }
-
-    @Test
-    public void isEmpty() throws Exception {
-        System.out.println(queue.isEmpty());
-    }
-
-    @Test
-    public void size() throws Exception {
-        System.out.println(queue.size());
-    }
-
-}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java
deleted file mode 100644
index f1798f8329..0000000000
--- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.apn.coding2017.basic;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by Pan on 2017/2/26.
- */
-public class StackTest {
-
-    Stack stack;
-
-    @Before
-    public void setUp() throws Exception {
-        stack = new Stack(3);
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-    }
-
-    @Test
-    public void isEmpty() throws Exception {
-        System.out.println(stack.isEmpty());
-    }
-
-    @Test
-    public void size() throws Exception {
-        System.out.println(stack.size());
-    }
-
-    @Test
-    public void push() throws Exception {
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-        System.out.println(stack);
-    }
-
-    @Test
-    public void pop() throws Exception {
-        stack.pop();
-        System.out.println(stack);
-    }
-
-}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java
similarity index 94%
rename from group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java
rename to group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java
index 1b38998253..281a5bf07b 100644
--- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java
@@ -1,4 +1,4 @@
-package org.apn.coding2017;
+package org.pan.coding2017;
 
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..29ab6bf6dc
--- /dev/null
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java
@@ -0,0 +1,89 @@
+package org.pan.coding2017.array;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * Created by QiPan on 2017/2/27.
+ */
+public class ArrayUtilTest {
+
+    @Test
+    public void removeZero() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        System.out.println("removeZero 移除0之前： "+ Arrays.toString(oldArr));
+        int[] newArrays = ArrayUtil.removeZero(oldArr);
+        System.out.println("removeZero 移除0之后： "+ Arrays.toString(newArrays));
+    }
+
+    @Test
+    public void removeZero_2() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        System.out.println("removeZero_2 移除0之前： "+ Arrays.toString(oldArr));
+        int[] newArrays = ArrayUtil.removeZero_2(oldArr);
+        System.out.println("removeZero_2 移除0之后： "+ Arrays.toString(newArrays));
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] array = new int[]{7, 9 , 30, 3};
+        int[] array2 = new int[] {7, 9, 30, 3, 4};
+        System.out.println("置换前: " + Arrays.toString(array));
+        ArrayUtil.reverseArray(array);
+        System.out.println("置换后: "+ Arrays.toString(array));
+        System.out.println("置换前: " + Arrays.toString(array2));
+        ArrayUtil.reverseArray(array2);
+        System.out.println("置换后: "+ Arrays.toString(array2));
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a1 = {3, 5, 7,8},  a2 = {4, 5, 6,7};
+        //则 a3 为[3,4,5,6,7,8]
+        int[] merge = ArrayUtil.merge(a1, a2);
+        System.out.println(Arrays.toString(merge));
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[] oldArray = {2,3,6} ;
+        int size = 3;
+        System.out.println("grow 之前："+ Arrays.toString(oldArray));
+        int[] newArrays = ArrayUtil.grow(oldArray, size);
+        System.out.println("grow 之后："+ Arrays.toString(newArrays));
+
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+    //max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+        int[] fibonacci = ArrayUtil.fibonacci(988);
+        System.out.println(Arrays.toString(fibonacci));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        //例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+        int[] primes = ArrayUtil.getPrimes(23);
+        System.out.println(Arrays.toString(primes));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int[] primes = ArrayUtil.getPerfectNumbers(10000);
+        System.out.println(Arrays.toString(primes));
+    }
+
+    @Test
+    public void join() throws Exception {
+        int [] array= {3,8,9};
+        String seperator = "-";
+        String result = ArrayUtil.join(array, seperator);
+        System.out.println(result);
+    }
+
+
+
+
+}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java
new file mode 100644
index 0000000000..f93876522a
--- /dev/null
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java
@@ -0,0 +1,74 @@
+package org.pan.coding2017.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Pan on 2017/2/26.
+ */
+public class ArrayListTest {
+
+    ArrayList arrayList;
+
+    @Before
+    public void  before(){
+        arrayList = new ArrayList();
+        arrayList.add(1);
+        arrayList.add(2);
+        arrayList.add(3);
+    }
+
+    @Test
+    public void add() throws Exception {
+        ArrayList arrayList = new ArrayList();
+        arrayList.add(3);
+        System.out.println(arrayList);
+    }
+
+    @Test
+    public void set() throws Exception {
+        arrayList.add(3);
+        arrayList.set(0, 4);
+        System.out.println(arrayList);
+    }
+
+    @Test
+    public void get() throws Exception {
+        arrayList.add(1);
+        arrayList.add(2);
+        arrayList.add(3);
+        Object o = arrayList.get(1);
+        System.out.println(o);
+    }
+
+    @Test
+    public void remove() throws Exception {
+        arrayList.add(1);
+        arrayList.add(2);
+        arrayList.add(3);
+        arrayList.remove(1);
+        System.out.println(arrayList);
+    }
+
+    @Test
+    public void size() throws Exception {
+        System.out.println(arrayList.size());
+    }
+
+    @Test
+    public void isEmpty() throws Exception {
+        System.out.println(arrayList.isEmpty());
+    }
+
+    @Test
+    public void iterator() throws Exception {
+        Iterator iterator = arrayList.iterator();
+        while (iterator.hasNext()){
+            Object next = iterator.next();
+            System.out.println(next);
+            iterator.remove();
+        }
+        System.out.println(arrayList.isEmpty());
+    }
+
+}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..4c3c01cd73
--- /dev/null
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java
@@ -0,0 +1,38 @@
+package org.pan.coding2017.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Pan on 2017/2/26.
+ */
+public class BinaryTreeNodeTest {
+
+    BinaryTreeNode binaryTreeNode;
+
+    @Before
+    public void setUp() throws Exception {
+        binaryTreeNode = new BinaryTreeNode();
+        binaryTreeNode.push(1, "A");
+        binaryTreeNode.push(2, "B");
+        binaryTreeNode.push(3, "C");
+        binaryTreeNode.push(4, "D");
+    }
+
+    @Test
+    public void size() throws Exception {
+        System.out.println(binaryTreeNode.size());
+    }
+
+    @Test
+    public void get() throws Exception {
+        System.out.println(binaryTreeNode.get(3));
+    }
+
+    @Test
+    public void push() throws Exception {
+        binaryTreeNode.push(5, "E");
+        System.out.println(binaryTreeNode);
+    }
+
+}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java
new file mode 100644
index 0000000000..d10e2a1d48
--- /dev/null
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java
@@ -0,0 +1,80 @@
+package org.pan.coding2017.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Pan on 2017/2/26.
+ */
+public class LinkedListTest {
+
+    LinkedList linkedList;
+
+    @Before
+    public void setUp() throws Exception {
+        linkedList = new LinkedList();
+        linkedList.add(0);
+        linkedList.add(1);
+        linkedList.add(2);
+        linkedList.add(3);
+    }
+
+    @Test
+    public void add() throws Exception {
+        linkedList.add(0);
+        System.out.println(linkedList);
+    }
+
+    @Test
+    public void get() throws Exception {
+        Object o = linkedList.get(1);
+        System.out.println(o);
+    }
+
+    @Test
+    public void remove() throws Exception {
+        linkedList.remove(1);
+        System.out.println(linkedList);
+    }
+
+    @Test
+    public void size() throws Exception {
+        System.out.println(linkedList.size());
+    }
+
+    @Test
+    public void addFirst() throws Exception {
+        linkedList.addFirst(4);
+        System.out.println(linkedList);
+    }
+
+    @Test
+    public void addLast() throws Exception {
+        linkedList.addLast(5);
+        System.out.println(linkedList);
+    }
+
+    @Test
+    public void removeFirst() throws Exception {
+        linkedList.removeFirst();
+        System.out.println(linkedList);
+    }
+
+    @Test
+    public void removeLast() throws Exception {
+        linkedList.removeLast();
+        System.out.println(linkedList);
+    }
+
+    @Test
+    public void iterator() throws Exception {
+        Iterator iterator = linkedList.iterator();
+        while (iterator.hasNext()){
+            Object next = iterator.next();
+            System.out.println(next);
+            iterator.remove();
+        }
+        System.out.println(linkedList);
+    }
+
+}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java
new file mode 100644
index 0000000000..c720e7d95e
--- /dev/null
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java
@@ -0,0 +1,44 @@
+package org.pan.coding2017.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Pan on 2017/2/26.
+ */
+public class QueueTest {
+
+    Queue queue;
+
+    @Before
+    public void setUp() throws Exception {
+        queue = new Queue();
+        queue.enQueue(1);
+        queue.enQueue(2);
+        queue.enQueue(3);
+
+    }
+
+    @Test
+    public void enQueue() throws Exception {
+        queue.enQueue(1);
+        System.out.println(queue);
+    }
+
+    @Test
+    public void deQueue() throws Exception {
+        queue.deQueue();
+        System.out.println(queue);
+    }
+
+    @Test
+    public void isEmpty() throws Exception {
+        System.out.println(queue.isEmpty());
+    }
+
+    @Test
+    public void size() throws Exception {
+        System.out.println(queue.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java
new file mode 100644
index 0000000000..df85b797d4
--- /dev/null
+++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java
@@ -0,0 +1,45 @@
+package org.pan.coding2017.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Pan on 2017/2/26.
+ */
+public class StackTest {
+
+    Stack stack;
+
+    @Before
+    public void setUp() throws Exception {
+        stack = new Stack(3);
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+    }
+
+    @Test
+    public void isEmpty() throws Exception {
+        System.out.println(stack.isEmpty());
+    }
+
+    @Test
+    public void size() throws Exception {
+        System.out.println(stack.size());
+    }
+
+    @Test
+    public void push() throws Exception {
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        System.out.println(stack);
+    }
+
+    @Test
+    public void pop() throws Exception {
+        stack.pop();
+        System.out.println(stack);
+    }
+
+}
\ No newline at end of file
diff --git a/group11/283091182/src/com/coderising/array/ArrayUtil.java b/group11/283091182/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..93c43d9500
--- /dev/null
+++ b/group11/283091182/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,303 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin==null||origin.length==0){
+			throw new RuntimeException("invalid array argument!");
+		}
+		if(origin.length>1){
+			int temp;
+			for(int i=0;i<origin.length/2;i++){
+				temp = origin[i];
+				origin[i] = origin[origin.length-1-i];
+				origin[origin.length-1-i]= temp;
+			}
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if(oldArray==null || oldArray.length==0){
+			return oldArray;
+		}else{
+			int[] tmp = new int[oldArray.length];
+			int pos = 0;
+			for(int i=0;i<oldArray.length;i++){
+				if(oldArray[i]!=0){
+					tmp[pos]=oldArray[i];
+					pos++;
+				}
+			}
+			int[] result = new int[pos];
+			System.arraycopy(tmp, 0, result, 0, pos);
+			return result;
+		}
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		//Check array sorting
+		checkIfArraySortedAsc(array1);
+		checkIfArraySortedAsc(array2);
+		//both are null then return null
+		if(array1==null && array2==null){
+			return null;
+		}
+		//one of them is empty array then return another
+		//Scenario:array1 is empty
+		if(array1.length==0){
+			if(array2 == null){
+				return array1;
+			}else{
+				return array2;
+			}
+		}else{
+			//Scenario:array1 is not empty
+			if(array2.length==0){
+				return array1;
+			//Scenario: both array1 and array2 are not empty
+			}else{
+				//Do merge in this case
+				int[] array3 = new int[array1.length+array2.length];
+				int pos1=0;
+				int pos2=0;
+				int pos3=0;
+				while(pos1<array1.length || pos2<array2.length){
+					if(pos1==array1.length){
+						array3[pos3] = array2[pos2];
+						pos2++;
+						pos3++;
+						continue;
+					}
+					if(pos2==array2.length){
+						array3[pos3] = array1[pos1];
+						pos1++;
+						pos3++;
+						continue;
+					}
+					if(array1[pos1]>array2[pos2]){
+						array3[pos3]=array2[pos2];
+						pos2++;
+						pos3++;
+					}else if(array1[pos1]<array2[pos2]){
+						array3[pos3]=array1[pos1];
+						pos1++;
+						pos3++;
+					}else{
+						array3[pos3]=array1[pos1];
+						pos1++;
+						pos2++;
+						pos3++;
+					}
+					
+				}
+				array3 = removeZero(array3);
+				printArray("Merge result=",array3);
+				return array3;
+			}
+		}
+	}
+	private void checkIfArraySortedAsc(int[] arr){
+		if(arr==null||arr.length==0||arr.length==1){
+			return;
+		}else{
+			for(int i=1;i<arr.length;i++){
+				if(arr[i]<arr[i-1]){
+					throw new RuntimeException("Array ["+join(arr,",")+"] is not sorted desc!");
+				}
+			}
+			return;
+		}
+	}
+	
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArr = new int[oldArray.length+size];
+		for(int i=0;i<oldArray.length;i++){
+			newArr[i] = oldArray[i];
+		}
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max==1){
+			return new int[0];
+		}else if(max==2){
+			return new int[]{1,1};
+		}else{
+			int[] arr = new int[max];
+			arr[0]=1;
+			arr[1]=1;
+			int pos=2;
+			genFibonacci(arr,pos,max);
+			
+			int[] result = removeZero(arr);
+			return result;
+		}
+	}
+	private void genFibonacci(int[] arr,int pos,int max){
+		int val = arr[pos-2]+arr[pos-1];
+		if(val<max){
+			arr[pos]=val;
+			pos++;
+			genFibonacci(arr,pos,max);
+		}else{
+			return;
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] nonPrimeArr = new int[max];
+		int tmp;
+		//begin to calculate for nonPrime,start from 4 because 2 & 3 can not be calculated in this way
+		for(int i=2;i<max;i++){
+			for(int j=2;j<=i;j++){
+				tmp = i*j;
+				if(tmp<max){
+					//Mark as nonPrime numbers
+					nonPrimeArr[tmp]=1;
+				}else{
+					break;
+				}
+			}
+		}
+		int[] result = new int[max];
+		int pos = 0;
+		if(max>3){
+			result[pos]=2;
+			pos++;
+		}
+		if(max>4){
+			result[pos]=3;
+			pos++;
+		}
+		for(int i=4;i<nonPrimeArr.length;i++){
+			//for those value==0, mean indicated as Primes,index is the prime number
+			if(nonPrimeArr[i]==0){
+				result[pos]=i;
+				pos++;
+			}
+		}
+		
+		result = removeZero(result);
+		return result;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max<=1){
+			throw new RuntimeException("Invalid Arguement :max number="+max);
+		}else{
+			int[] result = new int[max];
+			int pos = 0;
+			for(int i=2;i<=max;i++){
+				int[] factors = getFactors(i);
+				int val =0;
+				//Sum of the factors
+				for(int j:factors){
+					val+=j;
+				}
+				//Check if the sum of factors equals to the number
+				if(val==i){
+					result[pos]=i;
+					pos++;
+				}
+			}
+			result = removeZero(result);
+			return result;
+		}
+	}
+
+	/**
+	 * Get the factor of a integer
+	 * @param num
+	 * @return factors of this number as int array 
+	 */
+	private int[] getFactors(int num){
+		int[] factors = new int[num];
+		int pos = 0;
+		for(int i=1;i<=num/2;i++){
+			if(num%i==0){
+				factors[pos]=i;
+				pos++;
+			}
+		}
+		return removeZero(factors);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sb = new StringBuilder();
+		for(int i: array){
+			if(sb.length()>0){
+				sb.append(seperator);
+			}
+			sb.append(i);
+		}
+		return sb.toString();
+	}
+	
+	private void printArray(String msg,int[] array){
+		System.out.print(msg);
+		for(int i=0;i<array.length;i++){
+			System.out.print(array[i]+",");
+		}
+		System.out.println();
+	}
+}
diff --git a/group11/283091182/src/com/coderising/array/ArrayUtilTest.java b/group11/283091182/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..47c5f7ef0c
--- /dev/null
+++ b/group11/283091182/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,151 @@
+/**
+ * 
+ */
+package com.coderising.array;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Administrator
+ *
+ */
+public class ArrayUtilTest {
+	private static ArrayUtil util;
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		util = new ArrayUtil();
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		util = null;
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#reverseArray(int[])}.
+	 */
+	@Test
+	public void testReverseArray() {
+		int[] origin = {1,2,3,4,5,6,7};
+		int[] expected = {7,6,5,4,3,2,1};
+		util.reverseArray(origin);
+		assertArrayEquals(expected,origin);
+		int[] origin2 = {1,2};
+		int[] expected2 = {2,1};
+		util.reverseArray(origin2);
+		assertArrayEquals(expected2,origin2);
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#removeZero(int[])}.
+	 */
+	@Test
+	public void testRemoveZero() {
+		 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};   
+		 int expectedArr[]={1,3,4,5,6,6,5,4,7,6,7,5};
+		 int newArr[]=util.removeZero(oldArr);
+		 assertArrayEquals(expectedArr,newArr);
+		 
+		 int oldArr2[]={0,0,0,0,0,0};   
+		 int expectedArr2[]={};
+		 int newArr2[]=util.removeZero(oldArr2);
+		 assertArrayEquals(expectedArr2,newArr2);
+		 
+		 int oldArr3[]={1,2,3,4,5};   
+		 int expectedArr3[]={1,2,3,4,5};
+		 int newArr3[]=util.removeZero(oldArr3);
+		 assertArrayEquals(expectedArr3,newArr3);
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#merge(int[], int[])}.
+	 */
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] a3 = {3,4,5,6,7,8};
+		assertArrayEquals(a3,util.merge(a1, a2));
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#grow(int[], int)}.
+	 */
+	@Test
+	public void testGrow() {
+		 int[] oldArr = {2,3,6};
+		 int[] newArr ={2,3,6,0,0,0};
+		 int size =3;
+		 assertArrayEquals(newArr,util.grow(oldArr, size));
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#fibonacci(int)}.
+	 */
+	@Test
+	public void testFibonacci() {
+		int[] expected = {1,1,2,3,5,8,13};
+		assertArrayEquals(expected,util.fibonacci(15));
+		int[] expected2 = {1,1};
+		assertArrayEquals(expected2,util.fibonacci(2));
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#getPrimes(int)}.
+	 */
+	@Test
+	public void testGetPrimes() {
+		int[] arr = {2,3,5,7,11,13,17,19};
+		assertArrayEquals(arr,util.getPrimes(23));
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#getPerfectNumbers(int)}.
+	 */
+	@Test
+	public void testGetPerfectNumbers() {
+		int arr[] = {6};
+		assertArrayEquals(arr,util.getPerfectNumbers(7));
+		int arr2[] = {6,28};
+		assertArrayEquals(arr2,util.getPerfectNumbers(28));
+	}
+
+	/**
+	 * Test method for {@link com.coderising.array.ArrayUtil#join(int[], java.lang.String)}.
+	 */
+	@Test
+	public void testJoin() {
+		int[] arr = {3,8,9};
+		String seperator = "-";
+		String expected = "3-8-9";
+		assertTrue(expected.equals(util.join(arr, seperator)));
+	}
+
+}
diff --git a/group11/283091182/src/com/coderising/litestruts/Action.java b/group11/283091182/src/com/coderising/litestruts/Action.java
new file mode 100644
index 0000000000..9c0fb22f7c
--- /dev/null
+++ b/group11/283091182/src/com/coderising/litestruts/Action.java
@@ -0,0 +1,71 @@
+/**
+ * 
+ */
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ *
+ */
+public class Action {
+	private Map<String,String> resultMap= new HashMap<String,String>();
+	public static final String CONST_ACTION = "action";
+	public static final String CONST_NAME = "name";
+	public static final String CONST_CLASS = "class";
+	public static final String CONST_RESULT = "result";
+	
+	private String actionName;
+	private String actionClass;
+	
+	public Action(){};
+	
+	public Action(String actionName,String actionClass){
+		this.actionName = actionName;
+		this.actionClass = actionClass;
+	}
+	
+	public void setActionResultJsp(String result,String dispatcherJsp){
+		this.resultMap.put(result, dispatcherJsp);
+	}
+	
+	public String getActionResultJsp(String result){
+		return this.resultMap.get(result);
+	}
+	
+	
+	public String getActionName() {
+		return actionName;
+	}
+
+	public void setActionName(String actionName) {
+		this.actionName = actionName;
+	}
+
+	public String getActionClass() {
+		return actionClass;
+	}
+
+	public void setActionClass(String actionClass) {
+		this.actionClass = actionClass;
+	}
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public String toString(){
+		StringBuilder sb = new StringBuilder();
+		sb.append(CONST_ACTION).append(":").append(this.actionName).append(",");
+		sb.append(CONST_CLASS).append(":").append(this.actionClass).append(",");
+		sb.append("ResultMap").append(":").append(this.resultMap.toString());
+		return sb.toString();
+	}
+}
diff --git a/group11/283091182/src/com/coderising/litestruts/LoginAction.java b/group11/283091182/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group11/283091182/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group11/283091182/src/com/coderising/litestruts/Struts.java b/group11/283091182/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..dbe4691938
--- /dev/null
+++ b/group11/283091182/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,229 @@
+package com.coderising.litestruts;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+		
+		//0. Load Structs.xml and return a map
+		Map<String,Action> actionMap =  loadActionMap();
+		
+		//1.Find and initialize action instance to actionName provided
+		Action action = actionMap.get(actionName);
+		Object instance  = initializeActionInstance(action.getActionClass(),parameters);
+		
+		//2.invoke the execute method and get the result
+		String result = executeAction(instance);
+		
+		//3.Extract info for view
+		View view = new View();
+		view.setParameters(extractInfo(instance));
+		
+		//4.set dispatcher jsp according to execution result
+		view.setJsp(action.getActionResultJsp(result));
+		
+		return view;
+	}
+
+	private static Map<String, Action> loadActionMap() {
+		try {
+			
+			InputStream is = Struts.class.getResourceAsStream("struts.xml");
+			
+			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder builder = factory.newDocumentBuilder();
+			Document document = builder.parse(is);
+			Element struct = document.getDocumentElement();
+			
+			return getActions(struct);
+			
+		} catch (IOException e) {
+			throw new RuntimeException("Error Reading Configuration XML",e);
+		} catch (ParserConfigurationException e) {
+			throw new RuntimeException("Error Parsing Configuration XML",e);
+		} catch (SAXException e) {
+			throw new RuntimeException("Error Parsing Configuration XML",e);
+		}
+	}
+
+	/**
+	 * Parse the XML and construct ActionName:Action map
+	 * 
+	 * @param Element struct, root of the struct xml
+	 * @return Map<String,Action>
+	 */
+	private static Map<String,Action> getActions(Element struct) {
+		
+		Map<String,Action> map = new HashMap();
+		
+		NodeList nl = struct.getElementsByTagName(Action.CONST_ACTION);
+
+		for (int i = 0; i < nl.getLength(); i++) 
+		{
+			Node actionNode = nl.item(i);
+			// Get action name and corresponding action class from property
+			String actionClass = getAttribute(actionNode,Action.CONST_CLASS);
+			String actionName = getAttribute(actionNode,Action.CONST_NAME);
+
+			Action action = new Action(actionName, actionClass);
+
+			// get results under action
+			NodeList childNodes = actionNode.getChildNodes();
+			
+			for (int j = 0; j < childNodes.getLength(); j++) 
+			{
+				Node result = childNodes.item(j);
+				//Only accept if Node Type is element and Node name is "result"
+				if ((result.getNodeType() == result.ELEMENT_NODE) 
+						&& (result.getNodeName() == Action.CONST_RESULT)) 
+				{
+					String resultName = getAttribute(result,Action.CONST_NAME);
+					String dispatcherJsp = result.getTextContent();
+					action.setActionResultJsp(resultName, dispatcherJsp);
+				}
+			}
+			map.put(action.getActionName(), action);
+		}
+		System.out.println(map);
+		return map;
+	}
+	/**
+	 * Get property from given node
+	 * @param node
+	 * @param key
+	 * @return attribute as String
+	 */
+	private static String getAttribute(Node node,String key){
+		NamedNodeMap map = node.getAttributes();
+		Node attriNode =  map.getNamedItem(key);
+		if(attriNode!=null && attriNode.getNodeType()==Node.ATTRIBUTE_NODE){
+			return attriNode.getNodeValue();
+		}
+		return null;
+	}
+	
+	/**
+	 * Initialize instance from given class name and parameters map
+	 * @param actionClass
+	 * @param parameters
+	 * @return instance of specified class
+	 */
+	private static Object initializeActionInstance(String actionClass,Map parameters){
+		try {
+			Class clazz= Class.forName(actionClass);
+			//Instantiate by calling constructor
+			Constructor constructor = clazz.getConstructor();
+			
+			constructor.setAccessible(true);
+			Object instance = constructor.newInstance(new Object[]{});
+			
+			//Check class propertes with instrospector
+			BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
+			PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
+			
+			for(PropertyDescriptor prop:props){
+				String propName = prop.getName();
+				Method propSetter = prop.getWriteMethod();
+				//If there is a setter for the property and also there is a value in parameter map
+				//then invoke the setter method to set the values
+				if(propSetter!=null && parameters.containsKey(propName))
+				{
+					propSetter.invoke(instance, parameters.get(propName));
+				}
+			}
+			
+			return instance;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException("Error initializing instance: ClassName="+actionClass,e);
+		}
+	}
+	
+	
+	/**
+	 * Invoke the "execute" method from the action instance
+	 * @param Action instance
+	 * @return execute result as String
+	 */
+	private static String executeAction(Object instance){
+		Class clazz = instance.getClass();
+		try {
+			//exepct no argument for execute method
+			Method execute = clazz.getMethod("execute", new Class[0]);
+			return (String)execute.invoke(instance, new Object[0]);
+		} catch (Exception e) {
+			throw new RuntimeException("Error executing action,class name="+clazz.getCanonicalName());
+		}
+	}
+	
+	
+	/**
+	 * Extracting Bean info by calling the getting method in the Action instance
+	 * @param instance
+	 * @return map
+	 */
+	private static Map extractInfo(Object instance){
+		Map<String,Object> map = new HashMap<String,Object>();
+		Class clazz = instance.getClass();
+		try{
+			Method[] methods = clazz.getMethods();
+			for(Method method:methods)
+			{
+				String methodName = method.getName();
+				if(methodName.startsWith("get")&&method.getParameterTypes().length==0)
+				{
+					Object methodReturn = method.invoke(instance, new Object[0]);
+					//construct the properties name by getter method name,first character toLower case
+					String propName = methodName.replaceFirst("get", "");
+					char[] propNameCharArr = propName.toCharArray();
+					propNameCharArr[0]=Character.toLowerCase(propNameCharArr[0]);
+					
+					map.put(String.valueOf(propNameCharArr), methodReturn);
+				}
+			}
+			
+		}catch(Exception e){
+			throw new RuntimeException("Error extracting info from Action Insance,class="+clazz.getCanonicalName(),e);
+		}
+		return map;
+	}
+
+}
diff --git a/group11/283091182/src/com/coderising/litestruts/StrutsTest.java b/group11/283091182/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group11/283091182/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group11/283091182/src/com/coderising/litestruts/View.java b/group11/283091182/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group11/283091182/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/283091182/src/com/coderising/litestruts/struts.xml b/group11/283091182/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..4c6eeabbd4
--- /dev/null
+++ b/group11/283091182/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/283091182/src/com/coding/basic/ArrayListTest.java b/group11/283091182/src/com/coding/basic/ArrayListTest.java
new file mode 100644
index 0000000000..7807fa831e
--- /dev/null
+++ b/group11/283091182/src/com/coding/basic/ArrayListTest.java
@@ -0,0 +1,142 @@
+/**
+ * 
+ */
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Administrator
+ *
+ */
+public class ArrayListTest {
+
+	private ArrayList al;
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+		System.out.println("SetUp");
+		al= new ArrayList();
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@After
+	public void tearDown() throws Exception {
+		System.out.println("TearDown");
+		al = null;
+	}
+
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#add(java.lang.Object)}.
+	 */
+	@Test
+	public final void testAddObject() {
+		al.add("aaa");
+		al.add("bbb");
+		al.add("ccc");
+		assertEquals("aaa",al.get(0));
+		assertEquals("bbb",al.get(1));
+		assertEquals("ccc",al.get(2));
+		assertEquals(3,al.size());
+	}
+
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#add(int, java.lang.Object)}.
+	 */
+	@Test
+	public final void testAddIntObject() {
+		al.add("aaa");
+		al.add(0,"bbb");
+		al.add(1,"ccc");
+		assertEquals("bbb",al.get(0));
+		assertEquals("ccc",al.get(1));
+		assertEquals("aaa",al.get(2));
+		assertEquals(3,al.size());
+	}
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#add(int, java.lang.Object)}.
+	 */
+	@Test(expected=IndexOutOfBoundsException.class)
+	public final void testAddIntObjectWithException1() {
+		al.add(-1, "aaa");
+	}
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#add(int, java.lang.Object)}.
+	 */
+	@Test(expected=IndexOutOfBoundsException.class)
+	public final void testAddIntObjectWithException2() {
+		al.add("aaa");
+		al.add(1,"bbb");
+	}
+
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#get(int)}.
+	 */
+	@Test
+	public final void testGet() {
+		fail("Not yet implemented"); // TODO
+	}
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#get(int)}.
+	 */
+	@Test
+	public final void testGetWithException1() {
+		fail("Not yet implemented"); // TODO
+	}
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#get(int)}.
+	 */
+	@Test
+	public final void testGetWithException2() {
+		fail("Not yet implemented"); // TODO
+	}
+
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#remove(int)}.
+	 */
+	@Test
+	public final void testRemove() {
+		fail("Not yet implemented"); // TODO
+	}
+
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#size()}.
+	 */
+	@Test
+	public final void testSize() {
+		fail("Not yet implemented"); // TODO
+	}
+
+	/**
+	 * Test method for {@link com.coding.basic.ArrayList#iterator()}.
+	 */
+	@Test
+	public final void testIterator() {
+		fail("Not yet implemented"); // TODO
+	}
+
+}
diff --git a/group11/395443277/data_structure/.gitignore b/group11/395443277/.gitignore
similarity index 100%
rename from group11/395443277/data_structure/.gitignore
rename to group11/395443277/.gitignore
diff --git a/group11/395443277/src/com/coderising/array/ArrayUtil.java b/group11/395443277/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..d73df85b05
--- /dev/null
+++ b/group11/395443277/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,254 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int first = 0;
+		int last = origin.length - 1;
+		
+		while (first < last) {
+			int temp;
+			temp = origin[first];
+			origin[first] = origin[last];
+			origin[last] = temp;
+			
+			first++;
+			last--;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		// count how many zeros 
+		int zeroCount = 0;
+		int len= oldArray.length;
+		
+		if (len==0) {
+			return new int[]{};
+		}
+		
+		for (int i=0; i<len; i++) {
+			if (oldArray[i]==0) {
+				zeroCount++;
+			}
+		}
+		
+		if (zeroCount == 0) {
+			return oldArray;
+		}
+		
+		// create a new array
+		int newLen = len - zeroCount;
+		int[] newArr = new int[newLen];
+		
+		// copy to the new array and return
+		int k = 0;
+		for (int j=0; j<len; j++) {
+			if (oldArray[j]!=0) {
+				newArr[k] = oldArray[j];
+				k++;
+			}
+		}
+		
+		return newArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int len1 = array1.length;
+		int len2 = array2.length;
+		
+		int newSize = len1+len2;
+		int[] newArray = new int[newSize];
+		
+		int i = 0; // i for array1
+		int j = 0; // j for array2
+		int k = 0; // k for newArray
+		while(i <=len1-1 && j<=len2-1) {
+			if (array1[i] < array2[j]) {
+				newArray[k++] = array1[i];
+				i++;
+			} else if (array1[i] == array2[j]){
+				newArray[k++] = array1[i];
+				newArray[k++] = 0;
+				i++;
+				j++;
+			} else {
+				newArray[k++] = array2[j];
+				j++;
+			}
+		}
+		
+		while(i<len1) {
+			newArray[k++] = array1[i++];
+		}
+
+		while(j<len2) {
+			newArray[k++] = array2[j++];
+		}
+		
+		// remove 0 after merge
+		return this.removeZero(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 len = oldArray.length;
+		
+		if (len ==0) {
+			return new int[]{};
+		}
+		
+		int newSize = len + size;
+		int[] newArray = new int[newSize];
+		
+		for(int i=0; i<len; i++) {
+			newArray[i] = oldArray[i];
+		}
+		
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if (max ==1) {
+			return new int[]{};
+		}
+		
+		int[] arr = new int[max];
+		arr[0] = 1;
+		arr[1] = 1;
+		
+		int k = 2;
+		do {
+			arr[k] = arr[k-1] + arr[k-2];
+		} while(arr[k++]<=max);
+		
+		// remove the last element since the condition exit 
+		// when it is already passed the limit
+		arr[k-1] = 0;
+		
+		return this.removeZero(arr);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] primes = new int[max];
+		for(int i=0; i<primes.length; i++) {
+			primes[i] = i;
+		}
+		// we know 0 and 1 are not prime
+		primes[0] = 0;
+		primes[1] = 0;
+		
+		for (int i=2; i<primes.length; i++) {
+			// if value is prime, all it's multiplier is prime and set to 0
+			if(primes[i] !=0) {
+				for(int j=2; j<primes.length; j++) {
+					if(i*j < max) {
+						primes[i*j] = 0;
+					}
+				}
+			}
+		}
+		
+		return this.removeZero(primes);
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if (max==1) {
+			return new int[]{};
+		}
+		
+		int[] newArr = new int[max];
+		int k =0;
+		int sum=0;
+		for (int i=1; i<=max;i++) {
+			for(int j=1; j<i;j++) {
+				if(i%j ==0) {
+					sum+=j;
+				}
+			}
+			
+			if(sum==i) {
+				newArr[k++] = i;
+			}
+			
+			sum=0;
+		}
+		
+		return this.removeZero(newArr);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if (array==null) {
+			return null;
+		}
+		
+		final int noOfItems = array.length;
+		final StringBuilder buf = new StringBuilder(noOfItems * 16);
+		for (int i =0; i<noOfItems; i++) {
+			buf.append(Integer.toString(array[i]));
+			if (i!=noOfItems-1 && seperator!=null) {
+				buf.append(seperator);
+			}
+		}
+		
+		return buf.toString();
+	}
+	
+
+}
diff --git a/group11/395443277/src/com/coderising/array/ArrayUtilTest.java b/group11/395443277/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..704ea09591
--- /dev/null
+++ b/group11/395443277/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,96 @@
+package com.coderising.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		ArrayUtil util = new ArrayUtil();
+		
+		int[] test1 = {7, 9 , 30, 3};
+		util.reverseArray(test1);
+		Assert.assertArrayEquals(new int[]{3, 30, 9,7}, test1);
+		
+		int[] test2 = {7, 9, 30, 3, 4};
+		util.reverseArray(test2);
+		Assert.assertArrayEquals(new int[]{4,3, 30 , 9,7}, test2);
+		
+		int[] test3 = {};
+		util.reverseArray(test3);
+		Assert.assertArrayEquals(new int[]{}, test3);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		ArrayUtil util = new ArrayUtil();
+		
+		int oldArray[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		Assert.assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, util.removeZero(oldArray));
+		
+		int oldArray1[]={1,3,4,5,6,6,5,4,7,6,7,5};
+		Assert.assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, util.removeZero(oldArray1));
+		
+		int oldArray2[]={};
+		Assert.assertArrayEquals(new int[]{}, util.removeZero(oldArray2));
+	}
+
+	@Test
+	public void testMerge() {
+		ArrayUtil util = new ArrayUtil();
+		
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7, 9}; 
+		int[] a3 =  util.merge(a1, a2);
+		
+		Assert.assertArrayEquals(new int[] {3,4,5,6,7,8,9},a3);
+		
+	}
+
+	@Test
+	public void testGrow() {
+		ArrayUtil util = new ArrayUtil();
+		
+		int[] a = new int[]{2,3,6};
+		Assert.assertArrayEquals(new int[] {2,3,6,0,0,0}, util.grow(a, 3));
+	}
+
+	@Test
+	public void testFibonacci() {
+		ArrayUtil util = new ArrayUtil();
+		int[] res = util.fibonacci(32);
+		Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 5, 8, 13, 21}, res);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		ArrayUtil util = new ArrayUtil();
+		int[] res = util.getPrimes(23);
+		Assert.assertArrayEquals(new int[] {2,3,5,7,11,13,17,19}, res);
+		
+		int[] res2 = util.getPrimes(6);
+		Assert.assertArrayEquals(new int[] {2, 3, 5}, res2);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		ArrayUtil util = new ArrayUtil();
+		int[] res = util.getPerfectNumbers(6);
+		Assert.assertArrayEquals(new int[] {6}, res);
+	}
+
+	@Test
+	public void testJoin() {
+		ArrayUtil util = new ArrayUtil();
+		String ans1 = util.join(new int[]{3,8,9}, "-");
+		Assert.assertEquals("3-8-9", ans1);
+		
+		String ans2 = util.join(null,"-");
+		Assert.assertEquals(null, ans2);
+		
+		String ans3 = util.join(new int[]{3,8,9},null);
+		Assert.assertEquals("389", ans3);
+	}
+
+}
diff --git a/group11/395443277/src/com/coderising/litestruts/LoginAction.java b/group11/395443277/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group11/395443277/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group11/395443277/src/com/coderising/litestruts/Struts.java b/group11/395443277/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..c5d3d602fc
--- /dev/null
+++ b/group11/395443277/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,108 @@
+package com.coderising.litestruts;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+
+		// create a new DocumentBuilderFactory
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+		try {
+			// use the factory to create a documentbuilder
+			DocumentBuilder builder = factory.newDocumentBuilder();
+			InputStream istream = Struts.class.getResourceAsStream("struts.xml");
+			Document doc = builder.parse(istream);
+
+			// find jsp page based on the result from execute result
+			Element element = doc.getDocumentElement();
+			NodeList actionNodeList = element.getElementsByTagName("action");
+
+			for (int i = 0; i < actionNodeList.getLength(); i++) {
+				NamedNodeMap actionNodeAttr = actionNodeList.item(i).getAttributes();
+
+				if (actionNodeAttr.getNamedItem("name").getTextContent().equals(actionName)) {
+					String className = actionNodeAttr.getNamedItem("class").getTextContent();
+
+					Class<?> cls = Class.forName(className);
+					Object obj = cls.newInstance();
+
+					// set name and password
+					Method setName = cls.getDeclaredMethod("setName", String.class);
+					Method setPassword = cls.getDeclaredMethod("setPassword", String.class);
+					setName.invoke(obj, parameters.get("name"));
+					setPassword.invoke(obj, parameters.get("password"));
+
+					// execute
+					Method execute = cls.getDeclaredMethod("execute");
+					String executeResult = (String) execute.invoke(obj);
+
+					// get message and jsp
+					Method getMessage = cls.getDeclaredMethod("getMessage");
+					String msg = (String) getMessage.invoke(obj);
+					Map<String,String> params = new HashMap<String,String>();
+			        params.put("message",msg);
+
+					// check result nodes
+					NodeList resultNodes = actionNodeList.item(i).getChildNodes();
+					
+					String jsp = "";
+					for (int j=0; j<resultNodes.getLength(); j++) {
+						NamedNodeMap resultNodeAttr = resultNodes.item(j).getAttributes();
+						if (resultNodeAttr != null) {
+							if (resultNodeAttr.getNamedItem("name").getTextContent().equals(executeResult)) {
+								jsp = resultNodes.item(j).getTextContent();
+								break;
+							}
+						}
+					}
+					
+					// enter information into view
+					Class<?> viewCls = Class.forName("com.coderising.litestruts.View");
+					View viewObj = (View) viewCls.newInstance();
+					Method setParameters = viewCls.getDeclaredMethod("setParameters", Map.class);
+					setParameters.invoke(viewObj, params);
+					Method setJsp = viewCls.getDeclaredMethod("setJsp", String.class);
+					setJsp.invoke(viewObj, jsp);
+					
+					return viewObj;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+}
diff --git a/group11/395443277/src/com/coderising/litestruts/StrutsTest.java b/group11/395443277/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group11/395443277/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group11/395443277/src/com/coderising/litestruts/View.java b/group11/395443277/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group11/395443277/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/395443277/src/com/coderising/litestruts/struts.xml b/group11/395443277/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..7f8d558286
--- /dev/null
+++ b/group11/395443277/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LoginAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/395443277/data_structure/src/com/coding/basic/ArrayList.java b/group11/395443277/src/com/coding/basic/ArrayList.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/ArrayList.java
rename to group11/395443277/src/com/coding/basic/ArrayList.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/ArrayListTest.java b/group11/395443277/src/com/coding/basic/ArrayListTest.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/ArrayListTest.java
rename to group11/395443277/src/com/coding/basic/ArrayListTest.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNode.java b/group11/395443277/src/com/coding/basic/BinaryTreeNode.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNode.java
rename to group11/395443277/src/com/coding/basic/BinaryTreeNode.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNodeTest.java b/group11/395443277/src/com/coding/basic/BinaryTreeNodeTest.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNodeTest.java
rename to group11/395443277/src/com/coding/basic/BinaryTreeNodeTest.java
diff --git a/group15/1514_616019420/Iterator.java b/group11/395443277/src/com/coding/basic/Iterator.java
similarity index 100%
rename from group15/1514_616019420/Iterator.java
rename to group11/395443277/src/com/coding/basic/Iterator.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/LinkedList.java b/group11/395443277/src/com/coding/basic/LinkedList.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/LinkedList.java
rename to group11/395443277/src/com/coding/basic/LinkedList.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/LinkedListTest.java b/group11/395443277/src/com/coding/basic/LinkedListTest.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/LinkedListTest.java
rename to group11/395443277/src/com/coding/basic/LinkedListTest.java
diff --git a/group15/1514_616019420/List.java b/group11/395443277/src/com/coding/basic/List.java
similarity index 100%
rename from group15/1514_616019420/List.java
rename to group11/395443277/src/com/coding/basic/List.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/Queue.java b/group11/395443277/src/com/coding/basic/Queue.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/Queue.java
rename to group11/395443277/src/com/coding/basic/Queue.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/QueueTest.java b/group11/395443277/src/com/coding/basic/QueueTest.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/QueueTest.java
rename to group11/395443277/src/com/coding/basic/QueueTest.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/Stack.java b/group11/395443277/src/com/coding/basic/Stack.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/Stack.java
rename to group11/395443277/src/com/coding/basic/Stack.java
diff --git a/group11/395443277/data_structure/src/com/coding/basic/StackTest.java b/group11/395443277/src/com/coding/basic/StackTest.java
similarity index 100%
rename from group11/395443277/data_structure/src/com/coding/basic/StackTest.java
rename to group11/395443277/src/com/coding/basic/StackTest.java
diff --git a/group11/542194147/myDataStructure/.classpath b/group11/542194147/myDataStructure/.classpath
new file mode 100644
index 0000000000..ddd63c6d08
--- /dev/null
+++ b/group11/542194147/myDataStructure/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_101"/>
+	<classpathentry kind="lib" path="E:/jar/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar" sourcepath="D:/maven_lib/dom4j/dom4j/1.6.1/dom4j-1.6.1-sources.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group11/542194147/myDataStructure/.gitignore b/group11/542194147/myDataStructure/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group11/542194147/myDataStructure/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group11/542194147/myDataStructure/.project b/group11/542194147/myDataStructure/.project
new file mode 100644
index 0000000000..56bfc21f79
--- /dev/null
+++ b/group11/542194147/myDataStructure/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>myDataStructure</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java b/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..7512dac816
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,208 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+/**
+ * Array集合工具类
+ * @author 小摩托
+ *
+ */
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin){
+		if(origin.length==0){
+			throw new RuntimeException("数组为空");
+		}
+		int[]exchange=new int[origin.length];
+		for(int i=origin.length-1;i>=0;i--){
+		exchange[origin.length-1-i]=origin[i];	
+		}
+		return exchange;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int exchange[]={};
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i]!=0){
+				int newExchange[]=new int[exchange.length+1];
+				if(i==0){
+					newExchange[i]=oldArray[i];
+				}else{
+					for(int j=0;j<exchange.length;j++){
+						newExchange[j]=exchange[j];
+					}
+					newExchange[exchange.length]=oldArray[i];
+				}
+				exchange=newExchange;
+			}
+		}
+		return exchange;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， 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[] a1, int[] a2){
+		for(int i=0;i<a2.length;i++){
+			int newA1[]=new int [a1.length+1];
+			for(int k=0;k<a1.length;k++){
+				newA1[k]=a1[k];
+			}
+			newA1[a1.length]=a2[i];
+			a1=newA1;
+		}
+		Arrays.sort(a1);
+		return  a1;
+	}
+	/**
+	 * 把一个已经存满数据的数组 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<newArray.length;i++){
+			if(i<oldArray.length){
+				newArray[i]=oldArray[i];
+			}else{
+				newArray[i]=0;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int i=1;
+		while(getFibonacci(i)<max){
+			i++;
+		}
+		int fibonacci[]=new int[i];
+		for(int k=0;k<i;k++){
+			fibonacci[k]=getFibonacci(k);
+		}
+		return fibonacci;
+	}
+	private int getFibonacci(int n){
+		if(n<2){return n;}
+		if(n==2){return 1;}
+		else{return getFibonacci(n-1)+getFibonacci(n-2);}
+	}
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int primes[]={};
+		for(int i=1;i<max;i++){
+			int j=2;
+			while(j<i){
+				if(i%j!=0){
+					j++;
+				}else{
+					break;
+				}
+			}
+			if(j==i){
+				if(i==2){
+					int newPrimes[]=new int[primes.length+1];
+					newPrimes[primes.length]=2;
+					primes=newPrimes;
+				}else{
+					int newPrimes[]=new int[primes.length+1];
+					for(int k=0;k<primes.length;k++){
+						newPrimes[k]=primes[k];
+					}
+					newPrimes[primes.length]=i;
+					primes=newPrimes;
+				}
+				
+			}
+		}
+		return primes;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int perfect[]={};
+		int value=0;
+		for(int i=1;i<max;i++){
+			for(int j=1;j<i;j++){
+				if(i%j==0){
+					value+=j;
+				}
+			}
+			if(i==value){
+				int newPerfect[]=new int[perfect.length+1];
+				for(int k=0;k<perfect.length;k++){
+					newPerfect[k]=perfect[k];
+				}
+				newPerfect[perfect.length]=i;
+				perfect=newPerfect;
+			}
+			value=0;		
+		}
+		return perfect;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer sb=new StringBuffer();
+		if(array.length==0||array==null){
+			throw new RuntimeException("数组为空");
+		}
+		for(int i=0;i<array.length;i++){
+			if(array.length==i+1){
+				sb.append(Integer.valueOf(array[i]));
+			}else{
+				sb.append(Integer.valueOf(array[i]).toString()).append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+
+}
diff --git a/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtilTest.java b/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..c39787d3b5
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,66 @@
+package com.coderising.array;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	ArrayUtil al=new ArrayUtil();
+	
+	@Test
+	public void testReverseArray(){
+		int origin[]={1,2,3,4,5,6};
+		int exchange[]=al.reverseArray(origin);
+		for(int i=0;i<exchange.length;i++){
+			System.out.println(exchange[i]);
+		}
+		
+	}
+	@Test
+	public void testRemoveZero(){
+		int origin[]={1,0,0,2,3,4,5,0,6,0};
+		int exchange[]=al.removeZero(origin);
+		for(int i=0;i<exchange.length;i++){
+			System.out.println(exchange[i]);
+		}
+	}
+	@Test
+	public void testJoin(){
+		int array[]= {3,8,9};
+		String seperator = "-";
+		String exchange=al.join(array, seperator);
+		System.out.println(exchange);
+	}
+	@Test
+	public void testGetPerfectNumbers(){
+		int max=10000;
+		int perfect[]=al.getPerfectNumbers(max);
+		for(int i=0;i<perfect.length;i++){
+			System.out.println(perfect[i]);
+		}
+	}
+	@Test
+	public void testGetPrimes(){
+		int max=3;
+		int perfect[]=al.getPrimes(max);
+		for(int i=0;i<perfect.length;i++){
+			System.out.println(perfect[i]);
+		}
+	}
+	@Test
+	public void testFibonacci(){
+		int max=100000;
+		int fibonacci[]=al.fibonacci(max);
+		for(int i=0;i<fibonacci.length;i++){
+			System.out.println(fibonacci[i]);
+		}
+	}
+	@Test
+	public void testGrow(){
+		int [] oldArray={2,3,6};
+		int size=3;
+		int newArray[]=al.grow(oldArray,size);
+		for(int i=0;i<newArray.length;i++){
+			System.out.println(newArray[i]);
+		}
+	}
+}
diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/LoginAction.java b/group11/542194147/myDataStructure/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..38ed8c7d29
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author XMT
+ *
+ */
+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/group11/542194147/myDataStructure/src/com/coderising/litestruts/Struts.java b/group11/542194147/myDataStructure/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..29f42aac12
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,94 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+public class Struts {
+
+	@SuppressWarnings({"unchecked" })
+	public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+		View view=new View();
+    	try {
+    		SAXReader sr=new SAXReader();
+			Document document= sr.read(new File("src/com/coderising/litestruts/struts.xml"));
+			Element root=document.getRootElement();
+			List<Element> actions=root.elements("action");
+			for(Iterator<Element> it=actions.iterator();it.hasNext();){
+				Element action =it.next();
+				if(action.attribute("name").getText().equals(actionName)){
+					LoginAction loginAction=(LoginAction)Class.forName(
+							action.attribute("class").getText()).newInstance();
+					loginAction.setName(parameters.get("name"));
+					loginAction.setPassword(parameters.get("password"));
+					String loginMsg=loginAction.execute();
+					if(loginMsg.equals("success")){ 
+						List<Element>results=action.elements("result");
+						for(it=results.iterator();it.hasNext();){
+							Element result=it.next();
+							if(result.attribute("name").getText().equals("success")){
+								createView(view, loginAction, result);
+							}
+						}
+					}
+					if(loginMsg.equals("fail")){
+						List<Element>results=action.elements("result");
+						for(it=results.iterator();it.hasNext();){
+							Element result=it.next();
+							if(result.attribute("name").getText().equals("fail")){
+								createView(view, loginAction, result);
+							}
+						}
+					}
+					if(loginMsg.equals("error")){
+						List<Element>results=action.elements("result");
+						for(it=results.iterator();it.hasNext();){
+							Element result=it.next();
+							if(result.attribute("name").getText().equals("error")){
+								createView(view, loginAction, result);
+							}
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			System.out.println("have exception:"+e);
+			e.printStackTrace();
+		}
+    	return view;
+    }
+
+	private static void createView(View view, LoginAction loginAction, Element result) {
+		Map<String,String> msgMap=new HashMap<String,String>();
+		msgMap.put("message", loginAction.getMessage());
+		view.setParameters(msgMap);
+		view.setJsp(result.getText());
+	}    
+
+}
diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java b/group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..7fa9e9a4e5
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java b/group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..610ce0d092
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java
@@ -0,0 +1,24 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml b/group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java
new file mode 100644
index 0000000000..fbede89fa1
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java
@@ -0,0 +1,133 @@
+package com.coding.basic;
+
+import java.util.Iterator;
+
+public class MyArrayList implements MyList {
+
+	/**
+	 * 数组默认大小
+	 */
+	private static final int DEFAULT_SIZE = 10;
+	/**
+	 * 储存元素的数组
+	 */
+	private Object[] elementData =null;
+	/**
+	 * 数组大小指针;
+	 */
+	private int capacity;
+	/**
+	 * 当前游标
+	 */
+	private int current;
+	
+	public MyArrayList(int size){
+		if(size<0){
+			throw new RuntimeException("大小不能小于0");
+		}else{
+			this.elementData= new Object[size];
+			this.current=0;
+			this.capacity=size;
+		}
+	}
+	
+	public MyArrayList(){
+		this(DEFAULT_SIZE);
+	}
+	
+	@Override
+	public void add(Object o) {
+		isOverSize();//判断数组容量是否满足，不满足增加空间
+		this.elementData[current]=o;
+		this.current++;
+	}
+
+	@Override
+	public void add(int index, Object o) {
+		isOverSize();//判断数组容量是否满足，不满足增加空间
+		isOutOfBoundIndex(index);//判断数组下标是否越界
+		System.arraycopy(elementData, index, elementData, index+1, this.elementData.length-index);
+		this.current++;
+	}
+
+	@Override
+	public Object get(int index) {
+		isOutOfBoundIndex(index);//判断数组下标是否越界
+		return this.elementData[index];
+	}
+
+	@Override
+	public Object remove(int index) {
+		isOutOfBoundIndex(index);//判断数组下标是否越界
+		Object o=this.elementData[index];
+		if(this.elementData.length>index+1){
+			System.arraycopy(elementData, index+1, elementData, index,this.elementData.length-index-1);
+		}
+		this.elementData[this.elementData.length-1]=null;
+		return o;
+	}
+
+	public Iterator<?> iterator(){
+		return new MyArrayListIterator();
+	}
+	
+	@Override
+	public int size() {
+		return this.elementData.length;
+	}
+
+	/**
+	 * 判断数组容量是否满足，不满足增加空间
+	 */
+	private void isOverSize() {
+		if(this.current==this.capacity){
+			this.capacity+=MyArrayList.DEFAULT_SIZE;
+		}
+		Object[]newElementData=new Object[this.capacity];
+		for(int i=0;i<this.elementData.length;i++){
+			newElementData[i]=this.elementData[i];
+		}
+		this.elementData=newElementData;
+	}
+	
+	/**
+	 * 判断数组下标是否越界
+	 * @param index
+	 */
+	private void isOutOfBoundIndex(int index){
+		if(index>this.capacity||index<0){
+			throw new RuntimeException("数组下标越界");
+		}
+	}
+	
+	/**
+	 * MyArrayList的迭代器
+	 * @author 小摩托
+	 *
+	 */
+	private class MyArrayListIterator implements Iterator<Object>{
+
+		private int current=0;
+		
+		@Override
+		public boolean hasNext() {
+			return current<size();
+		}
+
+		@Override
+		public Object next() {
+			if(hasNext()==false){
+				throw new RuntimeException("不存在对应元素");
+			}else{
+				return MyArrayList.this.get(current+1);
+			}
+		}
+
+		@Override
+		public void remove() {
+			MyArrayList.this.remove(current);
+			
+		}
+		
+	}
+}
diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyLinkedList.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyLinkedList.java
new file mode 100644
index 0000000000..5123045986
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyLinkedList.java
@@ -0,0 +1,194 @@
+package com.coding.basic;
+
+import java.util.Iterator;
+
+public class MyLinkedList implements MyList {
+
+	private Node head;//头指针
+	private Node last;//尾指针
+	private int size;//集合大小
+	
+	public MyLinkedList(){
+		
+	}
+	@Override
+	public void add(Object o) {
+		addLast(o);//默认插到队尾
+
+	}
+
+	@Override
+	public void add(int index, Object o) {
+		if(index>size||index<0){//检查下标是否越界
+			throw new RuntimeException("下标越界");
+		}
+		if(index==this.size){
+			addLast(o);//插到队尾
+		}else{
+			Node l= node(index);
+			addBeforeNode(o,l);//插到指定下标节点之前
+		}
+	}
+
+	@Override
+	public Object get(int index) {
+		if (index >= size || index < 0) {
+			throw new RuntimeException("下标越界");
+		}
+		return node(index).data;
+	}
+
+	@Override
+	public Object remove(int index) {
+		if (index >= size || index < 0) {
+			throw new RuntimeException("下标越界");
+		}
+		Node l=node(index);
+		Node prevNode=l.prev;
+		Node nextNode=l.next;
+		if(prevNode==null){
+			head=nextNode;
+		}else{
+			prevNode.next=nextNode;
+			
+		}
+		if(nextNode==null){
+			last=prevNode;
+		}else{
+			nextNode.prev=prevNode;
+		}
+		l.prev =null;
+		l.next=null;
+		l.data=null;
+		return l.data;
+	}
+
+	@Override
+	public int size() {
+		return size;
+	}
+	
+	/**
+	 * 获取对应节点的下标
+	 * @param element
+	 * @return
+	 */
+	public int indexOf(Object element) {
+		Node current = head;
+	    int count = 0;
+	    while (current != null) {
+	    	if (element != null) {
+	    		if (element.equals(current.data)) {
+	    			return count;
+	    			}
+	            }else{
+	            	if (current.data == null) {
+	            		return count;
+	                }
+	            }
+	    	count ++;
+	        current = current.next;
+	        }
+	    return -1;
+	    }
+	 
+	/**
+	 * 添加到对应下标的节点之前
+	 * @param o
+	 * @param theNode
+	 */
+	public void addBeforeNode(Object o,Node theNode){
+		Node prevNode=theNode.prev;
+		Node newNode= new Node(o,theNode,prevNode);
+		theNode.prev=newNode;
+		if(null==prevNode){
+			this.head=newNode;
+		}else{
+			prevNode.next=newNode;
+		}
+		size++;
+	}
+	
+	/**
+	 * 默认添加到队尾
+	 * @param o
+	 */
+	public void addLast(Object o){
+		Node l=this.last;
+		Node node= new Node(o,null,l);
+		if(null!=l){
+			l.next=node;
+		}else{
+			this.head=node;
+		}
+		size++;
+	}
+	
+	/**
+	 * 查找对应下标的节点并返回
+	 * @param index
+	 * @return
+	 */
+	private Node node(int index){
+		if(index<(this.size>>1)){
+			Node current=head;
+			for(int i=0;i<index;i++){
+				current=current.next;
+			}
+			return current;
+		}else{
+			Node current= last;
+			for(int i=size-1;i>index;i--){
+				current=current.prev;
+			}
+			return current;
+		}
+	}
+	
+	public Iterator<?> iterator(){
+		return new MyLinkedListIterator();
+	}
+	
+	private class MyLinkedListIterator implements Iterator<Object>{
+		private Node current=head;
+		
+		@Override
+		public boolean hasNext() {
+
+			return current!=last;
+		}
+
+		@Override
+		public Object next() {
+			if(hasNext()==false){
+				throw new RuntimeException("不存在对应元素");
+			}
+			Object o=current.data;
+			current=current.next;
+			return o;
+		}
+
+		@Override
+		public void remove() {
+			int index=MyLinkedList.this.indexOf(current);
+			MyLinkedList.this.remove(index);
+		}
+		
+	}
+	/**
+	 * 双向链表
+	 * @author 小摩托
+	 *
+	 */
+	private static  class Node{
+		Object data;
+		Node next;
+		Node prev;
+		public Node(Object d,Node n,Node p){
+			this.data=d;
+			this.next=n;
+			this.prev=p;
+		}
+	}
+
+}
diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyList.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyList.java
new file mode 100644
index 0000000000..73f331beec
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyList.java
@@ -0,0 +1,34 @@
+package com.coding.basic;
+
+public interface MyList {
+	
+	/**
+	 * 向集合中添加元素
+	 * @param o 任意类型元素
+	 */
+	public void add(Object o);
+	/**
+	 * 向集合中添加元素
+	 * @param index 指定位置下标
+	 * @param o 任意类型元素
+	 */
+	public void add(int index, Object o);
+	/**
+	 * 获取对应下标的元素
+	 * @param index 下标
+	 * @return 对应下标的元素
+	 */
+	public Object get(int index);
+	/**
+	 * 移除对应下标的元素
+	 * @param index 下标
+	 * @return 
+	 */
+	public Object remove(int index);
+	/**
+	 * 获取集合的大小
+	 * @return 大小数值
+	 */
+	public int size();
+	
+}
diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java
new file mode 100644
index 0000000000..c7fba907d4
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java
@@ -0,0 +1,19 @@
+package com.coding.basic;
+
+public class MyQueue {
+
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java
new file mode 100644
index 0000000000..705b3ec7e0
--- /dev/null
+++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java
@@ -0,0 +1,25 @@
+package com.coding.basic;
+
+import java.util.ArrayList;
+
+public class MyStack {
+
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group11/729245768/DataStructure/src/main/coding_170302/ArrayUtil.java b/group11/729245768/DataStructure/src/main/coding_170302/ArrayUtil.java
new file mode 100644
index 0000000000..db8d8bef49
--- /dev/null
+++ b/group11/729245768/DataStructure/src/main/coding_170302/ArrayUtil.java
@@ -0,0 +1,211 @@
+package main.coding_170302;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		for(int i=0,j=origin.length-1;i<origin.length/2;i++,j--){
+			int temp = origin[i];
+			origin[i] = origin[j];
+			origin[j] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int size=0;//表示非零个数
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i]!=0){
+				oldArray[size] = oldArray[i];
+				size++;
+			}
+		}
+		return Arrays.copyOf(oldArray,size);
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] array3 = new int[array1.length+array2.length];
+		int size=0;//表示array3元素个数
+		int i=0,j=0;
+		for(;i<array1.length&&j<array2.length;){
+			if(array1[i]<array2[j]){
+				array3[size++] = array1[i++];
+			}else if(array1[i]==array2[j]){
+				array3[size++] = array1[i++];
+				j++;
+			}else{
+				array3[size++] = array2[j++];
+			}
+		}
+		while (i<array1.length){
+			array3[size++] = array1[i++];
+		}
+		while (j<array2.length){
+			array3[size++] = array2[j++];
+		}
+		return  Arrays.copyOf(array3,size);
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		System.arraycopy(oldArray,0,newArray,0,oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max<=1){
+			return new int[0];
+		}
+		ArrayList list = new ArrayList();
+		int fib1 = 1;
+		int fib2 = 1;
+		list.add(fib1);
+		while (fib2<max){
+			list.add(fib2);
+			int temp = fib2;
+			fib2 = fib1+ fib2;
+			fib1 = temp;
+		}
+		int[] array = new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			array[i] = (int)list.get(i);
+		}
+		return array;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max<=2)return new int[0];
+		List list = new ArrayList();
+		for(int i=2;i<max;i++){
+			if(isPrime(i)){
+				list.add(i);
+			}
+		}
+		int[] primeArray = new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			primeArray[i] = (int)list.get(i);
+		}
+		return primeArray;
+	}
+	public boolean isPrime(int element){
+		if(element==1)return false;
+		if(element==2||element==3)return true;
+		for(int i=2;i<=Math.sqrt(element);i++){
+			if(element%i==0)
+				return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max<6){
+			return new int[0];
+		}
+		List<Integer> list = new ArrayList<>();
+		for(int i=6;i<=max;i++){
+			if(isPerfectNumbers(i)){
+				list.add(i);
+			}
+		}
+		int[] array = new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			array[i] = list.get(i);
+		}
+		return array;
+	}
+
+	public boolean isPerfectNumbers(int element){
+		if(element==1||isPrime(element))
+			return false;
+		List<Integer> list = new ArrayList<>();
+		int end =(int) Math.sqrt(element);//
+		for(int i=2;i<=end;){
+			if(element%i==0){
+				list.add(i);
+				element=element/i;
+			}else{
+				i++;
+			}
+		}
+		int sum =1;
+		for(Integer i:list){
+			sum+=i;
+		}
+		if(element==sum){
+			return true;
+		}else{
+			return false;
+		}
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sb = new StringBuilder();
+		for(int i=0;i<array.length;i++){
+			sb.append(array[i]);
+			sb.append(seperator);
+		}
+		sb.deleteCharAt(sb.length()-1);
+		return sb.toString();
+	}
+
+}
diff --git a/group11/729245768/DataStructure/src/main/coding_170302/LoginAction.java b/group11/729245768/DataStructure/src/main/coding_170302/LoginAction.java
new file mode 100644
index 0000000000..0ff359efaa
--- /dev/null
+++ b/group11/729245768/DataStructure/src/main/coding_170302/LoginAction.java
@@ -0,0 +1,38 @@
+package main.coding_170302;
+
+/**这是一个用来显示登录的业务类，其中的用户名和密码都是硬编码
+ * Created by peter on 2017/3/3.
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+    public String execute(){
+        if("test".equals(name)&&"1234".equals(password)){
+            this.message = "login successful";
+            return message;
+        }
+        this.message = "login failed,please check your user/pwd";
+        return message;
+    }
+}
diff --git a/group11/729245768/DataStructure/src/main/coding_170302/Struts.java b/group11/729245768/DataStructure/src/main/coding_170302/Struts.java
new file mode 100644
index 0000000000..f0f9b7b67f
--- /dev/null
+++ b/group11/729245768/DataStructure/src/main/coding_170302/Struts.java
@@ -0,0 +1,108 @@
+package main.coding_170302;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by peter on 2017/3/3.
+ */
+public class Struts {
+    public static View runAction(String actionName, Map<String,String> parameters) throws DocumentException {
+         /*
+
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		("name"="test" ,  "password"="1234") ,
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+
+        */
+        View view = new View();
+        SAXReader saxReader = new SAXReader();
+        Document document = saxReader.read(new File("DataStructure/src/main/coding_170302/struts.xml"));
+        Element root = document.getRootElement();//获取根元素
+        List<Element> listOfAction = root.elements("action");//获取action子元素
+        int i=0;
+        for(;i<listOfAction.size();i++){
+            if(listOfAction.get(i).attributeValue("name").equals(actionName)){
+                break;
+            }
+        }
+        if(i==listOfAction.size()){
+            System.out.println("没有对应的action");
+        }
+        Element action = listOfAction.get(i);
+        String classPackage = action.attributeValue("class");
+        try {
+            Class c = Class.forName(classPackage);
+            Object o = c.newInstance();//实例化对象
+            Set<Map.Entry<String,String>> inputs = parameters.entrySet();
+            //执行setName和setPassword
+            for(Map.Entry<String,String> input:inputs){
+                String key = input.getKey();
+                String value = input.getValue();
+                String methodName = "set"+Character.toUpperCase(key.charAt(0))+key.substring(1);
+                Method method = c.getDeclaredMethod(methodName,String.class);
+                method.invoke(o,value);
+            }
+            //执行execute方法，并返回message
+            Method execute = c.getDeclaredMethod("execute");
+            String returnMessage = (String)execute.invoke(o);
+
+            Method[] methods = c.getDeclaredMethods();
+            //获取所有getter方法，并且将值放到view的parameters中
+            Map<String,String> paraMap = new HashMap<>();
+            for(int j=0;j<methods.length;j++){
+                String getName = methods[j].getName();
+                if(getName.indexOf("get")!=-1){
+                    String returnValue = (String)methods[j].invoke(o);
+                    String functionName = Character.toLowerCase(getName.charAt(3))+getName.substring(4);
+                    paraMap.put(functionName,returnValue);
+
+                }
+            }
+            view.setPatameters(paraMap);
+            //4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+           // 放到View对象的jsp字段中。
+            List<Element> resultOfElements = action.elements("result");
+            for(int k=0;k<resultOfElements.size();k++){
+                if(returnMessage.indexOf(resultOfElements.get(k).attributeValue("name"))!=-1){
+                    view.setJsp(resultOfElements.get(k).getText());
+                    break;
+                }
+            }
+
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return view;
+    }
+}
diff --git a/group11/729245768/DataStructure/src/main/coding_170302/View.java b/group11/729245768/DataStructure/src/main/coding_170302/View.java
new file mode 100644
index 0000000000..fa8155abe9
--- /dev/null
+++ b/group11/729245768/DataStructure/src/main/coding_170302/View.java
@@ -0,0 +1,27 @@
+package main.coding_170302;
+
+import java.util.Map;
+
+/**
+ * Created by peter on 2017/3/3.
+ */
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public View setJsp(String jsp){
+        this.jsp = jsp;
+        return this;
+    }
+    public View setPatameters(Map parameters){
+        this.parameters = parameters;
+        return this;
+    }
+    public String getJsp() {
+        return jsp;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+}
diff --git a/group11/729245768/DataStructure/src/main/coding_170302/struts.xml b/group11/729245768/DataStructure/src/main/coding_170302/struts.xml
new file mode 100644
index 0000000000..a500b2d24f
--- /dev/null
+++ b/group11/729245768/DataStructure/src/main/coding_170302/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="main.coding_170302.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="main.coding_170302.LogoutAction">
+        <result name= "success">/jsp/welcome.jsp</result>
+        <result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java b/group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java
new file mode 100644
index 0000000000..4d5cc38728
--- /dev/null
+++ b/group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java
@@ -0,0 +1,78 @@
+package main.coding_170302;
+
+import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by peter on 2017/3/2.
+ */
+public class ArrayUtilTest extends TestCase {
+    @Before
+    public void setUp() throws Exception {
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void testReverseArray() throws Exception {
+        int[] array1 = {1,2,3,4,5,6,7};
+        int[] array2 = {7,6,5,4,3,2,1};
+        ArrayUtil util = new ArrayUtil();
+        util.reverseArray(array1);
+        Assert.assertArrayEquals(array1,array2);
+    }
+
+    @Test
+    public void testRemoveZero() throws Exception {
+        int[] array1 = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        int[] arry2 = {1,3,4,5,6,6,5,4,7,6,7,5};
+        Assert.assertArrayEquals(new ArrayUtil().removeZero(array1),arry2);
+}
+
+    @Test
+    public void testMerge() throws Exception {
+        int[] array1 = {3,5,7,8};
+        int[] array2 = {4,5,6,7};
+        int[] array = {3,4,5,6,7,8};
+        Assert.assertArrayEquals(array,new ArrayUtil().merge(array1,array2));
+    }
+
+    @Test
+    public void testGrow() throws Exception {
+        int[] array1 ={2,3,6};
+        int[] array2 = {2,3,6,0,0,0};
+        Assert.assertArrayEquals(array2,new ArrayUtil().grow(array1,3));
+    }
+
+    @Test
+    public void testFibonacci() throws Exception {
+        int[] array1 = {1,1,2,3,5,8,13};
+        Assert.assertArrayEquals(array1,new ArrayUtil().fibonacci(15));
+    }
+
+    @Test
+    public void testGetPrimes() throws Exception {
+        int[] array1 = {2,3,5,7,11,13,17,19};
+        Assert.assertArrayEquals(array1,new ArrayUtil().getPrimes(23));
+    }
+
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+        int[] array1 = {6};
+        Assert.assertArrayEquals(array1,new ArrayUtil().getPerfectNumbers(10));
+    }
+
+    @Test
+    public void testJoin() throws Exception {
+        int[] array1 = {3,8,9};
+        Assert.assertEquals("3-8-9",new ArrayUtil().join(array1,"-"));
+    }
+
+}
\ No newline at end of file
diff --git a/group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java b/group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java
new file mode 100644
index 0000000000..309bdfc9ba
--- /dev/null
+++ b/group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java
@@ -0,0 +1,42 @@
+package main.coding_170302;
+
+import junit.framework.TestCase;
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by peter on 2017/3/3.
+ */
+public class StrutsTest extends TestCase {
+    @Test
+    public void testLoginActionSuccess() throws DocumentException {
+        String actionName = "login";
+
+        Map<String,String> params = new HashMap<>();
+        params.put("name","test");
+        params.put("password","1234");
+
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+    }
+    @Test
+    public void testLoginActionFailed() throws DocumentException {
+        String actionName = "login";
+        Map<String,String> params = new HashMap<>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+
+}
\ No newline at end of file
diff --git a/group11/996108220/.classpath b/group11/996108220/.classpath
index d171cd4c12..11cc9c31cb 100644
--- a/group11/996108220/.classpath
+++ b/group11/996108220/.classpath
@@ -2,5 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="var" path="JUNIT" sourcepath="/JUNIT_SRC"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group11/996108220/src/com/coderising/array/ArrayUtil.java b/group11/996108220/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..0637eb921c
--- /dev/null
+++ b/group11/996108220/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,194 @@
+package com.coderising.array;
+
+import com.coding.basic.ArrayList;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int mid=origin.length%2==1?origin.length/2:origin.length/2-1;
+		for (int i = 0; i <= mid; i++) {
+			int vlaue=origin[i];
+			origin[i]=origin[origin.length-1-i];
+			origin[origin.length-1-i]=vlaue;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		ArrayList list=new ArrayList();
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i]!=0) {
+				list.add(oldArray[i]);
+			}
+		}
+		int[] array=new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			array[i]=(int) list.get(i);
+		}
+		
+		return array;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] array=new int[array1.length+array2.length];
+		int ptr1=0;int ptr2=0;int index=0;
+		while (ptr1!=array1.length&&ptr2!=array2.length) {
+			array[index++]=array1[ptr1]>array2[ptr2]?array2[ptr2++]:array1[ptr1++];
+			}
+		if (ptr1==array1.length) {
+			for (int i = ptr2; i < array2.length; i++)array[index++]=array2[i];		
+		}
+		else {
+			for (int i = ptr1; i < array1.length; i++)array[index++]=array1[i];
+		}
+		return array;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int [] array=new int[oldArray.length+size];
+		for (int i = 0; i < oldArray.length; i++) {
+			array[i]=oldArray[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		
+		if (max==1) {
+			return null;
+		}
+		else if (max==2) {
+			return new int[]{1,1};
+		}
+		else {
+			ArrayList list=new ArrayList();
+			list.add(1);
+			list.add(1);
+			int next=2;
+			while (next<max) {
+				list.add(next);
+				next=(int)list.get(list.size()-1)+(int)list.get(list.size()-2);
+			}
+			int[] array=new int[list.size()];
+			for (int i = 0; i < list.size(); i++) {
+				array[i]=(int)list.get(i);
+			}
+		return array;	
+		}
+		
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if (max<=2) {
+			return null;
+		}
+		ArrayList 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[] array=new int[list.size()];
+		for (int i = 0; i < array.length; i++) {
+			array[i]=(int) list.get(i);
+		}
+		return array;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		ArrayList list=new ArrayList();
+		for (int j = 2; j < max; j++) {
+			int value=0;
+			for (int i = 1; i < j; i++) {
+			if (j%i==0) {
+				value=value+i;
+				}
+			}
+			if (value==j) {
+				list.add(j);
+				}
+		}
+		if (list.size()!=0) {
+			int[] array=new int[list.size()];
+			for (int i = 0; i < array.length; i++) {
+				array[i]=(int)list.get(i);
+			}
+			return array;
+		}	
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String str=""+array[0];
+		for (int i = 1; i < array.length; i++) {
+			str=str+seperator+array[i];
+		}
+		return str;
+	}
+	
+
+}
diff --git a/group11/996108220/src/com/coderising/array/ArrayUtilTest.java b/group11/996108220/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..ee220a4059
--- /dev/null
+++ b/group11/996108220/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,71 @@
+package com.coderising.array;
+import org.junit.Test;
+
+
+
+public class ArrayUtilTest {
+	ArrayUtil arrayUtil=new ArrayUtil();
+
+	@Test
+	public void testReverseArray() {
+		int[] array=new int[]{1,2,3,4,5};
+		arrayUtil.reverseArray(array);
+		for (int i = 0; i < array.length; i++) {
+			System.out.print(array[i]+" ");
+		}
+		//Assert.assertEquals(new int[]{5,4,3,2,1}, array);
+	}
+	@Test
+	public void testRemoveZero(){
+		int[] array=new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}  ;
+		int[] newarray=arrayUtil.removeZero(array);
+		for (int i = 0; i < newarray.length; i++) {
+			System.out.print(newarray[i]+" ");
+		}	
+	}
+	@Test
+	public void testMerge(){
+		int[] array1=new int[]{3, 5, 7,8,9,10};
+		int[] array2=new int[]{1,2,4};
+		int[] newarray=arrayUtil.merge(array1, array2);
+		for (int i = 0; i < newarray.length; i++) {
+			System.out.print(newarray[i]+" ");
+		}	
+	}
+	@Test
+	public void testGrow(){
+		int[] array=new int[]{1,3,4,5,0,0}  ;
+		int[] newarray=arrayUtil.grow(array, 4);
+		for (int i = 0; i < newarray.length; i++) {
+			System.out.print(newarray[i]+" ");
+		}	
+	}
+	@Test
+	public void testFibonacci(){
+		int[] newarray=arrayUtil.fibonacci(15);
+		for (int i = 0; i < newarray.length; i++) {
+			System.out.print(newarray[i]+" ");
+		}	
+	}
+	@Test
+	public void testGetPrimes(){
+		int[] newarray=arrayUtil.getPrimes(15);
+		for (int i = 0; i < newarray.length; i++) {
+			System.out.print(newarray[i]+" ");
+		}	
+	}
+	@Test
+	public void testGetPerfectNumbers(){
+		int[] newarray=arrayUtil.getPerfectNumbers(100);
+		for (int i = 0; i < newarray.length; i++) {
+			System.out.print(newarray[i]+" ");
+		}	
+	}
+	@Test
+	public void testJoin(){
+		int[] array=new int[]{1,3,4,5,0,0} ;
+		String s=arrayUtil.join(array,"&");
+		System.out.print(s);		
+	}
+
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/Action.java b/group11/996108220/src/com/coderising/litestruts/Action.java
new file mode 100644
index 0000000000..e5e076aa77
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/Action.java
@@ -0,0 +1,11 @@
+package com.coderising.litestruts;
+
+public interface Action {
+
+    public String getName();
+    public String getPassword();
+    public String execute();
+    public void setName(String name);
+    public void setPassword(String password);
+    public String getMessage();
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/ActionConfig.java b/group11/996108220/src/com/coderising/litestruts/ActionConfig.java
new file mode 100644
index 0000000000..16289029d8
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/ActionConfig.java
@@ -0,0 +1,44 @@
+/**
+ * 
+ */
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+
+/**
+ * @author WANGCANCER
+ *
+ */
+public class ActionConfig {
+	 
+	    private	String actionName;
+	    private String clazzName;
+	    private	HashMap<String, String> messageToresult=null;
+		public String getActionName() {
+			return actionName;
+		}
+		public void setActionName(String actionName) {
+			this.actionName = actionName;
+		}
+		public String getClazzName() {
+			return clazzName;
+		}
+		public void setClazzName(String clazzName) {
+			this.clazzName = clazzName;
+		}
+		public HashMap<String, String> getMessageToresult() {
+			return messageToresult;
+		}
+		public void setMessageToresult(HashMap<String, String> messageToresult) {
+			this.messageToresult = messageToresult;
+		}
+		public ActionConfig(String actionName, String clazzName,
+				HashMap<String, String> messageToresult) {
+			super();
+			this.actionName = actionName;
+			this.clazzName = clazzName;
+			this.messageToresult = messageToresult;
+		}
+		
+	 
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/LoginAction.java b/group11/996108220/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..01b51fdd88
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction implements Action{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/LogoutAction.java b/group11/996108220/src/com/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..8043fae56e
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,35 @@
+package com.coderising.litestruts;
+
+public class LogoutAction implements Action{
+	private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "logout successful";
+                return "success";
+            }
+            this.message = "logout failed,please try again";
+            return "error";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
+
diff --git a/group11/996108220/src/com/coderising/litestruts/Struts.java b/group11/996108220/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..8f961f2175
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,167 @@
+package com.coderising.litestruts;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import com.coderising.litestruts.Action;
+
+
+
+/*
+ 
+0. 读取配置文件struts.xml
+
+1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+("name"="test" ,  "password"="1234") ,     	
+那就应该调用 setName和setPassword方法
+
+2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+放到View对象的parameters
+
+4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+放到View对象的jsp字段中。
+
+*/
+	
+public class Struts {
+	//strut.xml文件所在的路径
+	public static final String dir="/mycoding2017/group11/996108220/src/com/coderising/litestruts/struts.xml";
+    
+	/**
+	 * 用户提供action动作，以及用户名和密码，对应返回view视图
+	 * @param actionName 登入登出
+	 * @param parameters 用户名密码
+	 */
+	public static View runAction(String actionName, Map<String,String> parameters) throws Exception {
+		ActionConfig actionConfig=getActionConfig(actionName);
+		Action action=createAction(actionConfig.getClazzName(),parameters);
+		String message=getActionMessage(action);
+		View view=updaView(getALL(action), actionConfig, message);
+    	return view;
+    }
+
+    /**
+     * 步骤0：读取配置文件，将文件中的action生成ActionDao
+     * @param actionName传入action的名字
+     */
+    private static ActionConfig getActionConfig(String name) throws Exception {
+    	 // 生成一个Dom解析器  
+    	 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
+    	// 解析XML文件  
+    	 Document document = builder.parse(dir); 
+    	 NodeList actions = document.getElementsByTagName("action");
+    	 int j = 0;String actionName="";String clazzName="";
+    	 for (; j < actions.getLength(); j++) {
+    		 	actionName= actions.item(j).getAttributes().getNamedItem("name").getNodeValue();
+				if (actionName.equals(name)) {
+					clazzName=actions.item(j).getAttributes().getNamedItem("class").getNodeValue();
+					break;
+					}
+			}
+    	 if (actions.item(0).getNodeType() == Node.ELEMENT_NODE) {
+
+				Element action =(Element) actions.item(j);
+				NodeList results =action.getElementsByTagName("result");
+				HashMap<String, String> map=new HashMap<String, String>();
+				for (int i = 0; i < results.getLength(); i++) {
+					String nameString=results.item(i).getAttributes().getNamedItem("name").getNodeValue();
+					String pageString=results.item(i).getTextContent();
+					map.put(nameString, pageString);
+				} 
+				return new ActionConfig(actionName, clazzName, map);
+			}
+    	 return null; 	
+	}
+	/**
+	 * 步骤1：反射创建action的对象，将name和password赋值
+	 * @param clazzName
+	 * @return
+	 */
+    private static Action createAction(String clazzName,Map<String,String> parameters) throws Exception {
+		Class<?> clazz=Class.forName(clazzName);
+		Object action = clazz.newInstance() ;
+		Method nameSetter = action.getClass().getMethod("setName", String.class);  
+		nameSetter .invoke(action, parameters.get("name")); 
+		Method passwordSetter  = action.getClass().getMethod("setPassword", String.class);  
+		passwordSetter.invoke(action, parameters.get("password"));
+		return (Action) action;	
+	}
+    /**
+     * 步骤2：反射运行execute方法，获得message
+     * @param action
+     * @return message
+     */
+    private static String getActionMessage (Action action) throws Exception {
+    	
+		return (String) action.getClass().getMethod("execute").invoke(action);
+		
+	}
+    /**
+     * 步骤3：将action中get方法与get到的值的映射关系记录到view里的Parameters表中
+     * @param action
+     * @return view
+     */
+    private static View getALL(Action action) throws Exception {
+    	HashMap<String, String> map=new HashMap<>();
+    	Method nameGetter = action.getClass().getMethod("getName");  
+    	map.put("name", (String) nameGetter.invoke(action)); 
+    	Method passwordGetter = action.getClass().getMethod("getPassword");  
+    	map.put("password", (String) passwordGetter.invoke(action));
+    	Method MessageGetter = action.getClass().getMethod("getMessage");  
+    	map.put("message", (String) MessageGetter.invoke(action));
+    	View view=new View();
+    	view.setParameters(map);
+		return view;
+	}
+    /**
+     * 步骤4：将execute获得的message查找Struts配置文件将对应的页面记录到view中
+     * @param view
+     * @param actionConfig
+     * @param message
+     * @return
+     */
+    private static View updaView(View view,ActionConfig actionConfig,String message) {
+    	return view.setJsp(actionConfig.getMessageToresult().get(message));
+	}
+//    public static void main(String[] args) {
+//    	DocumentBuilder builder;
+//		try {
+//			builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+//			Document doc = builder.parse(dir);
+//			NodeList beans = doc.getElementsByTagName("action");
+//			for (int j = 0; j < beans.getLength(); j++) {
+//				System.out.println(beans.item(j).getAttributes().getNamedItem("name").getNodeValue());
+//				System.out.println(beans.item(j).getAttributes().getNamedItem("class").getNodeValue());
+//			}
+//			if (beans.item(0).getNodeType() == Node.ELEMENT_NODE) {
+//
+//				Element action =(Element) beans.item(0);
+//				NodeList results =action.getElementsByTagName("result");
+//				HashMap<String, String> map=new HashMap<String, String>();
+//				System.out.println(results.getLength());
+//				for (int i = 0; i < results.getLength(); i++) {
+//					System.out.println(results.item(i).getAttributes().getNamedItem("name").getNodeValue());
+//					System.out.println(results.item(i).getTextContent());
+//				}
+//			}
+//			
+////			NamedNodeMap name = beans.item(0).getAttributes(); 
+//			
+//		} catch (Exception e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		}  
+    	
+    	 
+//	}
+   
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/StrutsTest.java b/group11/996108220/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..af5f82d275
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,63 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws Exception {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+	@Test
+	public void testLogoutActionSuccess() throws Exception {
+		
+		String actionName = "logout";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);
+        Assert.assertEquals("/jsp/welcome.jsp", view.getJsp());
+        Assert.assertEquals("logout successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLogoutActionFailed() throws Exception {
+		String actionName = "logout";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);    
+        Assert.assertEquals("/jsp/error.jsp", view.getJsp());
+        Assert.assertEquals("logout failed,please try again", view.getParameters().get("message"));
+	}
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/View.java b/group11/996108220/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group11/996108220/src/com/coderising/litestruts/struts.xml b/group11/996108220/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..246b3595ad
--- /dev/null
+++ b/group11/996108220/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group11/996108220/src/com/coding/basic/ArrayList.java b/group11/996108220/src/com/coding/basic/ArrayList.java
index 6fe727645b..2445d52ae5 100644
--- a/group11/996108220/src/com/coding/basic/ArrayList.java
+++ b/group11/996108220/src/com/coding/basic/ArrayList.java
@@ -1,5 +1,6 @@
 package com.coding.basic;
 
+
 public class ArrayList implements List {
 	
 	private int size = 0;
@@ -94,6 +95,13 @@ public Object next() {
 	        }
 
 	 }
+	public Object[] toArray() {
+		Object[] array= new Object[size];
+		for (int i = 0; i < elementData.length; i++) {
+			array[i]=elementData[i];
+		}
+		return array;
+	}
 	public void grow(Object[] elementData2){
 		int[] elementData=new int[elementData2.length+elementData2.length/2];
 		System.arraycopy(elementData2,0,elementData,0,elementData2.length); 
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewArrayList.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewArrayList.java
new file mode 100644
index 0000000000..aa7c5bd0ed
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewArrayList.java
@@ -0,0 +1,90 @@
+package com.tiaozaoj;
+import java.util.Arrays;
+
+public class NewArrayList {
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	//ֱ���ں�������
+	public void add(Object o){
+		//���жϸ������Ƿ�����
+		if(this.size == elementData.length){
+			this.grow(elementData,5);
+		}
+		this.elementData[size] = o;
+		this.size++;
+	}
+	
+	private void grow(Object[] src,int length){
+		this.elementData = Arrays.copyOf(src, src.length+length);
+	}
+	
+	public void add(int index,Object o){
+		this.verifyIndex(index);
+		//���жϸ������Ƿ�����
+		if(this.size == elementData.length){
+			this.grow(elementData,5);
+		}
+		for(int i=size;i>index;i--){
+			this.elementData[i+1] = this.elementData[i];
+		}
+		this.elementData[index] = o;
+		this.size++;
+	}
+	
+	private void verifyIndex(int index){
+		try{
+			if(index <0 || index > this.size)
+				throw new Exception("�±�Խ��");
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	public Object get(int index){
+		this.verifyIndex(index);
+		return this.elementData[index];
+	}
+	
+	public Object remove(int index){
+		Object o = elementData[index];
+		this.verifyIndex(index);
+		for(int i=index;i<size;i++){
+			this.elementData[i] = this.elementData[i+1];
+		}
+		this.size--;
+		return o;
+	}
+	
+	public int size(){
+		return this.size;
+	}
+	
+	public NewIterator iterator(){
+		return new ArrayListIterator(this);
+	}
+	
+	private class ArrayListIterator implements NewIterator{
+		NewArrayList l = null;
+		int pos = 0;
+		
+		private ArrayListIterator(NewArrayList l){
+			this.l = l;
+		}
+		
+		public boolean hasNext() {
+			// TODO �Զ����ɵķ������
+			return pos < l.size();
+		}
+		
+		public void remove(){
+			this.l.remove(pos);
+		}
+
+		public Object next() {
+			// TODO �Զ����ɵķ������
+			return l.get(pos++);
+		}
+	}
+}
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewArrayListTest.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewArrayListTest.java
new file mode 100644
index 0000000000..5082715037
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewArrayListTest.java
@@ -0,0 +1,58 @@
+package com.tiaozaoj;
+
+import java.awt.List;
+
+import junit.framework.TestCase;
+
+public class NewArrayListTest extends TestCase {
+	private NewArrayList list = new NewArrayList();
+	
+	protected void setUp() throws Exception {
+		super.setUp();
+	}
+
+	protected void tearDown() throws Exception {
+		super.tearDown();
+	}
+
+	public void testAddObject() {
+		list.add("0");
+		list.add("2");
+		assertEquals("0", list.get(0));
+		assertEquals("2", list.get(1));
+	}
+
+	public void testAddIntObject() {
+		list.add(0,"0");
+		assertEquals("0", list.get(0));
+	}
+
+	public void testRemove() {
+		list.add(0,"0");
+		list.add(1,"1");
+		list.add(2,"2");
+		assertEquals("1", list.remove(1));
+	}
+
+	public void testSize() {
+		list.add(0,"0");
+		list.add(1,"1");
+		list.add(2,"2");
+		assertEquals(3, list.size());
+	}
+
+	public void testIterator() {
+		int i = 0;
+		for(NewIterator It = list.iterator();It.hasNext();){
+			Object str = (Object) It.next();
+			assertEquals(list.get(i++), str);
+		}
+		
+		int j = list.size();
+		for(NewIterator It = list.iterator();It.hasNext();){
+			It.next();
+			It.remove();
+			assertEquals(--j, list.size());
+		}
+	}
+}
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewBinaryTree.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewBinaryTree.java
new file mode 100644
index 0000000000..da53fb56dd
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewBinaryTree.java
@@ -0,0 +1,61 @@
+package com.tiaozaoj;
+
+public class NewBinaryTree {
+	// Root node pointer. Will be null for an empty tree.
+	  private Node root ;
+ 
+	  private static class Node {
+		    Node left ;
+		    Node right ;
+		    int data ;
+		 
+		    Node( int newData) {
+		      left = null ;
+		      right = null ;
+		      data = newData;
+		    }
+	  }
+ 
+	  public NewBinaryTree() {
+		  root = null ;
+	  }
+	 
+	  public void insert( int data) {
+		  root = insert( root , data);
+	  }
+ 
+	  private Node insert(Node node, int data) {
+	    if (node== null ) {
+	      node = new Node(data);
+	    }
+	    else {
+	      if (data <= node. data ) {
+	        node. left = insert(node. left , data);
+	      }
+	      else {
+	        node. right = insert(node. right , data);
+	      }
+	    }
+	
+	    return (node); // in any case, return the new pointer to the caller
+	  }
+ 
+	  public void buildTree( int [] data){
+	      for ( int i=0;i<data.length ;i++){
+	         insert(data[i]);
+	      } 
+	  }
+ 
+	  public void printTree() {
+	      printTree( root );
+	      System. out .println();
+	  }
+  
+  	private void printTree(Node node) {
+  		if (node == null ) return ;
+		  // left, node itself, right
+		  printTree(node. left );
+		  System. out .print(node. data + "  " );
+		  printTree(node. right );
+  		}
+	}
\ No newline at end of file
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewIterator.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewIterator.java
new file mode 100644
index 0000000000..b6e615638e
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewIterator.java
@@ -0,0 +1,7 @@
+package com.tiaozaoj;
+
+public interface NewIterator {
+	public boolean hasNext();
+	public Object next();
+	public void remove();
+}
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewLinkedList.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewLinkedList.java
new file mode 100644
index 0000000000..3a545565cb
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewLinkedList.java
@@ -0,0 +1,91 @@
+package com.tiaozaoj;
+
+public class NewLinkedList {
+	
+	private Node head;
+	private int size = 0;
+	
+	//���췽��
+	public NewLinkedList(){
+		//��ʼ����ʱ������һ��ͷ��㣬���洢����
+		head = new Node("0x666");
+		head.next = null;
+	}
+	
+	public void add(Object o){
+		Node newNode = new Node(o);
+		head.next = newNode;
+		newNode = head;
+		this.size++;
+	}
+	
+	private void verifyIndex(int index){
+		try{
+			if(index<0 || index>size)
+				throw new Exception("Խ���쳣");
+		}catch(Exception e){
+			e.printStackTrace();
+			return;
+		}
+	}
+	
+	public void add(int index,Object o){
+		this.verifyIndex(index);
+		int j = -1;
+		Node newNode = new Node(o);
+		//�������
+		for(Node p = head.next;p.next != null;p = p.next){
+			if((index) == j+1){
+				Node q = p.next;
+				p.next = newNode;
+				newNode.next = q;
+				break;
+			}
+			j++;
+		}
+		this.size++;
+	}
+	
+	public Object get(int index){
+		this.verifyIndex(index);
+		int j = 0;
+		//�������
+		Node p = head.next;
+		for(;p.next != null;p = p.next){
+			if((index) == j){
+				break;
+			}
+			j++;
+		}
+		return p;
+	}
+	
+	public Object remove(int index){
+		this.verifyIndex(index);
+		int j = -1;
+		//�������
+		Node p = head.next;
+		for(;p.next != null;p = p.next){
+			if((index) == j+1){
+				break;
+			}
+			j++;
+		}
+		Node toRemoveNode = p.next;
+		p.next = toRemoveNode.next;
+		return toRemoveNode;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	private static class Node{
+		public Object data;
+		public Node next;
+		
+		public Node(Object o){
+			this.data = o;
+		}
+	}
+}
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewQueue.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewQueue.java
new file mode 100644
index 0000000000..4259848af8
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewQueue.java
@@ -0,0 +1,24 @@
+package com.tiaozaoj;
+
+public class NewQueue {
+	NewLinkedList linkedList = new NewLinkedList();
+	private int size = 0;
+	
+	public void enQueue(Object o){
+		linkedList.add(o);
+	}
+	
+	public Object deQueue(Object o){
+		Object toDel = linkedList.get(0);
+		linkedList.remove(0);
+		return toDel;
+	}
+	
+	public boolean isEmpty(){
+		return linkedList.size()>0?false:true;
+	}
+	
+	public int size(){
+		return linkedList.size();
+	}
+}
diff --git a/group13/1392221554/lesson01/src/com/tiaozaoj/NewStack.java b/group13/1392221554/lesson01/src/com/tiaozaoj/NewStack.java
new file mode 100644
index 0000000000..856361c9fa
--- /dev/null
+++ b/group13/1392221554/lesson01/src/com/tiaozaoj/NewStack.java
@@ -0,0 +1,24 @@
+package com.tiaozaoj;
+
+public class NewStack {
+	private NewArrayList elementData = new NewArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		Object o = elementData.get(elementData.size());
+		elementData.remove(elementData.size());
+		return o;
+	}
+	
+	//ֻ��ȡջ��Ԫ��
+	public Object peek(){
+		return elementData.get(elementData.size());
+	}
+	
+	public boolean isEmpty(){
+		return elementData.size()>0?false:true;
+	}
+}
diff --git a/group13/1392221554/lesson02/src/com/tiaozaoj/ArrayUtil.java b/group13/1392221554/lesson02/src/com/tiaozaoj/ArrayUtil.java
new file mode 100644
index 0000000000..4aa9d3dace
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/ArrayUtil.java
@@ -0,0 +1,180 @@
+package com.tiaozaoj;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+	
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin){
+		int len = origin.length;
+		int temp = 0;
+		for(int i=0;i<len/2;i++){
+			temp = origin[i];
+			origin[i] = origin[len-i-1];
+			origin[len-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 int[] removeZero(int[] oldArray){
+		int i,j=0;
+		int[] newArr = new int[oldArray.length];
+		for(i=0;i<oldArray.length;i++){
+			if(oldArray[i] != 0){
+				newArr[j] = oldArray[i];
+				j++;
+			}
+		}
+		return Arrays.copyOfRange(newArr, 0,j);
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int i=0,j=0,k=0;
+		int len1 = array1.length;
+		int len2 = array2.length;
+		int[] mergeArr = new int[len1+len2];
+		while(true){
+			if(i == len1 || j == len2)
+				break;
+			if(array1[i]<array2[j]){
+				mergeArr[k++] = array1[i++];
+			}else if(array1[i]>array2[j]){
+				mergeArr[k++] = array2[j++];
+			}else{
+				mergeArr[k++] = array1[i++];
+				j++;
+			}
+		}
+		for(;i<len1;i++){
+			mergeArr[k++] = array1[i];
+		}
+		for(;j<len2;j++){
+			mergeArr[k++] = array1[j];
+		}
+		return  Arrays.copyOfRange(mergeArr, 0,k);
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArr = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0,newArr, 0,oldArray.length);
+		return newArr;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int k = 1;
+		if(max == 1){
+			return new int[0];
+		}
+		int[] fib = new int[max];
+		fib[0] = 1;
+		fib[1] = 1;
+		while(fib[k] < max)
+		{
+			k++;
+			fib[k] = fib[k-1]+fib[k-2];			
+		}
+		return  Arrays.copyOfRange(fib,0,k);
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] a = new int[max];
+		int k=0;
+        for (int z = 1; z<max; z++){
+                int j = 1;
+                for ( int i = 1; i<z; i++){
+                    if( z%i == 0){
+                         j++;
+                    }
+                } 
+                //����1�����������ܱ���������������ֻ�ܱ��������Σ�
+                if(j == 2){
+                    a[k++] = z;
+                }
+        } 
+		return Arrays.copyOfRange(a,0,k);
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] a = new int[max];
+		int k = 0;
+		for (int i = 1; i <= max; i++) {  			 
+            int temp = 0;// ��������֮�ͱ���    
+            for (int n = 1; n < i / 2 + 1; n++) {  
+                if (i % n == 0) {  
+                    temp += n;// �ܱ������ĳ����򱻼ӵ�temp��  
+                }  
+            }  
+            if (temp == i) {// �������֮����ԭ����ȵĻ���˵��������  
+                a[k++] = i;  
+            }  
+        }  
+		return Arrays.copyOfRange(a,0,k);
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if(array.length<=1)
+			return array.toString();
+		String desc = "";
+		for (int i = 0; i < array.length; i++) {
+			desc += array[i]+"-";
+		}
+		return desc.substring(0,desc.length()-1);
+	}
+}
\ No newline at end of file
diff --git a/group13/1392221554/lesson02/src/com/tiaozaoj/ArrayUtilTest.java b/group13/1392221554/lesson02/src/com/tiaozaoj/ArrayUtilTest.java
new file mode 100644
index 0000000000..11e164ec0d
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/ArrayUtilTest.java
@@ -0,0 +1,74 @@
+package com.tiaozaoj;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	public ArrayUtil util = new ArrayUtil();
+	
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] array1 = {7,9,30,3};
+		int[] array2 = {3,30,9,7};
+		Assert.assertArrayEquals(array2, util.reverseArray(array1));
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int except[] = {1,3,4,5,6,6,5,4,7,6,7,5};
+		Assert.assertArrayEquals(except,util.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] a3 = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(a3, util.merge(a1, a2));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] a = {2,3,6};
+		int[] b = {2,3,6,0,0,0};
+		int size = 3;
+		Assert.assertArrayEquals(b,util.grow(a,size));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] b = {1,1,2,3,5,8,13};
+		Assert.assertArrayEquals(b,util.fibonacci(15));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] b = {2,3,5,7,11,13,17,19};
+		Assert.assertArrayEquals(b,util.getPrimes(23));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] b = {6,28,496};
+		Assert.assertArrayEquals(b,util.getPerfectNumbers(1000));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] b = {6,28,496};
+		System.out.println(util.join(b, "-"));
+		Assert.assertEquals("6-28-496", util.join(b, "-"));
+	}
+
+}
diff --git a/group13/1392221554/lesson02/src/com/tiaozaoj/LoginAction.java b/group13/1392221554/lesson02/src/com/tiaozaoj/LoginAction.java
new file mode 100644
index 0000000000..86071b98b7
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/LoginAction.java
@@ -0,0 +1,39 @@
+package com.tiaozaoj;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @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/group13/1392221554/lesson02/src/com/tiaozaoj/LoginActionTest.java b/group13/1392221554/lesson02/src/com/tiaozaoj/LoginActionTest.java
new file mode 100644
index 0000000000..bfdf4f6065
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/LoginActionTest.java
@@ -0,0 +1,24 @@
+package com.tiaozaoj;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LoginActionTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testGetMessage() {
+		fail("��δʵ��");
+	}
+
+}
diff --git a/group13/1392221554/lesson02/src/com/tiaozaoj/Struts.java b/group13/1392221554/lesson02/src/com/tiaozaoj/Struts.java
new file mode 100644
index 0000000000..496d3c1905
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/Struts.java
@@ -0,0 +1,138 @@
+package com.tiaozaoj;
+
+import java.util.Map;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+public class Struts {	
+    /* 
+     *@param obj 操作的对象 
+     *@param att 操作的属性 
+     *@param value 设置的值 
+     *@param type 参数的类型 
+     */  
+    private static void setter(Object obj, String att, Object value, Class<?>type){  
+        try {  
+            Method met = obj.getClass().  
+                            getMethod("set" + initStr(att), type);  
+            met.invoke(obj, value);  
+        }catch (Exception e){  
+            e.printStackTrace();  
+        }  
+    }  
+    
+    private static String getter(Object obj, String att){  
+        try {  
+            Method met = obj.getClass().getMethod("get" + initStr(att)); 
+            return (String)met.invoke(obj);
+        }catch (Exception e){  
+            e.printStackTrace();  
+        }  
+        return null;
+    }  
+    private static String initStr(String name){   // 将单词的首字母大写  
+        name = name.substring(0, 1).toUpperCase() + name.substring(1);
+        return  name;  
+    }  
+    
+    private static String toLowerString(String name){   // 将单词的首字母大写  
+        name = name.substring(0, 1).toLowerCase() + name.substring(1);
+        return  name;  
+    }
+
+    public static View runAction(String actionName, Map<String,String> parameters){
+
+        /*
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	 SAXReader saxReader = new SAXReader();
+    	 try {
+    		 Document document = saxReader.read(new File("struts.xml"));
+    		// 获取根元素
+             Element root = document.getRootElement();         
+    
+             // 迭代输出
+             boolean flag = false;
+             String className = "";
+             Element action = null;
+             for (Iterator iter = root.elementIterator(); iter.hasNext();)
+             {            	 
+                 Element e = (Element) iter.next();
+                 if(e.attributeValue("name").equals(actionName)){
+                	 flag = true;
+                	 className = e.attributeValue("class");
+                	 action = e;
+                	 break;
+                 }             
+             }
+             if(!flag)
+            	 throw new Exception(actionName+"未定义");
+             
+             Class<?> clz = Class.forName(className);  
+             Constructor<?> c = clz.getConstructor();
+             Object obj = c.newInstance();
+             //通过for循环设置数据
+             for (String in : parameters.keySet()) {
+            	 setter(obj,in,parameters.get(in), String.class);  
+	         }
+             Method exc = clz.getDeclaredMethod("execute");
+             String res = (String)exc.invoke(obj);
+             
+             //获取所有getter方法
+             //Get the methods
+             Method[] methods = clz.getDeclaredMethods();
+             //Loop through the methods and print out their names
+             Map<String,String> params = new HashMap<String,String>();
+             
+             for (Method method : methods) {
+            	 String name = method.getName();
+            	 if(name.substring(0,3).equals("get")){
+            		 params.put(toLowerString(name.substring(3)),getter(obj,toLowerString(name.substring(3))));
+            	 }            	                 
+             }
+             View view = new View();
+             view.setParameters(params);             
+             //step 4
+             flag = false;
+             Element result = null;
+             List<Element> actionChildList = action.elements("result"); 
+             for (Iterator iter = action.elementIterator(); iter.hasNext();){            	 
+            	 Element e = (Element) iter.next();
+                 if(e.attributeValue("name").equals(res)){
+                	 flag = true;
+                	 result = e; 
+                	 break;
+                 }             
+             }
+             if(!flag)
+            	 throw new Exception(res+"未定义");
+             view.setJsp(result.getText());
+             return view;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}     
+    	return null;
+    }    
+}
diff --git a/group13/1392221554/lesson02/src/com/tiaozaoj/StrutsTest.java b/group13/1392221554/lesson02/src/com/tiaozaoj/StrutsTest.java
new file mode 100644
index 0000000000..05ea2da314
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/StrutsTest.java
@@ -0,0 +1,36 @@
+package com.tiaozaoj;
+
+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<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        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/group13/1392221554/lesson02/src/com/tiaozaoj/View.java b/group13/1392221554/lesson02/src/com/tiaozaoj/View.java
new file mode 100644
index 0000000000..abb4e363b2
--- /dev/null
+++ b/group13/1392221554/lesson02/src/com/tiaozaoj/View.java
@@ -0,0 +1,23 @@
+package com.tiaozaoj;
+
+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/group13/1641296572/lesson2/.gitignore b/group13/1641296572/lesson2/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group13/1641296572/lesson2/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group13/1641296572/lesson2/src/com/coderising/array/ArrayUtil.java b/group13/1641296572/lesson2/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..c39ceccf48
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,326 @@
+package com.coderising.array;
+
+public class ArrayUtil
+{
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin)
+	{
+		if (isEmpty(origin))
+		{
+			return;
+		}
+		int length = origin.length;
+		for (int i = 0, j = length - 1; i < j; i++, j--)
+		{
+			int tmp = origin[i];
+			origin[i] = origin[j];
+			origin[j] = tmp;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray)
+	{
+		if (isEmpty(oldArray))
+		{
+			return oldArray;
+		}
+		int length = oldArray.length;
+		int j = 0;
+		int[] tmp = new int[length];
+		for (int i = 0; i < length; i++)
+		{
+			if (oldArray[i] != 0)
+			{
+				tmp[j++] = oldArray[i];
+			}
+		}
+
+		if (j == length)
+		{
+			return oldArray;
+		} else
+		{
+			int[] rt = new int[j];
+			System.arraycopy(tmp, 0, rt, 0, j);
+			return rt;
+		}
+
+	}
+
+	private boolean isEmpty(int[] array)
+	{
+		return null == array || array.length == 0;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2)
+	{
+		if (isEmpty(array1) && isEmpty(array2))
+		{
+			if (null != array1)
+			{
+				return array1;
+			}
+			return array2;
+		}
+		int len1 = array1.length;
+		int len2 = array2.length;
+		int[] tmp = new int[len1 + len2];
+		int i = 0, j = 0, k = 0;
+		while (i < len1 && j < len2)
+		{
+			//如果array1[i]已经放入了
+			if(k>0 && tmp[k-1]==array1[i])
+			{
+				i++;
+				continue;
+			}
+			//如果array2[j]已经放入了
+			if(k>0 && tmp[k-1]==array2[j])
+			{
+				j++;
+				continue;
+			}
+
+			if (array1[i] < array2[j])
+			{
+				tmp[k++] = array1[i++];
+			} else if (array1[i] > array2[j])
+			{
+				tmp[k++] = array2[j++];
+			} else
+			{
+				tmp[k++] = array1[i++];
+				j++;
+			}
+		}
+		// 剩余的
+		while (i < len1)
+		{
+			//如果已经放入了
+			if(k>0 && tmp[k-1]==array1[i])
+			{
+				i++;
+				continue;
+			}
+			tmp[k++] = array1[i++];
+		}
+		while (j < len2)
+		{
+			//如果已经放入了
+			if(k>0 && tmp[k-1]==array2[j])
+			{
+				j++;
+				continue;
+			}
+			tmp[k++] = array2[j++];
+		}
+		if (k == len1 + len2)
+		{
+			return tmp;
+		}
+		int[] rt = new int[k];
+		System.arraycopy(tmp, 0, rt, 0, k);
+		return rt;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size)
+	{
+		if (size <= 0)
+		{
+			return oldArray;
+		}
+		if (isEmpty(oldArray))
+		{
+			return new int[size];
+		}
+		int length = oldArray.length;
+		int[] newArray = new int[length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, length);
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max)
+	{
+		if (max <= 0)
+		{
+			return null;
+		}
+		if (max == 1)
+		{
+			return new int[]
+			{ 1 };
+		}
+		if (max == 2)
+		{
+			return new int[]
+			{ 1, 1 };
+		}
+		int prepre = 1;
+		int pre = 1;
+		int now = 0;
+		int[] tmp = new int[max];
+		int i = 0;
+		while ((now = prepre + pre) <= max)
+		{
+			prepre = pre;
+			pre = now;
+			tmp[i++] = now;
+		}
+		int[] rt = new int[i + 2];
+		System.arraycopy(tmp, 0, rt, 2, i);
+		rt[0] = 1;
+		rt[1] = 1;
+		return rt;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max)
+	{
+		if (max <= 1)
+		{
+			return null;
+		}
+		int[] tmp = new int[max];
+		int k = 0;
+		for (int i = 2; i < max; i++)
+		{
+			if (isPrime(i))
+			{
+				tmp[k++] = i;
+			}
+		}
+		int[] rt = new int[k];
+		System.arraycopy(tmp, 0, rt, 0, k);
+		return rt;
+	}
+
+	private boolean isPrime(int num)
+	{
+		if (num == 2)
+		{
+			return true;
+		}
+		for (int i = 2; i <= Math.sqrt(num); i++)
+		{
+			if (num % i == 0)
+			{
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max)
+	{
+		if (max <= 0)
+		{
+			return null;
+		}
+		int[] tmp = new int[20];
+		int k = 0;
+		for (int i = 1; i < max; i++)
+		{
+			if (isPerfectNumber(i))
+			{
+				tmp[k++] = i;
+			}
+		}
+		int[] rt = new int[k];
+		System.arraycopy(tmp, 0, rt, 0, k);
+		return rt;
+	}
+
+	private boolean isPerfectNumber(int num)
+	{
+		if (num == 1)
+		{
+			return false;
+		}
+		int factorSum = 0;
+		for (int i = 1; i <= num / 2; i++)
+		{
+			// is factor
+			if (num % i == 0)
+			{
+				factorSum += i;
+			}
+		}
+		return factorSum == num;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator)
+	{
+		if (isEmpty(array))
+		{
+			return "";
+		}
+		int len = array.length;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < len - 1; i++)
+		{
+			sb.append(array[i]);
+			sb.append(seperator);
+		}
+		sb.append(array[len - 1]);
+		return sb.toString();
+	}
+
+}
diff --git a/group13/1641296572/lesson2/src/com/coderising/array/ArrayUtilTest.java b/group13/1641296572/lesson2/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..0247a09d98
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,140 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest
+{
+
+	@Test
+	public void revice1()
+	{
+		int[] a =
+		{ 7, 9, 30, 3 };
+		ArrayUtil au = new ArrayUtil();
+		au.reverseArray(a);
+		int[] expecteds =
+		{ 3, 30, 9, 7 };
+		Assert.assertArrayEquals(expecteds, a);
+	}
+
+	@Test
+	public void revice2()
+	{
+		int[] a =
+		{ 7, 9, 30, 3, 4 };
+		ArrayUtil au = new ArrayUtil();
+		au.reverseArray(a);
+		int[] expecteds =
+		{ 4, 3, 30, 9, 7 };
+		Assert.assertArrayEquals(expecteds, a);
+	}
+
+	@Test
+	public void removeZeroTest1()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int oldArr[] =
+		{ 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
+		int[] newArr = au.removeZero(oldArr);
+		int[] expecteds =
+		{ 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 };
+		Assert.assertArrayEquals(expecteds, newArr);
+
+	}
+
+	@Test
+	public void removeZeroTest2()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int oldArr[] =
+		{ 1 };
+		int[] newArr = au.removeZero(oldArr);
+		int[] expecteds =
+		{ 1 };
+		Assert.assertArrayEquals(expecteds, newArr);
+	}
+	
+	@Test
+	public void mergeTest1()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int [] a1 ={3, 5, 7,8};
+		int [] a2 = {4, 5, 6,7};
+		int [] expecteds ={3,4,5,6,7,8};
+		int [] a3 =au.merge(a1, a2);
+		Assert.assertArrayEquals(expecteds, a3);
+	}
+	
+	@Test
+	public void mergeTest2()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int [] a1 ={1, 1, 4,4};
+		int [] a2 = {1, 1};
+		int [] expecteds ={1,4};
+		int [] a3 =au.merge(a1, a2);
+		Assert.assertArrayEquals(expecteds, a3);
+	}
+	
+	@Test
+	public void growTest()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int []oldArray = {2,3,6};
+		int [] newArray = au.grow(oldArray, 3);
+		int [] expecteds = {2,3,6,0,0,0};
+		Assert.assertArrayEquals(expecteds, newArray);
+	}
+	
+	@Test
+	public void fibonacciTest1()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int []expecteds = {1,1,2,3,5,8,13};
+		int []actuals =au.fibonacci(13);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+	
+	@Test
+	public void getPrimesTest()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int []expecteds = {2,3,5,7,11,13,17,19};
+		int []actuals =au.getPrimes(20);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void getPerfectNumbersTest()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int []expecteds = {6};
+		int []actuals =au.getPerfectNumbers(13);
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+	
+	@Test
+	public void join()
+	{
+		ArrayUtil au = new ArrayUtil();
+		int []array= {3};
+		String expecteds = "3";
+		String str =au.join(array,"-");
+		Assert.assertEquals(expecteds,str);
+	}
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/group13/1641296572/lesson2/src/com/coderising/litestruts/ActionObject.java b/group13/1641296572/lesson2/src/com/coderising/litestruts/ActionObject.java
new file mode 100644
index 0000000000..438638444d
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/litestruts/ActionObject.java
@@ -0,0 +1,49 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ActionObject
+{
+	private String actionName;
+	private String actionClass;
+	private Map<String, String> resultMap = new HashMap<String, String>();
+
+	public String getActionName()
+	{
+		return actionName;
+	}
+
+	public void setActionName(String actionName)
+	{
+		this.actionName = actionName;
+	}
+
+	public String getActionClass()
+	{
+		return actionClass;
+	}
+
+	public void setActionClass(String actionClass)
+	{
+		this.actionClass = actionClass;
+	}
+
+	public Map<String, String> getResultMap()
+	{
+		return resultMap;
+	}
+
+	public void setResultMap(Map<String, String> resultMap)
+	{
+		this.resultMap = resultMap;
+	}
+
+	@Override
+	public String toString()
+	{
+		return actionName + ", " + actionClass + ", " + resultMap.get("success") + "," + resultMap.get("fail");
+
+	}
+
+}
diff --git a/group13/1641296572/lesson2/src/com/coderising/litestruts/LoginAction.java b/group13/1641296572/lesson2/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..11e2276590
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,50 @@
+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/group13/1641296572/lesson2/src/com/coderising/litestruts/Struts.java b/group13/1641296572/lesson2/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..14d7129679
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,162 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+/*
+ * 
+ * 0. 读取配置文件struts.xml
+ * 
+ * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+ * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+ * "password"="1234") , 那就应该调用 setName和setPassword方法
+ * 
+ * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+ * 
+ * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+ * {"message": "登录成功"} , 放到View对象的parameters
+ * 
+ * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+ * 放到View对象的jsp字段中。
+ * 
+ */
+public class Struts
+{
+	public static View runAction(String actionName, Map<String, String> parameters)
+
+	{
+		View view = new View();
+		
+		try
+		{
+			//0. 读取配置文件struts.xml
+			Map<String, ActionObject> actionMap = getActionMapFromXml(new File("struts.xml"));
+			//1.根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+			String className = actionMap.get(actionName).getActionClass();
+			Class<?> clazz = Class.forName(className);
+			Object action = clazz.newInstance();
+			
+			// 据parameters中的数据，调用对象的setter方法
+			Set<Entry<String, String>> entrySet = parameters.entrySet();
+			for (Entry<String, String> entry : entrySet)
+			{
+				String key = entry.getKey();
+				String value = entry.getValue();
+				Method method = null;
+				method = clazz.getDeclaredMethod("set" + upperFirstChar(key), String.class);
+				method.invoke(action, value);
+			}
+			
+			//2.通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+			Method executeMethod = null;
+			executeMethod = clazz.getDeclaredMethod("execute");
+			String resultMsg = (String) executeMethod.invoke(action);
+
+			//3.通过反射找到对象的所有getter方法,通过反射来调用， 把值和属性形成一个HashMap,放到View对象的parameters
+			Map<String, String> paraMap = new HashMap<String, String>();
+			// 用"get"+属性 来获取getter方法
+			Field[] fields = clazz.getDeclaredFields();
+			for (Field f : fields)
+			{
+				Method m = null;
+				m = clazz.getDeclaredMethod("get" + upperFirstChar(f.getName()));
+				String key = f.getName();
+				String value = (String) m.invoke(action);;
+				paraMap.put(key, value);
+			}
+			view.setParameters(paraMap);
+			
+			//4.根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。
+			String jsp = actionMap.get(actionName).getResultMap().get(resultMsg);
+			view.setJsp(jsp);
+			
+		} catch (ClassNotFoundException e)
+		{
+			e.printStackTrace();
+		} catch (InstantiationException e)
+		{
+			e.printStackTrace();
+		} catch (IllegalAccessException e)
+		{
+			e.printStackTrace();
+		} catch (IllegalArgumentException e)
+		{
+			e.printStackTrace();
+		} catch (InvocationTargetException e)
+		{
+			e.printStackTrace();
+		} catch (NoSuchMethodException e)
+		{
+			e.printStackTrace();
+		} catch (SecurityException e)
+		{
+			e.printStackTrace();
+		}
+
+		return view;
+	}
+
+
+	private static Map<String, ActionObject> getActionMapFromXml(File file)
+	{
+		SAXReader sr = new SAXReader();
+		Document dc = null;
+		try
+		{
+			dc = sr.read(file);
+		} catch (DocumentException e)
+		{
+			e.printStackTrace();
+			return null;
+		}
+		Map<String, ActionObject> actionMap = new HashMap<String, ActionObject>();
+		Element root = dc.getRootElement();
+		Iterator<Element> it = root.elementIterator();
+		while (it.hasNext())
+		{
+			Element ele = it.next();
+			ActionObject ao = new ActionObject();
+			ao.setActionName(ele.attribute("name").getText());
+			ao.setActionClass(ele.attribute("class").getText());
+			List<Element> subEles = ele.elements();
+			for (Element sub : subEles)
+			{
+				Map<String, String> map = ao.getResultMap();
+				map.put(sub.attribute("name").getText(), sub.getTextTrim());
+
+			}
+
+			actionMap.put(ao.getActionName(), ao);
+		}
+		return actionMap;
+	}
+
+	private static String upperFirstChar(String str)
+	{
+		if (null == str || str.length() == 0)
+		{
+			return "";
+		}
+
+		char[] chars = str.toCharArray();
+		if (chars[0] >= 'a' && chars[0] <= 'z')
+		{
+			chars[0] -= 32;
+		}
+		return new String(chars);
+	}
+
+}
diff --git a/group13/1641296572/lesson2/src/com/coderising/litestruts/StrutsTest.java b/group13/1641296572/lesson2/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..c212ab6c0f
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,42 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        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/group13/1641296572/lesson2/src/com/coderising/litestruts/View.java b/group13/1641296572/lesson2/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..41ee6afb98
--- /dev/null
+++ b/group13/1641296572/lesson2/src/com/coderising/litestruts/View.java
@@ -0,0 +1,31 @@
+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/group13/1641296572/lesson2/struts.xml b/group13/1641296572/lesson2/struts.xml
new file mode 100644
index 0000000000..70082e1208
--- /dev/null
+++ b/group13/1641296572/lesson2/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="fail">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group13/2729382520/L2/src/io/github/vxzh/struts/ArrayUtil.java b/group13/2729382520/L2/src/io/github/vxzh/struts/ArrayUtil.java
new file mode 100644
index 0000000000..9dbfde48ad
--- /dev/null
+++ b/group13/2729382520/L2/src/io/github/vxzh/struts/ArrayUtil.java
@@ -0,0 +1,218 @@
+package io.github.vxzh.struts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by vxzh on 28/02/2017.
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        for (int i = 0; i < (origin.length >> 1); i++) {
+            int temp = origin[i];
+            origin[i] = origin[origin.length - 1 - i];
+            origin[origin.length - 1 - i] = temp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+    public int[] removeZero(int[] oldArray) {
+        int count = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                count++;
+            }
+        }
+
+        int[] newArray = new int[count];
+        int j = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 2) {
+                newArray[j] = oldArray[i];
+                j++;
+            }
+        }
+
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public Integer[] merge(int[] array1, int[] array2) {
+
+        List<Integer> result = new ArrayList<Integer>();
+        int i = 0, j = 0;
+        while (i < array1.length && j < array2.length) {
+            if (i != array1.length - 1 && array1[i] == array1[i + 1]) {
+                i++;
+                continue;
+            }
+            if (j != array2.length - 1 && array2[j] == array2[j + 1]) {
+                j++;
+                continue;
+            }
+            if (array1[i] > array2[j]) {
+                result.add(array2[j++]);
+            } else if (array1[i] < array2[j]) {
+                result.add(array1[i++]);
+            } else if (array1[i] == array2[j]) {
+                result.add(array1[i]);
+                i++;
+                j++;
+            }
+        }
+        while (i < array1.length) {
+            result.add(array1[i++]);
+        }
+        while (j < array2.length) {
+            result.add(array2[j++]);
+        }
+        return result.toArray(new Integer[result.size()]);
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        for (int i = 0; i < oldArray.length; i++) {
+            newArray[i] = oldArray[i];
+        }
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public Integer[] fibonacci(int max) {
+        if (max <= 1)
+            return new Integer[0];
+        List<Integer> list = new ArrayList<Integer>();
+        list.add(1);
+        list.add(1);
+        int last = 1;
+        int count = list.size();
+        while (last < max) {
+            int x = list.get(count - 1) + list.get(count - 2);
+            list.add(x);
+            count++;
+            last = x;
+        }
+
+        list.remove(count - 1);
+        return list.toArray(new Integer[list.size()]);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public Integer[] getPrimes(int max) {
+        List<Integer> list = new ArrayList<Integer>();
+        if (max < 2)
+            return new Integer[0];
+        else if (max == 2)
+            return new Integer[]{2};
+        else {
+            list.add(2);
+            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) {
+                    list.add(i);
+                }
+            }
+            if (list.get(list.size() - 1) >= max)
+                list.remove(list.size() - 1);
+        }
+
+        return list.toArray(new Integer[list.size()]);
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public Integer[] getPerfectNumbers(int max) {
+        List<Integer> list = new ArrayList<Integer>();
+        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) {
+                System.out.println(i);
+                list.add(i);
+            }
+        }
+
+        return list.toArray(new Integer[list.size()]);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            if (i == array.length - 1)
+                builder.append(array[i]);
+            else
+                builder.append(array[i]).append(seperator);
+        }
+        return builder.toString();
+    }
+
+}
diff --git a/group13/2729382520/L2/src/io/github/vxzh/struts/LoginAction.java b/group13/2729382520/L2/src/io/github/vxzh/struts/LoginAction.java
new file mode 100644
index 0000000000..4638552916
--- /dev/null
+++ b/group13/2729382520/L2/src/io/github/vxzh/struts/LoginAction.java
@@ -0,0 +1,40 @@
+package io.github.vxzh.struts;
+
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ */
+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/group13/2729382520/L2/src/io/github/vxzh/struts/Struts.java b/group13/2729382520/L2/src/io/github/vxzh/struts/Struts.java
new file mode 100644
index 0000000000..be549e95dd
--- /dev/null
+++ b/group13/2729382520/L2/src/io/github/vxzh/struts/Struts.java
@@ -0,0 +1,98 @@
+package io.github.vxzh.struts;
+
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Created by vxzh on 28/02/2017.
+ */
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters)
+            throws DocumentException, ClassNotFoundException, IllegalAccessException,
+            InstantiationException, NoSuchMethodException, InvocationTargetException {
+
+        Map<String, String> map = parseXML(actionName, "/Users/zzzz/Documents/IdeaProjects/demo/src/io/github/vxzh/struts/struts.xml");
+
+
+        /**
+         * 1. 根据actionName找到相对应的class, 例如LoginAction, 通过反射实例化（创建对象）
+         *    据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+         *    ("name"="test" ,"password"="1234") ,那就应该调用setName和setPassword方法
+         */
+        Class clz = Class.forName(map.get(actionName));
+        LoginAction loginAction = (LoginAction) clz.newInstance();
+        Method name = clz.getMethod("setName", String.class);
+        Method password = clz.getMethod("setPassword", String.class);
+        name.invoke(loginAction, parameters.get("name"));
+        password.invoke(loginAction, parameters.get("password"));
+
+        /**
+         * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+         */
+        Method exectue = clz.getMethod("execute");
+        String str = (String) exectue.invoke(loginAction);
+        map.put("returnValue", str);
+
+        /**
+         * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+         *    通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+         *    放到View对象的parameters
+         */
+        Method getMessage = clz.getMethod("getMessage");
+        String message = (String) getMessage.invoke(loginAction);
+        Map<String, String> hashMap = new HashMap<>();
+        hashMap.put("message", message);
+
+
+        /**
+         * 4. 根据struts.xml中的 <result> 配置, 以及execute的返回值, 确定哪一个jsp，
+         *    放到View对象的jsp字段中。
+         */
+        View view = new View();
+        view.setParameters(hashMap);
+        String jsp = map.get(map.get("returnValue"));
+        view.setJsp(jsp);
+        return view;
+    }
+
+    public static Map<String, String> parseXML(String actionName, String path) throws DocumentException {
+        SAXReader saxReader = new SAXReader();
+        File file = new File(path);
+        Document document = saxReader.read(file);
+
+        //获取根节点对象
+        Element root = document.getRootElement();
+        Element actionElement = null;
+        HashMap<String, String> map = new HashMap<>();
+        for (Iterator i = root.elementIterator(); i.hasNext(); ) {
+            Element element = (Element) i.next();
+            String name = element.attributeValue("name");
+            String clazz = element.attributeValue("class");
+            if (actionName.equals(name)) {
+                actionElement = element;
+                map.put(name, clazz);
+            }
+        }
+
+        for (Iterator j = actionElement.elementIterator(); j.hasNext(); ) {
+            Element elem = (Element) j.next();
+            String resultName = elem.attributeValue("name");
+            String jsp = elem.getText();
+            map.put(resultName, jsp);
+        }
+
+        return map;
+    }
+
+}
diff --git a/group13/2729382520/L2/src/io/github/vxzh/struts/StrutsTest.java b/group13/2729382520/L2/src/io/github/vxzh/struts/StrutsTest.java
new file mode 100644
index 0000000000..1c33f3da30
--- /dev/null
+++ b/group13/2729382520/L2/src/io/github/vxzh/struts/StrutsTest.java
@@ -0,0 +1,48 @@
+package io.github.vxzh.struts;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * Created by vxzh on 28/02/2017.
+ */
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "1234");
+
+        try {
+            View view = Struts.runAction(actionName, params);
+            Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+            Assert.assertEquals("login successful", view.getParameters().get("message"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testLoginActionFailed() {
+        String actionName = "login";
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        try {
+            View view = Struts.runAction(actionName, params);
+            Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+            Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/group13/2729382520/L2/src/io/github/vxzh/struts/View.java b/group13/2729382520/L2/src/io/github/vxzh/struts/View.java
new file mode 100644
index 0000000000..558afc5d0f
--- /dev/null
+++ b/group13/2729382520/L2/src/io/github/vxzh/struts/View.java
@@ -0,0 +1,29 @@
+package io.github.vxzh.struts;
+
+import java.util.Map;
+
+/**
+ * Created by vxzh on 28/02/2017.
+ */
+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/group13/2729382520/L2/src/io/github/vxzh/struts/struts.xml b/group13/2729382520/L2/src/io/github/vxzh/struts/struts.xml
new file mode 100644
index 0000000000..10c89781dc
--- /dev/null
+++ b/group13/2729382520/L2/src/io/github/vxzh/struts/struts.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="io.github.vxzh.struts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+
+    <action name="logout" class="">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties b/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties
new file mode 100644
index 0000000000..6ac27da3d4
--- /dev/null
+++ b/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties
@@ -0,0 +1 @@
+#Sun Mar 05 17:01:38 CST 2017
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock b/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock
new file mode 100644
index 0000000000..e526851619
Binary files /dev/null and b/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock differ
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin b/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin
new file mode 100644
index 0000000000..df74348046
Binary files /dev/null and b/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin differ
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin b/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin
new file mode 100644
index 0000000000..d65e698bbc
Binary files /dev/null and b/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin differ
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin b/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin
new file mode 100644
index 0000000000..69a7010d72
Binary files /dev/null and b/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin differ
diff --git a/group13/2931408816/.idea/compiler.xml b/group13/2931408816/.idea/compiler.xml
new file mode 100644
index 0000000000..0d7b2e2077
--- /dev/null
+++ b/group13/2931408816/.idea/compiler.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <bytecodeTargetLevel>
+      <module name="2931408816_main" target="1.8" />
+      <module name="2931408816_test" target="1.8" />
+      <module name="lesson1_main" target="1.8" />
+      <module name="lesson1_test" target="1.8" />
+      <module name="lesson2_main" target="1.8" />
+      <module name="lesson2_test" target="1.8" />
+    </bytecodeTargetLevel>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/gradle.xml b/group13/2931408816/.idea/gradle.xml
new file mode 100644
index 0000000000..8f375ca523
--- /dev/null
+++ b/group13/2931408816/.idea/gradle.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="createEmptyContentRootDirectories" value="true" />
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="1.8" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/lesson1" />
+            <option value="$PROJECT_DIR$/lesson2" />
+          </set>
+        </option>
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/kotlinc.xml b/group13/2931408816/.idea/kotlinc.xml
new file mode 100644
index 0000000000..1c24f9a8de
--- /dev/null
+++ b/group13/2931408816/.idea/kotlinc.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="KotlinCommonCompilerArguments">
+    <option name="languageVersion" value="1.1" />
+    <option name="apiVersion" value="1.1" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__com_thoughtworks_xstream_xstream_1_4_9.xml b/group13/2931408816/.idea/libraries/Gradle__com_thoughtworks_xstream_xstream_1_4_9.xml
new file mode 100644
index 0000000000..e43ac7093d
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__com_thoughtworks_xstream_xstream_1_4_9.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: com.thoughtworks.xstream:xstream:1.4.9">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.thoughtworks.xstream/xstream/1.4.9/c43f6e6bfa79b56e04a8898a923c3cf7144dd460/xstream-1.4.9.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.thoughtworks.xstream/xstream/1.4.9/a9eb7942e1c58d99d53226b13cc21b4b88cb5cab/xstream-1.4.9-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__junit_junit_4_11.xml b/group13/2931408816/.idea/libraries/Gradle__junit_junit_4_11.xml
new file mode 100644
index 0000000000..dc26b345fb
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__junit_junit_4_11.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: junit:junit:4.11">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/28e0ad201304e4a4abf999ca0570b7cffc352c3c/junit-4.11-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/group13/2931408816/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000000..8262f729c2
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.hamcrest:hamcrest-core:1.3">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b/hamcrest-core-1.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000000..4f32fdef28
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.jetbrains:annotations:13.0">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_0.xml b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_0.xml
new file mode 100644
index 0000000000..8a8a09208b
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_0.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre7_1_1_0.xml b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre7_1_1_0.xml
new file mode 100644
index 0000000000..3e2df0e854
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre7_1_1_0.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.0/ef03cfed144ff47eed2cab1f7be4381bc18a6237/kotlin-stdlib-jre7-1.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.0/b00a8e969925ea1383e48775eb126cc975340c1e/kotlin-stdlib-jre7-1.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre8_1_1_0.xml b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre8_1_1_0.xml
new file mode 100644
index 0000000000..7c2630cd99
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre8_1_1_0.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.0/89c9fbaa9c33c98e590959d50fca9e21bad96b9a/kotlin-stdlib-jre8-1.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.0/987085e43c983b76acfff1429fe551f81a91d12a/kotlin-stdlib-jre8-1.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__xmlpull_xmlpull_1_1_3_1.xml b/group13/2931408816/.idea/libraries/Gradle__xmlpull_xmlpull_1_1_3_1.xml
new file mode 100644
index 0000000000..bb8ebc9b65
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__xmlpull_xmlpull_1_1_3_1.xml
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="Gradle: xmlpull:xmlpull:1.1.3.1">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/xmlpull/xmlpull/1.1.3.1/2b8e230d2ab644e4ecaa94db7cdedbc40c805dfa/xmlpull-1.1.3.1.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/libraries/Gradle__xpp3_xpp3_min_1_1_4c.xml b/group13/2931408816/.idea/libraries/Gradle__xpp3_xpp3_min_1_1_4c.xml
new file mode 100644
index 0000000000..fa9b59fe31
--- /dev/null
+++ b/group13/2931408816/.idea/libraries/Gradle__xpp3_xpp3_min_1_1_4c.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: xpp3:xpp3_min:1.1.4c">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/xpp3/xpp3_min/1.1.4c/19d4e90b43059058f6e056f794f0ea4030d60b86/xpp3_min-1.1.4c.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/xpp3/xpp3_min/1.1.4c/fffe25ec1f20ec1cfdc0edd41c6e0d55bc0dbaf5/xpp3_min-1.1.4c-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/misc.xml b/group13/2931408816/.idea/misc.xml
new file mode 100644
index 0000000000..2f25276f7b
--- /dev/null
+++ b/group13/2931408816/.idea/misc.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ClientPropertiesManager">
+    <properties class="javax.swing.AbstractButton">
+      <property name="hideActionText" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JComponent">
+      <property name="html.disable" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JEditorPane">
+      <property name="JEditorPane.w3cLengthUnits" class="java.lang.Boolean" />
+      <property name="JEditorPane.honorDisplayProperties" class="java.lang.Boolean" />
+      <property name="charset" class="java.lang.String" />
+    </properties>
+    <properties class="javax.swing.JList">
+      <property name="List.isFileList" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JPasswordField">
+      <property name="JPasswordField.cutCopyAllowed" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JSlider">
+      <property name="Slider.paintThumbArrowShape" class="java.lang.Boolean" />
+      <property name="JSlider.isFilled" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JTable">
+      <property name="Table.isFileList" class="java.lang.Boolean" />
+      <property name="JTable.autoStartsEdit" class="java.lang.Boolean" />
+      <property name="terminateEditOnFocusLost" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JToolBar">
+      <property name="JToolBar.isRollover" class="java.lang.Boolean" />
+    </properties>
+    <properties class="javax.swing.JTree">
+      <property name="JTree.lineStyle" class="java.lang.String" />
+    </properties>
+    <properties class="javax.swing.text.JTextComponent">
+      <property name="caretAspectRatio" class="java.lang.Double" />
+      <property name="caretWidth" class="java.lang.Integer" />
+    </properties>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ProjectJDKs.UI">
+        <settings>
+          <last-edited>1.8</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+    </states>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules.xml b/group13/2931408816/.idea/modules.xml
new file mode 100644
index 0000000000..d9e9ddf0b5
--- /dev/null
+++ b/group13/2931408816/.idea/modules.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/2931408816.iml" filepath="$PROJECT_DIR$/.idea/modules/2931408816.iml" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/2931408816_main.iml" filepath="$PROJECT_DIR$/.idea/modules/2931408816_main.iml" group="2931408816" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/2931408816_test.iml" filepath="$PROJECT_DIR$/.idea/modules/2931408816_test.iml" group="2931408816" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson1/lesson1.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson1/lesson1.iml" group="lesson1" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson1/lesson1_main.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson1/lesson1_main.iml" group="lesson1" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson1/lesson1_test.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson1/lesson1_test.iml" group="lesson1" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson2/lesson2.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson2/lesson2.iml" group="lesson2" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson2/lesson2_main.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson2/lesson2_main.iml" group="lesson2" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson2/lesson2_test.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson2/lesson2_test.iml" group="lesson2" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/2931408816.iml b/group13/2931408816/.idea/modules/2931408816.iml
new file mode 100644
index 0000000000..0716f40f99
--- /dev/null
+++ b/group13/2931408816/.idea/modules/2931408816.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="2931408816" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../..">
+      <excludeFolder url="file://$MODULE_DIR$/../../.gradle" />
+      <excludeFolder url="file://$MODULE_DIR$/../../build" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/2931408816_main.iml b/group13/2931408816/.idea/modules/2931408816_main.iml
new file mode 100644
index 0000000000..b42899ee6a
--- /dev/null
+++ b/group13/2931408816/.idea/modules/2931408816_main.iml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="2931408816:main" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.type="sourceSet" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="kotlin-language" name="Kotlin">
+      <configuration version="1">
+        <option name="compilerInfo">
+          <KotlinCompilerInfo>
+            <option name="compilerSettings">
+              <CompilerSettings />
+            </option>
+            <option name="k2jsCompilerArguments">
+              <K2JSCompilerArguments />
+            </option>
+            <option name="k2jvmCompilerArguments">
+              <K2JVMCompilerArguments>
+                <option name="noStdlib" value="true" />
+                <option name="noReflect" value="true" />
+                <option name="moduleName" value="2931408816_main" />
+                <option name="jvmTarget" value="1.6" />
+                <option name="addCompilerBuiltIns" value="true" />
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="coroutinesWarn" value="true" />
+              </K2JVMCompilerArguments>
+            </option>
+            <option name="_commonCompilerArguments">
+              <DummyImpl>
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="pluginClasspaths">
+                  <array />
+                </option>
+                <option name="coroutinesWarn" value="true" />
+                <option name="pluginOptions">
+                  <array />
+                </option>
+              </DummyImpl>
+            </option>
+          </KotlinCompilerInfo>
+        </option>
+        <option name="useProjectSettings" value="false" />
+        <option name="versionInfo">
+          <KotlinVersionInfo>
+            <option name="apiLevel" value="1.1" />
+            <option name="languageLevel" value="1.1" />
+            <option name="targetPlatformName" value="JVM 1.6" />
+          </KotlinVersionInfo>
+        </option>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../../build/classes/main" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../src/main">
+      <sourceFolder url="file://$MODULE_DIR$/../../src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../../src/main/kotlin" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../../src/main/resources" type="java-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/2931408816_test.iml b/group13/2931408816/.idea/modules/2931408816_test.iml
new file mode 100644
index 0000000000..971cde76ba
--- /dev/null
+++ b/group13/2931408816/.idea/modules/2931408816_test.iml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="2931408816:test" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.type="sourceSet" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="kotlin-language" name="Kotlin">
+      <configuration version="1">
+        <option name="compilerInfo">
+          <KotlinCompilerInfo>
+            <option name="compilerSettings">
+              <CompilerSettings />
+            </option>
+            <option name="k2jsCompilerArguments">
+              <K2JSCompilerArguments />
+            </option>
+            <option name="k2jvmCompilerArguments">
+              <K2JVMCompilerArguments>
+                <option name="noStdlib" value="true" />
+                <option name="noReflect" value="true" />
+                <option name="moduleName" value="2931408816_main" />
+                <option name="jvmTarget" value="1.6" />
+                <option name="addCompilerBuiltIns" value="true" />
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="coroutinesWarn" value="true" />
+              </K2JVMCompilerArguments>
+            </option>
+            <option name="_commonCompilerArguments">
+              <DummyImpl>
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="pluginClasspaths">
+                  <array />
+                </option>
+                <option name="coroutinesWarn" value="true" />
+                <option name="pluginOptions">
+                  <array />
+                </option>
+              </DummyImpl>
+            </option>
+          </KotlinCompilerInfo>
+        </option>
+        <option name="useProjectSettings" value="false" />
+        <option name="versionInfo">
+          <KotlinVersionInfo>
+            <option name="apiLevel" value="1.1" />
+            <option name="languageLevel" value="1.1" />
+            <option name="targetPlatformName" value="JVM 1.6" />
+          </KotlinVersionInfo>
+        </option>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output-test url="file://$MODULE_DIR$/../../build/classes/test" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../src/test">
+      <sourceFolder url="file://$MODULE_DIR$/../../src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/../../src/test/kotlin" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/../../src/test/resources" type="java-test-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="2931408816_main" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: junit:junit:4.11" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
+  </component>
+  <component name="TestModuleProperties" production-module="2931408816_main" />
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/lesson1/lesson1.iml b/group13/2931408816/.idea/modules/lesson1/lesson1.iml
new file mode 100644
index 0000000000..6ddcfffd2b
--- /dev/null
+++ b/group13/2931408816/.idea/modules/lesson1/lesson1.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":lesson1" external.linked.project.path="$MODULE_DIR$/../../../lesson1" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../../lesson1">
+      <excludeFolder url="file://$MODULE_DIR$/../../../lesson1/.gradle" />
+      <excludeFolder url="file://$MODULE_DIR$/../../../lesson1/build" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/lesson1/lesson1_main.iml b/group13/2931408816/.idea/modules/lesson1/lesson1_main.iml
new file mode 100644
index 0000000000..baff9579ff
--- /dev/null
+++ b/group13/2931408816/.idea/modules/lesson1/lesson1_main.iml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":lesson1:main" external.linked.project.path="$MODULE_DIR$/../../../lesson1" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.type="sourceSet" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="kotlin-language" name="Kotlin">
+      <configuration version="1">
+        <option name="compilerInfo">
+          <KotlinCompilerInfo>
+            <option name="compilerSettings">
+              <CompilerSettings />
+            </option>
+            <option name="k2jsCompilerArguments">
+              <K2JSCompilerArguments />
+            </option>
+            <option name="k2jvmCompilerArguments">
+              <K2JVMCompilerArguments>
+                <option name="noStdlib" value="true" />
+                <option name="noReflect" value="true" />
+                <option name="moduleName" value="lesson1_main" />
+                <option name="jvmTarget" value="1.6" />
+                <option name="addCompilerBuiltIns" value="true" />
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="coroutinesWarn" value="true" />
+              </K2JVMCompilerArguments>
+            </option>
+            <option name="_commonCompilerArguments">
+              <DummyImpl>
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="pluginClasspaths">
+                  <array />
+                </option>
+                <option name="coroutinesWarn" value="true" />
+                <option name="pluginOptions">
+                  <array />
+                </option>
+              </DummyImpl>
+            </option>
+          </KotlinCompilerInfo>
+        </option>
+        <option name="useProjectSettings" value="false" />
+        <option name="versionInfo">
+          <KotlinVersionInfo>
+            <option name="apiLevel" value="1.1" />
+            <option name="languageLevel" value="1.1" />
+            <option name="targetPlatformName" value="JVM 1.6" />
+          </KotlinVersionInfo>
+        </option>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../../../lesson1/build/classes/main" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../../lesson1/src/main">
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson1/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson1/src/main/kotlin" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson1/src/main/resources" type="java-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/lesson1/lesson1_test.iml b/group13/2931408816/.idea/modules/lesson1/lesson1_test.iml
new file mode 100644
index 0000000000..be6102deeb
--- /dev/null
+++ b/group13/2931408816/.idea/modules/lesson1/lesson1_test.iml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":lesson1:test" external.linked.project.path="$MODULE_DIR$/../../../lesson1" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.type="sourceSet" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="kotlin-language" name="Kotlin">
+      <configuration version="1">
+        <option name="compilerInfo">
+          <KotlinCompilerInfo>
+            <option name="compilerSettings">
+              <CompilerSettings />
+            </option>
+            <option name="k2jsCompilerArguments">
+              <K2JSCompilerArguments />
+            </option>
+            <option name="k2jvmCompilerArguments">
+              <K2JVMCompilerArguments>
+                <option name="noStdlib" value="true" />
+                <option name="noReflect" value="true" />
+                <option name="moduleName" value="lesson1_main" />
+                <option name="jvmTarget" value="1.6" />
+                <option name="addCompilerBuiltIns" value="true" />
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="coroutinesWarn" value="true" />
+              </K2JVMCompilerArguments>
+            </option>
+            <option name="_commonCompilerArguments">
+              <DummyImpl>
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="pluginClasspaths">
+                  <array />
+                </option>
+                <option name="coroutinesWarn" value="true" />
+                <option name="pluginOptions">
+                  <array />
+                </option>
+              </DummyImpl>
+            </option>
+          </KotlinCompilerInfo>
+        </option>
+        <option name="useProjectSettings" value="false" />
+        <option name="versionInfo">
+          <KotlinVersionInfo>
+            <option name="apiLevel" value="1.1" />
+            <option name="languageLevel" value="1.1" />
+            <option name="targetPlatformName" value="JVM 1.6" />
+          </KotlinVersionInfo>
+        </option>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output-test url="file://$MODULE_DIR$/../../../lesson1/build/classes/test" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../../lesson1/src/test">
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson1/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson1/src/test/kotlin" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson1/src/test/resources" type="java-test-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="lesson1_main" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: junit:junit:4.11" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
+  </component>
+  <component name="TestModuleProperties" production-module="lesson1_main" />
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/lesson2/lesson2.iml b/group13/2931408816/.idea/modules/lesson2/lesson2.iml
new file mode 100644
index 0000000000..5703c11139
--- /dev/null
+++ b/group13/2931408816/.idea/modules/lesson2/lesson2.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":lesson2" external.linked.project.path="$MODULE_DIR$/../../../lesson2" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../../lesson2">
+      <excludeFolder url="file://$MODULE_DIR$/../../../lesson2/.gradle" />
+      <excludeFolder url="file://$MODULE_DIR$/../../../lesson2/build" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/lesson2/lesson2_main.iml b/group13/2931408816/.idea/modules/lesson2/lesson2_main.iml
new file mode 100644
index 0000000000..8772697868
--- /dev/null
+++ b/group13/2931408816/.idea/modules/lesson2/lesson2_main.iml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":lesson2:main" external.linked.project.path="$MODULE_DIR$/../../../lesson2" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.type="sourceSet" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="kotlin-language" name="Kotlin">
+      <configuration version="1">
+        <option name="compilerInfo">
+          <KotlinCompilerInfo>
+            <option name="compilerSettings">
+              <CompilerSettings />
+            </option>
+            <option name="k2jsCompilerArguments">
+              <K2JSCompilerArguments />
+            </option>
+            <option name="k2jvmCompilerArguments">
+              <K2JVMCompilerArguments>
+                <option name="noStdlib" value="true" />
+                <option name="noReflect" value="true" />
+                <option name="moduleName" value="lesson2_main" />
+                <option name="jvmTarget" value="1.6" />
+                <option name="addCompilerBuiltIns" value="true" />
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="coroutinesWarn" value="true" />
+              </K2JVMCompilerArguments>
+            </option>
+            <option name="_commonCompilerArguments">
+              <DummyImpl>
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="pluginClasspaths">
+                  <array />
+                </option>
+                <option name="coroutinesWarn" value="true" />
+                <option name="pluginOptions">
+                  <array />
+                </option>
+              </DummyImpl>
+            </option>
+          </KotlinCompilerInfo>
+        </option>
+        <option name="useProjectSettings" value="false" />
+        <option name="versionInfo">
+          <KotlinVersionInfo>
+            <option name="apiLevel" value="1.1" />
+            <option name="languageLevel" value="1.1" />
+            <option name="targetPlatformName" value="JVM 1.6" />
+          </KotlinVersionInfo>
+        </option>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../../../lesson2/build/classes/main" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../../lesson2/src/main">
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson2/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson2/src/main/kotlin" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson2/src/main/resources" type="java-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: xmlpull:xmlpull:1.1.3.1" level="project" />
+    <orderEntry type="library" name="Gradle: xpp3:xpp3_min:1.1.4c" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/modules/lesson2/lesson2_test.iml b/group13/2931408816/.idea/modules/lesson2/lesson2_test.iml
new file mode 100644
index 0000000000..fef2346a6d
--- /dev/null
+++ b/group13/2931408816/.idea/modules/lesson2/lesson2_test.iml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":lesson2:test" external.linked.project.path="$MODULE_DIR$/../../../lesson2" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="cn.net.pikachu" external.system.module.type="sourceSet" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="kotlin-language" name="Kotlin">
+      <configuration version="1">
+        <option name="compilerInfo">
+          <KotlinCompilerInfo>
+            <option name="compilerSettings">
+              <CompilerSettings />
+            </option>
+            <option name="k2jsCompilerArguments">
+              <K2JSCompilerArguments />
+            </option>
+            <option name="k2jvmCompilerArguments">
+              <K2JVMCompilerArguments>
+                <option name="noStdlib" value="true" />
+                <option name="noReflect" value="true" />
+                <option name="moduleName" value="lesson2_main" />
+                <option name="jvmTarget" value="1.6" />
+                <option name="addCompilerBuiltIns" value="true" />
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="coroutinesWarn" value="true" />
+              </K2JVMCompilerArguments>
+            </option>
+            <option name="_commonCompilerArguments">
+              <DummyImpl>
+                <option name="languageVersion" value="1.1" />
+                <option name="apiVersion" value="1.1" />
+                <option name="pluginClasspaths">
+                  <array />
+                </option>
+                <option name="coroutinesWarn" value="true" />
+                <option name="pluginOptions">
+                  <array />
+                </option>
+              </DummyImpl>
+            </option>
+          </KotlinCompilerInfo>
+        </option>
+        <option name="useProjectSettings" value="false" />
+        <option name="versionInfo">
+          <KotlinVersionInfo>
+            <option name="apiLevel" value="1.1" />
+            <option name="languageLevel" value="1.1" />
+            <option name="targetPlatformName" value="JVM 1.6" />
+          </KotlinVersionInfo>
+        </option>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output-test url="file://$MODULE_DIR$/../../../lesson2/build/classes/test" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../../lesson2/src/test">
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson2/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson2/src/test/kotlin" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/../../../lesson2/src/test/resources" type="java-test-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="lesson2_main" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
+    <orderEntry type="library" name="Gradle: junit:junit:4.11" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: xmlpull:xmlpull:1.1.3.1" level="project" />
+    <orderEntry type="library" name="Gradle: xpp3:xpp3_min:1.1.4c" level="project" />
+    <orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
+  </component>
+  <component name="TestModuleProperties" production-module="lesson2_main" />
+</module>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/workspace.xml b/group13/2931408816/.idea/workspace.xml
new file mode 100644
index 0000000000..19b768c7b6
--- /dev/null
+++ b/group13/2931408816/.idea/workspace.xml
@@ -0,0 +1,1781 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="c408ce92-cf33-4b29-9914-8fa209c7c738" name="Default" comment="" />
+    <ignored path="$PROJECT_DIR$/out/" />
+    <ignored path="$PROJECT_DIR$/.gradle/" />
+    <ignored path="$PROJECT_DIR$/build/" />
+    <ignored path="$PROJECT_DIR$/lesson1/.gradle/" />
+    <ignored path="$PROJECT_DIR$/lesson1/build/" />
+    <ignored path="$PROJECT_DIR$/lesson2/.gradle/" />
+    <ignored path="$PROJECT_DIR$/lesson2/build/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="CreatePatchCommitExecutor">
+    <option name="PATCH_PATH" value="" />
+  </component>
+  <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
+  <component name="ExternalProjectsData">
+    <projectState path="$PROJECT_DIR$">
+      <ProjectState />
+    </projectState>
+  </component>
+  <component name="ExternalProjectsManager">
+    <system id="GRADLE">
+      <state>
+        <task path="$PROJECT_DIR$">
+          <activation />
+        </task>
+        <task path="$PROJECT_DIR$/lesson1">
+          <activation />
+        </task>
+        <task path="$PROJECT_DIR$/lesson2">
+          <activation />
+        </task>
+        <projects_view>
+          <tree_state>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value=":lesson2" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="Run Configurations" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.RunConfigurationsNode" />
+              </PATH_ELEMENT>
+            </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value=":lesson2" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="Tasks" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.TasksNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="verification" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.TasksNode$1" />
+              </PATH_ELEMENT>
+            </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value=":lesson2" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="Tasks" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.TasksNode" />
+              </PATH_ELEMENT>
+            </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value=":lesson2" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+            </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+            </PATH>
+          </tree_state>
+        </projects_view>
+      </state>
+    </system>
+  </component>
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file leaf-file-name="build.gradle" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="567">
+              <caret line="27" column="80" lean-forward="false" selection-start-line="27" selection-start-column="80" selection-end-line="27" selection-end-column="80" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="build.gradle" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/build.gradle">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="357">
+              <caret line="17" column="25" lean-forward="false" selection-start-line="17" selection-start-column="25" selection-end-line="17" selection-end-column="25" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="StrutsTest.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="105">
+              <caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="ArrayUtil.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="-2562">
+              <caret line="18" column="42" lean-forward="true" selection-start-line="18" selection-start-column="42" selection-end-line="18" selection-end-column="42" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="Struts.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="189">
+              <caret line="28" column="16" lean-forward="true" selection-start-line="28" selection-start-column="16" selection-end-line="28" selection-end-column="16" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="GradleLocalSettings">
+    <option name="myGradleHomes">
+      <map>
+        <entry key="$PROJECT_DIR$" value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1" />
+      </map>
+    </option>
+    <option name="myGradleVersions">
+      <map>
+        <entry key="$PROJECT_DIR$" value="3.1" />
+      </map>
+    </option>
+    <option name="availableProjects">
+      <map>
+        <entry>
+          <key>
+            <ExternalProjectPojo>
+              <option name="name" value="2931408816" />
+              <option name="path" value="$PROJECT_DIR$" />
+            </ExternalProjectPojo>
+          </key>
+          <value>
+            <list>
+              <ExternalProjectPojo>
+                <option name="name" value="2931408816" />
+                <option name="path" value="$PROJECT_DIR$" />
+              </ExternalProjectPojo>
+              <ExternalProjectPojo>
+                <option name="name" value=":lesson1" />
+                <option name="path" value="$PROJECT_DIR$/lesson1" />
+              </ExternalProjectPojo>
+              <ExternalProjectPojo>
+                <option name="name" value=":lesson2" />
+                <option name="path" value="$PROJECT_DIR$/lesson2" />
+              </ExternalProjectPojo>
+            </list>
+          </value>
+        </entry>
+      </map>
+    </option>
+    <option name="availableTasks">
+      <map>
+        <entry key="$PROJECT_DIR$">
+          <value>
+            <list>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the components produced by root project '2931408816'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="components" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="buildDependents" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the sub-projects of root project '2931408816'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="projects" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="classes" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all buildscript dependencies declared in root project '2931408816'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="buildEnvironment" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Generates Gradle wrapper files. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="wrapper" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles test classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="testClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Generates Javadoc API documentation for the main source code." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="javadoc" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles a jar archive containing the main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="jar" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the configuration model of root project '2931408816'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="model" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="copyMainKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes main resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="processResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the tasks runnable from root project '2931408816' (some of the displayed tasks may belong to subprojects)." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="tasks" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Initializes a new Gradle build. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="init" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="copyTestKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs the unit tests." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="test" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles main Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="compileJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'test'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="compileTestKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the insight into a specific dependency in root project '2931408816'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="dependencyInsight" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs all checks." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="check" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles the outputs of this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="assemble" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Deletes the build directory." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="clean" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles test Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="compileTestJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all dependencies declared in root project '2931408816'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="dependencies" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes test resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="processTestResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays a help message." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="help" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'main'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="compileKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="build" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects it depends on." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="buildNeeded" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the properties of root project '2931408816'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+                <option name="name" value="properties" />
+              </ExternalTaskPojo>
+            </list>
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/lesson1">
+          <value>
+            <list>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the components produced by project ':lesson1'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="components" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="buildDependents" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the sub-projects of project ':lesson1'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="projects" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="classes" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all buildscript dependencies declared in project ':lesson1'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="buildEnvironment" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles test classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="testClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Generates Javadoc API documentation for the main source code." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="javadoc" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles a jar archive containing the main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="jar" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the configuration model of project ':lesson1'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="model" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="copyMainKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes main resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="processResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the tasks runnable from project ':lesson1'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="tasks" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="copyTestKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs the unit tests." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="test" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles main Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="compileJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'test'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="compileTestKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the insight into a specific dependency in project ':lesson1'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="dependencyInsight" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs all checks." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="check" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles the outputs of this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="assemble" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Deletes the build directory." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="clean" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles test Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="compileTestJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all dependencies declared in project ':lesson1'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="dependencies" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes test resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="processTestResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays a help message." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="help" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'main'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="compileKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="build" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects it depends on." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="buildNeeded" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the properties of project ':lesson1'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson1" />
+                <option name="name" value="properties" />
+              </ExternalTaskPojo>
+            </list>
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/lesson2">
+          <value>
+            <list>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the components produced by project ':lesson2'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="components" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="buildDependents" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the sub-projects of project ':lesson2'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="projects" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="classes" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all buildscript dependencies declared in project ':lesson2'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="buildEnvironment" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles test classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="testClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Generates Javadoc API documentation for the main source code." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="javadoc" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles a jar archive containing the main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="jar" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the configuration model of project ':lesson2'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="model" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="copyMainKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes main resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="processResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the tasks runnable from project ':lesson2'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="tasks" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="copyTestKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs the unit tests." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="test" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles main Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="compileJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'test'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="compileTestKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the insight into a specific dependency in project ':lesson2'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="dependencyInsight" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs all checks." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="check" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles the outputs of this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="assemble" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Deletes the build directory." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="clean" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles test Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="compileTestJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all dependencies declared in project ':lesson2'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="dependencies" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes test resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="processTestResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays a help message." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="help" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'main'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="compileKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="build" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects it depends on." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="buildNeeded" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the properties of project ':lesson2'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson2" />
+                <option name="name" value="properties" />
+              </ExternalTaskPojo>
+            </list>
+          </value>
+        </entry>
+      </map>
+    </option>
+    <option name="modificationStamps">
+      <map>
+        <entry key="$PROJECT_DIR$" value="5954818723291" />
+        <entry key="$PROJECT_DIR$/../../../../src/gradle/study/basic" value="2976922707460" />
+      </map>
+    </option>
+    <option name="projectBuildClasspath">
+      <map>
+        <entry key="$PROJECT_DIR$">
+          <value>
+            <ExternalProjectBuildClasspathPojo>
+              <option name="modulesBuildClasspath">
+                <map>
+                  <entry key="$PROJECT_DIR$">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
+                  <entry key="$PROJECT_DIR$/lesson1">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$/lesson1" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
+                  <entry key="$PROJECT_DIR$/lesson2">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$/lesson2" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
+                </map>
+              </option>
+              <option name="name" value="2931408816" />
+              <option name="projectBuildClasspath">
+                <list>
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/tooling-api" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/base-services-groovy" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/antlr" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/resources" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/platform-jvm" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/ide-native" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/base-services" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/resources-http" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/internal-android-performance-testing" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/internal-performance-testing" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/diagnostics" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/ivy" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/plugin-development" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/task-cache-http" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/reporting" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/process-services" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/build-comparison" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/publish" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/ui" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/resources-sftp" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/messaging" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/composite-builds" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/jetty" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/open-api" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/language-groovy" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/cli" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/model-groovy" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/platform-native" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/internal-integ-testing" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/logging" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/signing" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/language-scala" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/dependency-management" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/tooling-api-builders" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/plugins" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/platform-base" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/maven" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/ear" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/osgi" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/core" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/plugin-use" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/resources-s3" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/jacoco" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/testing-native" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/wrapper" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/testing-jvm" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/model-core" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/internal-testing" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/scala" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/launcher" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/ide-play" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/announce" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/installation-beacon" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/platform-play" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/native" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/jvm-services" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/language-java" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/code-quality" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/build-init" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/test-kit" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/language-native" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/javascript" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/testing-base" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/language-jvm" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/src/ide" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-resources-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-native-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-model-core-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-docs-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-base-services-groovy-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-wrapper-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-installation-beacon-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-logging-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-core-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-messaging-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-tooling-api-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/ant-1.9.6.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-open-api-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-jvm-services-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-base-services-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-cli-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-script-kotlin-0.3.2.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-launcher-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/ant-launcher-1.9.6.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/groovy-all-2.4.7.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-model-groovy-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-ui-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/gradle-process-services-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-ide-native-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-language-scala-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-maven-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-ide-play-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-language-native-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-testing-native-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-code-quality-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-scala-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-resources-http-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-reporting-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-platform-jvm-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-resources-s3-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-tooling-api-builders-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-language-jvm-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-build-init-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-ear-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-jetty-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-language-groovy-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-publish-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-plugin-use-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-signing-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/ivy-2.2.0.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-announce-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-ivy-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-test-kit-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-platform-native-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-resources-sftp-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-plugin-development-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-javascript-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-testing-jvm-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-platform-play-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-testing-base-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-osgi-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-composite-builds-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-ide-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-task-cache-http-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-build-comparison-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-jacoco-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-platform-base-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-dependency-management-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-antlr-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-language-java-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-diagnostics-3.1.jar" />
+                  <option value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.1-all/ejgglywf033yp6s4x8ahmgm74/gradle-3.1/lib/plugins/gradle-plugins-3.1.jar" />
+                  <option value="$PROJECT_DIR$/buildSrc/src/main/java" />
+                  <option value="$PROJECT_DIR$/buildSrc/src/main/groovy" />
+                </list>
+              </option>
+            </ExternalProjectBuildClasspathPojo>
+          </value>
+        </entry>
+      </map>
+    </option>
+    <option name="externalProjectsViewState">
+      <projects_view />
+    </option>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/settings.gradle" />
+        <option value="$PROJECT_DIR$/build.gradle" />
+        <option value="$PROJECT_DIR$/lesson1/build.gradle" />
+        <option value="$PROJECT_DIR$/lesson2/build.gradle" />
+        <option value="$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java" />
+        <option value="$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java" />
+      </list>
+    </option>
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="ProjectFrameBounds">
+    <option name="width" value="1920" />
+    <option name="height" value="1008" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+      <manualOrder />
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lesson2" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lesson2" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lesson2" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="main" />
+              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lesson2" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="main" />
+              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="java" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lesson2" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="main" />
+              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="java" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="pikachu" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="litestruts" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="2931408816" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lesson2" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="main" />
+              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="java" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="pikachu" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="array" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+      <pane id="Scratches" />
+      <pane id="PackagesPane" />
+      <pane id="Scope" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="settings.editor.selected.configurable" value="reference.settingsdialog.project.gradle" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="aspect.path.notification.shown" value="true" />
+    <property name="js.eslint.eslintPackage" value="" />
+  </component>
+  <component name="RunManager" selected="Gradle.2931408816:lesson2 [test]">
+    <configuration default="false" name="2931408816:lesson1 [test]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$/lesson1" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value="test" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="false" name="2931408816:lesson2 [test]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$/lesson2" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value="test" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="false" name="2931408816:lesson2 [clean]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$/lesson2" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value="clean" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="false" name="2931408816 [clean]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value="clean" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
+      <module name="" />
+      <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
+      <option name="PROGRAM_PARAMETERS" />
+      <predefined_log_file id="idea.log" enabled="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android App">
+      <module name="" />
+      <option name="DEPLOY" value="true" />
+      <option name="ARTIFACT_NAME" value="" />
+      <option name="PM_INSTALL_OPTIONS" value="" />
+      <option name="ACTIVITY_EXTRA_FLAGS" value="" />
+      <option name="MODE" value="default_activity" />
+      <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
+      <option name="PREFERRED_AVD" value="" />
+      <option name="CLEAR_LOGCAT" value="false" />
+      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
+      <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
+      <option name="FORCE_STOP_RUNNING_APP" value="true" />
+      <option name="DEBUGGER_TYPE" value="Java" />
+      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+      <option name="PREFERRED_AVD" value="" />
+      <Java />
+      <Profilers>
+        <option name="ENABLE_ADVANCED_PROFILING" value="true" />
+        <option name="GAPID_ENABLED" value="false" />
+        <option name="GAPID_DISABLE_PCS" value="false" />
+        <option name="SUPPORT_LIB_ENABLED" value="true" />
+        <option name="INSTRUMENTATION_ENABLED" value="true" />
+      </Profilers>
+      <option name="DEEP_LINK" value="" />
+      <option name="ACTIVITY_CLASS" value="" />
+      <method />
+    </configuration>
+    <configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests">
+      <module name="" />
+      <option name="TESTING_TYPE" value="0" />
+      <option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="CLASS_NAME" value="" />
+      <option name="PACKAGE_NAME" value="" />
+      <option name="EXTRA_OPTIONS" value="" />
+      <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
+      <option name="PREFERRED_AVD" value="" />
+      <option name="CLEAR_LOGCAT" value="false" />
+      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
+      <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
+      <option name="FORCE_STOP_RUNNING_APP" value="true" />
+      <option name="DEBUGGER_TYPE" value="Java" />
+      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+      <option name="PREFERRED_AVD" value="" />
+      <Java />
+      <Profilers>
+        <option name="ENABLE_ADVANCED_PROFILING" value="true" />
+        <option name="GAPID_ENABLED" value="false" />
+        <option name="GAPID_DISABLE_PCS" value="false" />
+        <option name="SUPPORT_LIB_ENABLED" value="true" />
+        <option name="INSTRUMENTATION_ENABLED" value="true" />
+      </Profilers>
+      <method />
+    </configuration>
+    <configuration default="true" type="Applet" factoryName="Applet">
+      <option name="HTML_USED" value="false" />
+      <option name="WIDTH" value="400" />
+      <option name="HEIGHT" value="300" />
+      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
+      <module />
+      <method />
+    </configuration>
+    <configuration default="true" type="Application" factoryName="Application">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="ArquillianJUnit" factoryName="" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="arquillianRunConfiguration">
+        <value>
+          <option name="containerStateName" value="" />
+        </value>
+      </option>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="true" type="ArquillianTestNG" factoryName="">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="arquillianRunConfiguration">
+        <value>
+          <option name="containerStateName" value="" />
+        </value>
+      </option>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SUITE_NAME" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="GROUP_NAME" />
+      <option name="TEST_OBJECT" value="CLASS" />
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="OUTPUT_DIRECTORY" />
+      <option name="ANNOTATION_TYPE" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <option name="USE_DEFAULT_REPORTERS" value="false" />
+      <option name="PROPERTIES_FILE" />
+      <envs />
+      <properties />
+      <listeners />
+      <method />
+    </configuration>
+    <configuration default="true" type="Cold Fusion runner description" factoryName="Cold Fusion" custom_browser="" web_path="">
+      <method />
+    </configuration>
+    <configuration default="true" type="CucumberJavaRunConfigurationType" factoryName="Cucumber java">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="myFilePath" />
+      <option name="GLUE" />
+      <option name="myNameFilter" />
+      <option name="myGeneratedName" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="FlashRunConfigurationType" factoryName="Flash App">
+      <option name="BCName" value="" />
+      <option name="IOSSimulatorSdkPath" value="" />
+      <option name="adlOptions" value="" />
+      <option name="airProgramParameters" value="" />
+      <option name="appDescriptorForEmulator" value="Android" />
+      <option name="debugTransport" value="USB" />
+      <option name="debuggerSdkRaw" value="BC SDK" />
+      <option name="emulator" value="NexusOne" />
+      <option name="emulatorAdlOptions" value="" />
+      <option name="fastPackaging" value="true" />
+      <option name="fullScreenHeight" value="0" />
+      <option name="fullScreenWidth" value="0" />
+      <option name="launchUrl" value="false" />
+      <option name="launcherParameters">
+        <LauncherParameters>
+          <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" />
+          <option name="launcherType" value="OSDefault" />
+          <option name="newPlayerInstance" value="false" />
+          <option name="playerPath" value="/usr/bin/flashplayerdebugger" />
+        </LauncherParameters>
+      </option>
+      <option name="mobileRunTarget" value="Emulator" />
+      <option name="moduleName" value="" />
+      <option name="overriddenMainClass" value="" />
+      <option name="overriddenOutputFileName" value="" />
+      <option name="overrideMainClass" value="false" />
+      <option name="runTrusted" value="true" />
+      <option name="screenDpi" value="0" />
+      <option name="screenHeight" value="0" />
+      <option name="screenWidth" value="0" />
+      <option name="url" value="http://" />
+      <option name="usbDebugPort" value="7936" />
+      <method />
+    </configuration>
+    <configuration default="true" type="FlexUnitRunConfigurationType" factoryName="FlexUnit" appDescriptorForEmulator="Android" class_name="" emulatorAdlOptions="" method_name="" package_name="" scope="Class">
+      <option name="BCName" value="" />
+      <option name="launcherParameters">
+        <LauncherParameters>
+          <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" />
+          <option name="launcherType" value="OSDefault" />
+          <option name="newPlayerInstance" value="false" />
+          <option name="playerPath" value="/usr/bin/flashplayerdebugger" />
+        </LauncherParameters>
+      </option>
+      <option name="moduleName" value="" />
+      <option name="trusted" value="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="GradleRunConfiguration" factoryName="Gradle">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list />
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="true" type="GroovyScriptRunConfiguration" factoryName="Groovy">
+      <module name="" />
+      <setting name="path" value="" />
+      <setting name="vmparams" value="" />
+      <setting name="params" value="" />
+      <setting name="workDir" value="file://$PROJECT_DIR$" />
+      <setting name="debug" value="false" />
+      <method />
+    </configuration>
+    <configuration default="true" type="JUnit" factoryName="JUnit">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="true" type="JarApplication" factoryName="JAR Application">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="Java Scratch" factoryName="Java Scratch">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="SCRATCH_FILE_ID" value="0" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="JavaScriptTestRunnerProtractor" factoryName="Protractor">
+      <config-file value="" />
+      <node-interpreter value="project" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
+      <method />
+    </configuration>
+    <configuration default="true" type="JetRunConfigurationType" factoryName="Kotlin">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="2931408816" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="KotlinStandaloneScriptRunConfigurationType" factoryName="Kotlin script">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="filePath" />
+      <option name="vmParameters" />
+      <option name="alternativeJrePath" />
+      <option name="programParameters" />
+      <option name="passParentEnvs" value="true" />
+      <option name="workingDirectory" />
+      <option name="isAlternativeJrePathEnabled" value="false" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="NodeJSConfigurationType" factoryName="Node.js" path-to-node="project" working-dir="">
+      <method />
+    </configuration>
+    <configuration default="true" type="Remote" factoryName="Remote">
+      <option name="USE_SOCKET_TRANSPORT" value="true" />
+      <option name="SERVER_MODE" value="false" />
+      <option name="SHMEM_ADDRESS" value="javadebug" />
+      <option name="HOST" value="localhost" />
+      <option name="PORT" value="5005" />
+      <method />
+    </configuration>
+    <configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="TestNG" factoryName="TestNG">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SUITE_NAME" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="GROUP_NAME" />
+      <option name="TEST_OBJECT" value="CLASS" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="OUTPUT_DIRECTORY" />
+      <option name="ANNOTATION_TYPE" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <option name="USE_DEFAULT_REPORTERS" value="false" />
+      <option name="PROPERTIES_FILE" />
+      <envs />
+      <properties />
+      <listeners />
+      <method />
+    </configuration>
+    <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
+      <node-interpreter>project</node-interpreter>
+      <node-options />
+      <gulpfile />
+      <tasks />
+      <arguments />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="js.build_tools.npm" factoryName="npm">
+      <command value="run" />
+      <scripts />
+      <node-interpreter value="project" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="mocha-javascript-test-runner" factoryName="Mocha">
+      <node-interpreter>project</node-interpreter>
+      <node-options />
+      <working-directory />
+      <pass-parent-env>true</pass-parent-env>
+      <envs />
+      <ui />
+      <extra-mocha-options />
+      <test-kind>DIRECTORY</test-kind>
+      <test-directory />
+      <recursive>false</recursive>
+      <method />
+    </configuration>
+    <list size="4">
+      <item index="0" class="java.lang.String" itemvalue="Gradle.2931408816:lesson1 [test]" />
+      <item index="1" class="java.lang.String" itemvalue="Gradle.2931408816:lesson2 [test]" />
+      <item index="2" class="java.lang.String" itemvalue="Gradle.2931408816:lesson2 [clean]" />
+      <item index="3" class="java.lang.String" itemvalue="Gradle.2931408816 [clean]" />
+    </list>
+    <recent_temporary>
+      <list size="4">
+        <item index="0" class="java.lang.String" itemvalue="Gradle.2931408816 [clean]" />
+        <item index="1" class="java.lang.String" itemvalue="Gradle.2931408816:lesson2 [clean]" />
+        <item index="2" class="java.lang.String" itemvalue="Gradle.2931408816:lesson2 [test]" />
+        <item index="3" class="java.lang.String" itemvalue="Gradle.2931408816:lesson1 [test]" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false">
+    <option name="remove_strategy" value="false" />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="c408ce92-cf33-4b29-9914-8fa209c7c738" name="Default" comment="" />
+      <created>1488704424971</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1488704424971</updated>
+      <workItem from="1488704430242" duration="406000" />
+      <workItem from="1488704954369" duration="99000" />
+      <workItem from="1488705682787" duration="375000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TestHistory">
+    <history-entry file="2931408816_lesson1_[test] - 2017.03.05 at 17h 05m 18s.xml">
+      <configuration name="2931408816:lesson1 [test]" configurationId="GradleRunConfiguration" />
+    </history-entry>
+    <history-entry file="2931408816_lesson2_[test] - 2017.03.05 at 17h 05m 52s.xml">
+      <configuration name="2931408816:lesson2 [test]" configurationId="GradleRunConfiguration" />
+    </history-entry>
+    <history-entry file="2931408816_lesson2_[test] - 2017.03.05 at 17h 06m 37s.xml">
+      <configuration name="2931408816:lesson2 [test]" configurationId="GradleRunConfiguration" />
+    </history-entry>
+    <history-entry file="2931408816_lesson2_[test] - 2017.03.05 at 17h 09m 55s.xml">
+      <configuration name="2931408816:lesson2 [test]" configurationId="GradleRunConfiguration" />
+    </history-entry>
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="880000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="0" y="0" width="1920" height="1008" extended-state="6" />
+    <editor active="true" />
+    <layout>
+      <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Nl-Palette" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32918552" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Properties" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2553305" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32995737" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+    </layout>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="processedProjectFiles" value="true" />
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager />
+    <watches-manager />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="567">
+          <caret line="27" column="80" lean-forward="false" selection-start-line="27" selection-start-column="80" selection-end-line="27" selection-end-column="80" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="357">
+          <caret line="17" column="25" lean-forward="false" selection-start-line="17" selection-start-column="25" selection-end-line="17" selection-end-column="25" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson1/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="105">
+          <caret line="5" column="0" lean-forward="false" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/settings.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="357">
+          <caret line="17" column="31" lean-forward="false" selection-start-line="17" selection-start-column="31" selection-end-line="17" selection-end-column="31" />
+          <folding>
+            <element signature="n#!!doc" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="567">
+          <caret line="27" column="80" lean-forward="false" selection-start-line="27" selection-start-column="80" selection-end-line="27" selection-end-column="80" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="357">
+          <caret line="17" column="25" lean-forward="false" selection-start-line="17" selection-start-column="25" selection-end-line="17" selection-end-column="25" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="105">
+          <caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-2562">
+          <caret line="18" column="42" lean-forward="true" selection-start-line="18" selection-start-column="42" selection-end-line="18" selection-end-column="42" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="189">
+          <caret line="28" column="16" lean-forward="true" selection-start-line="28" selection-start-column="16" selection-end-line="28" selection-end-column="16" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>
\ No newline at end of file
diff --git a/group13/2931408816/build.gradle b/group13/2931408816/build.gradle
new file mode 100644
index 0000000000..0b286df367
--- /dev/null
+++ b/group13/2931408816/build.gradle
@@ -0,0 +1,27 @@
+group 'cn.net.pikachu'
+version '1.0-SNAPSHOT'
+
+buildscript {
+    ext.kotlin_version = '1.1.0'
+
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+    }
+}
+
+apply plugin: 'java'
+apply plugin: 'kotlin'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
+    testCompile group: 'junit', name: 'junit', version: '4.11'
+}
diff --git a/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.jar b/group13/2931408816/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.jar
rename to group13/2931408816/gradle/wrapper/gradle-wrapper.jar
diff --git a/group13/2931408816/gradle/wrapper/gradle-wrapper.properties b/group13/2931408816/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..fa039b1ce2
--- /dev/null
+++ b/group13/2931408816/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sun Mar 05 17:01:46 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip
diff --git a/group13/2931408816/lesson1/data-structure/gradlew b/group13/2931408816/gradlew
old mode 100644
new mode 100755
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/gradlew
rename to group13/2931408816/gradlew
diff --git a/group13/2931408816/gradlew.bat b/group13/2931408816/gradlew.bat
new file mode 100644
index 0000000000..e95643d6a2
--- /dev/null
+++ b/group13/2931408816/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/group13/2931408816/lesson1/build.gradle b/group13/2931408816/lesson1/build.gradle
new file mode 100644
index 0000000000..0b286df367
--- /dev/null
+++ b/group13/2931408816/lesson1/build.gradle
@@ -0,0 +1,27 @@
+group 'cn.net.pikachu'
+version '1.0-SNAPSHOT'
+
+buildscript {
+    ext.kotlin_version = '1.1.0'
+
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+    }
+}
+
+apply plugin: 'java'
+apply plugin: 'kotlin'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
+    testCompile group: 'junit', name: 'junit', version: '4.11'
+}
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties
deleted file mode 100644
index e23811b654..0000000000
--- a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties
+++ /dev/null
@@ -1 +0,0 @@
-#Sun Feb 19 10:59:39 CST 2017
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties.lock b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties.lock
deleted file mode 100644
index c5daff8bbe..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties.lock and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileHashes.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileHashes.bin
deleted file mode 100644
index 6512ad40b8..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileHashes.bin and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileSnapshots.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileSnapshots.bin
deleted file mode 100644
index 357f65c480..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileSnapshots.bin and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/taskArtifacts.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/taskArtifacts.bin
deleted file mode 100644
index 1dcc7e5225..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/taskArtifacts.bin and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileHashes.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileHashes.bin
deleted file mode 100644
index 561100c562..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileHashes.bin and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileSnapshots.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileSnapshots.bin
deleted file mode 100644
index a2d12a13b5..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileSnapshots.bin and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.bin
deleted file mode 100644
index 18c54c8bd5..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.bin and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.lock b/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.lock
deleted file mode 100644
index bed9c81dee..0000000000
Binary files a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.lock and /dev/null differ
diff --git a/group13/2931408816/lesson1/data-structure/build.gradle b/group13/2931408816/lesson1/data-structure/build.gradle
deleted file mode 100644
index 0049406393..0000000000
--- a/group13/2931408816/lesson1/data-structure/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-group 'cn.net.pikachu'
-version '1.0-SNAPSHOT'
-
-buildscript {
-    ext.kotlin_version = '1.0.6'
-
-    repositories {
-        mavenCentral()
-    }
-    dependencies {
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-    }
-}
-
-apply plugin: 'java'
-apply plugin: 'kotlin'
-
-sourceCompatibility = 1.8
-
-repositories {
-    mavenCentral()
-}
-
-dependencies {
-    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
-    testCompile group: 'junit', name: 'junit', version: '4.11'
-
-}
diff --git a/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties b/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 84514df01f..0000000000
--- a/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Sun Feb 19 11:20:26 CST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
diff --git a/group13/2931408816/lesson1/data-structure/gradlew.bat b/group13/2931408816/lesson1/data-structure/gradlew.bat
deleted file mode 100644
index f9553162f1..0000000000
--- a/group13/2931408816/lesson1/data-structure/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/group13/2931408816/lesson1/data-structure/settings.gradle b/group13/2931408816/lesson1/data-structure/settings.gradle
deleted file mode 100644
index 941deed614..0000000000
--- a/group13/2931408816/lesson1/data-structure/settings.gradle
+++ /dev/null
@@ -1,2 +0,0 @@
-rootProject.name = 'data-structure'
-
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java
deleted file mode 100644
index 8cc192feeb..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package cn.net.pikachu.basic;
-
-import java.util.Arrays;
-
-public class ArrayList implements List {
-
-    private int size = 0;
-
-    private Object[] elementData = new Object[100];
-
-    private class Itr implements Iterator {
-        private int curIndex = 0;
-
-        @Override
-        public boolean hasNext() {
-            return curIndex < size;
-        }
-
-        @Override
-        public Object next() {
-            return elementData[curIndex++];
-        }
-    }
-
-    public void add(Object o) {
-        if (size == elementData.length) {
-            grow();
-        }
-        elementData[size++] = o;
-    }
-
-    private void grow() {
-        if (elementData.length < 2048) {
-            Arrays.copyOf(elementData, elementData.length * 2);
-        } else {
-            Arrays.copyOf(elementData, elementData.length + 1024);
-        }
-    }
-
-    public void add(int index, Object o) {
-        if (index > size || index < 0) {
-            throw new IndexOutOfBoundsException(String.valueOf(index));
-        } else if (index == size) {
-            add(o);
-        } else {
-            if (size == elementData.length) {
-                grow();
-            }
-            for (int i = size; i >= index; i--) {
-                elementData[i + 1] = elementData[i];
-            }
-            elementData[index] = o;
-        }
-        size++;
-
-    }
-
-    public Object get(int index) {
-        if (index >= size || index < 0) {
-            throw new IndexOutOfBoundsException(String.valueOf(index));
-        }
-        return elementData[index];
-    }
-
-    public Object remove(int index) {
-        if (index >= size || index < 0) {
-            throw new IndexOutOfBoundsException(String.valueOf(index));
-        }
-        Object o = elementData[index];
-        System.arraycopy(elementData, index + 1, elementData, index, size - index);
-        size--;
-        return o;
-    }
-
-    public int size() {
-        return size;
-    }
-
-    // 迭代器留在后面写
-    public Iterator iterator() {
-        return new Itr();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("[");
-        for (int i = 0; i < size - 1; i++) {
-            builder.append(elementData[i]).append(",");
-        }
-        if (size > 0) {
-            builder.append(elementData[size - 1]);
-        }
-        builder.append("]");
-        return builder.toString();
-    }
-}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java
deleted file mode 100644
index 0c4d545e8a..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package cn.net.pikachu.basic;
-
-public class BinaryTreeNode {
-	
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	
-	public Object getData() {
-		return data;
-	}
-	public void setData(Object data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-	
-	public BinaryTreeNode insert(Object o){
-		if (!(o instanceof Comparable)){
-			throw new ClassCastException(o.toString());
-		}
-		// 根据节点大小放置元素 小的在左边 大的在右边
-		Comparable c = (Comparable) o;
-		if (data==null){
-			data=o;
-			return this;
-		}else if (c.compareTo(o)>0){
-			if (left==null){
-				left=new BinaryTreeNode();
-			}
-			return left.insert(o);
-		}else {
-			if (right==null){
-				right=new BinaryTreeNode();
-			}
-			return right.insert(o);
-		}
-	}
-	public void inOrderTraversal(Visit visit,BinaryTreeNode node){
-		if (node.left!=null)
-		inOrderTraversal(visit,node.left);
-		if (node!=null)
-		visit.visit(node.data);
-		if (node.right!=null)
-		inOrderTraversal(visit,node.right);
-	}
-	public static interface Visit{
-		public void visit(Object o);
-	}
-}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java
deleted file mode 100644
index 05e8486430..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package cn.net.pikachu.basic;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java
deleted file mode 100644
index 2c29d0f085..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package cn.net.pikachu.basic;
-
-import java.util.NoSuchElementException;
-
-public class LinkedList implements List {
-
-    private Node head;
-    private int curSize = 0;
-
-    private class Itr implements Iterator {
-        Node curNode = head;
-
-        @Override
-        public boolean hasNext() {
-            return curNode != null;
-        }
-
-        @Override
-        public Object next() {
-            Node node = curNode;
-            curNode = curNode.next;
-            return node.data;
-        }
-    }
-
-    public void add(Object o) {
-        if (head == null) {
-            head = new Node(o, null);
-        } else {
-            Node node = head;
-            while (node.next != null) {
-                node = node.next;
-            }
-            node.next = new Node(o, null);
-        }
-        curSize++;
-    }
-
-    public void add(int index, Object o) {
-        // 这里可以等于
-        if (index < 0 || index > curSize) {
-            throw new IndexOutOfBoundsException(String.valueOf(index));
-        }
-        if (index == 0) {
-            addFirst(o);
-        } else {
-
-            Node node = head;
-            for (int i = 1; i < index; i++) {
-                node = node.next;
-            }
-            node.next = new Node(o, node.next);
-            curSize++;
-        }
-
-    }
-
-    public Object get(int index) {
-        if (index < 0 || index >= curSize) {
-            throw new IndexOutOfBoundsException(String.valueOf(index));
-        }
-        Node node = head;
-        for (int i = 0; i < index; i++) {
-            node = node.next;
-        }
-        return node.data;
-    }
-
-    public Object remove(int index) {
-        if (index < 0 || index >= curSize) {
-            throw new IndexOutOfBoundsException(String.valueOf(index));
-        }
-        if (index == 0) {
-            return removeFirst();
-        }
-
-        Node node = head;
-        for (int i = 1; i < index; i++) {
-            node = node.next;
-        }
-        Node t = node.next;
-        node.next=t.next;
-        curSize--;
-        return t.data;
-    }
-
-    public int size() {
-        return curSize;
-    }
-
-    public void addFirst(Object o) {
-        Node node = new Node(o, head);
-        head = node;
-        curSize++;
-    }
-
-    public void addLast(Object o) {
-        add(o);
-    }
-
-    public Object removeFirst() {
-        if (head == null) {
-            throw new NoSuchElementException();
-        }
-        Node node = head;
-        head = head.next;
-        curSize--;
-        return node.data;
-    }
-
-    public Object removeLast() {
-        if (head == null) {
-            throw new NoSuchElementException();
-        }
-        Node node;
-        if (head.next == null) {
-            node = head;
-            head = null;
-        } else {
-            node = head;
-            while (node.next.next != null) {
-                node = node.next;
-            }
-            Node t = node.next;
-            node.next = null;
-            node = t;
-        }
-        curSize--;
-        return node.data;
-    }
-
-    // 后面再实现
-    public Iterator iterator() {
-        return new Itr();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("[");
-        Node node = head;
-        while (node != null) {
-            builder.append(node.data).append(",");
-            node = node.next;
-        }
-        if (curSize>0)
-        builder.deleteCharAt(builder.length() - 1);
-        builder.append("]");
-        return builder.toString();
-    }
-
-    private static class Node {
-        Object data;
-        Node next;
-
-        Node(Object data, Node next) {
-            this.data = data;
-            this.next = next;
-        }
-    }
-}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java
deleted file mode 100644
index 4272bde587..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package cn.net.pikachu.basic;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java
deleted file mode 100644
index 7e033d0885..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.net.pikachu.basic;
-
-import java.util.NoSuchElementException;
-
-public class Queue {
-	private LinkedList list = new LinkedList();
-	public void enQueue(Object o){
-		list.addLast(o);
-	}
-	
-	public Object deQueue(){
-		if (isEmpty()){
-			throw new NoSuchElementException();
-		}
-		return list.removeFirst();
-	}
-	
-	public boolean isEmpty(){
-		return list.size()==0;
-	}
-	
-	public int size(){
-		return list.size();
-	}
-
-	@Override
-	public String toString() {
-		return list.toString();
-	}
-}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java
deleted file mode 100644
index 492d782b26..0000000000
--- a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package cn.net.pikachu.basic;
-
-import java.util.NoSuchElementException;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){
-		elementData.add(o);
-	}
-	
-	public Object pop(){
-		if (isEmpty()){
-			throw new NoSuchElementException();
-		}
-		return elementData.remove(elementData.size()-1);
-	}
-	
-	public Object peek(){
-		return elementData.get(elementData.size()-1);
-	}
-	public boolean isEmpty(){
-		return elementData.size()==0;
-	}
-	public int size(){
-		return elementData.size();
-	}
-
-	@Override
-	public String toString() {
-		return elementData.toString();
-	}
-}
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/ArrayList.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/ArrayList.java
new file mode 100644
index 0000000000..34a672ba96
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/ArrayList.java
@@ -0,0 +1,97 @@
+package cn.net.pikachu.basic;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+
+    private int size = 0;
+
+    private Object[] elementData = new Object[100];
+
+    private class Itr implements Iterator {
+        private int curIndex = 0;
+
+        @Override
+        public boolean hasNext() {
+            return curIndex < size;
+        }
+
+        @Override
+        public Object next() {
+            return elementData[curIndex++];
+        }
+    }
+
+    public void add(Object o) {
+        if (size == elementData.length) {
+            grow();
+        }
+        elementData[size++] = o;
+    }
+
+    private void grow() {
+        if (elementData.length < 2048) {
+            Arrays.copyOf(elementData, elementData.length * 2);
+        } else {
+            Arrays.copyOf(elementData, elementData.length + 1024);
+        }
+    }
+
+    public void add(int index, Object o) {
+        if (index > size || index < 0) {
+            throw new IndexOutOfBoundsException(String.valueOf(index));
+        } else if (index == size) {
+            add(o);
+        } else {
+            if (size == elementData.length) {
+                grow();
+            }
+            for (int i = size; i >= index; i--) {
+                elementData[i + 1] = elementData[i];
+            }
+            elementData[index] = o;
+        }
+        size++;
+
+    }
+
+    public Object get(int index) {
+        if (index >= size || index < 0) {
+            throw new IndexOutOfBoundsException(String.valueOf(index));
+        }
+        return elementData[index];
+    }
+
+    public Object remove(int index) {
+        if (index >= size || index < 0) {
+            throw new IndexOutOfBoundsException(String.valueOf(index));
+        }
+        Object o = elementData[index];
+        System.arraycopy(elementData, index + 1, elementData, index, size - index);
+        size--;
+        return o;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    // 迭代器留在后面写
+    public Iterator iterator() {
+        return new Itr();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("[");
+        for (int i = 0; i < size - 1; i++) {
+            builder.append(elementData[i]).append(",");
+        }
+        if (size > 0) {
+            builder.append(elementData[size - 1]);
+        }
+        builder.append("]");
+        return builder.toString();
+    }
+}
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..cb21dbe823
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java
@@ -0,0 +1,60 @@
+package cn.net.pikachu.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		if (!(o instanceof Comparable)){
+			throw new ClassCastException(o.toString());
+		}
+		// 根据节点大小放置元素 小的在左边 大的在右边
+		Comparable c = (Comparable) o;
+		if (data==null){
+			data=o;
+			return this;
+		}else if (c.compareTo(o)>0){
+			if (left==null){
+				left=new BinaryTreeNode();
+			}
+			return left.insert(o);
+		}else {
+			if (right==null){
+				right=new BinaryTreeNode();
+			}
+			return right.insert(o);
+		}
+	}
+	public void inOrderTraversal(Visit visit,BinaryTreeNode node){
+		if (node.left!=null)
+		inOrderTraversal(visit,node.left);
+		if (node!=null)
+		visit.visit(node.data);
+		if (node.right!=null)
+		inOrderTraversal(visit,node.right);
+	}
+	public static interface Visit{
+		public void visit(Object o);
+	}
+}
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Iterator.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Iterator.java
new file mode 100644
index 0000000000..c00020f0cf
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Iterator.java
@@ -0,0 +1,7 @@
+package cn.net.pikachu.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/LinkedList.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/LinkedList.java
new file mode 100644
index 0000000000..8186bb1a24
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/LinkedList.java
@@ -0,0 +1,161 @@
+package cn.net.pikachu.basic;
+
+import java.util.NoSuchElementException;
+
+public class LinkedList implements List {
+
+    private Node head;
+    private int curSize = 0;
+
+    private class Itr implements Iterator {
+        Node curNode = head;
+
+        @Override
+        public boolean hasNext() {
+            return curNode != null;
+        }
+
+        @Override
+        public Object next() {
+            Node node = curNode;
+            curNode = curNode.next;
+            return node.data;
+        }
+    }
+
+    public void add(Object o) {
+        if (head == null) {
+            head = new Node(o, null);
+        } else {
+            Node node = head;
+            while (node.next != null) {
+                node = node.next;
+            }
+            node.next = new Node(o, null);
+        }
+        curSize++;
+    }
+
+    public void add(int index, Object o) {
+        // 这里可以等于
+        if (index < 0 || index > curSize) {
+            throw new IndexOutOfBoundsException(String.valueOf(index));
+        }
+        if (index == 0) {
+            addFirst(o);
+        } else {
+
+            Node node = head;
+            for (int i = 1; i < index; i++) {
+                node = node.next;
+            }
+            node.next = new Node(o, node.next);
+            curSize++;
+        }
+
+    }
+
+    public Object get(int index) {
+        if (index < 0 || index >= curSize) {
+            throw new IndexOutOfBoundsException(String.valueOf(index));
+        }
+        Node node = head;
+        for (int i = 0; i < index; i++) {
+            node = node.next;
+        }
+        return node.data;
+    }
+
+    public Object remove(int index) {
+        if (index < 0 || index >= curSize) {
+            throw new IndexOutOfBoundsException(String.valueOf(index));
+        }
+        if (index == 0) {
+            return removeFirst();
+        }
+
+        Node node = head;
+        for (int i = 1; i < index; i++) {
+            node = node.next;
+        }
+        Node t = node.next;
+        node.next=t.next;
+        curSize--;
+        return t.data;
+    }
+
+    public int size() {
+        return curSize;
+    }
+
+    public void addFirst(Object o) {
+        Node node = new Node(o, head);
+        head = node;
+        curSize++;
+    }
+
+    public void addLast(Object o) {
+        add(o);
+    }
+
+    public Object removeFirst() {
+        if (head == null) {
+            throw new NoSuchElementException();
+        }
+        Node node = head;
+        head = head.next;
+        curSize--;
+        return node.data;
+    }
+
+    public Object removeLast() {
+        if (head == null) {
+            throw new NoSuchElementException();
+        }
+        Node node;
+        if (head.next == null) {
+            node = head;
+            head = null;
+        } else {
+            node = head;
+            while (node.next.next != null) {
+                node = node.next;
+            }
+            Node t = node.next;
+            node.next = null;
+            node = t;
+        }
+        curSize--;
+        return node.data;
+    }
+
+    // 后面再实现
+    public Iterator iterator() {
+        return new Itr();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("[");
+        Node node = head;
+        while (node != null) {
+            builder.append(node.data).append(",");
+            node = node.next;
+        }
+        if (curSize>0)
+        builder.deleteCharAt(builder.length() - 1);
+        builder.append("]");
+        return builder.toString();
+    }
+
+    private static class Node {
+        Object data;
+        Node next;
+
+        Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+}
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/List.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/List.java
new file mode 100644
index 0000000000..d182aa32b4
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/List.java
@@ -0,0 +1,9 @@
+package cn.net.pikachu.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Main.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Main.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Main.java
rename to group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Main.java
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Queue.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Queue.java
new file mode 100644
index 0000000000..03650057c1
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Queue.java
@@ -0,0 +1,30 @@
+package cn.net.pikachu.basic;
+
+import java.util.NoSuchElementException;
+
+public class Queue {
+	private LinkedList list = new LinkedList();
+	public void enQueue(Object o){
+		list.addLast(o);
+	}
+	
+	public Object deQueue(){
+		if (isEmpty()){
+			throw new NoSuchElementException();
+		}
+		return list.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		return list.size()==0;
+	}
+	
+	public int size(){
+		return list.size();
+	}
+
+	@Override
+	public String toString() {
+		return list.toString();
+	}
+}
diff --git a/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Stack.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Stack.java
new file mode 100644
index 0000000000..3fe6ea6391
--- /dev/null
+++ b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/basic/Stack.java
@@ -0,0 +1,33 @@
+package cn.net.pikachu.basic;
+
+import java.util.NoSuchElementException;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		if (isEmpty()){
+			throw new NoSuchElementException();
+		}
+		return elementData.remove(elementData.size()-1);
+	}
+	
+	public Object peek(){
+		return elementData.get(elementData.size()-1);
+	}
+	public boolean isEmpty(){
+		return elementData.size()==0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+
+	@Override
+	public String toString() {
+		return elementData.toString();
+	}
+}
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyArrayList.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyArrayList.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyArrayList.java
rename to group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyArrayList.java
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyLinkedList.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyLinkedList.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyLinkedList.java
rename to group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyLinkedList.java
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyQueue.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyQueue.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyQueue.java
rename to group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyQueue.java
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyStack.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyStack.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyStack.java
rename to group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyStack.java
diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyTree.java b/group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyTree.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyTree.java
rename to group13/2931408816/lesson1/src/main/java/cn/net/pikachu/other/MyTree.java
diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/ArrayListTest.java b/group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/ArrayListTest.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/ArrayListTest.java
rename to group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/ArrayListTest.java
diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java b/group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java
rename to group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java
diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/LinkedListTest.java b/group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/LinkedListTest.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/LinkedListTest.java
rename to group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/LinkedListTest.java
diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/QueueTest.java b/group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/QueueTest.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/QueueTest.java
rename to group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/QueueTest.java
diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/StackTest.java b/group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/StackTest.java
similarity index 100%
rename from group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/StackTest.java
rename to group13/2931408816/lesson1/src/test/java/cn/net/pikachu/basic/StackTest.java
diff --git a/group13/2931408816/lesson2/build.gradle b/group13/2931408816/lesson2/build.gradle
new file mode 100644
index 0000000000..d69c95b786
--- /dev/null
+++ b/group13/2931408816/lesson2/build.gradle
@@ -0,0 +1,29 @@
+group 'cn.net.pikachu'
+version '1.0-SNAPSHOT'
+
+buildscript {
+    ext.kotlin_version = '1.1.0'
+
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+    }
+}
+
+apply plugin: 'java'
+apply plugin: 'kotlin'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
+    testCompile group: 'junit', name: 'junit', version: '4.11'
+    // https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream
+    compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.9'
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java
new file mode 100644
index 0000000000..9a94cf145e
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java
@@ -0,0 +1,228 @@
+package cn.net.pikachu.array;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int[] reverse = new int[origin.length];
+		for (int i = 0; i < origin.length; i++) {
+			reverse[origin.length-1-i]=origin[i];
+		}
+        for (int i = 0; i < reverse.length; i++) {
+            origin[i]=reverse[i];
+        }
+    }
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int count = oldArray.length;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0){
+				count -- ;
+			}
+		}
+		int index = 0;
+		int[] result = new int[count];
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i]!=0){
+				result[index++]=oldArray[i];
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		// 考虑到去重的问题　直接用数组无法确定大小　
+        // 可悲的发现用了LinkedList并没有我想象中的那么好　最后还得手动复制一次
+		LinkedList<Integer> list = new LinkedList<Integer>();
+		int i = 0;
+		int j = 0;
+		int index = 0;
+		int cur = array1[0]<array2[0]?array1[0]:array2[0];
+		list.add(cur);
+		while (i < array1.length && j < array2.length){
+			if (array1[i] < array1[j]){
+				if (array1[i]>cur){
+					cur=array1[i];
+					list.add(cur);
+				}
+				i++;
+			}else {
+				if (array2[j]>cur){
+					cur=array2[j];
+					list.add(cur);
+				}
+				j++;
+			}
+		}
+		while (i < array1.length){
+		    if (cur!= array1[i])
+			list.add(array1[i++]);
+		}
+		while (j < array2.length){
+            if (cur!= array2[j])
+			list.add(array2[j++]);
+		}
+        int[] result = getIntsFromList(list);
+        return result;
+    }
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+	    int[] result = new int[oldArray.length+size];
+        for (int i = 0; i < oldArray.length; i++) {
+            result[i] = oldArray[i];
+        }
+        return result;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+	    if(max == 1){
+	        return new int[]{};
+        }
+	    // 虽然之前被LinkedList坑到了　但是　我还是得用
+        // 手动复制就手动复制吧
+        LinkedList<Integer> list = new LinkedList<Integer>();
+        list.add(1);
+        list.add(1);
+        int a = 1;
+        int b = 1;
+        while (a+b<max){
+            int c = a + b;
+            a = b;
+            b = c;
+            list.add(c);
+        }
+        int[] result = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            result[i] = list.get(i);
+        }
+        return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+	    // 首先确定如何判定是素数
+        // 继续LinkedList　
+        List<Integer> list = new LinkedList<Integer>();
+        for (int i = 2; i < max; i++) {
+            if (isPrimes(i)){
+                list.add(i);
+            }
+        }
+        int[] r = getIntsFromList(list);
+        return r;
+	}
+
+    /**
+     * 这是一个我不得不写的函数　用LinkedList的心酸
+     * @param list
+     * @return
+     */
+    private int[] getIntsFromList(List<Integer> list) {
+        int[] r = new int[list.size()];
+        for (int i = 0; i < r.length; i++) {
+            r[i]=list.get(i);
+        }
+        return r;
+    }
+
+    private boolean isPrimes(int num){
+	    int end = (int) (Math.sqrt(num)+1);
+        for (int i = 2; i < end; i++) {
+            if (num % i == 0){
+                return false;
+            }
+        }
+        return true;
+    }
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+	    // 与上面类似　首先判断是不是完数
+        List<Integer> list = new LinkedList<Integer>();
+        for (int i = 2; i < max; i++) {
+            if (isPerfectNumber(i)){
+                list.add(i);
+            }
+        }
+        return getIntsFromList(list);
+	}
+	private boolean isPerfectNumber(int num){
+	    int sum = 1;
+	    int end = (int) (Math.sqrt(num)+1);
+        for (int i = 2; i < end; i++) {
+            if (num % 2 == 0){
+                sum+=2 + num/2;
+            }
+        }
+        return sum == num;
+    }
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+	    StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            builder.append(array[i]).append(seperator);
+        }
+        builder.deleteCharAt(builder.length()-1);
+        return builder.toString();
+	}
+	
+
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java
new file mode 100644
index 0000000000..d4e162e5e0
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java
@@ -0,0 +1,122 @@
+package cn.net.pikachu.litestruts;
+
+import cn.net.pikachu.litestruts.xstream.Action;
+import cn.net.pikachu.litestruts.xstream.Result;
+import com.thoughtworks.xstream.XStream;
+
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        try {
+            // 目标文件
+//            File file = new File("/home/pikachu/Documents/2017编程提高/coding2017/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/struts.xml");
+
+            File file = new File("D:\\src\\java\\coding2017\\group13\\2931408816\\lesson2\\src\\main\\java\\cn\\net\\pikachu\\litestruts\\struts.xml");
+            XStream xStream = new XStream();
+            // 扫描注解
+            xStream.processAnnotations(new Class[]{
+                    cn.net.pikachu.litestruts.xstream.Struts.class,Result.class,Action.class
+            });
+            // struts.xml映射的类
+            cn.net.pikachu.litestruts.xstream.Struts struts = (cn.net.pikachu.litestruts.xstream.Struts) xStream.fromXML(file);
+            Class clazz = null;
+            Action action = null;
+            // 找到执行action的类
+            for (Action a :
+                    struts.getActions()) {
+                if (a.getName().equals(actionName)){
+                    System.out.println("执行 "+actionName);
+                    clazz = Class.forName(a.getClazz());
+                    action = a;
+                    break;
+                }
+            }
+            if (clazz == null){
+                throw new ClassNotFoundException("执行action "+actionName+" 所对应的类");
+            }
+            // 参数注入
+            Object o = clazz.newInstance();
+            // java可怜的lambda表达式
+            final Class c = clazz;
+            parameters.forEach((k,v)->{
+                try {
+                    String methodName = "set"+k.substring(0,1).toUpperCase()+k.substring(1);
+                    System.out.println("调用"+methodName);
+                    Method method = c.getMethod(methodName,String.class);
+                    method.invoke(o,v);
+                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            });
+            // 执行
+            Method method = clazz.getMethod("execute");
+            String name = (String) method.invoke(o);
+            // 可怜又可恶的Java lambda表达式
+            final String[] results = new String[]{null};
+            action.getResults().forEach(it -> {
+                if (it.getName().equals(name)){
+                    results[0]=it.getResult();
+                }
+            });
+            if (results[0]==null){
+                throw new Exception("未找到与action匹配的结果");
+            }
+            // 获取最后的结果
+            View view = new View();
+            view.setJsp(results[0]);
+            /**
+             * 没有正确理解老师的意思
+             */
+            /*
+            String message = (String) clazz.getMethod("getMessage").invoke(o);
+            parameters.put("message",message);
+            view.setParameters(parameters);
+            */
+            Map<String,Object> map = new HashMap<String,Object>();
+            Method[] methods = clazz.getMethods();
+            for (Method m : methods) {
+                String methodName = m.getName();
+                if (methodName.startsWith("get")){
+                    String attr = methodName.substring(3);
+                    attr=attr.substring(0,1).toLowerCase()+attr.substring(1);
+                    Object value = m.invoke(o);
+                    map.put(attr,value);
+                }
+            }
+            view.setParameters(map);
+            return view;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    	return null;
+    }    
+
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/View.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/View.java
new file mode 100644
index 0000000000..ef91f36b6d
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/View.java
@@ -0,0 +1,23 @@
+package cn.net.pikachu.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/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/struts.xml b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Action.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Action.java
new file mode 100644
index 0000000000..42e517dd14
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Action.java
@@ -0,0 +1,51 @@
+package cn.net.pikachu.litestruts.xstream;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
+import com.thoughtworks.xstream.annotations.XStreamImplicit;
+
+import java.util.List;
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+@XStreamAlias("action")
+public class Action {
+    @XStreamAsAttribute
+    private String name;
+    @XStreamAlias("class")
+    @XStreamAsAttribute
+    private String clazz;
+    @XStreamImplicit
+    private List<Result> results;
+
+    public Action(String name, String clazz, List<Result> 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 List<Result> getResults() {
+        return results;
+    }
+
+    public void setResults(List<Result> results) {
+        this.results = results;
+    }
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Main.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Main.java
new file mode 100644
index 0000000000..164dd1c6d1
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Main.java
@@ -0,0 +1,42 @@
+package cn.net.pikachu.litestruts.xstream;
+
+import com.thoughtworks.xstream.XStream;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+public class Main {
+    public static void main(String[] args) {
+        Result result = new Result("success","/index.jsp");
+        List<Result> results = new LinkedList<>();
+        results.add(result);
+        results.add(new Result("fail","/login.jsp"));
+
+        Action action = new Action(Main.class.getSimpleName(),Main.class.getCanonicalName(),results);
+        List<Action> actions = new ArrayList<>();
+        actions.add(action);
+//        actions.add(action);
+
+        Struts struts = new Struts(actions);
+
+        XStream xStream = new XStream();
+        xStream.processAnnotations(new Class[]{
+                Struts.class,Result.class,Action.class
+        });
+//        xStream.addImplicitCollection(Struts.class,"actions");
+//        xStream.alias("struts",Struts.class);
+//        xStream.useAttributeFor("name",String.class);
+//        xStream.useAttributeFor("clazz",String.class);
+//        xStream.aliasField("class",Struts.class,"clazz");
+//        xStream.alias("action",Action.class);
+//        xStream.alias("result",Result.class);
+
+        String xml = xStream.toXML(struts);
+
+        System.out.println(xml);
+    }
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Result.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Result.java
new file mode 100644
index 0000000000..65deb6520b
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Result.java
@@ -0,0 +1,36 @@
+package cn.net.pikachu.litestruts.xstream;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+@XStreamAlias("result")
+@XStreamConverter(value=ToAttributedValueConverter.class, strings={"result"})
+public class Result {
+    private String name;
+    private String result;
+
+    public Result(String name, String result) {
+        this.name = name;
+        this.result = result;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Struts.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Struts.java
new file mode 100644
index 0000000000..02cd795b3a
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Struts.java
@@ -0,0 +1,28 @@
+package cn.net.pikachu.litestruts.xstream;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
+import com.thoughtworks.xstream.annotations.XStreamImplicit;
+
+import java.util.List;
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+@XStreamAlias("struts")
+public class Struts {
+    @XStreamImplicit
+    private List<Action> actions;
+
+    public Struts(List<Action> actions) {
+        this.actions = actions;
+    }
+
+    public List<Action> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<Action> actions) {
+        this.actions = actions;
+    }
+}
diff --git a/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Test.java b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Test.java
new file mode 100644
index 0000000000..793e5d3a22
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/xstream/Test.java
@@ -0,0 +1,18 @@
+package cn.net.pikachu.litestruts.xstream;
+
+import com.thoughtworks.xstream.XStream;
+
+import java.io.File;
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+public class Test {
+    public static void main(String[] args) {
+        XStream xStream = new XStream();
+        xStream.processAnnotations(new Class[]{
+                Struts.class,Result.class,Action.class
+        });
+        Struts struts = (Struts) xStream.fromXML(new File("/home/pikachu/Documents/2017编程提高/coding2017/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/struts.xml"));
+    }
+}
diff --git a/group13/2931408816/lesson2/src/main/java/com/coderising/action/LoginAction.java b/group13/2931408816/lesson2/src/main/java/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..5496d8084d
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/java/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group13/2931408816/lesson2/src/main/kotlin/cn/net/pikachu/Alias Tutorial.kt b/group13/2931408816/lesson2/src/main/kotlin/cn/net/pikachu/Alias Tutorial.kt
new file mode 100644
index 0000000000..aa0c8fc6e6
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/kotlin/cn/net/pikachu/Alias Tutorial.kt	
@@ -0,0 +1,67 @@
+package cn.net.pikachu
+
+import com.thoughtworks.xstream.XStream
+import java.util.ArrayList
+import com.thoughtworks.xstream.converters.SingleValueConverter
+
+
+
+
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+fun main(args: Array<String>) {
+    val list = mutableListOf<Entry>()
+    list.add(Entry("first","My first blog entry."))
+    list.add(Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!"))
+
+    val teamBlog = Blog(Author("Guilherme Silveira"),list)
+
+    val xstream = XStream()
+    xstream.alias("blog",Blog::class.java)
+    xstream.alias("entry",Entry::class.java)
+//    xstream.aliasField("author",Blog::class.java,"writer")
+
+    xstream.addImplicitCollection(Blog::class.java,"entries")
+
+    xstream.useAttributeFor(Blog::class.java,"author")
+    xstream.registerConverter(AuthorConverter())
+
+    // 更改包名
+//    xstream.aliasPackage("my.company","cn.net.pikachu")
+
+    println(xstream.toXML(teamBlog))
+
+}
+data class Entry(
+        var title:String,
+        var description:String
+)
+data class Author(
+        var name:String
+)
+data class Blog(
+        var author:Author,
+        val entries:MutableList<Entry> = mutableListOf()
+){
+    fun add(entry: Entry){
+        entries.add(entry)
+    }
+}
+
+class AuthorConverter : SingleValueConverter {
+
+    override fun toString(obj: Any): String {
+        return (obj as Author).name
+    }
+
+    override fun fromString(name: String): Any {
+        return Author(name)
+    }
+
+    override fun canConvert(type: Class<*>): Boolean {
+        return type == Author::class.java
+    }
+
+}
\ No newline at end of file
diff --git a/group13/2931408816/lesson2/src/main/kotlin/cn/net/pikachu/main.kt b/group13/2931408816/lesson2/src/main/kotlin/cn/net/pikachu/main.kt
new file mode 100644
index 0000000000..a6db134f81
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/kotlin/cn/net/pikachu/main.kt
@@ -0,0 +1,32 @@
+package cn.net.pikachu
+
+import com.thoughtworks.xstream.XStream
+
+/**
+ * Created by pikachu on 17-3-2.
+ */
+data class PhoneNumber(
+        var code:Int,
+        var number:String
+)
+data class Person(
+        var firstname:String,
+        var lastname:String,
+        var phone:PhoneNumber,
+        var fax:PhoneNumber
+)
+
+fun main(args: Array<String>) {
+    val xstream = XStream()
+    xstream.alias("person",Person::class.java)
+    xstream.alias("phonenumber",PhoneNumber::class.java)
+
+    val joe = Person("Joe","Walnes", PhoneNumber(123,"1234-456"), PhoneNumber(123,"9999-999"))
+
+    val xml = xstream.toXML(joe)
+
+    println(xml)
+
+    val newJoe = xstream.fromXML(xml)
+    println(newJoe)
+}
\ No newline at end of file
diff --git a/group13/2931408816/lesson2/src/main/resources/blog.xml b/group13/2931408816/lesson2/src/main/resources/blog.xml
new file mode 100644
index 0000000000..19f387aa99
--- /dev/null
+++ b/group13/2931408816/lesson2/src/main/resources/blog.xml
@@ -0,0 +1,12 @@
+<blog author="Guilherme Silveira">
+    <entry>
+        <title>first</title>
+        <description>My first blog entry.</description>
+    </entry>
+    <entry>
+        <title>tutorial</title>
+        <description>
+            Today we have developed a nice alias tutorial. Tell your friends! NOW!
+        </description>
+    </entry>
+</blog>
\ No newline at end of file
diff --git a/group13/2931408816/lesson2/src/test/java/cn/net/pikachu/array/ArrayUtilTest.java b/group13/2931408816/lesson2/src/test/java/cn/net/pikachu/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..5a9ff8a1e5
--- /dev/null
+++ b/group13/2931408816/lesson2/src/test/java/cn/net/pikachu/array/ArrayUtilTest.java
@@ -0,0 +1,189 @@
+package cn.net.pikachu.array; 
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/** 
+* ArrayUtil Tester. 
+* 
+* @author pikachu 
+* @since <pre>三月 1, 2017</pre> 
+* @version 1.0 
+*/ 
+public class ArrayUtilTest { 
+
+    public ArrayUtil util;
+    @Before
+    public void before() throws Exception { 
+        util= new ArrayUtil();
+    } 
+
+    @After
+    public void after() throws Exception { 
+        
+    } 
+
+    /** 
+    * 
+    * Method: reverseArray(int[] origin) 
+    * 
+    */ 
+    @Test
+    public void testReverseArray() { 
+        int a[]={7,9,30,3};
+        int ae[]={3,30,9,7};
+        util.reverseArray(a);
+        Assert.assertArrayEquals(ae,a);
+
+        int b[]={7,9,30,3,4};
+        int be[]={4,3,30,9,7};
+        util.reverseArray(b);
+        Assert.assertArrayEquals(be,b);
+    } 
+
+    /** 
+    * 
+    * Method: removeZero(int[] oldArray) 
+    * 
+    */ 
+    @Test
+    public void testRemoveZero() {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        int arr[]={1,3,4,5,6,6,5,4,7,6,7,5};
+        int r[] = util.removeZero(oldArr);
+        Assert.assertEquals(Arrays.toString(r),Arrays.toString(arr));
+    } 
+
+    /** 
+    * 
+    * Method: merge(int[] array1, int[] array2) 
+    * 
+    */ 
+    @Test
+    public void testMerge() { 
+        int[] a = {3, 5, 7,8};
+        int[] b = {4, 5, 6,7};
+        int[] c = {3,4,5,6,7,8};
+        int[] r=util.merge(a,b);
+        Assert.assertEquals(Arrays.toString(c),Arrays.toString(r));
+    } 
+
+    /** 
+    * 
+    * Method: grow(int [] oldArray, int size) 
+    * 
+    */ 
+    @Test
+    public void testGrow() { 
+        int[] oldArray = {2,3,6};
+        int[] a = {2,3,6,0,0,0};
+        Assert.assertArrayEquals(a,util.grow(oldArray,3));
+    }
+
+    /** 
+    * 
+    * Method: fibonacci(int max) 
+    * 
+    */ 
+    @Test
+    public void testFibonacci() { 
+        int[] a ={1,1,2,3,5,8,13};
+        Assert.assertArrayEquals(a,util.fibonacci(15));
+        Assert.assertArrayEquals(new int[]{},util.fibonacci(1));
+    } 
+
+    /** 
+    * 
+    * Method: getPrimes(int max) 
+    * 
+    */ 
+    @Test
+    public void testGetPrimes() { 
+        int[] a = new int[]{2,3,5,7,11,13,17,19};
+        Assert.assertArrayEquals(a,util.getPrimes(23));
+    } 
+
+    /** 
+    * 
+    * Method: getPerfectNumbers(int max) 
+    * 
+    */ 
+    @Test
+    public void testGetPerfectNumbers() { 
+        
+    } 
+
+    /** 
+    * 
+    * Method: join(int[] array, String seperator) 
+    * 
+    */ 
+    @Test
+    public void testJoin() { 
+        int[] a =new int[]{3,8,9};
+        Assert.assertEquals("3-8-9",util.join(a,"-"));
+    } 
+
+
+    /** 
+    * 
+    * Method: getIntsFromList(List<Integer> list) 
+    * 
+    */ 
+    @Test
+    public void testGetIntsFromList() { 
+        /* 
+        try { 
+           Method method = ArrayUtil.getClass().getMethod("getIntsFromList", List<Integer>.class); 
+           method.setAccessible(true); 
+           method.invoke(<Object>, <Parameters>); 
+        } catch(NoSuchMethodException e) { 
+        } catch(IllegalAccessException e) { 
+        } catch(InvocationTargetException e) { 
+        } 
+        */ 
+        } 
+
+    /** 
+    * 
+    * Method: isPrimes(int num) 
+    * 
+    */ 
+    @Test
+    public void testIsPrimes() { 
+        /* 
+        try { 
+           Method method = ArrayUtil.getClass().getMethod("isPrimes", int.class); 
+           method.setAccessible(true); 
+           method.invoke(<Object>, <Parameters>); 
+        } catch(NoSuchMethodException e) { 
+        } catch(IllegalAccessException e) { 
+        } catch(InvocationTargetException e) { 
+        } 
+        */ 
+        } 
+
+    /** 
+    * 
+    * Method: isPerfectNumber(int num) 
+    * 
+    */ 
+    @Test
+    public void testIsPerfectNumber() { 
+        /* 
+        try { 
+           Method method = ArrayUtil.getClass().getMethod("isPerfectNumber", int.class); 
+           method.setAccessible(true); 
+           method.invoke(<Object>, <Parameters>); 
+        } catch(NoSuchMethodException e) { 
+        } catch(IllegalAccessException e) { 
+        } catch(InvocationTargetException e) { 
+        } 
+        */ 
+        } 
+
+} 
diff --git a/group13/2931408816/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java b/group13/2931408816/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java
new file mode 100644
index 0000000000..eff3e7d341
--- /dev/null
+++ b/group13/2931408816/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java
@@ -0,0 +1,42 @@
+package cn.net.pikachu.array;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import cn.net.pikachu.litestruts.Struts;
+import cn.net.pikachu.litestruts.View;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        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/group13/2931408816/settings.gradle b/group13/2931408816/settings.gradle
new file mode 100644
index 0000000000..edb622fc76
--- /dev/null
+++ b/group13/2931408816/settings.gradle
@@ -0,0 +1,21 @@
+/*
+ * This settings file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/3.4/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = '2931408816'
+include 'lesson1'
+include 'lesson2'
+
diff --git a/group13/413007522/lesson02/pom.xml b/group13/413007522/lesson02/pom.xml
new file mode 100644
index 0000000000..656ddd82ed
--- /dev/null
+++ b/group13/413007522/lesson02/pom.xml
@@ -0,0 +1,18 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>cn.xl</groupId>
+  <artifactId>lesson_code</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>lesson_code</name>
+  
+  <dependencies>
+  
+      <dependency>  
+            <groupId>junit</groupId>  
+            <artifactId>junit</artifactId>  
+            <version>4.8.2</version>  
+            <scope>test</scope>  
+        </dependency>  
+  </dependencies>
+  
+</project>
\ No newline at end of file
diff --git a/group13/413007522/lesson02/src/main/java/cn/xl/c2/LoginAction.java b/group13/413007522/lesson02/src/main/java/cn/xl/c2/LoginAction.java
new file mode 100644
index 0000000000..473b781bdf
--- /dev/null
+++ b/group13/413007522/lesson02/src/main/java/cn/xl/c2/LoginAction.java
@@ -0,0 +1,46 @@
+package cn.xl.c2;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @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 static void main(String[] args){
+    	
+    	
+    }
+}
diff --git a/group13/413007522/lesson02/src/main/java/cn/xl/c2/Struts.java b/group13/413007522/lesson02/src/main/java/cn/xl/c2/Struts.java
new file mode 100644
index 0000000000..82c5f0e9a8
--- /dev/null
+++ b/group13/413007522/lesson02/src/main/java/cn/xl/c2/Struts.java
@@ -0,0 +1,169 @@
+package cn.xl.c2;
+
+import java.io.File;
+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 javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * 0. 读取配置文件struts.xml
+ * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）据parameters中的数据，调用对象的setter方法， 
+ *    例如parameters中的数据是 ("name"="test" ,  "password"="1234") , 那就应该调用 setName和setPassword方法
+ * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+ * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+ *    通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  放到View对象的parameters
+ * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+ * 	     放到View对象的jsp字段中。
+ * 
+ */
+
+public class Struts {
+
+
+	private static  String filePath = "src/main/java/cn/xl/c2/struts.xml";
+
+	private static  long time; 
+
+	private static  List<Object> reList = new ArrayList<Object>(); 
+
+
+	@SuppressWarnings("unchecked")
+	public static View runAction(String actionName, Map<String,String> parameters) {
+
+		View    view = null;
+		Class<?> cls = null;
+		Object   Obj = null;
+		Map<String,Object> action = null;
+		List<Object>   resultList = null;
+		Iterator<Object> restIter = null;
+		List<Object> configlist = getConfigInfo();
+		Iterator<Object> lter = configlist.iterator();
+		while(lter.hasNext()){
+			action = (Map<String,Object>)lter.next();
+			if(actionName.equals(action.get("actionName"))){
+				System.out.println("action.get(actionClass)"+action.get("actionClass"));
+				try {
+					//得到对象
+					cls = Class.forName(action.get("actionClass").toString());
+					Obj = cls.newInstance();
+					//获取到方法对象
+					Method setName = cls.getDeclaredMethod("setName", String.class);
+					Method setPassword = cls.getDeclaredMethod("setPassword", String.class);
+					Method exectue = cls.getDeclaredMethod("execute");
+					//执行方法
+					setName.invoke(Obj,parameters.get("name").toString());
+					setPassword.invoke(Obj,parameters.get("password").toString());
+					String reMessage = (String)exectue.invoke(Obj);
+					//匹配结果，封装view
+					resultList =  (List<Object>) action.get("result");
+					restIter = resultList.iterator();
+					while(restIter.hasNext()){
+						Map<String,Object> result = (Map<String,Object>) restIter.next();
+						if(reMessage.equals(result.get("resultName"))){
+							view = new View();
+							view.setJsp(result.get("resultMapper").toString());
+							view.setParameters(parameters);
+						}
+					}
+
+				} catch (Exception e) {
+					// TODO: handle exception
+					System.out.println("e=="+e);
+				}  
+
+			}
+		}
+
+		return view;
+	}    
+
+	/** 
+	 * 如果内存中没有，则先去解析，如果存在并且配置文件未修改，则直接从内存中获取  
+	 * @return configInfo
+	 */  
+	public static List<Object> getConfigInfo(){  
+		if(reList.size()==0 || getTime(filePath)!=time){  
+			return readConfigXML();  
+		}else {  
+			return  reList;
+		}  
+	}  
+
+	/**
+	 * 读取配置文件信息，并返回配置文件内容
+	 * 
+	 */
+	private static List<Object> readConfigXML() {
+		DocumentBuilderFactory   dbf = DocumentBuilderFactory.newInstance();
+		try {
+			DocumentBuilder db = dbf.newDocumentBuilder();  
+			Document doc = db.parse(filePath);  
+			time = getTime(filePath);
+			NodeList actionList = doc.getElementsByTagName("action"); 
+			Map<String,Object>  actionMap ;
+			
+			for (int i = 0; i < actionList.getLength(); i++)  
+			{  
+				actionMap =  new HashMap<String,Object>();
+				Node action = actionList.item(i);  
+				Element elem = (Element) action; 
+				String actionName = elem.getAttributes().getNamedItem("name").getNodeValue();
+				String actionClass = elem.getAttributes().getNamedItem("class").getNodeValue();
+				actionMap.put("actionName",actionName);
+				actionMap.put("actionClass",actionClass);
+				// 获得根元素下的子节点
+				List<Object> resultList = new ArrayList<Object>();
+				for (Node node = action.getFirstChild(); node != null; node = node.getNextSibling())  
+				{  
+					if (node.getNodeType() == Node.ELEMENT_NODE)  
+					{  
+						Map<String,Object> resultMap = new HashMap<String,Object>();
+						String resultName = node.getAttributes().getNamedItem("name").getNodeValue();
+						String resultMapper = node.getFirstChild().getNodeValue();
+						resultMap.put("resultName", resultName);
+						resultMap.put("resultMapper", resultMapper);
+						resultList.add(resultMap);
+					}  
+
+				}
+				actionMap.put("result",resultList);
+				reList.add(actionMap);
+			}
+
+		} catch (Exception e) {
+			// TODO: handle exception
+			System.out.println("e=="+e.getMessage());
+		}
+		return reList;  	
+	}
+
+	/** 
+	 * 获取到文件最后修改时间 
+	 * @return 
+	 */  
+	public static long getTime(String path){  
+		File f = new File(path);    
+		long  lastTime=f.lastModified();  
+		System.out.println("lastTime:::::"+lastTime);
+		return lastTime;  
+	}  
+
+
+	public static void main(String[] args){
+
+
+	}
+
+
+}
diff --git a/group13/413007522/lesson02/src/main/java/cn/xl/c2/StrutsTest.java b/group13/413007522/lesson02/src/main/java/cn/xl/c2/StrutsTest.java
new file mode 100644
index 0000000000..3cbb3f5e69
--- /dev/null
+++ b/group13/413007522/lesson02/src/main/java/cn/xl/c2/StrutsTest.java
@@ -0,0 +1,42 @@
+package cn.xl.c2;
+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<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        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/group13/413007522/lesson02/src/main/java/cn/xl/c2/View.java b/group13/413007522/lesson02/src/main/java/cn/xl/c2/View.java
new file mode 100644
index 0000000000..acb53482df
--- /dev/null
+++ b/group13/413007522/lesson02/src/main/java/cn/xl/c2/View.java
@@ -0,0 +1,23 @@
+package cn.xl.c2;
+
+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/group13/413007522/lesson02/src/main/java/cn/xl/c2/struts.xml b/group13/413007522/lesson02/src/main/java/cn/xl/c2/struts.xml
new file mode 100644
index 0000000000..44f46e5977
--- /dev/null
+++ b/group13/413007522/lesson02/src/main/java/cn/xl/c2/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="cn.xl.c2.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="cn.xl.c2.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group13/453070251/lessones01/BinaryTreeNode.class b/group13/453070251/lessones01/BinaryTreeNode.class
new file mode 100644
index 0000000000..0420d6f383
Binary files /dev/null and b/group13/453070251/lessones01/BinaryTreeNode.class differ
diff --git a/group13/453070251/lessones01/BinaryTreeNode.java b/group13/453070251/lessones01/BinaryTreeNode.java
index f5d8c5dacd..da34f1a0af 100644
--- a/group13/453070251/lessones01/BinaryTreeNode.java
+++ b/group13/453070251/lessones01/BinaryTreeNode.java
@@ -1,3 +1,4 @@
+package lessones01;
 public class BinaryTreeNode{
 	public BinaryTreeNode left;
 	public BinaryTreeNode right;
diff --git a/group13/453070251/lessones01/LinkedList.class b/group13/453070251/lessones01/LinkedList.class
new file mode 100644
index 0000000000..e6782af760
Binary files /dev/null and b/group13/453070251/lessones01/LinkedList.class differ
diff --git a/group13/453070251/lessones01/LinkedList.java b/group13/453070251/lessones01/LinkedList.java
index c1cefc463f..3732f43f8b 100644
--- a/group13/453070251/lessones01/LinkedList.java
+++ b/group13/453070251/lessones01/LinkedList.java
@@ -1,3 +1,4 @@
+package lessones01;
 public class LinkedList<T>{
 	public static void main(String[] args){
 		LinkedList<String> arr = new LinkedList<String>();
diff --git a/group13/453070251/lessones01/LinkedListWithFloat.class b/group13/453070251/lessones01/LinkedListWithFloat.class
new file mode 100644
index 0000000000..bf24ae8841
Binary files /dev/null and b/group13/453070251/lessones01/LinkedListWithFloat.class differ
diff --git a/group13/453070251/lessones01/LinkedListWithFloat.java b/group13/453070251/lessones01/LinkedListWithFloat.java
index 803faa43d3..efc1b55fe2 100644
--- a/group13/453070251/lessones01/LinkedListWithFloat.java
+++ b/group13/453070251/lessones01/LinkedListWithFloat.java
@@ -1,3 +1,4 @@
+package lessones01;
 public class LinkedListWithFloat<T> extends LinkedList<T>{
 	public static void main(String[] args){
 		LinkedListWithFloat<String> arr = new LinkedListWithFloat<String>();
diff --git a/group13/453070251/lessones01/Node.class b/group13/453070251/lessones01/Node.class
new file mode 100644
index 0000000000..95c3f5d6cc
Binary files /dev/null and b/group13/453070251/lessones01/Node.class differ
diff --git a/group13/453070251/lessones01/Node.java b/group13/453070251/lessones01/Node.java
index 14abb92ecf..68e4845bff 100644
--- a/group13/453070251/lessones01/Node.java
+++ b/group13/453070251/lessones01/Node.java
@@ -1,3 +1,4 @@
+package lessones01;
 public class Node<T>{
 	public Node<T> left;
 	public Node<T> right;
diff --git a/group13/453070251/lessones01/Queue.class b/group13/453070251/lessones01/Queue.class
new file mode 100644
index 0000000000..0628d014f4
Binary files /dev/null and b/group13/453070251/lessones01/Queue.class differ
diff --git a/group13/453070251/lessones01/Queue.java b/group13/453070251/lessones01/Queue.java
index 6e54c1add2..2e111925f3 100644
--- a/group13/453070251/lessones01/Queue.java
+++ b/group13/453070251/lessones01/Queue.java
@@ -1,3 +1,4 @@
+package lessones01;
 public class Queue<T>{
 	Node<T> first;
 	Node<T> lastest;
diff --git a/group13/453070251/lessones01/Stack.class b/group13/453070251/lessones01/Stack.class
new file mode 100644
index 0000000000..0d2c5e42f6
Binary files /dev/null and b/group13/453070251/lessones01/Stack.class differ
diff --git a/group13/453070251/lessones01/Stack.java b/group13/453070251/lessones01/Stack.java
index a87cb59268..35bdfea31c 100644
--- a/group13/453070251/lessones01/Stack.java
+++ b/group13/453070251/lessones01/Stack.java
@@ -1,3 +1,4 @@
+package lessones01;
 public class Stack<T>{
 	Node<T> first;
 	Node<T> lastest;
diff --git a/group13/453070251/lessones02/ArrayUtil.class b/group13/453070251/lessones02/ArrayUtil.class
new file mode 100644
index 0000000000..342fba3bee
Binary files /dev/null and b/group13/453070251/lessones02/ArrayUtil.class differ
diff --git a/group13/453070251/lessones02/ArrayUtil.java b/group13/453070251/lessones02/ArrayUtil.java
new file mode 100644
index 0000000000..fe2fa5a5a4
--- /dev/null
+++ b/group13/453070251/lessones02/ArrayUtil.java
@@ -0,0 +1,134 @@
+package lessones02;
+import others.Others;
+import lessones01.LinkedListWithFloat;
+public class ArrayUtil{
+	public static void reverseArray(int[] arg_arr){
+		for(int i = arg_arr.length/2;i>0;i--){
+			//��Ϊȷ����int���͵��������Կ�����ô��
+			arg_arr[i-1] ^= arg_arr[arg_arr.length - i];
+			arg_arr[arg_arr.length - i] ^= arg_arr[i-1];
+			arg_arr[i-1] ^= arg_arr[arg_arr.length - i];
+		}
+	}
+	public static int[] removeZero(int[] arg_arr){
+		int zeroNum = 0;
+		//��������漸��for��������������ôд������(���)��õ㣬���ǿ��ɶ��Ի�������
+		for(int i=0;i<arg_arr.length;i++){if(arg_arr[i] == 0){zeroNum++;}}
+		int[] newArray = new int[arg_arr.length - zeroNum];
+		int f = 0;
+		for(int x=0;x<arg_arr.length;x++){if(arg_arr[x] != 0){newArray[f++] = arg_arr[x];}}
+		return newArray;
+	}
+	public static int[] merge(int[] arg_arr1,int[] arg_arr2){
+		int s = 0;
+		int f1=0;
+		int f2=0;
+		//�о������ƴ��룬�����벻������ô�Ż�
+		for(;f1<arg_arr1.length&&f2<arg_arr2.length;s++){
+			if(arg_arr1[f1] == arg_arr2[f2]){
+				f1++;
+				f2++;
+			}else if(arg_arr1[f1] > arg_arr2[f2]){
+				f2++;
+			}else/*if(arg_arr1[f1] < arg_arr2[f2])*/{
+				f1++;
+			}
+		}
+		int[] arr = new int[s];
+		for(s=0,f1=0,f2=0;f1<arg_arr1.length&&f2<arg_arr2.length;s++){
+			if(arg_arr1[f1] == arg_arr2[f2]){
+				arr[s] = arg_arr1[f1];
+				f1++;
+				f2++;
+			}else if(arg_arr1[f1] > arg_arr2[f2]){
+				arr[s] = arg_arr2[f2];
+				f2++;
+			}else/*if(arg_arr1[f1] < arg_arr2[f2])*/{
+				arr[s] = arg_arr1[f1];
+				f1++;
+			}
+		}
+		return arr;
+	}
+	public static int[] grow(int[] arg_arr,int arg_size){
+		int[] arr = new int[arg_arr.length + arg_size];
+		int s = arg_arr.length;
+		for(int i=0;i<s;i++){arr[i] = arg_arr[i];}
+		int x = s;
+		for(s+=arg_size;x<s;x++){arr[x] = 0;}
+		return arr;
+	}
+	public static int[] fibonacci(int max){
+		return makeFibonacci(0,1,1,max);
+	}
+	private static int[] makeFibonacci(int num,int a,int b,int max){
+		if(a < max){
+			int[] temp = makeFibonacci(num+1,b,a+b,max);
+			temp[num] = a;
+			return temp;
+		}else{
+			return new int[num];
+		}
+	}
+	public static int[] getPrimes(int max){
+		int i=0;
+		for(;Others.PrimeGetter.get(i)<max;i++){}
+		int[] arr = new int[i];
+		for(i--;i>=0;i--){arr[i] = Others.PrimeGetter.get(i);}
+		return arr;
+	}
+	private static int[] two_s_TimesEnd = {8,6,2,4};
+	public static int[] getPerfectNumbers(int arg_num){
+		LinkedListWithFloat<Integer> arr = new LinkedListWithFloat<Integer>();
+		for(int i=2;;i++){
+			int z = (int)Math.pow(2,i) - 1;
+			int zz = z*two_s_TimesEnd[i&3];
+			if(zz%10 == 8||zz%10 == 6){
+				if(Others.PrimeGetter.isPrime(z)){
+					int zzz = (int)Math.pow(2,i-1)*z;
+					if(zzz<arg_num&&zzz>0){
+						arr.add(zzz);
+						System.out.println(zzz);
+					}else{
+						break;
+					}
+				}
+			}
+		}
+		int[] numbers = new int[arr.size()];
+		for(int i =0;i<arr.size();i++){numbers[i] = arr.get(i);}
+		return numbers;
+	}
+	public static void main(String[] args){
+		int[] a = fibonacci(15);
+		for(int i=0;i<a.length;i++){
+			System.out.println(a[i]);
+		}
+		System.out.println("=========================");
+		a = grow(a,5);
+		for(int i=0;i<a.length;i++){
+			System.out.println(a[i]);
+		}
+		System.out.println("=========================");
+		a = removeZero(a);
+		for(int i=0;i<a.length;i++){
+			System.out.println(a[i]);
+		}
+		System.out.println("=========================");
+		reverseArray(a);
+		for(int i=0;i<a.length;i++){
+			System.out.println(a[i]);
+		}
+		System.out.println("=========================");
+		a = getPrimes(1000);
+		for(int i=0;i<a.length;i++){
+			System.out.println(a[i]);
+		}
+		System.out.println("=========================");
+		a = getPerfectNumbers(40000000);
+		for(int i=0;i<a.length;i++){
+			System.out.println(a[i]);
+		}
+		System.out.println("=========================");
+	}
+}
\ No newline at end of file
diff --git a/group13/453070251/others/Other.java b/group13/453070251/others/Other.java
new file mode 100644
index 0000000000..05a2715ea8
--- /dev/null
+++ b/group13/453070251/others/Other.java
@@ -0,0 +1,39 @@
+package others;
+import lessones01.LinkedListWithFloat;
+public class Others{
+	public static class PrimeGetter{
+		private static LinkedListWithFloat<Integer> primes = new LinkedListWithFloat<Integer>();
+		public static int get(int arg_num){
+			for(int i = primes.size()-1;i<arg_num;i++){add();}
+			return primes.get(arg_num);
+		}
+		private static void add(){
+			int size = primes.size();
+			if(size == 0){
+				primes.add(2);
+			}else if(size == 1){
+				primes.add(3);
+			}else{
+				for(int x = primes.get(size-1)+2;;x+=2){
+					int max = Math.sqrt(x);
+					boolean isPrime = true;
+					primes.get(0);
+					while(primes.floatNext()<max){
+						if(x%primes.floatValue == 0){
+							isPrime = false;
+							break;
+						}
+					}
+					if(isPrime){
+						primes.add(x);
+						return;
+					}
+				}
+			}
+		}
+		public static boolean isPrime(int arg_num){
+			for(int i = 0;arg_num<primes.get(i);i++){}
+			return arg_num == prime.get(i);
+		}
+	}
+}
\ No newline at end of file
diff --git a/group13/453070251/others/Others$PrimeGetter.class b/group13/453070251/others/Others$PrimeGetter.class
new file mode 100644
index 0000000000..cface24c05
Binary files /dev/null and b/group13/453070251/others/Others$PrimeGetter.class differ
diff --git a/group13/453070251/others/Others.class b/group13/453070251/others/Others.class
new file mode 100644
index 0000000000..69ae67f9c0
Binary files /dev/null and b/group13/453070251/others/Others.class differ
diff --git a/group13/453070251/others/Others.java b/group13/453070251/others/Others.java
new file mode 100644
index 0000000000..ef60886483
--- /dev/null
+++ b/group13/453070251/others/Others.java
@@ -0,0 +1,41 @@
+package others;
+import lessones01.LinkedListWithFloat;
+public class Others{
+	public static class PrimeGetter{
+		private static LinkedListWithFloat<Integer> primes = new LinkedListWithFloat<Integer>();
+		public static int get(int arg_num){
+			for(int i = primes.size()-1;i<arg_num;i++){add();}
+			return primes.get(arg_num);
+		}
+		private static void add(){
+			int size = primes.size();
+			if(size == 0){
+				primes.add(2);
+			}else if(size == 1){
+				primes.add(3);
+			}else{
+				for(int x = primes.get(size-1)+2;;x+=2){
+					boolean isPrime = true;
+					int floatPrime;
+					int z = (int)Math.sqrt(x);
+					for(int i=1;i<size;i++){
+						if(x%(floatPrime = primes.get(i)) == 0){
+							isPrime = false;
+							break;
+						}
+						if(z<floatPrime){break;}
+					}
+					if(isPrime){
+						primes.add(x);
+						return;
+					}
+				}
+			}
+		}
+		public static boolean isPrime(int arg_num){
+			int i = 0;
+			for(;arg_num>get(i);i++){}
+			return arg_num == primes.get(i);
+		}
+	}
+}
\ No newline at end of file
diff --git a/group13/568334413/0305/Coderising/build.gradle b/group13/568334413/0305/Coderising/build.gradle
new file mode 100644
index 0000000000..fd46ba2472
--- /dev/null
+++ b/group13/568334413/0305/Coderising/build.gradle
@@ -0,0 +1,16 @@
+group 'Coderising'
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.5
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    testCompile group: 'junit', name: 'junit', version: '4.11'
+    // https://mvnrepository.com/artifact/dom4j/dom4j
+
+}
diff --git a/group13/568334413/0305/Coderising/src/main/java/coderising/Main.java b/group13/568334413/0305/Coderising/src/main/java/coderising/Main.java
new file mode 100644
index 0000000000..8c8bd2773c
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/Main.java
@@ -0,0 +1,52 @@
+package coderising;
+
+import coderising.array.ArrayUtil;
+import coderising.litestruts.Struts;
+import coderising.litestruts.View;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by laibin on 2017/3/4.
+ */
+public class Main {
+    private static ArrayUtil arrayUtil = new ArrayUtil();
+
+    public static void main(String[] args) {
+        int[] ints1 = {1, 2, 3, 9, 22};
+//        arrayUtil.grow(ints1, 10);
+//        arrayUtil.getPerfectNumbers(100000000);
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "1234");
+
+
+        View view = Struts.runAction(actionName, params);
+
+        arrayUtil.join(ints1, "-");
+    }
+
+    private static void merge() {
+        int[] ints1 = {1, 2, 3, 9, 22};
+        int[] ints2 = {2, 3, 4, 7, 8, 10};
+        int[] newArr = arrayUtil.merge(ints1, ints2);
+        for (int i = 0; i < newArr.length; i++) {
+            System.out.println("newArr[i] = " + newArr[i]);
+        }
+    }
+
+    public static void reverseArray() {
+        int[] ints = {1, 2, 3, 4, 5, 6};
+        arrayUtil.reverseArray(ints);
+        System.out.println("ints = " + ints);
+    }
+
+    public static void removeZero() {
+        int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int[] ints1 = arrayUtil.removeZero(oldArr);
+        System.out.println("ints = " + ints1);
+    }
+}
diff --git a/group13/568334413/0305/Coderising/src/main/java/coderising/array/ArrayUtil.java b/group13/568334413/0305/Coderising/src/main/java/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..fbcdf72ff6
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/array/ArrayUtil.java
@@ -0,0 +1,245 @@
+package coderising.array;
+
+public class ArrayUtil {
+
+
+    private void checkArray(int[] origin) {
+        if (origin == null) {
+            throw new NullPointerException("array  is null refresh ");
+        }
+    }
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * 4 9 30 3 7
+     * 4 3 30 9 7
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        if (origin.length < 2) {
+            return;
+        }
+        for (int i = 0; i < origin.length / 2; i++) {
+            int temp = origin[i];
+            origin[i] = origin[origin.length - i - 1];
+            origin[origin.length - i - 1] = temp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        checkArray(oldArray);
+
+        int[] newArr = new int[oldArray.length];
+        int index = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                newArr[index] = oldArray[i];
+                index++;
+            }
+        }
+        int[] newArrs = new int[index];
+        System.arraycopy(newArr, 0, newArrs, 0, index);
+        return newArrs;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        if (array1 == null && array2 == null) {
+            return new int[0];
+        } else if (array1 == null || array1.length < 1) {
+            return array2;
+        } else if (array2 == null || array2.length < 1) {
+            return array1;
+        }
+        int index1 = 0;
+        int index2 = 0;
+        int index = 0;
+        int[] tempArr = new int[array1.length + array2.length];
+        for (int i = index1; i < tempArr.length; i++) {
+            for (int j = index2; j < array2.length; j++) {
+                int i1 = array1[index1];
+                int i2 = array2[index2];
+
+                if (i1 > i2) {
+                    tempArr[index] = i2;
+                    index2 = index2 + 1;
+                    index++;
+                    break;
+                } else if (i1 < i2) {
+                    tempArr[index] = i1;
+                    index1 = index1 + 1;
+                    index++;
+                    break;
+                } else {
+                    tempArr[index] = i1;
+                    index1 = index1 + 1;
+                    index2 = index2 + 1;
+                    index++;
+                    break;
+                }
+            }
+            if (index2 >= array2.length && index1 < array1.length) {
+                tempArr[index] = array1[index1];
+                index1 = index1 + 1;
+                index++;
+            }
+        }
+        int[] newArr = new int[index];
+        System.arraycopy(tempArr, 0, newArr, 0, index);
+        return newArr;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArr = new int[oldArray.length + size];
+        for (int i = 0; i < oldArray.length; i++) {
+            newArr[i] = oldArray[i];
+        }
+        return newArr;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        int[] tempArray = new int[max];
+        int[] ints = new int[0];
+        for (int i = 1; i <= max; i++) {
+            int num = fibonacci1(i);
+            if (num < max) {
+                tempArray[i - 1] = num;
+            } else {
+                ints = new int[i - 1];
+                System.arraycopy(tempArray, 0, ints, 0, i - 1);
+
+                break;
+            }
+        }
+
+
+        return ints;
+    }
+
+    // 递归实现方式
+    public static int fibonacci1(int n) {
+        if (n <= 2) {
+            return 1;
+        } else {
+            return fibonacci1(n - 1) + fibonacci1(n - 2);
+        }
+    }
+
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        int i, j, index = 0;
+        int[] tempArray = new int[max];
+
+        for (i = 1; i <= max; i++) {
+            for (j = 2; j < i; j++)
+                if (i % j == 0) break;
+            if (j < i)
+                continue;
+            else {
+                tempArray[index] = i;
+                index++;
+                System.out.println(i);
+            }
+        }
+        int[] arr = new int[index];
+        System.arraycopy(tempArray, 0, arr, 0, index);
+
+        return arr;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int sum = 0, i, j, index = 0;
+        int[] tempArray = new int[max];
+        for (i = 1; i <= max; i++) {
+            for (j = 1, sum = 0; j <= i / 2; j++) {
+                if (i % j == 0)
+                    sum += j;
+            }
+            if (sum == i) {
+                System.out.println("完数：" + i);
+                tempArray[index] = i;
+                index++;
+            }
+        }
+        int[] arr = new int[index];
+        System.arraycopy(tempArray, 0, arr, 0, index);
+        return arr;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            stringBuilder.append(i);
+            if (i != array.length - 1) {
+                stringBuilder.append(seperator);
+            }
+        }
+        System.out.println("stringBuilder = " + stringBuilder.toString());
+
+        return stringBuilder.toString();
+    }
+
+
+}
diff --git a/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/LoginAction.java b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..c528df798a
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/LogoutAction.java b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..8ec64d612d
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,39 @@
+package coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LogoutAction {
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/Struts.java b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..9dfbcdfc4e
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/Struts.java
@@ -0,0 +1,126 @@
+package coderising.litestruts;
+
+//import org.dom4j.Document;
+//import org.dom4j.DocumentException;
+//import org.dom4j.Element;
+//import org.dom4j.io.SAXReader;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+        SAXReader saxReader = new SAXReader();
+        Document document = null;
+        View view = new View();
+
+        try {
+            document = saxReader.read(new File(Struts.class.getResource("/struts.xml").getPath()));
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+        Element root = document.getRootElement();
+        List<Element> childList = root.elements();
+        String classValue = null;
+        String nameValue = null;
+        Element resultElement = null;
+        for (int i = 0; i < childList.size(); i++) {
+            Element element = childList.get(i);
+            List<Attribute> list = element.attributes();
+            for (Attribute attribute : list) {
+                if (attribute.getName().equals("name")) {
+                    nameValue = attribute.getValue();
+                } else {
+                    classValue = attribute.getValue();
+                }
+            }
+            if (nameValue != null && classValue != null) {
+                resultElement = element;
+                break;
+
+            }
+        }
+        Class<?> class1 = null;
+
+        try {
+
+            class1 = Class.forName(classValue);
+            Object loginAction = class1.newInstance();
+            Field[] fields = class1.getDeclaredFields();
+            for (int i = 0; i < fields.length; i++) {
+                Field field = fields[i];
+                field.setAccessible(true);
+                field.set(loginAction, parameters.get(field.getName()));
+            }
+            Method method = class1.getMethod("execute", null);
+            String object = (String) method.invoke(loginAction, null);
+            List<Element> name = resultElement.elements();
+            String jsp = null;
+            for (Element element : name) {
+                Attribute attribute1 = element.attribute("name");
+                if (attribute1.getValue().equals(object)) {
+                    jsp = element.getText();
+                    break;
+                }
+            }
+
+            HashMap<String, Object> parameter = new HashMap<String, Object>();
+            for (int i = 0; i < fields.length; i++) {
+                Field field = fields[i];
+                field.setAccessible(true);
+                parameter.put(field.getName(), field.get(loginAction));
+            }
+            view.setJsp(jsp);
+            view.setParameters(parameter);
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return view;
+    }
+
+}
diff --git a/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/StrutsTest.java b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..7c90aed0ce
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,69 @@
+package coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLogoutActionSuccess() {
+
+        String actionName = "logout";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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 testLogoutActionFailed() {
+        String actionName = "logout";
+        Map<String, String> params = new HashMap<String, String>();
+        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/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/View.java b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/View.java
new file mode 100644
index 0000000000..22fdf877d8
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/java/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group13/568334413/0305/Coderising/src/main/resources/struts.xml b/group13/568334413/0305/Coderising/src/main/resources/struts.xml
new file mode 100644
index 0000000000..57ad66abd0
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group13/568334413/0305/Coderising/src/test/resources/struts.xml b/group13/568334413/0305/Coderising/src/test/resources/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group13/568334413/0305/Coderising/src/test/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project"
deleted file mode 100644
index 194f47da7a..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project"
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>basicstructuredemo</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java"
deleted file mode 100644
index f6d3b4c44a..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java"
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.maple.basic;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData = new Object[100];
-	
-	public void add(Object o){
-		//不够了怎么扩容
-		elementData[size++]=o;
-	}
-	public void add(int index, Object o){
-		if(index<0||index>size){
-			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
-		}
-		for(int i=size;i>index;i--){
-			elementData[i-1]=elementData[i];
-		}
-		elementData[index]=o;
-		size++;
-	}
-	
-	public Object get(int index){
-		if(index<0||index>=size){
-			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
-		}
-		return elementData[index];
-	}
-	
-	public Object remove(int index){
-		if(index<0||index>=size){
-			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
-		}
-		Object removeObj=elementData[index];
-		for(int i=index;i<size-1;i++){
-			elementData[i]=elementData[i+1];
-		}
-		size--;
-		return removeObj;
-	}
-	
-	public int size(){
-		return size;
-	}
-	
-	public Iterator iterator(){
-		return new Iterator() {
-			int ref=0;
-			@Override
-			public Object next() {
-				if(hasNext()){
-					return elementData[ref++];
-				}
-				return null;
-			}
-			
-			@Override
-			public boolean hasNext() {
-				if(ref<0||ref>=size) return false;
-				return true;
-			}
-		};
-	}
-	
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java"
deleted file mode 100644
index 5e63cf4d3c..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java"
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.maple.basic;
-
-import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName;
-
-public class BinaryTree<T extends Comparable<T>> {
-	private BinaryTreeNode<T> root;
-	
-	public void traversal(BinaryTreeNode<T> node){
-		if(node.getLeft()!=null){
-			traversal(node.getLeft());
-		}
-		System.out.println("--"+node.getData()+"--");
-		if(node.getRight()!=null){
-			traversal(node.getRight());
-		}
-	}
-	/**
-	 * 如果根节点为null，则作为根节点，否则遍历下去插值
-	 * @param o
-	 * @return 
-	 * 2017年2月23日 下午4:21:51
-	 * @Author Joy
-	 */
-	public BinaryTreeNode insert(T o){
-		if(root==null){
-			BinaryTreeNode<T> newB=new BinaryTreeNode<T>();
-			newB.setData(o);
-			newB.setLeft(null);
-			newB.setRight(null);
-			root=newB;
-			return root;
-		}
-		
-		return  root.insert(o);
-	}
-	public BinaryTreeNode<T> getRoot() {
-		return root;
-	}
-
-	public void setRoot(BinaryTreeNode<T> root) {
-		this.root = root;
-	}
-	
-	
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java"
deleted file mode 100644
index f702d48922..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java"
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.maple.basic;
-
-import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName;
-
-public class BinaryTreeNode<T extends Comparable<T>>{
-	
-	private T data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	
-	/**
-	 * 如果待插入的值等于节点的值，则抛出异常：duplicate value
-	 * 如果小于节点的值，则往左边遍历
-	 * 如果大于节点的值，则往右边遍历
-	 * @param o
-	 * @return 
-	 * 2017年2月23日 下午4:22:50
-	 * @Author Joy
-	 */
-	public BinaryTreeNode insert(T o){
-		//assume that no duplicate key
-		
-		if(o.compareTo(data)==0){
-			try {
-				throw new DuplicateName("duplicate value: "+o);
-			} catch (DuplicateName e) {
-				e.printStackTrace();
-			}
-		}
-		BinaryTreeNode<T> newB=new BinaryTreeNode<T>();
-		newB.setData(o);
-		newB.setLeft(null);
-		newB.setRight(null);
-		//o更大，在右边
-		if(o.compareTo(data)>0){
-			if(this.getRight()!=null){
-				this.getRight().insert(o);
-			}else{
-				this.setRight(newB);
-			}
-		}else if(o.compareTo(data)<0){
-			if(this.getLeft()!=null){
-				this.getLeft().insert(o);
-			}else{
-				this.setLeft(newB);
-			}
-		}
-		return  newB;
-	}
-	
-	public T getData() {
-		return data;
-	}
-	public void setData(T data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java"
deleted file mode 100644
index ac8ecd6050..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java"
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.maple.basic;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java"
deleted file mode 100644
index d957f74bdc..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java"
+++ /dev/null
@@ -1,154 +0,0 @@
-package com.maple.basic;
-
-import java.util.NoSuchElementException;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	private int size = 0;//自己加的，觉得需要
-	/**
-	 * 与addList()是一样的
-	 */
-	public void add(Object o){
-		addLast(o);
-	}
-	public void add(int index , Object o){
-		if(index<0||index>size){
-			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
-		}
-		Node prevNode=head;
-		Node curNode=head.next;
-		int count=0;
-		while(count<=index){
-			if(count==index){
-				Node newNode=new Node();
-				newNode.data=o;
-				
-				newNode.next=curNode;
-				prevNode.next=newNode;
-				size++;
-				break;
-			}
-			curNode=curNode.next;
-			prevNode=prevNode.next;
-			count++;
-		}
-		
-		
-	}
-	public Object get(int index){
-		if(index<0||index>=size)
-			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
-		
-		Node curNode=head.next;
-		int count=0;
-		while(count<=index){
-			if(count==index){
-				return curNode.data;
-			}
-			curNode=curNode.next;
-			count++;
-		}
-		return null;
-	}
-	public Object remove(int index){
-		if(index<0||index>=size)
-			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
-		Node prevNode=head;
-		Node curNode=head.next;
-		int count=0;
-		while(count<=index){
-			if(count==index){
-				prevNode.next=curNode.next;
-				size--;
-				return curNode.data;
-			}
-			curNode=curNode.next;
-			prevNode=prevNode.next;
-			count++;
-		}
-		return null;
-	}
-	
-	public int size(){
-		return size;
-	}
-	
-	public void addFirst(Object o){
-		Node objNode=new Node();
-		objNode.data=o;
-		if(head==null) head=new Node();
-		objNode.next=head.next;
-		size++;
-		head.next=objNode;
-	}
-	public void addLast(Object o){
-		Node objNode=new Node();
-		objNode.data=o;
-		if(head==null) head=new Node();
-		
-		//也可以用iterator迭代，先不用吧
-		Node curNode=head;
-		while(curNode.next!=null){
-			curNode=curNode.next;
-		}
-		objNode.next=curNode.next;
-		curNode.next=objNode;
-		size++;
-		
-	}
-	public Object removeFirst(){
-		if(head==null||head.next==null)
-			throw new NoSuchElementException();
-		Node delNode=head.next;
-		head.next=delNode.next;
-		size--;
-		return delNode.data;
-	}
-	public Object removeLast(){
-		if(head==null||head.next==null)
-			throw new NoSuchElementException();
-		Node prevNode=head;
-		Node curNode=head.next;
-		while(curNode!=null){
-			if(curNode.next==null){//说明是尾节点
-				prevNode.next=curNode.next;
-				size--;
-				return curNode.data;
-			}
-			curNode=curNode.next;
-			prevNode=prevNode.next;
-		}
-		return null;
-	}
-	public Iterator iterator(){
-		return new Iterator() {
-			private Node cur=head!=null?head.next:head;
-			@Override
-			public Object next() {
-				if(cur==null){
-					throw new NoSuchElementException();
-				}
-				Object object=cur.data;
-				cur=cur.next;
-				return object;
-			}
-			
-			@Override
-			public boolean hasNext() {
-				if(cur==null){
-					return false;
-				}else{
-					return true;
-				}
-				
-			}
-		};
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-	}
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java"
deleted file mode 100644
index 99bed9d96b..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java"
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.maple.basic;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java"
deleted file mode 100644
index 278d3dba7f..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java"
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.maple.basic;
-
-public class Queue {
-	private LinkedList elementData=new LinkedList();
-	public void enQueue(Object o){		
-		elementData.addLast(o);
-	}
-	
-	public Object deQueue(){
-		Object first=elementData.removeFirst();
-		return first;
-	}
-	
-	public boolean isEmpty(){
-		return elementData.size()<=0;
-	}
-	
-	public int size(){
-		return elementData.size();
-	}
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java"
deleted file mode 100644
index cec4599237..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java"
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.maple.basic;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){		
-		elementData.add(o);
-	}
-	
-	public Object pop(){
-		Object object=elementData.get(elementData.size()-1);
-		elementData.remove(elementData.size()-1);
-		return object;
-	}
-	
-	public Object peek(){
-		Object object=elementData.get(elementData.size()-1);
-		return object;
-	}
-	public boolean isEmpty(){
-		return elementData.size()<=0;
-	}
-	public int size(){
-		return elementData.size();
-	}
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java"
deleted file mode 100644
index 9fd59e512e..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java"
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.maple.test;
-
-import org.junit.Test;
-
-import com.maple.basic.ArrayList;
-import com.maple.basic.BinaryTree;
-import com.maple.basic.Iterator;
-import com.maple.basic.LinkedList;
-import com.maple.basic.Queue;
-import com.maple.basic.Stack;
-
-public class TestAll {
-	@Test
-	public void testArrayList(){
-		ArrayList list1=new ArrayList();
-		list1.add(0);
-		list1.add(1);
-		//list1.add(3, -1);//error
-		//list1.remove(2);//error
-		Iterator ite=list1.iterator();
-		while(ite.hasNext()){
-			System.out.println(ite.next());
-		}
-	}
-	@Test
-	public void testLinkedList(){
-		LinkedList list2=new LinkedList();
-		list2.add(0);
-		list2.add(1);
-		list2.addFirst(-1);
-		list2.addLast(-2);
-		
-		list2.removeFirst();
-		list2.removeLast();
-		list2.remove(0);
-		
-		Iterator ite2=list2.iterator();
-		while(ite2.hasNext()){
-			System.out.println(ite2.next());
-		}
-	}
-	@Test
-	public void testStack(){
-		Stack stack=new Stack();
-		stack.push(0);
-		stack.push(1);
-		stack.push(2);
-		System.out.println(stack.peek());
-		System.out.println(stack.pop());
-		System.out.println(stack.peek());
-	}
-	@Test
-	public void testQueue(){
-		Queue queue=new Queue();
-		queue.enQueue(0);
-		queue.enQueue(1);
-		
-		System.out.println(queue.deQueue());
-	}
-	@Test
-	public void testBinaryTree(){
-		BinaryTree<Integer> tree=new BinaryTree<>();
-		tree.insert(3);
-		tree.insert(2);
-		tree.insert(5);
-		//tree.insert(5);//error,duplicate
-		tree.insert(1);
-		tree.traversal(tree.getRoot());
-	}
-	
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java"
deleted file mode 100644
index 94ecec52f7..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java"
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.maple.test;
-
-import org.junit.Test;
-
-import com.maple.basic.ArrayList;
-import com.maple.basic.Iterator;
-
-public class TestArrayList{
-	
-	@Test
-	public void testAdd(){
-		ArrayList list1=new ArrayList();
-		list1.add(0);
-		list1.add(1);
-		//list1.add(3, -1);//error
-		//list1.remove(2);//error
-		Iterator ite=list1.iterator();
-		while(ite.hasNext()){
-			System.out.println(ite.next());
-		}
-	}
-}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt"
deleted file mode 100644
index 1ecad55f85..0000000000
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt"
+++ /dev/null
@@ -1,5 +0,0 @@
-����CPU���ڴ棬 Ӳ�̣�ָ��֮��Ĺ�ϵ��
-
-�������ӣ�http://www.cnblogs.com/qingmaple/p/6437070.html
-
-QQ��1091149131  ����-Ҷ��
\ No newline at end of file
diff --git a/group14/1091149131/2017JavaPro/.classpath b/group14/1091149131/2017JavaPro/.classpath
new file mode 100644
index 0000000000..0f6a65708e
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/mylib"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group14/1091149131/2017JavaPro/.gitignore b/group14/1091149131/2017JavaPro/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group14/1091149131/2017JavaPro/.project b/group14/1091149131/2017JavaPro/.project
new file mode 100644
index 0000000000..ab0a07b820
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>2017JavaPro</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs b/group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java
new file mode 100644
index 0000000000..c04d7fe381
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java
@@ -0,0 +1,66 @@
+package com.m0226.basic;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		//不够了怎么扩容
+		elementData[size++]=o;
+	}
+	public void add(int index, Object o){
+		if(index<0||index>size){
+			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
+		}
+		for(int i=size;i>index;i--){
+			elementData[i-1]=elementData[i];
+		}
+		elementData[index]=o;
+		size++;
+	}
+	
+	public Object get(int index){
+		if(index<0||index>=size){
+			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
+		}
+		return elementData[index];
+	}
+	
+	public Object remove(int index){
+		if(index<0||index>=size){
+			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
+		}
+		Object removeObj=elementData[index];
+		for(int i=index;i<size-1;i++){
+			elementData[i]=elementData[i+1];
+		}
+		size--;
+		return removeObj;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public Iterator iterator(){
+		return new Iterator() {
+			int ref=0;
+			@Override
+			public Object next() {
+				if(hasNext()){
+					return elementData[ref++];
+				}
+				return null;
+			}
+			
+			@Override
+			public boolean hasNext() {
+				if(ref<0||ref>=size) return false;
+				return true;
+			}
+		};
+	}
+	
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java
new file mode 100644
index 0000000000..962f73ea14
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java
@@ -0,0 +1,45 @@
+package com.m0226.basic;
+
+import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName;
+
+public class BinaryTree<T extends Comparable<T>> {
+	private BinaryTreeNode<T> root;
+	
+	public void traversal(BinaryTreeNode<T> node){
+		if(node.getLeft()!=null){
+			traversal(node.getLeft());
+		}
+		System.out.println("--"+node.getData()+"--");
+		if(node.getRight()!=null){
+			traversal(node.getRight());
+		}
+	}
+	/**
+	 * 如果根节点为null，则作为根节点，否则遍历下去插值
+	 * @param o
+	 * @return 
+	 * 2017年2月23日 下午4:21:51
+	 * @Author Joy
+	 */
+	public BinaryTreeNode insert(T o){
+		if(root==null){
+			BinaryTreeNode<T> newB=new BinaryTreeNode<T>();
+			newB.setData(o);
+			newB.setLeft(null);
+			newB.setRight(null);
+			root=newB;
+			return root;
+		}
+		
+		return  root.insert(o);
+	}
+	public BinaryTreeNode<T> getRoot() {
+		return root;
+	}
+
+	public void setRoot(BinaryTreeNode<T> root) {
+		this.root = root;
+	}
+	
+	
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..105d3c4e94
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java
@@ -0,0 +1,69 @@
+package com.m0226.basic;
+
+import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName;
+
+public class BinaryTreeNode<T extends Comparable<T>>{
+	
+	private T data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	/**
+	 * 如果待插入的值等于节点的值，则抛出异常：duplicate value
+	 * 如果小于节点的值，则往左边遍历
+	 * 如果大于节点的值，则往右边遍历
+	 * @param o
+	 * @return 
+	 * 2017年2月23日 下午4:22:50
+	 * @Author Joy
+	 */
+	public BinaryTreeNode insert(T o){
+		//assume that no duplicate key
+		
+		if(o.compareTo(data)==0){
+			try {
+				throw new DuplicateName("duplicate value: "+o);
+			} catch (DuplicateName e) {
+				e.printStackTrace();
+			}
+		}
+		BinaryTreeNode<T> newB=new BinaryTreeNode<T>();
+		newB.setData(o);
+		newB.setLeft(null);
+		newB.setRight(null);
+		//o更大，在右边
+		if(o.compareTo(data)>0){
+			if(this.getRight()!=null){
+				this.getRight().insert(o);
+			}else{
+				this.setRight(newB);
+			}
+		}else if(o.compareTo(data)<0){
+			if(this.getLeft()!=null){
+				this.getLeft().insert(o);
+			}else{
+				this.setLeft(newB);
+			}
+		}
+		return  newB;
+	}
+	
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java
new file mode 100644
index 0000000000..f2cf7ea146
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.m0226.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java
new file mode 100644
index 0000000000..4622986c31
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java
@@ -0,0 +1,154 @@
+package com.m0226.basic;
+
+import java.util.NoSuchElementException;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	private int size = 0;//自己加的，觉得需要
+	/**
+	 * 与addList()是一样的
+	 */
+	public void add(Object o){
+		addLast(o);
+	}
+	public void add(int index , Object o){
+		if(index<0||index>size){
+			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
+		}
+		Node prevNode=head;
+		Node curNode=head.next;
+		int count=0;
+		while(count<=index){
+			if(count==index){
+				Node newNode=new Node();
+				newNode.data=o;
+				
+				newNode.next=curNode;
+				prevNode.next=newNode;
+				size++;
+				break;
+			}
+			curNode=curNode.next;
+			prevNode=prevNode.next;
+			count++;
+		}
+		
+		
+	}
+	public Object get(int index){
+		if(index<0||index>=size)
+			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
+		
+		Node curNode=head.next;
+		int count=0;
+		while(count<=index){
+			if(count==index){
+				return curNode.data;
+			}
+			curNode=curNode.next;
+			count++;
+		}
+		return null;
+	}
+	public Object remove(int index){
+		if(index<0||index>=size)
+			throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size);
+		Node prevNode=head;
+		Node curNode=head.next;
+		int count=0;
+		while(count<=index){
+			if(count==index){
+				prevNode.next=curNode.next;
+				size--;
+				return curNode.data;
+			}
+			curNode=curNode.next;
+			prevNode=prevNode.next;
+			count++;
+		}
+		return null;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node objNode=new Node();
+		objNode.data=o;
+		if(head==null) head=new Node();
+		objNode.next=head.next;
+		size++;
+		head.next=objNode;
+	}
+	public void addLast(Object o){
+		Node objNode=new Node();
+		objNode.data=o;
+		if(head==null) head=new Node();
+		
+		//也可以用iterator迭代，先不用吧
+		Node curNode=head;
+		while(curNode.next!=null){
+			curNode=curNode.next;
+		}
+		objNode.next=curNode.next;
+		curNode.next=objNode;
+		size++;
+		
+	}
+	public Object removeFirst(){
+		if(head==null||head.next==null)
+			throw new NoSuchElementException();
+		Node delNode=head.next;
+		head.next=delNode.next;
+		size--;
+		return delNode.data;
+	}
+	public Object removeLast(){
+		if(head==null||head.next==null)
+			throw new NoSuchElementException();
+		Node prevNode=head;
+		Node curNode=head.next;
+		while(curNode!=null){
+			if(curNode.next==null){//说明是尾节点
+				prevNode.next=curNode.next;
+				size--;
+				return curNode.data;
+			}
+			curNode=curNode.next;
+			prevNode=prevNode.next;
+		}
+		return null;
+	}
+	public Iterator iterator(){
+		return new Iterator() {
+			private Node cur=head!=null?head.next:head;
+			@Override
+			public Object next() {
+				if(cur==null){
+					throw new NoSuchElementException();
+				}
+				Object object=cur.data;
+				cur=cur.next;
+				return object;
+			}
+			
+			@Override
+			public boolean hasNext() {
+				if(cur==null){
+					return false;
+				}else{
+					return true;
+				}
+				
+			}
+		};
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+	}
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java
new file mode 100644
index 0000000000..f45e9ebc4f
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java
@@ -0,0 +1,9 @@
+package com.m0226.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java
new file mode 100644
index 0000000000..51961056f7
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java
@@ -0,0 +1,21 @@
+package com.m0226.basic;
+
+public class Queue {
+	private LinkedList elementData=new LinkedList();
+	public void enQueue(Object o){		
+		elementData.addLast(o);
+	}
+	
+	public Object deQueue(){
+		Object first=elementData.removeFirst();
+		return first;
+	}
+	
+	public boolean isEmpty(){
+		return elementData.size()<=0;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java
new file mode 100644
index 0000000000..7de23aaff8
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java
@@ -0,0 +1,26 @@
+package com.m0226.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		Object object=elementData.get(elementData.size()-1);
+		elementData.remove(elementData.size()-1);
+		return object;
+	}
+	
+	public Object peek(){
+		Object object=elementData.get(elementData.size()-1);
+		return object;
+	}
+	public boolean isEmpty(){
+		return elementData.size()<=0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java" b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java
similarity index 97%
rename from "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java"
rename to group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java
index ee592fbb7b..eb3ada6da0 100644
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java"
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java
@@ -1,4 +1,4 @@
-package com.maple.test;
+package com.m0226.test;
 
 import java.util.ArrayList;
 import java.util.Iterator;
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java
new file mode 100644
index 0000000000..9ff0f407ce
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java
@@ -0,0 +1,71 @@
+package com.m0226.test;
+
+import org.junit.Test;
+
+import com.m0226.basic.ArrayList;
+import com.m0226.basic.BinaryTree;
+import com.m0226.basic.Iterator;
+import com.m0226.basic.LinkedList;
+import com.m0226.basic.Queue;
+import com.m0226.basic.Stack;
+
+public class TestAll {
+	@Test
+	public void testArrayList(){
+		ArrayList list1=new ArrayList();
+		list1.add(0);
+		list1.add(1);
+		//list1.add(3, -1);//error
+		//list1.remove(2);//error
+		Iterator ite=list1.iterator();
+		while(ite.hasNext()){
+			System.out.println(ite.next());
+		}
+	}
+	@Test
+	public void testLinkedList(){
+		LinkedList list2=new LinkedList();
+		list2.add(0);
+		list2.add(1);
+		list2.addFirst(-1);
+		list2.addLast(-2);
+		
+		list2.removeFirst();
+		list2.removeLast();
+		list2.remove(0);
+		
+		Iterator ite2=list2.iterator();
+		while(ite2.hasNext()){
+			System.out.println(ite2.next());
+		}
+	}
+	@Test
+	public void testStack(){
+		Stack stack=new Stack();
+		stack.push(0);
+		stack.push(1);
+		stack.push(2);
+		System.out.println(stack.peek());
+		System.out.println(stack.pop());
+		System.out.println(stack.peek());
+	}
+	@Test
+	public void testQueue(){
+		Queue queue=new Queue();
+		queue.enQueue(0);
+		queue.enQueue(1);
+		
+		System.out.println(queue.deQueue());
+	}
+	@Test
+	public void testBinaryTree(){
+		BinaryTree<Integer> tree=new BinaryTree<>();
+		tree.insert(3);
+		tree.insert(2);
+		tree.insert(5);
+		//tree.insert(5);//error,duplicate
+		tree.insert(1);
+		tree.traversal(tree.getRoot());
+	}
+	
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java
new file mode 100644
index 0000000000..d9cc6e55be
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java
@@ -0,0 +1,22 @@
+package com.m0226.test;
+
+import org.junit.Test;
+
+import com.m0226.basic.ArrayList;
+import com.m0226.basic.Iterator;
+
+public class TestArrayList{
+	
+	@Test
+	public void testAdd(){
+		ArrayList list1=new ArrayList();
+		list1.add(0);
+		list1.add(1);
+		//list1.add(3, -1);//error
+		//list1.remove(2);//error
+		Iterator ite=list1.iterator();
+		while(ite.hasNext()){
+			System.out.println(ite.next());
+		}
+	}
+}
diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java" b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java
similarity index 82%
rename from "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java"
rename to group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java
index 639aaa629b..855e84f04d 100644
--- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java"
+++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java
@@ -1,12 +1,12 @@
-package com.maple.test;
+package com.m0226.test;
 
-import com.maple.basic.ArrayList;
-import com.maple.basic.BinaryTree;
-import com.maple.basic.BinaryTreeNode;
-import com.maple.basic.Iterator;
-import com.maple.basic.LinkedList;
-import com.maple.basic.Queue;
-import com.maple.basic.Stack;
+import com.m0226.basic.ArrayList;
+import com.m0226.basic.BinaryTree;
+import com.m0226.basic.BinaryTreeNode;
+import com.m0226.basic.Iterator;
+import com.m0226.basic.LinkedList;
+import com.m0226.basic.Queue;
+import com.m0226.basic.Stack;
 
 /**
  * 测试自己写的数据结构
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java b/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java
new file mode 100644
index 0000000000..05002d3561
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java
@@ -0,0 +1,237 @@
+package com.m0305.array;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int len=origin.length;
+		
+		//方法2，用新数据去取旧数组的值
+		int[] src=new int[len];
+		long start=System.currentTimeMillis();
+		for(int i=0;i<len;i++){
+			src[i]=origin[len-1-i];
+		}
+		long end=System.currentTimeMillis();
+		System.out.println("方法2，用新数据去取旧数组的值 耗时："+(end-start));
+		for(int i=0;i<len;i++){
+			System.out.print(src[i]+",");
+		}
+		System.out.println();
+		
+		//方法1，在本数组之间移动
+		int temp;
+		int j=len/2;
+		start=System.currentTimeMillis();
+		for(int i=0;i<j;i++){
+			temp=origin[i];
+			origin[i]=origin[len-1-i];
+			origin[len-1-i]=temp;
+		}
+		end=System.currentTimeMillis();
+		System.out.println("方法1，在本数组之间移动 耗时："+(end-start));
+		for(int i=0;i<len;i++){
+			System.out.print(origin[i]+",");
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		//如何得到去掉0后的数组长度，装箱会不会影响性能？？
+		ArrayList<Integer> list=new ArrayList<>();
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i]==0){
+				continue;
+			}
+			list.add(oldArray[i]);
+		}
+		//如何更好的将list转为int[]
+		int[] srcArr=new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			srcArr[i]=list.get(i);
+		}
+		return srcArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param arr1
+	 * @param arr2
+	 * @return
+	 */
+	
+	public int[] merge(int[] arr1, int[] arr2){
+		//合并排序算法
+		int len1=arr1.length;
+		int len2=arr2.length;
+		ArrayList<Integer> list=new ArrayList<>();
+		//i指向arr1，j指向arr2,
+		int i=0,j=0;
+		while(i<len1&&j<len2){
+			
+			while(i<len1&&j<len2&&arr1[i]<=arr2[j]){
+				if(arr1[i]==arr2[j]){
+					j++;
+				}
+				list.add(arr1[i]);
+				i++;
+			}
+			while(i<len1&&j<len2&&arr1[i]>arr2[j]){
+				list.add(arr2[j]);
+				j++;
+			}
+		}
+		if(i>=len1||j>=len2){
+			//如果其中一个数组已经遍历完了，则另外一个数组直接加入到list中
+			for(int k1=i;k1<len1;k1++){
+				list.add(arr1[k1]);
+			}
+			for(int k2=j;k2<len2;k2++){
+				list.add(arr2[k2]);
+			}
+		}
+		
+		int[] srcArr=new int[list.size()];
+		for(int k=0;k<list.size();k++){
+			srcArr[k]=list.get(k);
+		}
+		return  srcArr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArr=new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArr, 0, oldArray.length);
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		ArrayList<Integer> list=new ArrayList<>();
+		if(max==1){
+			return new int[0];//??空数组？？
+		}
+		
+		int one=1;
+		int two=2;
+		list.add(one);
+		list.add(two);
+		int temp=one+two;
+		while(temp<max){
+			list.add(temp);
+			one=two;
+			two=temp;
+			temp=one+two;
+		}
+		
+		return list2arr(list);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max<2) return new int[0];
+		ArrayList<Integer> list=new ArrayList<>();
+		int j=2;
+		for(int i=2;i<max;i++){
+			j=2;
+			for(;j<i;j++){
+				if(i%j==0){
+					break;
+				}
+			}
+			if(j==i){
+				list.add(i);
+			}
+		}
+		return list2arr(list);
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		//if(max<2) return new int[0];
+		ArrayList<Integer> list=new ArrayList<>();
+		//1是完数吗
+		int sum=1;
+		for(int i=2;i<max;i++){
+			sum=1;
+			for(int j=2;j<i;j++){
+				if(i%j==0){
+					sum+=j;
+				}
+			}
+			if(sum==i){
+				list.add(i);
+			}
+		}
+		return list2arr(list);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if(array.length<1) return "";
+		StringBuffer sBuffer=new StringBuffer();
+		
+		for(int i:array){
+			sBuffer.append(i+""+seperator);
+		}
+		return sBuffer.substring(0, sBuffer.length()-1);
+	}
+	
+	public static int[] list2arr(ArrayList<Integer> list){
+		if(list==null) return null;
+		int[] descArr=new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			descArr[i]=list.get(i);
+		}
+		return descArr;
+	}
+
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtilTest.java b/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..0358b948c9
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtilTest.java
@@ -0,0 +1,84 @@
+package com.m0305.array;
+
+import static org.junit.Assert.*;
+
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	ArrayUtil util;
+	@Before
+	public void setUp() throws Exception {
+		util=new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+		/**
+		 * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+		 */
+		int[] origin={7, 9 , 30, 3};
+		int[] origin2={7, 9, 30, 3, 4};
+		util.reverseArray(origin2);
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		for(int i:util.removeZero(oldArr)){
+			System.out.print(i+",");
+		}
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8,9,10},   a2 = {4, 5, 6,7,9,11,12};
+		printArr(util.merge(a1, a2));
+		fail("Not yet implemented");
+	}
+	
+	@Test
+	public void testGrow() {
+		int[]  oldArray = {2,3,6};
+		printArr(util.grow(oldArray,4));
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testFibonacci() {
+		//printArr(util.fibonacci(35));
+		printArr(util.fibonacci(1));
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testGetPrimes() {
+		printArr(util.getPrimes(26));
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		printArr(util.getPerfectNumbers(1000));
+		//6,28,496
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testJoin() {
+		int[] a={};
+		System.out.println(util.join(a, "#"));
+		fail("Not yet implemented");
+	}
+	public static void printArr(int[] arr){
+		for(int obj:arr){
+			System.out.print(obj+",");
+		}
+		System.out.println();
+	}
+
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/LoginAction.java b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/LoginAction.java
new file mode 100644
index 0000000000..b7039e4ba8
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.m0305.lisestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author maple
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/Struts.java b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/Struts.java
new file mode 100644
index 0000000000..d1b2eb5875
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/Struts.java
@@ -0,0 +1,195 @@
+package com.m0305.lisestruts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import com.util.Dom4JforXML;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters){
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	SAXReader reader=new SAXReader();
+    	Document document=null;
+		try {
+			document = reader.read(Struts.class.getResource("struts.xml"));
+		} catch (DocumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	Element root=document.getRootElement();
+    	/*
+    	 * 当前节点的名称：struts
+    	 * 
+				当前节点的名称：action
+				属性name:login
+				属性class:com.m0305.lisestruts.LoginAction
+				
+					当前节点的名称：result
+					属性name:success
+					result：/jsp/homepage.jsp
+					
+					当前节点的名称：result
+					属性name:fail
+					result：/jsp/showLogin.jsp
+					
+			<struts>
+			    <action name="login" class="com.m0305.lisestruts.LoginAction">
+			        <result name="success">/jsp/homepage.jsp</result>
+			        <result name="fail">/jsp/showLogin.jsp</result>
+			    </action>
+			    <action name="logout" class="com.m0305.lisestruts.LogoutAction">
+			    	<result name="success">/jsp/welcome.jsp</result>
+			    	<result name="error">/jsp/error.jsp</result>
+			    </action>
+			</struts>
+			
+    	 */
+    	String xpath = "//action[@name='" + actionName + "']/child::*";  
+    	String xpath1 = "//action[@name='" + actionName + "']";  
+    	
+    	List list1=root.selectNodes(xpath1);
+    	
+    	String className=null;
+    	String methodName=null;
+    	if(!list1.isEmpty()){
+    		Element elt = (Element) list1.get(0);  
+    		Attribute classattr=elt.attribute("class");
+    		Attribute methodattr=elt.attribute("method");
+    		className=classattr.getValue();
+    		if(methodattr!=null){
+    			methodName=methodattr.getValue();
+    		}
+    	}
+    	Class clazz=null;
+    	try {
+			clazz=Class.forName(className);
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+    	Object act=null;
+    	try {
+			act=clazz.getConstructor().newInstance();
+		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+				| NoSuchMethodException | SecurityException e) {
+			e.printStackTrace();
+		}
+    	for(Entry<String, String> s:parameters.entrySet()){
+    		s.getKey();
+    		try {
+				Method m1=clazz.getDeclaredMethod(param2methodname(s.getKey()), String.class);//???
+				m1.invoke(act, s.getValue());//设置参数的值
+				
+			} catch (NoSuchMethodException | SecurityException e) {
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			} catch (IllegalArgumentException e) {
+				e.printStackTrace();
+			} catch (InvocationTargetException e) {
+				e.printStackTrace();
+			}
+    	}
+    	//调用execute方法后，读取所有getter方法，将值放到view的param里面去
+    	String jspkey=null;
+    	View view=new View();
+    	Map viewParams=new HashMap<String,Object>();
+    	if(methodName==null){
+    		methodName="execute";
+    	}
+    	try {
+			Method defaultmethod=clazz.getDeclaredMethod(methodName);
+			jspkey=defaultmethod.invoke(act).toString();//action返回值
+		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	Method[] methods=clazz.getDeclaredMethods();
+    	for(Method method:methods){
+    		if(method.getName().startsWith("get")){
+    			try {
+					viewParams.put(removeGet(method.getName()), method.invoke(act));
+				} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+    		}
+    	}
+    	view.setParameters(viewParams);
+    	//读xml文件里面的result，根据返回值决定哪个jsp，放到view里面的jsp中
+    	
+    	
+    	//读result里面的值
+    	List list=root.selectNodes(xpath);
+    	Iterator it = list.iterator();  
+        while (it.hasNext()) {  
+            Element elt = (Element) it.next();  
+            Attribute attr = elt.attribute("name");  
+            if(jspkey.equals(attr.getValue())){
+            	view.setJsp(elt.getStringValue());
+            	break;
+            }
+        }  
+    	return view;
+    }    
+    public static String param2methodname(String name){
+    	//password change to setPassword
+    	
+    	return "set"+name.substring(0, 1).toUpperCase() + name.substring(1);
+    }
+    public static String removeGet(String name){
+		String name1=name.substring(3);
+		String result=name1.substring(0, 1).toLowerCase()+name1.substring(1);
+		return result;
+	}
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java
new file mode 100644
index 0000000000..5438c50c88
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.m0305.lisestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java
new file mode 100644
index 0000000000..a5d0269d7f
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java
@@ -0,0 +1,23 @@
+package com.m0305.lisestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml
new file mode 100644
index 0000000000..6ca2757ed3
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.m0305.lisestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.m0305.lisestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java b/group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java
new file mode 100644
index 0000000000..ddf81bffeb
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java
@@ -0,0 +1,67 @@
+package com.util;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Test;
+
+public class Dom4JforXML {
+	@Test  
+    public void test() throws Exception{  
+        //创建SAXReader对象  
+        SAXReader reader = new SAXReader();  
+        //Dom4JforXML.class.getResourceAsStream("");
+        //读取文件 转换成Document  
+        //System.out.println(this.getClass().getResource("/").getPath()+"struts.xml");
+        Document document = reader.read(Dom4JforXML.class.getResource("struts.xml"));  
+        //获取根节点元素对象  
+        Element root = document.getRootElement();  
+        String xpath1 = "//action[@name='login']";  
+    	
+    	List list1=root.selectNodes(xpath1);
+    	Iterator it = list1.iterator();  
+        while (it.hasNext()) {  
+            Element elt = (Element) it.next();  
+            Attribute attr = elt.attribute("name");  
+            
+        }  
+        //遍历  
+        //listNodes(root);  
+    }  
+	@Test
+	public void test2(){
+		//Dom4JforXML.class.getClass().getResourceAsStream("struts.xml");
+		String name="getName";
+		//name
+		String name1=name.substring(3);
+		String result=name1.substring(0, 1).toLowerCase()+name1.substring(1);
+		System.out.println(result);
+		
+	}
+      
+    //遍历当前节点下的所有节点  
+    public void listNodes(Element node){  
+        System.out.println("当前节点的名称：" + node.getName());  
+        //首先获取当前节点的所有属性节点  
+        List<Attribute> 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<Element> iterator = node.elementIterator();  
+        while(iterator.hasNext()){  
+            Element e = iterator.next();  
+            listNodes(e);  
+        }  
+    }  
+}
diff --git a/group14/1091149131/2017JavaPro/src/com/util/struts.xml b/group14/1091149131/2017JavaPro/src/com/util/struts.xml
new file mode 100644
index 0000000000..6ca2757ed3
--- /dev/null
+++ b/group14/1091149131/2017JavaPro/src/com/util/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.m0305.lisestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.m0305.lisestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/1091149131/README.md b/group14/1091149131/README.md
new file mode 100644
index 0000000000..734ffcdc97
--- /dev/null
+++ b/group14/1091149131/README.md
@@ -0,0 +1,7 @@
+#作业记录
+2017/2/26</br>
+基本数据结构代码实现，关于CPU，内存等的硬件说明
+
+2017/3/5</br>
+一个大作业：读取struts.xml，实现struts</br>
+ArrayUtil里面实现几个函数
diff --git a/group14/254659936/.gitignore b/group14/254659936/.gitignore
index 5561991601..50039721f2 100644
--- a/group14/254659936/.gitignore
+++ b/group14/254659936/.gitignore
@@ -1,6 +1,7 @@
 *.iml
 .gradle
 .idea
+lib
 /local.properties
 /.idea/workspace.xml
 /.idea/libraries
diff --git a/group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml b/group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..8a9789665d
--- /dev/null
+++ b/group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/254659936/src/Main.java b/group14/254659936/src/Main.java
index 4d4fbb71ef..f7d10617e3 100644
--- a/group14/254659936/src/Main.java
+++ b/group14/254659936/src/Main.java
@@ -1,7 +1,14 @@
+import com.coderising.litestruts.Struts;
+
+import java.util.HashMap;
 
 public class Main {
 
     public static void main(String[] args) {
         System.out.println("Hello World!");
+        HashMap<String, String> parameters = new HashMap<>();
+        parameters.put("name", "zg");
+        parameters.put("password", "123456");
+        Struts.runAction("login", parameters);
     }
 }
diff --git a/group14/254659936/src/com/coderising/array/ArrayUtil.java b/group14/254659936/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..2f2987465b
--- /dev/null
+++ b/group14/254659936/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,261 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        if (null == origin) {
+            return;
+        }
+        int first = 0;
+        int last = origin.length - 1;
+        int temp;
+        while (first < last) {
+            temp = origin[first];
+            origin[first] = origin[last];
+            origin[last] = temp;
+            first++;
+            last++;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        int[] resultArr = null;
+        if (null == oldArray) {
+            return resultArr;
+        }
+        int zeroSize = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] == 0) {
+                zeroSize++;
+            }
+        }
+        resultArr = new int[oldArray.length - zeroSize];
+        int resultIndex = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                resultArr[resultIndex] = oldArray[i];
+                resultIndex++;
+            }
+        }
+        return resultArr;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        if (null == array1) {
+            return array2;
+        }
+        if (null == array2) {
+            return array1;
+        }
+        int[] resultArr = new int[array1.length + array2.length];
+        int index1 = 0;
+        int index2 = 0;
+        for (int i = 0; i < resultArr.length; i++) {
+            if (array1[index1] < array2[index2]) {
+                resultArr[i] = array1[index1];
+                index1++;
+            } else {
+                resultArr[i] = array2[index2];
+                index2++;
+            }
+        }
+        return resultArr;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        if (oldArray == null) {
+            return new int[size];
+        }
+        int[] resultArr = new int[oldArray.length + size];
+        for (int i = 0; i < oldArray.length; i++) {
+            resultArr[i] = oldArray[i];
+        }
+        return resultArr;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        ArrayList<Integer> tempList = new ArrayList<>();
+        int resultSize = 0;
+        while (fibonacci(tempList, resultSize) < max) {
+            resultSize++;
+        }
+        int[] resultArr = new int[resultSize];
+        for (int i = 0; i < resultSize; i++) {
+            resultArr[i] = tempList.get(i);
+        }
+        return resultArr;
+    }
+
+    /**
+     * 返回第index个斐波那契数列，resultArr用来存已经计算过的结果
+     *
+     * @param resultArr
+     * @param index
+     * @return
+     */
+    private int fibonacci(ArrayList<Integer> resultArr, int index) {
+        if (resultArr.size() > index) {
+            return resultArr.get(index);
+        }
+        int newResult;
+        if (index == 0) {
+            newResult = 1;
+        } else if (index == 1) {
+            newResult = 1;
+        } else {
+            newResult = (resultArr.get(index - 1) == 0 ? resultArr.get(index - 1) : fibonacci(resultArr, index - 1))
+                    + (resultArr.get(index - 2) == 0 ? resultArr.get(index - 2) : fibonacci(resultArr, index - 2));
+        }
+        resultArr.add(newResult);
+        return newResult;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        if (max < 2) {
+            return null;
+        }
+        ArrayList<Integer> tempList = new ArrayList<>();
+        for (int i = 2; i <= max; i++) {
+            if (isPrimes(tempList, i)) {
+                tempList.add(i);
+            }
+        }
+        int[] resultArr = new int[tempList.size()];
+        for (int i = 0; i < tempList.size(); i++) {
+            resultArr[i] = tempList.get(i);
+        }
+        return resultArr;
+    }
+
+    private boolean isPrimes(ArrayList<Integer> primesList, int temp) {
+        if (temp == 2 || temp == 3) {
+            return true;
+        }
+        for (int i = 0; i < primesList.size(); i++) {
+            if (temp % primesList.get(i) == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        if (max < 0) {
+            return null;
+        }
+        ArrayList<Integer> tempList = new ArrayList<>();
+        for (int i = 2; i <= max; i++) {
+            if (isPerfectNumber(i)) {
+                tempList.add(i);
+            }
+        }
+        int[] resultArr = new int[tempList.size()];
+        for (int i = 0; i < tempList.size(); i++) {
+            resultArr[i] = tempList.get(i);
+        }
+        return resultArr;
+    }
+
+    private boolean isPerfectNumber(int temp) {
+        if (temp == 1) {
+            return true;
+        }
+        int sum = 0;
+        for (int i = 1; i < temp; i++) {
+            if (temp % 1 == 0) {
+                if ((sum = sum + i) > temp) {
+                    return false;
+                }
+            }
+        }
+        if (sum == temp) {
+            return true;
+        }
+        return false;
+    }
+
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param separator
+     * @return
+     */
+    public String join(int[] array, String separator) {
+        if (null == array || array.length == 0 || null == separator) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder(array.length * (1 + separator.length()));
+        int i = 1;
+        sb.append(array[0]);
+        for (; i < array.length; i++) {
+            sb.append(separator);
+            sb.append(array[i]);
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/group14/254659936/src/com/coderising/litestruts/LoginAction.java b/group14/254659936/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group14/254659936/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group14/254659936/src/com/coderising/litestruts/Struts.java b/group14/254659936/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..76b1d8e531
--- /dev/null
+++ b/group14/254659936/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,150 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        // 0. 读取配置文件struts.xml
+        Element rootXmlElement = getRootXmlElement();
+
+        String className = getClassFromAction(actionName, rootXmlElement);
+
+        View view = new View();
+
+        try {
+            Class actionClass = null;
+            actionClass = Class.forName(className);
+            Object actionIns = null;
+            actionIns = actionClass.newInstance();
+
+            Method[] methods = actionClass.getMethods();
+            Set<Map.Entry<String, String>> entries = parameters.entrySet();
+            // 遍历map，调用set方法
+            for (Map.Entry<String, String> map : entries) {
+                String key = "set" + map.getKey();
+                String value = map.getValue();
+                Method method = null;
+                for (int i = 0; i < methods.length; i++) {
+                    if (key.equalsIgnoreCase(methods[i].getName())) {
+                        method = methods[i];
+                        break;
+                    }
+                }
+                method.invoke(actionIns, value);
+                System.out.println("execute set method：" + key + " " + value);
+            }
+
+            // 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+            Method method = actionClass.getMethod("execute");
+            Object executeResult = method.invoke(actionIns);
+            System.out.println("execute method result：" + executeResult.toString());
+
+            // 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+            // 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+            // 放到View对象的parameters
+            HashMap<String, Object> viewParametersMap = new HashMap<>();
+            String methodName;
+            Object methodResult;
+            for (int i = 0; i < methods.length; i++) {
+                methodName = methods[i].getName();
+                if (methodName.startsWith("get")) {
+                    methodResult = methods[i].invoke(actionIns);
+                    viewParametersMap.put((char) (methodName.charAt(3) - 32)
+                                    + methodName.substring(3, methodName.length() - 1),
+                            methodResult);
+
+                    System.out.println("execute get method：" + methodName + " " + methodResult);
+                }
+            }
+            view.setParameters(viewParametersMap);
+
+            // 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+            // 放到View对象的jsp字段中。
+            view.setJsp("" + executeResult);
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        }
+
+        return view;
+    }
+
+    private static Element getRootXmlElement() {
+        SAXReader sax = new SAXReader();
+        File xmlFile = new File("src/com/coderising/litestruts/struts.xml");
+        Document document = null;
+        try {
+            document = sax.read(xmlFile);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        Element root = document.getRootElement();
+        System.out.println("root：" + root.getName());
+        return root;
+    }
+
+    private static String getClassFromAction(String actionName, Element root) {
+        if (null == actionName || actionName.isEmpty() || null == root) {
+            return null;
+        }
+        List<Element> elements = root.elements();
+        for (Element element : elements) {
+            Attribute actionAttribute = element.attribute("name");
+            if (actionName.equals(actionAttribute.getValue())) {
+                Attribute classAttribute = element.attribute("class");
+
+
+                List<Element> elements1 = element.elements();
+                elements1.get(0).attribute("name").getValue();
+                elements1.get(0).getData();
+
+
+                return classAttribute.getValue();
+            }
+        }
+        return null;
+    }
+
+    /*
+
+    0. 读取配置文件struts.xml
+
+     1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+    据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+    ("name"="test" ,  "password"="1234") ,
+    那就应该调用 setName和setPassword方法
+
+    2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+    3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+    通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+    放到View对象的parameters
+
+    4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+    放到View对象的jsp字段中。
+
+    */
+
+
+}
diff --git a/group14/254659936/src/com/coderising/litestruts/StrutsTest.java b/group14/254659936/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..0bab615458
--- /dev/null
+++ b/group14/254659936/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group14/254659936/src/com/coderising/litestruts/View.java b/group14/254659936/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group14/254659936/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/254659936/src/com/coderising/litestruts/struts.xml b/group14/254659936/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..8a9789665d
--- /dev/null
+++ b/group14/254659936/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/296933284/DataStructuresTest/.gitignore b/group14/296933284/DataStructuresTest/.gitignore
deleted file mode 100644
index e32d56a40c..0000000000
--- a/group14/296933284/DataStructuresTest/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
-/bin/
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/LinkedList.java b/group14/296933284/DataStructuresTest/src/com/coding/basic/LinkedList.java
deleted file mode 100644
index 2a397e9bec..0000000000
--- a/group14/296933284/DataStructuresTest/src/com/coding/basic/LinkedList.java
+++ /dev/null
@@ -1,214 +0,0 @@
-package com.coding.basic;
-
-import java.util.Collection;
-
-import org.junit.Test;
-
-/**
- * LinkedList (��ͷ���ĵ�����) ʵ�� ��14С�� 296933284
- * 
- * @author Tonnyson
- *
- */
-public class LinkedList implements List {
-
-	private Node head;
-	private int size;
-
-	public LinkedList() {
-		super();
-		this.head = new Node();
-		this.size = 0;
-	}
-
-	public void add(Object obj) {
-		addLast(obj);
-	}
-
-	public void add(int index, Object obj) {
-		
-		if (index == size + 1) {
-			addLast(obj);
-		} else {
-			Node r = getPreNode(index);
-			Node node = new Node();
-			node.data = obj;
-			node.next = r.next;
-			r.next = node;
-			size++;
-		}
-	}
-
-	
-	
-	/**
-	 * �������ײ�����ڵ�
-	 * 
-	 * @param obj ������ڵ�Ľڵ�ֵ
-	 *            
-	 */
-	public void addFirst(Object obj) {
-		Node node = new Node();
-		node.data = obj;
-
-		node.next = head.next;
-		head.next = node;
-		size++;
-	}
-
-	/**
-	 * ������β������ڵ�
-	 * 
-	 * @param obj ������ڵ�Ľڵ�ֵ
-	 * 
-	 */
-	public void addLast(Object obj) {
-		
-		Node node = new Node();
-		node.data = obj;
-		node.next = null;
-		
-		Node r = head;
-		while (r.next != null) r = r.next;
-		
-		r.next = node;
-		
-		size++;
-
-	}
-
-	/**
-	 * ������������Ԫ�ذ�˳����뵥����
-	 * 
-	 * @param c Ҫ���뵥����������Ԫ�صļ���
-	 *            
-	 */
-	public void addAll(Collection c) {
-
-		Iterator iter = (Iterator) c.iterator();
-
-		while (iter.hasNext()) {
-			addLast(iter.next());
-		}
-	}
-
-	/**
-	 * ��ȡָ��λ�õĽڵ�ֵ
-	 */
-	public Object get(int index) {
-		// rangCheck(index);
-		
-		return getPreNode(index).next.data;
-	}
-
-	/**
-	 * ɾ��ָ��λ�ýڵ㣬�����ؽڵ�ֵ
-	 */
-	public Object remove(int index) {
-		rangCheck(index);
-		
-		Node r = getPreNode(index);
-		
-		Object result = r.next.data;
-		
-		r.next = r.next.next;
-		size--;
-		return result;
-	}
-	
-	/**
-	 * ɾ����������һ���ڵ㣬�����ؽڵ�ֵ
-	 * 
-	 * @return ��һ���ڵ��ֵ
-	 */
-	public Object removeFirst() {
-		return remove(0);
-	}
-	
-	/**
-	 * ɾ�����������һ���ڵ㣬�����ؽڵ�ֵ
-	 * 
-	 * @return ���һ���ڵ��ֵ
-	 */
-	public Object removeLast() {
-		return remove(size - 1);
-	}
-	
-	// ��ȡָ��λ�õ�ǰ����㲢����
-	private Node getPreNode(int index) {
-		rangCheck(index);
-		
-		if (index == 0) {
-			return head;
-		} else {
-			Node r = head;
-			
-			for (int i = 0; i < index; i++)
-				r = r.next;
-			
-			return r;			
-		}
-		
-	}
-	
-	/**
-	 * ���ص������ĳ���
-	 */
-	public int size() {
-		return size;
-	}
-
-	/**
-	 * ������
-	 * 
-	 * @return ����һ������������
-	 */
-	public Iterator iterator() {
-		return new Iter();
-	}
-
-	// �������ڲ���
-	private class Iter implements Iterator {
-		int current = 0;
-
-		@Override
-		public boolean hasNext() {
-			return current != size;
-		}
-
-		@Override
-		public Object next() {
-			int i = current;
-			
-			rangCheck(i);
-			
-			current++;
-
-			return get(i);
-		}
-
-	}
-	
-	/**
-	 * ����Ƿ�Խ��
-	 * 
-	 * @param index
-	 */
-	private void rangCheck(int index) {
-		if (index > size || index < 0)
-			throw new IndexOutOfBoundsException();
-	}
-
-	private static class Node {
-		Object data;
-		Node next;
-		
-		public Node() {
-			super();
-			this.data = null;
-			this.next = null;
-		}
-		
-		
-	}
-}
\ No newline at end of file
diff --git a/group14/296933284/Note/README.md b/group14/296933284/Note/README.md
index 3b92cb5667..0b08b8f0bb 100644
--- a/group14/296933284/Note/README.md
+++ b/group14/296933284/Note/README.md
@@ -1,4 +1,5 @@
 ﻿# 2017编程提高(Java)学习系列笔记链接
 ---
 
-1. [漫谈计算机组成 -- 微型计算机的硬件组成  2017-02-26](http://tennyson.ren/2017/02/25/%E6%BC%AB%E8%B0%88%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90%20--%20%E5%BE%AE%E5%9E%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E7%A1%AC%E4%BB%B6%E7%BB%84%E6%88%90/) 
\ No newline at end of file
+1. [漫谈计算机组成 -- 微型计算机的硬件组成  2017-02-26](http://tennyson.ren/2017/02/25/%E6%BC%AB%E8%B0%88%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90%20--%20%E5%BE%AE%E5%9E%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E7%A1%AC%E4%BB%B6%E7%BB%84%E6%88%90/) 
+2. [Java中解析XML的方法  2017-03-04](http://tennyson.ren/2017/03/04/Java%E4%B8%AD%E8%A7%A3%E6%9E%90XML%E7%9A%84%E6%96%B9%E6%B3%95/#more)
\ No newline at end of file
diff --git a/group14/296933284/Note/test.txt b/group14/296933284/Note/test.txt
deleted file mode 100644
index 95d09f2b10..0000000000
--- a/group14/296933284/Note/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-hello world
\ No newline at end of file
diff --git a/group14/296933284/README.md b/group14/296933284/README.md
index 023abf1e46..5c3f27c267 100644
--- a/group14/296933284/README.md
+++ b/group14/296933284/README.md
@@ -1,4 +1,4 @@
 ﻿# 2017年编程提高（Java） 作业、练习、总结
 
-[DataStructuresTest --- 基本数据结构Java实现](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/DataStructuresTest)      
+[coding --- 代码练习](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/coding)      
 [Note --- 2017编程提高(Java)学习系列笔记链接](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/Note) 
diff --git a/group14/296933284/coding/.classpath b/group14/296933284/coding/.classpath
new file mode 100644
index 0000000000..11ea08c22c
--- /dev/null
+++ b/group14/296933284/coding/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/junit-4.12.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/hamcrest-core-1.3"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/dom4j-1.6.1"/>
+	<classpathentry kind="var" path="APPLICATION_HOME_DIR/redist/annotations-java8.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group14/296933284/coding/.gitignore b/group14/296933284/coding/.gitignore
new file mode 100644
index 0000000000..1ea200494a
--- /dev/null
+++ b/group14/296933284/coding/.gitignore
@@ -0,0 +1,6 @@
+/bin/
+.eml
+.iml
+.idea
+/lib/
+*.eml
\ No newline at end of file
diff --git a/group14/296933284/coding/.project b/group14/296933284/coding/.project
new file mode 100644
index 0000000000..fab8d7f04c
--- /dev/null
+++ b/group14/296933284/coding/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>2017Learning</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs b/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..9abffe377f
--- /dev/null
+++ b/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//src/com/coderising/litestruts/StrutsTest.java=UTF-8
diff --git a/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs b/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..557f917c37
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,228 @@
+package com.coderising.array;
+
+import com.coding.basic.ArrayList;
+
+import java.util.Arrays;
+
+
+/**
+ * Created by Tennyson on 2017/3/1.
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        for (int i = 0, j = origin.length - 1; i < origin.length / 2; i++, j--) {
+            int temp = origin[j];
+            origin[j] = origin[i];
+            origin[i] = temp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     * @param oldArray
+     * @return
+     */
+    public int[] removeZero(int[] oldArray) {
+
+        int i;
+        // 获取数组中第一个值为 0 的元素的位置
+        for (i = 0; i < oldArray.length; i++)
+            if (oldArray[i] == 0)
+                break;
+        // 从第一个值为 0 的元素开始，用之后的非零元素覆盖之前值为 0 的元素，并记录非零元素的个数
+        for (int j = i + 1; j < oldArray.length; j++)
+            if (oldArray[j] != 0)
+                oldArray[i++] = oldArray[j];
+
+        // 复制数组
+        int[] newArray = new int[i];
+        System.arraycopy(oldArray, 0, newArray, 0, i);
+
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public int[] merge(int[] array1, int[] array2) {
+        int i = 0, j = 0;
+        ArrayList arrayList = new ArrayList();
+
+        // 比较两个数组的元素值，将较小的值存入arrayList
+        while (i < array1.length && j < array2.length) {
+
+            if (array1[i] == array2[j]) {
+                arrayList.add(array1[i]);
+                i++;
+                j++;
+            } else if (array1[i] < array2[j]) {
+                arrayList.add(array1[i++]);
+            } else if (array1[i] > array2[j]) {
+                arrayList.add(array2[j++]);
+            }
+        }
+
+        // 剩下一个数组还未比较完, 将其剩余元素存入arrayList
+        while (i < array1.length) arrayList.add(array1[i++]);
+        while (j < array2.length) arrayList.add(array2[j++]);
+
+        return  ArrayUtil.toArray(arrayList);
+    }
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int [] oldArray,  int size) {
+        int[] newArray = new int[oldArray.length + size];
+
+        return newArray = Arrays.copyOf(oldArray, newArray.length);
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+
+        ArrayList arrayList = new ArrayList();
+        arrayList.add(1);
+        arrayList.add(1);
+
+        int i, num;
+        for (i = 2; (num = (int) (arrayList.get(i - 1)) + (int) (arrayList.get(i - 2))) < max; i++)
+            arrayList.add(num);
+
+        return ArrayUtil.toArray(arrayList);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+
+        ArrayList arrayList = new ArrayList();
+
+        for (int i = 2; i < max; i++) {
+            int k = (int) Math.sqrt(i), j;
+            for (j = 2; j <= k; j++)
+                if (i % j == 0) break;
+
+            // 若是 j >= k + 1 表示 i 没有被整除 即 i 为素数
+            if (j >= k + 1)
+                arrayList.add(i);
+        }
+
+        return ArrayUtil.toArray(arrayList);
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+
+        ArrayList arrayList = new ArrayList();
+
+        for (int i = 6; i < max; i += 2) {
+
+            if (i == 6) {
+                arrayList.add(i);
+                continue;
+            }
+
+            int factorSum = 0;
+
+            if (i % 3 == 1 && i % 9 == 1) {
+
+                boolean flag = false;
+
+                if (i % 10 == 6 ) {
+                    flag = true;
+                }
+
+                if (i % 10 == 8) {
+                    if (i % 100 == 28) {
+                        flag = true;
+                    }
+                }
+
+                if (flag) {
+
+                    for (int j = 1; j <= (i / 2); j++) {
+
+                        if (i % j == 0) {
+                            factorSum += j;
+                        }
+                    }
+                }
+
+            }
+
+            if (factorSum == i) {
+                arrayList.add(i);
+            }
+
+        }
+
+        return ArrayUtil.toArray(arrayList);
+    }
+
+    // 将ArrayList对象转换为数组返回
+    private static int[] toArray(ArrayList arrayList) {
+        int[] array = new int[arrayList.size()];
+
+        for (int i = 0; i < array.length; i++)
+            array[i] = (Integer) arrayList.get(i);
+
+        return array;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator){
+
+        StringBuffer stringBuffer = new StringBuffer();
+
+        for (int i = 0; i < array.length - 1; i++)
+            stringBuffer.append("" + array[i] + seperator);
+
+        stringBuffer.append(array[array.length - 1]);
+
+        return stringBuffer.toString();
+    }
+
+
+}
diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..1b1e7005b4
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,99 @@
+package com.coderising.array;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ * Created by damocles on 2017/3/1.
+ */
+public class ArrayUtilTest {
+    private ArrayUtil arrayUtil;
+    private int[] oldArray = null;
+    private int[] newArray = null;
+
+    @Before
+    public void setUp() throws Exception {
+        arrayUtil = new ArrayUtil();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+
+    @Test
+    public void reverseArray() throws Exception {
+        oldArray = new int[]{7, 9, 30, 3};
+        newArray = new int[]{3, 30, 9, 7};
+        arrayUtil.reverseArray(oldArray);
+
+        Assert.assertArrayEquals(newArray, oldArray);
+
+        oldArray = new int[]{3, 30, 9, 7, 4};
+        newArray = new int[]{4, 7, 9, 30, 3};
+        arrayUtil.reverseArray(oldArray);
+
+        Assert.assertArrayEquals(newArray, oldArray);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        oldArray = new int[]{1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        newArray = new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5};
+
+        Assert.assertArrayEquals(newArray, arrayUtil.removeZero(oldArray));
+
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        newArray = new int[]{3, 4, 5, 6, 7, 8};
+
+        Assert.assertArrayEquals(newArray, arrayUtil.merge(a1, a2));
+    }
+
+    @Test
+    public void grow() throws Exception {
+        oldArray = new int[]{2, 3, 6};
+        newArray = new int[]{2, 3, 6, 0, 0, 0};
+        int size = 3;
+
+        Assert.assertArrayEquals(newArray, arrayUtil.grow(oldArray, size));
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        newArray = new int[]{1, 1, 2, 3, 5, 8, 13};
+
+        Assert.assertArrayEquals(newArray, arrayUtil.fibonacci(15));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        newArray = new int[]{2, 3, 5, 7, 11, 13, 17, 19};
+
+        Assert.assertArrayEquals(newArray, arrayUtil.getPrimes(23));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        newArray = new int[]{6, 28, 496, 8128};
+        System.out.println(33550336 % 27);
+        Assert.assertArrayEquals(newArray, arrayUtil.getPerfectNumbers(10000));
+    }
+
+    @Test
+    public void join() throws Exception {
+        oldArray = new int[]{3, 8, 9, 10, 2};
+        String seperator = "-";
+        String exception = "3-8-9-10-2";
+
+        Assert.assertEquals(exception, arrayUtil.join(oldArray, seperator));
+    }
+
+}
\ No newline at end of file
diff --git a/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java b/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..b76d6548b0
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,44 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+
+        if("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+
+        this.message = "login failed,please check your user/pwd";
+
+        return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+
+    public void setPassword(String password){
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group14/296933284/coding/src/com/coderising/litestruts/Struts.java b/group14/296933284/coding/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..0c83cf4507
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,141 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+        0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+        SAXReader reader = new SAXReader();
+        File file = new File("src/com/coderising/litestruts/struts.xml");
+        View view = new View();
+
+        try {
+            // 加载配置文件
+            Document doucment = reader.read(file);
+            Element struts = doucment.getRootElement();
+            Iterator strutsIterator = struts.elementIterator();
+            Element action = null;
+            Object obj = null;
+
+            while (strutsIterator.hasNext()) {
+                action = (Element) strutsIterator.next();
+                Attribute actionAttribute = action.attribute("name");
+
+                // 通过反射获取实例化对象
+                if (actionAttribute.getValue().equals(actionName)) {
+                    obj = Class.forName(action.attribute("class").getValue()).newInstance();
+                    break;
+                }
+            }
+
+            Iterator<Map.Entry<String, String>> parametersIterator = parameters.entrySet().iterator();
+
+            while (parametersIterator.hasNext()) {
+
+                Map.Entry<String, String> entry = parametersIterator.next();
+
+                // 调用相应属性的setter方法
+                Method setterMethod = obj.getClass().getMethod("set" +
+                        toUpperFisrtLetter(entry.getKey()), String.class);
+                setterMethod.invoke(obj, entry.getValue());
+            }
+
+            Method exectueMethod= obj.getClass().getMethod("execute");
+            String exectueValue = (String) exectueMethod.invoke(obj);
+
+            // 获取类中的所有属性
+            Field[] fields = obj.getClass().getDeclaredFields();
+            HashMap<String, String> fieldHashMap = new HashMap<>();
+
+            for(int i = 0; i < fields.length; i++){
+
+                String fieldName = fields[i].getName();
+
+                // 获取对应的getter方法
+                Method getterMethod = obj.getClass().getMethod("get" +
+                        toUpperFisrtLetter(fieldName));
+                String fieldValue = (String) getterMethod.invoke(obj);
+
+                fieldHashMap.put(fieldName, fieldValue);
+            }
+
+
+            view.setParameters(fieldHashMap);
+
+            Iterator actionIterator = action.elementIterator();
+
+            while (actionIterator.hasNext()) {
+                Element result = (Element) actionIterator.next();
+                Attribute resuAttribute = result.attribute("name");
+
+                if (resuAttribute.getValue().equals(exectueValue)) {
+                    view.setJsp(result.getStringValue());
+                    break;
+                }
+            }
+
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+
+        return view;
+    }
+
+    // 将字符串首字母大写
+    @NotNull
+    private static String toUpperFisrtLetter(String str) {
+        String string = str.toLowerCase();
+        char[] cs = string.toCharArray();
+        // 首字母大写
+        cs[0] -= 32;
+
+        return String.valueOf(cs);
+    }
+
+}
diff --git a/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java b/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..ab335a0ea4
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,41 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group14/296933284/coding/src/com/coderising/litestruts/View.java b/group14/296933284/coding/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/296933284/coding/src/com/coderising/litestruts/struts.xml b/group14/296933284/coding/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..ea46090bc9
--- /dev/null
+++ b/group14/296933284/coding/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/ArrayList.java b/group14/296933284/coding/src/com/coding/basic/ArrayList.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/ArrayList.java
rename to group14/296933284/coding/src/com/coding/basic/ArrayList.java
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/BinarySearchTree.java b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/BinarySearchTree.java
rename to group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/Iterator.java b/group14/296933284/coding/src/com/coding/basic/Iterator.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/Iterator.java
rename to group14/296933284/coding/src/com/coding/basic/Iterator.java
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/JavaTest.java b/group14/296933284/coding/src/com/coding/basic/JavaTest.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/JavaTest.java
rename to group14/296933284/coding/src/com/coding/basic/JavaTest.java
diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedList.java b/group14/296933284/coding/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..3c37904532
--- /dev/null
+++ b/group14/296933284/coding/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,215 @@
+package com.coding.basic;
+
+import java.util.Collection;
+
+
+/**
+ * LinkedList (��ͷ���ĵ�����) ʵ�� ��14С�� 296933284
+ * 
+ * @author Tonnyson
+ *
+ */
+public class LinkedList implements List {
+
+	private Node head;
+	private int size;
+
+	public LinkedList() {
+		super();
+		this.head = new Node();
+		this.size = 0;
+	}
+
+	public void add(Object obj) {
+		addLast(obj);
+	}
+
+	public void add(int index, Object obj) {
+		
+		if (index == size + 1) {
+			addLast(obj);
+		} else {
+			Node r = getPreNode(index);
+			Node node = new Node();
+			node.data = obj;
+			node.next = r.next;
+			r.next = node;
+			size++;
+		}
+	}
+
+	
+	
+	/**
+	 * �������ײ�����ڵ�
+	 * 
+	 * @param obj ������ڵ�Ľڵ�ֵ
+	 *            
+	 */
+	public void addFirst(Object obj) {
+		Node node = new Node();
+		node.data = obj;
+
+		node.next = head.next;
+		head.next = node;
+		size++;
+	}
+
+	/**
+	 * ������β������ڵ�
+	 * 
+	 * @param obj ������ڵ�Ľڵ�ֵ
+	 * 
+	 */
+	public void addLast(Object obj) {
+		
+		Node node = new Node();
+		node.data = obj;
+		node.next = null;
+		
+		Node r = head;
+		while (r.next != null) r = r.next;
+		
+		r.next = node;
+		
+		size++;
+
+	}
+
+	/**
+	 * ������������Ԫ�ذ�˳����뵥����
+	 * 
+	 * @param c Ҫ���뵥����������Ԫ�صļ���
+	 *            
+	 */
+	public void addAll(Collection c) {
+
+		Iterator iter = (Iterator) c.iterator();
+
+		while (iter.hasNext()) {
+			addLast(iter.next());
+		}
+	}
+
+	/**
+	 * ��ȡָ��λ�õĽڵ�ֵ
+	 */
+	public Object get(int index) {
+		// rangCheck(index);
+		
+		return getPreNode(index).next.data;
+	}
+
+	/**
+	 * ɾ��ָ��λ�ýڵ㣬�����ؽڵ�ֵ
+	 */
+	public Object remove(int index) {
+		
+		rangCheck(index);
+		
+		Node r = getPreNode(index);
+		
+		Object result = r.next.data;
+		
+		r.next = r.next.next;
+		size--;
+		return result;
+	}
+	
+	/**
+	 * ɾ����������һ���ڵ㣬�����ؽڵ�ֵ
+	 * 
+	 * @return ��һ���ڵ��ֵ
+	 */
+	public Object removeFirst() {
+		return remove(0);
+	}
+	
+	/**
+	 * ɾ�����������һ���ڵ㣬�����ؽڵ�ֵ
+	 * 
+	 * @return ���һ���ڵ��ֵ
+	 */
+	public Object removeLast() {
+		return remove(size - 1);
+	}
+	
+	// ��ȡָ��λ�õ�ǰ����㲢����
+	private Node getPreNode(int index) {
+		
+		rangCheck(index);
+		
+		if (index == 0) {
+			return head;
+		} else {
+			Node r = head;
+			
+			for (int i = 0; i < index; i++)
+				r = r.next;
+			
+			return r;			
+		}
+		
+	}
+	
+	/**
+	 * ���ص������ĳ���
+	 */
+	public int size() {
+		return size;
+	}
+
+	/**
+	 * ������
+	 * 
+	 * @return ����һ������������
+	 */
+	public Iterator iterator() {
+		return new Iter();
+	}
+
+	// �������ڲ���
+	private class Iter implements Iterator {
+		int current = 0;
+
+		@Override
+		public boolean hasNext() {
+			return current != size;
+		}
+
+		@Override
+		public Object next() {
+			int i = current;
+			
+			rangCheck(i);
+			
+			current++;
+
+			return get(i);
+		}
+
+	}
+	
+	/**
+	 * ����Ƿ�Խ��
+	 * 
+	 * @param index
+	 */
+	private void rangCheck(int index) {
+		if (index > size || index < 0)
+			throw new IndexOutOfBoundsException();
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+		
+		public Node() {
+			super();
+			this.data = null;
+			this.next = null;
+		}
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/List.java b/group14/296933284/coding/src/com/coding/basic/List.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/List.java
rename to group14/296933284/coding/src/com/coding/basic/List.java
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/Queue.java b/group14/296933284/coding/src/com/coding/basic/Queue.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/Queue.java
rename to group14/296933284/coding/src/com/coding/basic/Queue.java
diff --git a/group14/296933284/DataStructuresTest/src/com/coding/basic/Stack.java b/group14/296933284/coding/src/com/coding/basic/Stack.java
similarity index 100%
rename from group14/296933284/DataStructuresTest/src/com/coding/basic/Stack.java
rename to group14/296933284/coding/src/com/coding/basic/Stack.java
diff --git a/group14/598808350/2017project/src/org/comm/util/StringUtil.java b/group14/598808350/2017project/src/org/comm/util/StringUtil.java
new file mode 100644
index 0000000000..9c7b802252
--- /dev/null
+++ b/group14/598808350/2017project/src/org/comm/util/StringUtil.java
@@ -0,0 +1,30 @@
+package org.comm.util;
+
+import java.util.Arrays;
+
+public class StringUtil {
+
+	public static void printStr(Object obj){
+		System.out.print(obj);
+	}
+	
+	public static void printlnStr(Object obj){
+		System.out.println(obj.toString());
+	}
+	public static void printArr(int[] arr){
+		printlnStr(Arrays.toString(arr));
+	}
+	public static boolean isEmpty(Object str){
+		boolean flag = false;
+		if(str == null || "".equals(str)) flag = true;
+		return flag;
+	}
+	public static String objToStr(Object obj){
+		if(isEmpty(obj)){
+			return "";
+		}else{
+			return obj.toString();
+		}
+	}
+	
+}
diff --git a/group14/598808350/2017project/src/org/learning/container/ArrayUtil.java b/group14/598808350/2017project/src/org/learning/container/ArrayUtil.java
new file mode 100644
index 0000000000..63d9cd1a45
--- /dev/null
+++ b/group14/598808350/2017project/src/org/learning/container/ArrayUtil.java
@@ -0,0 +1,320 @@
+package org.learning.container;
+
+import java.util.Arrays;
+
+import org.comm.util.StringUtil;
+
+public class ArrayUtil {
+
+	/**
+	 * ����һ������a���Ը������ֵ���з�ת
+	 * ���磺 a= [7,9,30,3] ,�û���[3,30,9,7]
+	 * �����a= [7,9,30,3,4], �û���[4,3,30,9,7] 
+	 * @param origin
+	 * 
+	 */
+	public static int [] reverseArray(int [] sourceArray){
+		int length = sourceArray.length;
+		int [] newArray = new int[length];
+		for(int i=length;i>0;i--){
+			newArray[length -i ] = sourceArray[i-1];
+		}
+		return newArray;
+		
+	}
+	
+	/**
+	 * ����������һ�����飬 int [] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * Ҫ����������ֵΪ0����ȥ��������Ϊ0��ֵ���뵽һ���µ����飬����������Ϊ
+	 * [1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5]
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero(int [] oldArray){
+		int oldLength = oldArray.length;
+		int [] newArray = new int[oldLength];
+		int index = 0;
+		for(int i=0;i<oldLength;i++){
+			if(oldArray[i] > 0){
+				newArray[index] = oldArray[i];
+				index ++ ;
+			}
+		}
+		int [] dest = new int[index];
+		System.arraycopy(newArray, 0, dest, 0, index);
+		return dest;
+	}
+	/**
+	 * ð������
+	 * @param array1
+	 * @return
+	 */
+	public static int[] sort(int [] arr){
+		//int[] a1 = new int[]{5, 3, 7,8,1,3,42,2,6};
+		
+		for(int i=0;i<arr.length;i++){
+			for(int j=(i+1);j<arr.length;j++){
+				int a = arr[i];
+				int b = arr[j];
+				if(a>b){
+					arr[i]=b;
+					arr[j]=a;
+				}else if(a == b){
+					arr[j]=0;
+				}
+			}
+		}
+		
+		return arr;
+	}
+	
+	public static int[] replace(int[] sourceArr,int[] resultArr,int index){
+		System.arraycopy(sourceArr, 0, resultArr, 0, index);
+		System.arraycopy(sourceArr, index+1, resultArr, index, sourceArr.length-(index+1));
+		return resultArr;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int [] newArr = new int[array1.length+array2.length];
+		//1��������
+		int array1L = removeZero(array1).length;
+		int array2L = removeZero(array2).length;
+		int [] array3 = new int[array1L+array2L];
+		System.arraycopy(array1, 0, array3, 0, array1L);
+		System.arraycopy(array2, 0, array3, array1L, array2L);
+		//2����
+		sort(array3);
+		//3 ȥ��
+		for(int i=0;i<array3.length;i++){
+			if(array3[i] == 0){
+				array3 = replace(array3,newArr,i);
+			}
+		}
+		return  removeZero(array3);
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		if(size <0) throw new IndexOutOfBoundsException();
+		int length = oldArray.length;
+		int [] newArray = new int[length+size];
+		System.arraycopy(oldArray, 0, newArray, 0, length);
+		return newArray;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		int[] result = null;
+		if (max == 1) return result = new int[0];
+		if (max == 2) return result = new int[]{1};
+		
+		int a =1,b=1,c=0;
+		int aIndex = 0;
+		int bIndex = 0;
+		int cIndex = 3;
+		result = new int[max];
+		result[0] =1;
+		result[1] =1;
+		int rIndex = 2;
+		for(int i=0;i<max;i++){
+			
+			if(cIndex == 3){
+				cIndex = 0;
+				aIndex = 3;
+				c = a+b;
+				if(c>=max){break;}
+				//printStr(c+",");
+				result[rIndex] = c;
+				rIndex +=1;
+			}else if(aIndex == 3){
+				aIndex = 0;
+				bIndex = 3;
+				a = b+c;
+				if(a>=max){break;}
+				//printStr(c+",");
+				result[rIndex] = a;
+				rIndex +=1;
+			}else if(bIndex == 3){
+				cIndex = 3;
+				bIndex = 0;
+				b = c+a;
+				if(b>=max){break;}
+				//printStr(c+",");
+				result[rIndex] = b;
+				rIndex +=1;
+			}
+		}
+		
+		
+		return removeZero(result);
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		int [] result = new int[max];
+		result[0] =2;
+		result[1] =3;
+		result[2] =5;
+		result[3] =7;
+		int index = 4;
+		for(int i = 8;i<max;i++){
+			if(isPrimes(i)){
+				result[index] = i;
+				index+=1;
+			}
+		}
+		return removeZero(result);
+	}
+	/**
+	 * �ж�num �Ƿ�Ϊ����
+	 * @param num
+	 * @return
+	 */
+	public static boolean isPrimes(int num){
+		boolean flag0 = num%2 == 0;
+		boolean flag1 = num%3 == 0;
+		boolean flag2 = num%5 == 0;
+		boolean flag3 = num%7 == 0;
+		if(!flag0 && !flag1 && !flag2 && !flag3) return true;
+		return false;
+	}
+	
+	/**
+	 * ��ȡһ�����ֵ����� 
+	 * @param num
+	 * @return
+	 */
+	public static int[] getYinzi(int num){
+		int [] res = new int[num];
+		int index =0;
+		for(int i=1;i<num;i++){
+			if(num%i == 0){
+				res[index] = i;
+				index +=1;
+			} 
+		}
+		return removeZero(res);
+	}
+	/**
+	 * ��ȡһ���������� ��ֵ�ĺ�
+	 * @param sour
+	 * @return
+	 */
+	public static int sum(int[] sour){
+		int sum = 0;
+		for(int num : sour){
+			sum+= num;
+		}
+		return sum;
+	}
+	/**
+	 * �ж� num  �Ƿ� ������
+	 * @param num
+	 * @return
+	 */
+	public static boolean isPerfectNumber(int num){
+		int [] res = getYinzi(num);
+		int sum = sum(res);
+		if(sum == num) return true;
+		return false;
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		int[] res = new int[max];
+		int index=0;
+		for(int i=0;i<max;i++){
+			if(isPerfectNumber(i)) {
+				res[index] = i;
+				index+=1;
+			}
+		}
+		
+		return removeZero(res);
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		//Arrays.toString()�� ����(,)�� �пո�
+		String str = Arrays.toString(array);
+		str = str.replaceAll(", ", seperator);
+		return str.substring(1,str.length()-1);
+	}
+	
+	
+	
+	public static void main(String[] args) {
+		int [] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		StringUtil.printArr(removeZero(oldArray));
+		//int [] a= new int[]{7,9,30,3} ;
+		/*int [] a =new int[]{7,9,30,3,4};
+		int[] arr = reverseArray(a);
+		printStr("ԭֵ");
+		printArr(a);
+		printStr("ת�����ֵ");
+		printArr(arr);*/
+		/*int [] oldArray = new int []{2,3,6};
+		int size = 3;
+		printArr(grow(oldArray,size));*/
+		/*printArr(fibonacci(13));*/
+		/*printArr(getPrimes(23));*/
+		//printArr(getYinzi(6));
+		/*int num = 496;
+		int [] res = getYinzi(num);
+		printArr(res);
+		int sum = sum(res);
+		printlnStr(sum);*/
+		int num = 497;
+		StringUtil.printArr(getPerfectNumbers(num));
+		/*int [] a =new int[]{7,9,30,3,4};
+		String seperator= "-";
+		printlnStr(join(a,seperator));*/
+		
+		/*int[] a1 = new int[]{3, 5, 7,8}; 
+		int[] a2 = new int[]{4, 5, 6,7,9};
+		int [] a3 = merge(a1, a2);
+		StringUtil.printArr(a3);*/
+		//int[] a1 = new int[]{3, 5, 7,8,1,3,42,2,6};
+		//printArr(sort(a1));
+		
+	}
+
+}
diff --git a/group14/598808350/2017project/src/org/lite/struts/LoginAction.java b/group14/598808350/2017project/src/org/lite/struts/LoginAction.java
new file mode 100644
index 0000000000..cd9599af2c
--- /dev/null
+++ b/group14/598808350/2017project/src/org/lite/struts/LoginAction.java
@@ -0,0 +1,39 @@
+package org.lite.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/group14/598808350/2017project/src/org/lite/struts/ReadXML.java b/group14/598808350/2017project/src/org/lite/struts/ReadXML.java
new file mode 100644
index 0000000000..e78ae75732
--- /dev/null
+++ b/group14/598808350/2017project/src/org/lite/struts/ReadXML.java
@@ -0,0 +1,100 @@
+package org.lite.struts;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.comm.util.StringUtil;
+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;
+
+/**
+ * ��ȡxml �����ļ�
+ * @author z
+ *
+ */
+public class ReadXML {
+	
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		String actionName = "login";
+		HashMap map = readXml(actionName);
+		
+		Iterator it = map.keySet().iterator();
+		StringUtil.printlnStr("it.hasNext():"+it.hasNext());
+		while(it.hasNext()){
+			String key = (String)it.next();
+			String value = (String)map.get(key);
+			
+			StringUtil.printlnStr(key+":"+value);
+		}
+		
+	}
+	
+	public static HashMap readXml(String actionName){
+		HashMap map = new HashMap();
+		String path = "E:\\zhoubf_code\\coding2017\\group14\\598808350\\2017project\\src\\org\\lite\\struts\\struts.xml";
+		File f = new File(path);
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		try {
+			DocumentBuilder dBuilder = dbf.newDocumentBuilder();
+			Document doc = dBuilder.parse(f);
+			NodeList resultNL = doc.getElementsByTagName("action");
+			for(int i=0;i<resultNL.getLength();i++){
+				Node node = resultNL.item(i);
+                Element  ele = (Element)node;  
+
+                
+				NamedNodeMap nodeMap = node.getAttributes();
+				String name = nodeMap.getNamedItem("name").getNodeValue();//������
+				if(actionName != null && actionName.equals(name)){
+					String cla = nodeMap.getNamedItem("class").getNodeValue();//����
+					map.put("ActionName", name);
+					map.put("ClassName", cla);
+					
+					
+					NodeList childList = ele.getElementsByTagName("result");
+					for(int j=0;j<childList.getLength();j++){
+						Node childNode = childList.item(j);
+						NamedNodeMap childNodeMap = childNode.getAttributes();
+						String resultName = childNodeMap.getNamedItem("name").getNodeValue();
+						String pageUrl = childNode.getTextContent();
+						map.put(resultName, resultName);
+						map.put(resultName+"URL", pageUrl);
+					}
+						
+				}
+				
+			}
+			
+		} 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 map;
+		
+		
+		
+		
+		
+		
+	}
+
+}
diff --git a/group14/598808350/2017project/src/org/lite/struts/Struts.java b/group14/598808350/2017project/src/org/lite/struts/Struts.java
new file mode 100644
index 0000000000..3a11d5f5d6
--- /dev/null
+++ b/group14/598808350/2017project/src/org/lite/struts/Struts.java
@@ -0,0 +1,99 @@
+package org.lite.struts;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.comm.util.StringUtil;
+
+
+
+public class Struts {
+	
+	public static void main(String [] args){
+		String actionName = "login";
+		HashMap<String,String> params = new HashMap<String,String>();
+		params.put("name", "test");
+		params.put("pwd", "1234");
+		runAction(actionName,params);
+	}
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+    	HashMap strutsMap = ReadXML.readXml(actionName);
+    	View view = null;
+    	
+    	if(!strutsMap.isEmpty()){
+    		String className = (String)strutsMap.get("ClassName");
+    		
+    		try {
+				Class cls = Class.forName(className);
+				 try {
+					Object obj = cls.newInstance();
+					Field nameF = cls.getDeclaredField("name");
+					nameF.setAccessible(true);
+					nameF.set(obj, StringUtil.objToStr(parameters.get("name")));
+					
+					 Field pwdF = cls.getDeclaredField("password");
+					 pwdF.setAccessible(true);
+					 pwdF.set(obj, StringUtil.objToStr(parameters.get("pwd")));
+					 
+					try {
+						Method method = cls.getMethod("execute");
+						String result = (String)method.invoke(obj);
+						Field messageF = cls.getDeclaredField("message");
+						messageF.setAccessible(true);
+						String msg = (String)messageF.get(obj);
+						String pageUrl = (String)strutsMap.get(result+"URL");
+						view = new View();
+						view.setJsp(pageUrl);
+						HashMap map = new HashMap();
+						map.put("msg", msg);
+						map.put("result", result);
+						view.setParameters(map);
+						
+						StringUtil.printlnStr("result:"+result);
+						StringUtil.printlnStr("msg:"+msg);
+						StringUtil.printlnStr("pageUrl:"+pageUrl);
+					} catch (NoSuchMethodException e1) {
+						// TODO Auto-generated catch block
+						e1.printStackTrace();
+					}catch (IllegalArgumentException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					} catch (InvocationTargetException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+					 
+					 
+					
+					
+				} catch (InstantiationException e1) {
+					// TODO Auto-generated catch block
+					e1.printStackTrace();
+				} catch (IllegalAccessException e1) {
+					// TODO Auto-generated catch block
+					e1.printStackTrace();
+				}
+			}catch (ClassNotFoundException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (SecurityException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (NoSuchFieldException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+    		
+    	}else{
+    		StringUtil.printlnStr("Action is not found");
+    	}
+    	
+    	
+    	return view;
+    }    
+
+}
diff --git a/group14/598808350/2017project/src/org/lite/struts/View.java b/group14/598808350/2017project/src/org/lite/struts/View.java
new file mode 100644
index 0000000000..bb6a56a8c1
--- /dev/null
+++ b/group14/598808350/2017project/src/org/lite/struts/View.java
@@ -0,0 +1,23 @@
+package org.lite.struts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/598808350/2017project/src/org/lite/struts/struts.xml b/group14/598808350/2017project/src/org/lite/struts/struts.xml
new file mode 100644
index 0000000000..b9bf410c73
--- /dev/null
+++ b/group14/598808350/2017project/src/org/lite/struts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.lite.struts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.lite.struts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java b/group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java
new file mode 100644
index 0000000000..8ac30e9dd7
--- /dev/null
+++ b/group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java
@@ -0,0 +1,78 @@
+package org.learning.container;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+
+public class TestArrayUtil extends TestCase{
+	
+	private ArrayUtil au = null;
+	
+	@Override
+	public void setUp(){
+		//����ִ��
+		//����ʵ��
+		au = new ArrayUtil();
+		
+	}
+	public void testReverseArray(){
+		int [] array1 = {7,9,30,3};
+		int[] result1 = au.reverseArray(array1);
+		int[] exp1 = {3,30,9,7};
+		Assert.assertArrayEquals(exp1, result1);
+		
+	}
+	public void testRemoveZero(){
+		 int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		 int[] newArray = au.removeZero(oldArray);
+		 int[] exp1 = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5};
+		 Assert.assertArrayEquals(exp1, newArray);
+	}
+	public void testMerge(){
+		int[] array1 = {3, 5, 7,8};
+		int[] array2 = {4, 5, 6,7};
+		int[] newArray = au.merge(array1, array2);
+		int[] exp1 = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(exp1, newArray);
+	}
+	
+	public void testGrow(){
+		int[] array1 = {3, 5, 7,8};
+		int[] newArray = au.grow(array1, 1);
+		int[] exp1= {3, 5, 7,8,0};
+		Assert.assertArrayEquals(exp1, newArray);
+	}
+	
+	public void testFibonacci(){
+		int  max = 22;
+		int[] newArray = au.fibonacci(max);
+		int[] exp1 = {1,1,2,3,5,8,13,21};
+		Assert.assertArrayEquals(exp1, newArray);
+	}
+	public void testGetPrimes(){
+		int max =23;
+		int[] newArray = au.getPrimes(max);
+		int[] exp1 = {2,3,5,7,11,13,17,19};
+		Assert.assertArrayEquals(exp1, newArray);
+	}
+	public void testGetPerfectNumbers(){
+		int max = 497;
+		int[] newArray = au.getPerfectNumbers(max);
+		int[] exp1 = {6, 28, 496};
+		Assert.assertArrayEquals(exp1, newArray);
+	}
+	public void testJoin(){
+		//join(int[] array, String seperator)
+		int[] array = {3,8,9};
+		String seperator = "-";
+		String result = au.join(array, seperator);
+		String exp1 = "3-8-9";
+		Assert.assertEquals("���", exp1, result);
+	}
+	
+	
+	@Override
+	public void tearDown(){
+		//���ִ��
+	}
+}
diff --git a/group14/598808350/2017project/test/org/lite/struts/TestStruts.java b/group14/598808350/2017project/test/org/lite/struts/TestStruts.java
new file mode 100644
index 0000000000..16ccc711e0
--- /dev/null
+++ b/group14/598808350/2017project/test/org/lite/struts/TestStruts.java
@@ -0,0 +1,38 @@
+package org.lite.struts;
+
+import java.util.HashMap;
+
+import org.junit.Assert;
+
+import junit.framework.TestCase;
+
+public class TestStruts extends TestCase{
+
+	private Struts struts = null;
+	
+	@Override
+	public void setUp(){
+		struts = new Struts();
+	}
+	public void testRunAction(){
+		String actionName = "login";
+		HashMap<String,String> params = new HashMap<String,String>();
+		params.put("name", "test");
+		params.put("pwd", "1234");
+		View view = struts.runAction(actionName, params);
+		String jsp = view.getJsp();
+		String exp1 = "/jsp/homepage.jsp";
+		Assert.assertEquals("��¼�ɹ�", exp1, jsp);
+		
+		params = new HashMap<String,String>();
+		params = new HashMap<String,String>();
+		params.put("name", "test");
+		params.put("pwd", "12341");
+		view = struts.runAction(actionName, params);
+		jsp = view.getJsp();
+		exp1 = "/jsp/showLogin.jsp";
+		Assert.assertEquals("������󣬵�¼ʧ��", exp1, jsp);
+		
+		
+	}
+}
diff --git a/group14/598808350/2017project/test/org/test/all/TestAll.java b/group14/598808350/2017project/test/org/test/all/TestAll.java
new file mode 100644
index 0000000000..265bdb4c64
--- /dev/null
+++ b/group14/598808350/2017project/test/org/test/all/TestAll.java
@@ -0,0 +1,24 @@
+package org.test.all;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.learning.container.TestArrayUtil;
+import org.lite.struts.TestStruts;
+
+/**
+ * ��������������ӵ�һ�����з��������С�
+ * @author z
+ *
+ */
+public class TestAll extends TestCase{
+
+	public static Test suite(){
+		TestSuite suite = new TestSuite();
+		suite.addTestSuite(TestArrayUtil.class);
+		suite.addTestSuite(TestStruts.class);
+		return suite;
+	}
+	
+}
diff --git a/group14/630254746/2017Leaning/.project b/group14/630254746/2017Leaning/.project
deleted file mode 100644
index af4136644f..0000000000
--- a/group14/630254746/2017Leaning/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>2017Leaning</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/group14/630254746/2017Leaning/.classpath b/group14/630254746/Code2017/.classpath
similarity index 100%
rename from group14/630254746/2017Leaning/.classpath
rename to group14/630254746/Code2017/.classpath
diff --git a/group14/630254746/Code2017/.gitignore b/group14/630254746/Code2017/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group14/630254746/Code2017/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group14/630254746/Code2017/.project b/group14/630254746/Code2017/.project
new file mode 100644
index 0000000000..06e2d605ec
--- /dev/null
+++ b/group14/630254746/Code2017/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>code2017</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs b/group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..7341ab1683
--- /dev/null
+++ b/group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/ArrayList.java b/group14/630254746/Code2017/src/com/leaning/code/ArrayList.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/ArrayList.java
rename to group14/630254746/Code2017/src/com/leaning/code/ArrayList.java
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/Iterator.java b/group14/630254746/Code2017/src/com/leaning/code/Iterator.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/Iterator.java
rename to group14/630254746/Code2017/src/com/leaning/code/Iterator.java
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/LinkedList.java b/group14/630254746/Code2017/src/com/leaning/code/LinkedList.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/LinkedList.java
rename to group14/630254746/Code2017/src/com/leaning/code/LinkedList.java
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/List.java b/group14/630254746/Code2017/src/com/leaning/code/List.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/List.java
rename to group14/630254746/Code2017/src/com/leaning/code/List.java
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/Queue.java b/group14/630254746/Code2017/src/com/leaning/code/Queue.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/Queue.java
rename to group14/630254746/Code2017/src/com/leaning/code/Queue.java
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/Stack.java b/group14/630254746/Code2017/src/com/leaning/code/Stack.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/Stack.java
rename to group14/630254746/Code2017/src/com/leaning/code/Stack.java
diff --git a/group14/630254746/2017Leaning/src/com/leaning/code/test/ArrayListTest.java b/group14/630254746/Code2017/src/com/leaning/code/test/ArrayListTest.java
similarity index 100%
rename from group14/630254746/2017Leaning/src/com/leaning/code/test/ArrayListTest.java
rename to group14/630254746/Code2017/src/com/leaning/code/test/ArrayListTest.java
diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java b/group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..7e93be14ed
--- /dev/null
+++ b/group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java
@@ -0,0 +1,95 @@
+package com.leaning.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+}
diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java
new file mode 100644
index 0000000000..4e3995f0e4
--- /dev/null
+++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.leaning.coderising.litesturts;
+
+/**
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}
diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java
new file mode 100644
index 0000000000..d636ec27b6
--- /dev/null
+++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java
@@ -0,0 +1,31 @@
+package com.leaning.coderising.litesturts;
+
+import java.util.Map;
+
+public class Struts {
+	 
+	public static View runAction(String actionName, Map<String,String> parameters) {
+
+	        /*
+	         
+			0. ��ȡ�����ļ�struts.xml
+	 		
+	 		1. ����actionName�ҵ����Ӧ��class �� ����LoginAction,   ͨ������ʵ��������������
+			��parameters�е����ݣ����ö����setter������ ����parameters�е������� 
+			("name"="test" ,  "password"="1234") ,     	
+			�Ǿ�Ӧ�õ��� setName��setPassword����
+			
+			2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+			
+			3. ͨ�������ҵ����������getter���������� getMessage��,  
+			ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ���� {"message":  "��¼�ɹ�"} ,  
+			�ŵ�View�����parameters
+			
+			4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+			�ŵ�View�����jsp�ֶ��С�
+	        
+	        */
+	    	
+	    	return null;
+	    }    
+}
diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java
new file mode 100644
index 0000000000..1e81bad64d
--- /dev/null
+++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java
@@ -0,0 +1,23 @@
+package com.leaning.coderising.litesturts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/641013587/14_641013587/.classpath b/group14/641013587/14_641013587/.classpath
new file mode 100644
index 0000000000..373dce4005
--- /dev/null
+++ b/group14/641013587/14_641013587/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group14/641013587/14_641013587/.gitignore b/group14/641013587/14_641013587/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group14/641013587/14_641013587/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group14/641013587/14_641013587/.project b/group14/641013587/14_641013587/.project
new file mode 100644
index 0000000000..7433fa7872
--- /dev/null
+++ b/group14/641013587/14_641013587/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>14_641013587</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs b/group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java b/group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..48b84f02a2
--- /dev/null
+++ b/group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,79 @@
+package com.coding.basic;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		//�ҳ����һ���յ�λ�ø�ֵ
+		for(int i=0;i<elementData.length;i++){
+			if(elementData[i]==null){
+				elementData[i]=o;
+				break;
+			}
+			if(i==elementData.length){
+				this.expansion();
+				elementData[i]=o;
+				break;
+			}
+		}
+		size++;
+		 
+	}
+	
+	private void expansion(){
+		Object[] newElementData = new Object[this.elementData.length+10];
+		System.arraycopy(elementData, 0, newElementData, 0, elementData.length-1);
+		this.elementData=newElementData;
+	}
+	
+	public void add(int index, Object o){
+		if(elementData.length<=size){
+			expansion();
+		}
+		System.arraycopy(elementData,index,elementData,index+1,size);
+		elementData[index]=o;
+		size++;
+	}
+	
+	public Object get(int index){
+		if(index>=size){
+			return this.elementData[elementData.length];
+		}else{
+			return this.elementData[index];
+		}
+	}
+	
+	public Object remove(int index){
+		Object object = get(index);
+		System.arraycopy(elementData,index+1,elementData,index,size-1);
+		elementData[size-1]=null;
+		size--;
+		return object;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public Iterator iterator(){
+		
+		return new Iterator() {
+			
+			private int nextNum=0;
+			
+			@Override
+			public Object next() {
+				return get(nextNum++);
+			}
+			
+			@Override
+			public boolean hasNext() {
+				return nextNum>=size?false:true;
+			}
+		};
+	}
+	
+}
diff --git a/group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java b/group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group16/542087872/src/com/coding/basic/Iterator.java b/group14/641013587/14_641013587/src/com/coding/basic/Iterator.java
similarity index 100%
rename from group16/542087872/src/com/coding/basic/Iterator.java
rename to group14/641013587/14_641013587/src/com/coding/basic/Iterator.java
diff --git a/group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java b/group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..de7114b424
--- /dev/null
+++ b/group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,123 @@
+package com.coding.basic;
+
+public class LinkedList implements List {
+	
+	private Node head=new Node();
+	
+	public void add(Object o){
+		if(head.data==null){
+			head.data=o;
+			return;
+		}
+		Node node=head;
+		for(;node.next!=null;){
+			node=node.next;
+		}
+		node.next=new Node();
+		node.next.data=o;
+		
+	}
+	public void add(int index , Object o){
+		if(index==0){
+			addFirst(o);
+			return;
+		}
+		Node node=head;
+		for(int i=0;i<index;i++){
+				node=node.next;
+				if(node==null){
+					node=new Node();
+				}
+			
+		}
+		node.data=o;
+		return;
+	}
+	public Object get(int index){
+		Node node=head;
+		for(int i=0;i<index;i++){
+				node=node.next;
+		}
+		return node.data;
+	}
+	public Object remove(int index){
+		if(index==0){
+			Object data=head.data;
+			removeFirst();
+			return data;
+		}
+		Node node=head;
+		for(int i=0;i<index-1;i++){
+				node=node.next;
+		}
+		Object data=node.next.data;
+		node.next=node.next.next;
+		return data;
+	}
+	
+	public int size(){
+		int i =0;
+		Node node=head;
+		while (node!=null) {
+			node=node.next;
+			i++;
+		}
+		return i;
+	}
+	
+	public void addFirst(Object o){
+		Node node = new Node();
+		node.data=o;
+		node.next=head;
+		head=node;
+	}
+	public void addLast(Object o){
+		add(o);
+	}
+	public Object removeFirst(){
+		Object data=head.data;
+		head=head.next;
+		if(head==null){
+			head=new Node();
+		}
+		return data;
+	}
+	public Object removeLast(){
+		Object data = null;
+		Node node=head;
+		for(;node.next!=null;){
+			if(node.next.next==null){
+				data=node.next.next;
+				node.next=node.next.next;
+				break;
+			}
+			node=node.next;
+		}
+		return data;
+	}
+	public Iterator iterator(){
+		return new Iterator() {
+			
+			Node node=head;
+			
+			@Override
+			public Object next() {
+				Object data=node.data;
+				node=node.next;
+				return data;
+			}
+			
+			@Override
+			public boolean hasNext() {
+				return node==null?false:true;
+			}
+		};
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+}
diff --git a/group16/542087872/src/com/coding/basic/List.java b/group14/641013587/14_641013587/src/com/coding/basic/List.java
similarity index 100%
rename from group16/542087872/src/com/coding/basic/List.java
rename to group14/641013587/14_641013587/src/com/coding/basic/List.java
diff --git a/group14/641013587/14_641013587/src/com/coding/basic/Queue.java b/group14/641013587/14_641013587/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..36e516e266
--- /dev/null
+++ b/group14/641013587/14_641013587/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/group14/641013587/14_641013587/src/com/coding/basic/Stack.java b/group14/641013587/14_641013587/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..d3c0406dc8
--- /dev/null
+++ b/group14/641013587/14_641013587/src/com/coding/basic/Stack.java
@@ -0,0 +1,25 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(0, o);
+	}
+	
+	public Object pop(){
+		Object object = elementData.get(0);
+		elementData.remove(0);
+		return object;
+	}
+	
+	public Object peek(){
+		return elementData.get(0);
+	}
+	public boolean isEmpty(){
+		return elementData.size()==0?true:false;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group14/641013587/14_641013587/src/com/coding/test/MyTest.java b/group14/641013587/14_641013587/src/com/coding/test/MyTest.java
new file mode 100644
index 0000000000..79bee9cbe1
--- /dev/null
+++ b/group14/641013587/14_641013587/src/com/coding/test/MyTest.java
@@ -0,0 +1,59 @@
+package com.coding.test;
+
+import org.junit.Test;
+
+import com.coding.basic.ArrayList;
+import com.coding.basic.Iterator;
+import com.coding.basic.LinkedList;
+import com.coding.basic.Stack;
+
+public class MyTest {
+	
+	@Test
+	public void StackTest(){
+		Stack stack = new Stack();
+		stack.push("a");
+		stack.push("b");
+		stack.push("c");
+		System.out.println(stack.pop());
+		System.out.println(stack.pop());
+		System.out.println(stack.peek());
+		System.out.println(stack.pop());
+	}
+	
+	
+	@Test
+	public void myTest(){
+		ArrayList arrayList = new ArrayList();
+		arrayList.add("a");
+		arrayList.add("b");
+		arrayList.add("c");
+		arrayList.add("d");
+		arrayList.add("e");
+		arrayList.add(3,"f");
+		Iterator iterator = arrayList.iterator();
+		while (iterator.hasNext()) {
+			System.out.println(iterator.next());
+			
+		}
+	}
+	
+	@Test
+	public void LinkedListTest(){
+		LinkedList linkedList = new LinkedList();
+		linkedList.add("a");
+		linkedList.add("b");
+		linkedList.addFirst("c");
+		linkedList.addLast("d");
+		//linkedList.remove(2);
+		linkedList.removeLast();
+		System.out.println(linkedList.size());
+		//System.out.println(linkedList.get(2));
+		Iterator iterator = linkedList.iterator();
+		while (iterator.hasNext()) {
+			System.out.println(iterator.next());
+		}
+		
+	}
+	
+}
diff --git a/group14/641013587/RemoteSystemsTempFiles/.project b/group14/641013587/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000000..5447a64fa9
--- /dev/null
+++ b/group14/641013587/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RemoteSystemsTempFiles</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/775857669/.gitignore b/group14/775857669/.gitignore
index ae3c172604..09e3bc9b24 100644
--- a/group14/775857669/.gitignore
+++ b/group14/775857669/.gitignore
@@ -1 +1,2 @@
 /bin/
+/target/
diff --git a/group14/775857669/pom.xml b/group14/775857669/pom.xml
new file mode 100644
index 0000000000..114ff8d633
--- /dev/null
+++ b/group14/775857669/pom.xml
@@ -0,0 +1,31 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.heyucool</groupId>
+  <artifactId>coding</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>coding</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
+	<dependency>
+	    <groupId>dom4j</groupId>
+	    <artifactId>dom4j</artifactId>
+	    <version>1.6.1</version>
+	</dependency>
+  </dependencies>
+</project>
diff --git a/group14/775857669/src/com/coderising/array/ArrayUtil.java b/group14/775857669/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..43e93ff20f
--- /dev/null
+++ b/group14/775857669/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,227 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Stack;
+
+
+public class ArrayUtil {
+	
+	private static final String List = null;
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		Stack<Integer> stack = new Stack<>();
+		for (int item : origin) {
+			stack.push(item);
+		}
+		for (int index = 0; index < origin.length; index++) {
+			origin[index] = stack.pop();
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		Queue<Integer> queue = new LinkedList<>();
+		for (int item : oldArray) {
+			if (item != 0) {
+				queue.add(item);
+			}
+		}
+		int size = queue.size();
+		int[] newArray = new int[size];
+		for(int i=0 ; i<size ; i++) {
+			newArray[i] = queue.poll();
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		boolean asc = false;
+		if (array1[0] < array1[1]) {
+			asc = true;
+		}
+		HashSet<Integer> hashSet = new HashSet<>();
+		for (Integer integer : array1) {
+			hashSet.add(integer);
+		}
+		for (Integer integer : array2) {
+			hashSet.add(integer);
+		}
+		Integer[] array =  hashSet.toArray(new Integer[hashSet.size()]);
+		if(asc) {
+			Arrays.sort(array);
+		} else {
+			Arrays.sort(array);
+		}
+		int[] ret = new int[array.length];
+		for(int i=0 ; i<array.length; i++) {
+			ret[i] = array[i];
+		}
+		return ret;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		java.util.List<Integer> list = new ArrayList<>();
+		int fib = 1;
+		if(max <= 1){
+			return new int[0];
+		}
+		int count = 1;
+		list.add(1);
+		while (fib < max) {
+			list.add(fib);
+			fib = fib(++count);
+		}
+		int[] ret = new int[list.size()];
+		for (int i = 0 ; i<list.size() ; i++) {
+			ret[i] = list.get(i);
+		}
+		return ret;
+	}
+	
+	private int fib(int count) {
+		if (count == 1)
+			return 1;
+		if (count == 2)
+			return 1;
+		return fib(count-1) + fib(count-2);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		List<Integer> list = new ArrayList<>();
+		for(int i=2 ; i<max ; i++) {
+			if(isPrime(i)){
+				list.add(i);
+			}
+		}
+		return list.stream().mapToInt(i->i).toArray();
+	}
+	/**
+	 * 
+	 * @Author: yuhe
+	 * @Description: TODO
+	 * @param num
+	 * @return
+	 */
+	private boolean isPrime(int num) {
+		boolean isPrime = true;
+		if(num == 2) {
+			isPrime = true;
+		}else if(num == 3) {
+			isPrime = true;
+		}else if (num%2 == 0) {
+			isPrime = false;
+		} else {
+			for(int i=3 ; i<num ; i=i+2) {
+				if(num % i == 0) {
+					isPrime = false;
+					break;
+				}
+			}
+		}
+		return isPrime;
+	}
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		List<Integer> list = new ArrayList<>();
+		for(int i=3 ; i<max; i++) {
+			if(isPerfect(i)){
+				list.add(i);
+			}
+		}
+		return list.stream().mapToInt(i -> i).toArray();
+	}
+	
+	private boolean isPerfect(int num) {
+		boolean isPerfect = false;
+		List<Integer> list = new ArrayList<>();
+		for (int i = 1; i <= num/2; i++) {
+			if(num%i == 0) {
+				list.add(i);
+			}
+		}
+		int sum = 0;
+		for (Integer item : list) {
+			sum += item;
+		}
+		if (sum == num){
+			isPerfect = true;
+		}
+		return isPerfect;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer sb = new StringBuffer();
+		for(int i=0 ; i<array.length-1 ; i++) {
+			sb.append(array[i]).append("-");
+		}
+		sb.append(array[array.length-1]);
+		return sb.toString();
+	}
+}
diff --git a/group14/775857669/src/com/coderising/array/ArrayUtilTest.java b/group14/775857669/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..3d84c11252
--- /dev/null
+++ b/group14/775857669/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,75 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	private ArrayUtil arrayUtil;
+	@Before
+	public void init() {
+		arrayUtil = new ArrayUtil();
+	}
+	@After
+	public void finish() {
+		arrayUtil = null;
+	}
+	
+	@Test
+	public void testReverseArray() {
+		int[] origin = {1,2,3,4,5,6};
+		arrayUtil.reverseArray(origin);
+		System.out.println(Arrays.toString(origin));
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int[] origin = {0,1,0,2,3,4,5,6,0,0};
+		int[] newArr = arrayUtil.removeZero(origin);
+		System.out.println(Arrays.toString(newArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] array1 = {3,4,5,6,9,12};
+		int[] array2 = {1,3,5,6,7,8,9};
+		int[] merge = arrayUtil.merge(array1, array2);
+		System.out.println(Arrays.toString(merge));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] arr = {1,2,3,4};
+		System.out.println(Arrays.toString(arrayUtil.grow(arr, 3)));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int[] fibonacci = arrayUtil.fibonacci(12);
+		System.out.println(Arrays.toString(fibonacci));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int[] primes = arrayUtil.getPrimes(23);
+		System.out.println(Arrays.toString(primes));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] perfectNumbers = arrayUtil.getPerfectNumbers(100);
+		System.out.println(Arrays.toString(perfectNumbers));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] arr = {1,2,3};
+		String join = arrayUtil.join(arr, "-");
+		System.out.println(join);
+	}
+
+}
diff --git a/group14/775857669/src/com/coderising/iterstruts/LoginAction.java b/group14/775857669/src/com/coderising/iterstruts/LoginAction.java
new file mode 100644
index 0000000000..a92964c66f
--- /dev/null
+++ b/group14/775857669/src/com/coderising/iterstruts/LoginAction.java
@@ -0,0 +1,36 @@
+package com.coderising.iterstruts;
+
+public class LoginAction {
+
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+
+}
diff --git a/group14/775857669/src/com/coderising/iterstruts/Struts.java b/group14/775857669/src/com/coderising/iterstruts/Struts.java
new file mode 100644
index 0000000000..3efa435ca0
--- /dev/null
+++ b/group14/775857669/src/com/coderising/iterstruts/Struts.java
@@ -0,0 +1,101 @@
+package com.coderising.iterstruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+	@SuppressWarnings("unchecked")
+	public static View runAction(String actionName, Map<String,String> parameters) {
+		View view = new View();
+		Map<String, String> map = new HashMap<>();
+//		view.setParameters(parameters);
+		SAXReader reader = new SAXReader();
+		Document document = null;
+		try {
+			document = reader.read("src/com/coderising/iterstruts/struts.xml");
+			Element rootElement = document.getRootElement();
+			for(Iterator<Element> iter = rootElement.elementIterator(); iter.hasNext();){
+				Element element = iter.next();
+				if ("action".equals(element.getName()) && actionName.equals(element.attributeValue("name"))) {// 找到actionName对应的element
+					String className = element.attributeValue("class");
+					Class<?> targetClass = Class.forName(className);
+					Object instance = targetClass.newInstance();
+					Set<String> keySet = parameters.keySet();
+					//setter
+					for (String key : keySet) {
+						Character firstLit =Character.toUpperCase(key.charAt(0));
+						String leftParts = key.substring(1);
+						String methodName ="set" + firstLit + leftParts;
+						Method method = targetClass.getMethod(methodName, String.class);
+						method.invoke(instance, parameters.get(key));
+					}
+					
+					Method execute = targetClass.getMethod("execute");
+					String result = (String) execute.invoke(instance);
+					Map<String, String> resultMap = new HashMap<>();
+					for(Iterator<Element> innerIter = element.elementIterator(); innerIter.hasNext() ;){
+						Element resultElement = innerIter.next();
+						if(resultElement.getName().equals("result")){
+							String resultValue = resultElement.attributeValue("name");
+							String jspPath = resultElement.getStringValue();
+							resultMap.put(resultValue, jspPath);
+						}
+					}
+					String targetJspPath = resultMap.get(result);
+					view.setJsp(targetJspPath);
+					//getter
+					for (Method method : targetClass.getMethods()) {
+						if(method.getName().startsWith("get") && method.getReturnType()==String.class) {
+							System.out.println(method.getName());
+							String key = method.getName().substring(3);
+							key = Character.toLowerCase(key.charAt(0)) + key.substring(1);
+							String value = (String) method.invoke(instance);
+							map.put(key, value);
+						}
+					}
+					view.setParameters(map);
+					return view;
+				}
+			}
+		} catch (DocumentException | ClassNotFoundException 
+				| NoSuchMethodException | SecurityException | InstantiationException 
+				| IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		
+		
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return view;
+    } 
+	public static void main(String[] args) {
+		runAction(null, null);
+	}
+}
diff --git a/group14/775857669/src/com/coderising/iterstruts/StrutsTest.java b/group14/775857669/src/com/coderising/iterstruts/StrutsTest.java
new file mode 100644
index 0000000000..ee4a35467b
--- /dev/null
+++ b/group14/775857669/src/com/coderising/iterstruts/StrutsTest.java
@@ -0,0 +1,40 @@
+package com.coderising.iterstruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+}
diff --git a/group14/775857669/src/com/coderising/iterstruts/View.java b/group14/775857669/src/com/coderising/iterstruts/View.java
new file mode 100644
index 0000000000..f7f8422262
--- /dev/null
+++ b/group14/775857669/src/com/coderising/iterstruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.iterstruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/775857669/src/com/coderising/iterstruts/struts.xml b/group14/775857669/src/com/coderising/iterstruts/struts.xml
new file mode 100644
index 0000000000..7c52368dfb
--- /dev/null
+++ b/group14/775857669/src/com/coderising/iterstruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.iterstruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.iterstruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/857999411/SecondHomework/.classpath b/group14/857999411/SecondHomework/.classpath
new file mode 100644
index 0000000000..158993c7d3
--- /dev/null
+++ b/group14/857999411/SecondHomework/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/commons-beanutils-1.9.3.jar"/>
+	<classpathentry kind="lib" path="lib/commons-logging-1.1.1.jar"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group14/857999411/SecondHomework/.gitignore b/group14/857999411/SecondHomework/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group14/857999411/SecondHomework/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group14/857999411/SecondHomework/.project b/group14/857999411/SecondHomework/.project
new file mode 100644
index 0000000000..1bcfdd57a3
--- /dev/null
+++ b/group14/857999411/SecondHomework/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>SecondHomework</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs b/group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group14/857999411/SecondHomework/lib/commons-beanutils-1.9.3.jar b/group14/857999411/SecondHomework/lib/commons-beanutils-1.9.3.jar
new file mode 100644
index 0000000000..6728154e56
Binary files /dev/null and b/group14/857999411/SecondHomework/lib/commons-beanutils-1.9.3.jar differ
diff --git a/group14/857999411/SecondHomework/lib/commons-logging-1.1.1.jar b/group14/857999411/SecondHomework/lib/commons-logging-1.1.1.jar
new file mode 100644
index 0000000000..8758a96b70
Binary files /dev/null and b/group14/857999411/SecondHomework/lib/commons-logging-1.1.1.jar differ
diff --git a/group14/857999411/SecondHomework/lib/dom4j-1.6.1.jar b/group14/857999411/SecondHomework/lib/dom4j-1.6.1.jar
new file mode 100644
index 0000000000..c8c4dbb92d
Binary files /dev/null and b/group14/857999411/SecondHomework/lib/dom4j-1.6.1.jar differ
diff --git a/group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java b/group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..95be832836
--- /dev/null
+++ b/group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,264 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int len =origin.length;
+		int [] newArray =new int[len];
+		
+		int j=0;
+		for(int i=len-1;i>=0;i--){
+			if(j<newArray.length){
+				newArray[j]=origin[i];
+				j++;
+			}
+		}
+		System.out.println(Arrays.toString(newArray));
+		for (int i : newArray) {
+			System.out.print(i+",");
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	public int[] removeZero(int[] oldArray){
+		int len = oldArray.length;
+		int [] midA=new int[len];
+		
+		int j=0;
+		int num=0;
+		for(int i=0;i<len;i++){
+			if(oldArray[i] != 0){
+				midA[j]=oldArray[i];
+				j++;
+				++num;
+			}
+		}
+		
+		int[] newA = Arrays.copyOf(midA, num);
+		
+		System.out.println(Arrays.toString(newA));
+		return newA;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	public int[] merge(int[] array1, int[] array2){
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		
+		if(array1[0] != array2[0]){
+			list.add(array1[0]);
+			list.add(array2[0]);
+		}else if(array1[0] == array2[0]){
+			list.add(array1[0]);
+		}
+		
+		int i =1;
+		for(int j=1;j<array1.length;j++){
+			if(array1[i-1] == array2[j]){
+				list.add(array1[i]);
+			}else if(array1[i] == array2[j-1]){
+				list.add(array2[j]);
+			}else if(array1[i] > array2[j]){
+				list.add(array2[j]);
+				list.add(array1[i]);
+			}else if(array1[i] < array2[j]){
+				list.add(array1[i]);
+				list.add(array2[j]);
+			}else if(array1[i] == array2[j]){
+				list.add(array1[i]);
+			}
+			i++;
+		}	
+
+			int[] newA =new int[list.size()];
+			
+			for(int k=0;k<newA.length;k++){
+				newA[k]=list.get(k);
+			}
+			
+			System.out.println(Arrays.toString(newA));
+			return newA;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int len =oldArray.length+size;
+		int[] newA =new int[len];
+		
+		newA =Arrays.copyOf(oldArray, len);
+		System.out.println(Arrays.toString(newA));
+		return newA;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int f(int n){
+		return n>2?f(n-1)+f(n-2):1;
+	}
+	public int[] fibonacci(int max){
+		ArrayList<Integer> list =new ArrayList<Integer>();
+		for(int i=1; i<max; i++){
+			list.add(f(i));
+		}
+		
+		int num=0;
+		int [] newA =null;
+		for(int i=0; i<list.size(); i++){
+			if(max <= list.get(i+1)){
+				break;
+			}
+			num=i+1;
+		}
+		
+		newA =new int[num+1];
+		for(int i=0; i<=num; i++){
+			newA[i]=list.get(i);
+		}
+		for (int i : list) {
+			System.out.println(i);
+		}
+		for (int i : newA) {
+			System.out.println(i);
+		}
+		return newA;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		
+		int j;
+		for(int i=2; i<=max; i++){
+			j=2;
+			while(i%j != 0){
+				j++;
+			}
+			if(j == i){
+				list.add(i);
+			}
+		}
+		
+		for (Integer in : list) {
+			System.out.println(in);
+		}
+		
+		int num=0;
+		int [] newA =null;
+		for(int i=0; i<list.size(); i++){
+			if(max <= list.get(i+1)){
+				break;
+			}
+			num=i+1;
+		}
+		
+		int [] newA1 =new int[num+1];
+		for(int i=0; i<=num; i++){
+			newA1[i]=list.get(i);
+		}
+			
+		System.out.println(Arrays.toString(newA1));
+		
+		return newA1;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		
+		int s;
+	     for(int i=1;i<=10000;i++)
+	     {
+	        s=0;
+	        for(int j=1;j<i;j++)
+	            if(i % j==0)
+	               s=s+j;
+	           if(s==i)
+	             list.add(i);
+	     }
+	   
+	     
+	     int num=0;
+	     int [] newA =null;
+	     for(int i=0; i<list.size(); i++){
+			if(max <= list.get(i+1)){
+				break;
+			}
+			num=i+1;
+		}
+	     
+	     	int [] newA1 =new int[num+1];
+			for(int i=0; i<=num; i++){
+				newA1[i]=list.get(i);
+			}
+				
+			System.out.println(Arrays.toString(newA1));
+			
+			return newA1;
+	}
+	
+	/**
+	 * 用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]);
+				sb.append(seperator);
+			}else if(i == array.length-1){
+				sb.append(array[i]);
+			}
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/LoginAction.java b/group14/857999411/SecondHomework/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/Struts.java b/group14/857999411/SecondHomework/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..12ca731f67
--- /dev/null
+++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,68 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws Exception {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的execute 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	SAXReader reader = new SAXReader();
+    	Document doc = reader.read("./src/struts.xml");
+    	Element root = doc.getRootElement();
+    	Element el = root.element("action");
+    	Attribute attr = el.attribute("class");
+    	String value = attr.getValue();
+    	System.out.println(attr.getValue());
+    	
+    	
+    	Class<?> clazz = Class.forName(value);
+    	LoginAction login =(LoginAction) clazz.newInstance();
+    	
+    	Method setN = clazz.getMethod("setName", String.class);
+    	setN.invoke(login, "test");
+    	Method setP = clazz.getMethod("setPassword", String.class);
+    	setP.invoke(login, "1234");
+    	
+    	Method getM = clazz.getMethod("execute", null);
+    	String str = (String) getM.invoke(login, null);
+    	System.out.println(str);
+    	
+    	/*PropertyDescriptor pro = new PropertyDescriptor("name", LoginAction.class);
+    	Method readM = pro.getReadMethod();
+    	String message = (String) readM.invoke(login, null);*/
+    	
+    	String bean = BeanUtils.getProperty(login, "name");
+    	System.out.println(bean);
+    	return null;
+    }    
+
+}
diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java b/group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..92a6758a69
--- /dev/null
+++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws Exception {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws Exception {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java b/group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml b/group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group14/864020162/.classpath b/group14/864020162/.classpath
new file mode 100644
index 0000000000..fb5011632c
--- /dev/null
+++ b/group14/864020162/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group14/864020162/.gitignore b/group14/864020162/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group14/864020162/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group14/864020162/.project b/group14/864020162/.project
new file mode 100644
index 0000000000..f16286d15c
--- /dev/null
+++ b/group14/864020162/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>2017Improve</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group14/864020162/src/com/coderising/litestruts/LoginAction.java b/group14/864020162/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group14/864020162/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group14/864020162/src/com/coderising/litestruts/Struts.java b/group14/864020162/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/group14/864020162/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/group14/864020162/src/com/coderising/litestruts/View.java b/group14/864020162/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group14/864020162/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group14/864020162/src/com/datastructure/basic/ArrayList.java b/group14/864020162/src/com/datastructure/basic/ArrayList.java
new file mode 100644
index 0000000000..5245563b7e
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/ArrayList.java
@@ -0,0 +1,32 @@
+package com.datastructure.basic;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java b/group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..1c052a5005
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.datastructure.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group14/864020162/src/com/datastructure/basic/Iterator.java b/group14/864020162/src/com/datastructure/basic/Iterator.java
new file mode 100644
index 0000000000..bee5d797c9
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.datastructure.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group14/864020162/src/com/datastructure/basic/LinkedList.java b/group14/864020162/src/com/datastructure/basic/LinkedList.java
new file mode 100644
index 0000000000..a5b0b31c40
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/LinkedList.java
@@ -0,0 +1,46 @@
+package com.datastructure.basic;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+}
diff --git a/group14/864020162/src/com/datastructure/basic/List.java b/group14/864020162/src/com/datastructure/basic/List.java
new file mode 100644
index 0000000000..633f1f73e2
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/List.java
@@ -0,0 +1,9 @@
+package com.datastructure.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group14/864020162/src/com/datastructure/basic/Queue.java b/group14/864020162/src/com/datastructure/basic/Queue.java
new file mode 100644
index 0000000000..d59788a45f
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/Queue.java
@@ -0,0 +1,19 @@
+package com.datastructure.basic;
+
+public class Queue {
+	
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group14/864020162/src/com/datastructure/basic/Stack.java b/group14/864020162/src/com/datastructure/basic/Stack.java
new file mode 100644
index 0000000000..6a1d31a3d4
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/basic/Stack.java
@@ -0,0 +1,22 @@
+package com.datastructure.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group14/864020162/src/com/datastructure/util/ArrayUtil.java b/group14/864020162/src/com/datastructure/util/ArrayUtil.java
new file mode 100644
index 0000000000..3b6f9cc7aa
--- /dev/null
+++ b/group14/864020162/src/com/datastructure/util/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.datastructure.util;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/group15/1500_369516660/.gitignore b/group15/1500_369516660/.gitignore
deleted file mode 100644
index 5e56e040ec..0000000000
--- a/group15/1500_369516660/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/group15/1500_369516660/.project b/group15/1500_369516660/.project
deleted file mode 100644
index c2f1bb9994..0000000000
--- a/group15/1500_369516660/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>codingLeaning</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/group15/1500_369516660/src/com/arrayList/basic/List.java b/group15/1500_369516660/src/com/arrayList/basic/List.java
deleted file mode 100644
index 698e06eb42..0000000000
--- a/group15/1500_369516660/src/com/arrayList/basic/List.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.arrayList.basic;
-/**
- * ��������ɾ�鷽��
- * @author Jodie
- *
- */
-public interface List {
-
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public String remove(Object o);
-	public int size();
-	
-}
diff --git a/group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java b/group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java
deleted file mode 100644
index d2f3af6329..0000000000
--- a/group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.arrayList.basic;
-
-import java.util.Arrays;
-
-/**
- * 
- * @author Jodie
- *
- */
-public class SimpleArrayList implements List {
-
-	private final static int default_num = 10;//��������ʱ��û�ж����С��Ĭ��Ϊ10
-	private Object[] elementData;
-	private int size = 0;//��������Ĵ�С,��ʵ����Ĵ�С
-	
-	public SimpleArrayList(){
-		this(default_num);
-	}
-
-	public SimpleArrayList(int size) {
-		if(size<0){//�ж϶�������Ĵ�С�Ƿ�С��0
-			throw new IllegalArgumentException();
-		}else{
-			 elementData = new Object[size];
-		}
-	}
-
-/**
- * ��д���Ӻ����ķ���1
- */
-	@Override
-	public void add(Object o) {
-		//�ж��Ƿ���Ҫ����
-		ifSpaceEnougn(size+1);
-		elementData[size++]=o;
-	}
-	
-/**
- * ��д���Ӻ����ķ���2
- */
-	@Override
-	public void add(int index, Object o) {
-		checkIfOut(index);//�Ƿ�Խ��
-		ifSpaceEnougn(size+1);//�Ƿ�Ҫ����
-		System.arraycopy(elementData, index, elementData, index + 1, size-index);//��index��Ԫ�ؼ��Ժ��Ԫ�������һλ
-	}
-/**
- * �õ�ָ���±������
- */
-	@Override
-	public Object get(int index) {
-		checkIfOut(index);
-		return elementData[index];
-	}
-/**
- * ɾ��ָ���±������
- */
-	@Override
-	public Object remove(int index) {
-		Object value = get(index);
-		int numRemove = size - index - 1;
-		if(numRemove > 0){
-			System.arraycopy(elementData, index+1, elementData, index, size - index);//������ǰ��һλ
-		}
-		elementData[--size] = null;
-		return value;
-	}
-/**
- * ɾ��ָ��������	
- */
-	@Override
-	public String remove(Object o) {
-		if(contains(o)){
-			remove(indexOf(o));
-			return "ɾ���ɹ�";
-		}else{
-			return "Ҫɾ�������ݲ��������У�ɾ��ʧ��";
-		}
-	}
-/**
- * �ж��Ƿ���Ҫ����
- * @param size
- */
-	private void ifSpaceEnougn(int size) {
-		if(size>default_num){
-			exlicitSpace(size);
-		}
-		if(size<0){//��size����Integer.MAX_VALUEʱ�����Ϊ����
-			throw new OutOfMemoryError();
-		}
-	}
-/**
- * �������ݷ���
- * @param 
- */
-	private void exlicitSpace(int size) {
-		final int max_arrayLength = Integer.MAX_VALUE-8;
-		int newLength = elementData.length*2;//һ��������Ϊԭ��������������Ƶ��������
-		if(newLength - size<0){
-			newLength = size;
-		}
-		if(newLength > max_arrayLength){//�������ݺ�Ĵ�С�������ֵ
-			newLength = (size > max_arrayLength ? Integer.MAX_VALUE : max_arrayLength);
-		}
-		elementData = Arrays.copyOf(elementData, newLength);
-	}
-
-/**
- * �ж��Ƿ�Խ��
- * @param index
- */
-	private void checkIfOut(int index) {
-		if(index<0 || index>size){
-			throw new IndexOutOfBoundsException();
-		}
-	}
-
-/**
- * �ҵ�ָ���������±�
- * @param o
- * @return
- */
-private int indexOf(Object o) {
-	if(o!=null){
-		for(int i=0;i<size;i++){
-			if(elementData[i].equals(o)){
-				return i;
-			}
-		}
-	}else{
-		for(int i=0;i<size;i++){
-			if(elementData[i] == null){
-				return i;
-			}
-		}
-	}
-	return -1;
-}
-
-/**
- * �ж��������Ƿ�����������
- * @param o
- * @return
- */
-	private boolean contains(Object o) {
-		return indexOf(o) >= 0;
-	}
-
-	@Override
-	public int size() {
-		return size;
-	}
-
-
-}
diff --git a/group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java b/group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java
deleted file mode 100644
index 646c2ab656..0000000000
--- a/group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.arrayList.basic;
-
-public class SimpleLinkedList implements List {
-
-	private int size;//����Ĵ�С
-	private Node head;
-	
-	@Override
-	public void add(Object o) {
-		
-	}
-
-	@Override
-	public void add(int index, Object o) {
-		
-	}
-
-	@Override
-	public Object get(int index) {
-		return null;
-	}
-
-	@Override
-	public Object remove(int index) {
-		return null;
-	}
-
-	@Override
-	public String remove(Object o) {
-		return null;
-	}
-
-	@Override
-	public int size() {
-		return 0;
-	}
-
-}
diff --git a/group15/1501_2535894075/2017code/src/arraylist.java b/group15/1501_2535894075/2017code/src/arraylist.java
deleted file mode 100644
index 01e3be56e7..0000000000
--- a/group15/1501_2535894075/2017code/src/arraylist.java
+++ /dev/null
@@ -1,252 +0,0 @@
-package firstweek;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-public class arraylist implements List {
-	ArrayList<Integer> q=new ArrayList<Integer>();
-	
-	private static final int InitialValue=10;
-	
-	private static final Object[] Empty_Elementdata={};	
-	
-	private Object[] elementData = new Object[100];
-	
-	private int size = 0;
-	
-	public boolean add(Object o){
-		if(elementData==Empty_Elementdata){
-			//����Ϊ��ʼ������Ϊ10������
-			elementData[0]=o;
-		}
-		if(size==elementData.length){
-			//copy���鲢����50%
-			int oldLength=elementData.length;
-			int newLength=oldLength+(oldLength>>1);
-			if(newLength-oldLength>0){
-				elementData=Arrays.copyOf(elementData, newLength);
-			}
-		}
-		elementData[size++]=o;
-		return true;
-		
-	}
-	public void add(int index, Object o){
-		if(elementData==Empty_Elementdata){
-			elementData[0]=o;
-			System.out.print("������һ���µ�ֻ�и�Ԫ�ص�����");
-			return ;
-		}
-		if(size==elementData.length){
-			int oldLength=elementData.length;
-			int newLength=oldLength+(oldLength>>1);
-			if(newLength-oldLength>0){
-				System.arraycopy(elementData, index, elementData,index+1 ,size-index);
-			}
-		}
-		elementData[index]=o;
-		size++;
-	}
-	
-	public Object get(int index){
-		rangecheck(index);		
-		return elementData[index];
-	}
-	
-	public Object remove(int index){
-		rangecheck(index);
-		Object oldValue=elementData(index);
-		int numMove=size-index-1;
-		if(numMove>0){
-			System.arraycopy(elementData, index+1, elementData, index, numMove);
-		}
-		elementData[--size]=null;
-		return true;
-	}
-	public boolean removeObject(Object o){
-		if(o==null){
-			for(int index=0;index<size;index++){
-				if(elementData[index]==null){
-					fastremove(index);
-					return true;
-				}
-			}
-		}else{
-			for(int index=0;index<size;index++){
-				if(o.equals(elementData[index])){
-					fastremove(index);
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	private ArrayList<Integer> elementData(int index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	public int size(){
-		return size;
-	}
-	@Override
-	public boolean isEmpty() {
-		// TODO Auto-generated method stub
-		return size==0;
-	}
-	@Override
-	public boolean contains(Object o) {
-		// TODO Auto-generated method stub
-		return 0>=indexOf(o);
-	}
-	@Override
-	public Iterator iterator() {
-		// TODO Auto-generated method stub
-		//����
-		return null;
-	}
-	@Override
-	public Object[] toArray() {
-		// TODO Auto-generated method stub
-		return Arrays.copyOf(elementData,size);
-	}
-	@Override
-	public Object[] toArray(Object[] a) {
-		
-		// TODO Auto-generated method stub
-		return null;
-	}
-	@Override
-	public boolean remove(Object o) {
-		// TODO Auto-generated method stub
-		if(o==null){
-			for(int i=0;i<elementData.length;i++){
-				if(elementData[i]==null){
-					fastremove(i);
-					return true;
-				}
-			}
-		}else{
-			for(int i=0;i<elementData.length;i++){
-				if(o.equals(elementData[i])){
-					fastremove(i);
-					return true;
-				}
-			}
-		}
-		
-		return false;
-	}
-	@Override
-	public boolean containsAll(Collection c) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-	@Override
-	public boolean addAll(Collection c) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-	@Override
-	public boolean addAll(int index, Collection c) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-	@Override
-	public boolean removeAll(Collection c) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-	@Override
-	public boolean retainAll(Collection c) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-	@Override
-	public void clear() {
-		// TODO Auto-generated method stub
-		for(int i=0;i<elementData.length;i++){
-			elementData[i]=null;
-		}
-		size=0;
-		
-	}
-	@Override
-	public Object set(int index, Object element) {
-		// TODO Auto-generated method stub
-		if(index>size||index<0){
-			System.out.println("��ѯ������Χ��");
-			return null;
-		}
-		elementData[index]=element;
-		return null;
-	}
-	@Override
-	public int indexOf(Object o) {
-		// TODO Auto-generated method stub
-		if(o==null){
-			for(int i=0;i<elementData.length;i++){
-				if(elementData[i]==null){
-					return i;
-				}
-			}
-		}else{
-			for(int i=0;i<elementData.length;i++){
-				if(o.equals(elementData[i])){
-					return i;
-				}
-			}
-		}
-	
-		return 0;
-	}
-	@Override
-	public int lastIndexOf(Object o) {
-		// TODO Auto-generated method stub
-		int Storage=0;
-		boolean temp=false;
-		for(int i=0;i<size;i++){
-			if(o.equals(elementData[i])){
-				Storage=i;
-				temp=true;
-			}
-		}
-		if(temp){
-			return Storage;
-		}
-		return -1;
-	}
-	@Override
-	public ListIterator listIterator() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	@Override
-	public ListIterator listIterator(int index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	@Override
-	public List subList(int fromIndex, int toIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	private void rangecheck(int index){
-		if (index < 0 || index >= this.size)
-            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-	}
-	private String outOfBoundsMsg(int index) {
-            return "Index: "+index+", Size: "+this.size;
-	}
-	private void fastremove(int index){
-		int numMoved=size-index-1;
-		if(numMoved>0){
-			System.arraycopy(elementData, index+1, elementData, index, numMoved);
-		}
-		elementData[--size]=null;
-	}
-	
-}
diff --git a/group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java b/group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..8d5a83d85d
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,190 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] o){
+		
+		int length=o.length;
+		int half=length/2;
+		if(length==0||length==1){
+			return;
+		}
+		for(int i=0;i<half;i++){
+			int temp=o[i];
+			o[i]=o[length-i-1];
+			o[length-i-1]=temp;
+		}
+		for(int q=0;q<length;q++){
+			System.out.print(o[q]+" ");
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   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[] o){
+		int length=o.length;
+		int count=0;
+		for(int i=0;i<length;i++){
+			if(o[i]!=0){
+				count++;
+			}
+		} 
+		int[] newArray=new int[count];
+		for(int i=0;i<length;i++){
+			if(o[i]!=0){
+				newArray[i]=o[i];
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int length1=array1.length;
+		int length2=array2.length;
+		int[] merge=new int[length1+length2];
+		int index1=0;
+		int index2=0;
+		int index3=0;
+		if(index1<length1&&index2<length2){
+			if(array1[index1]<array2[index2]){
+				merge[index3++]=array1[index1++];
+			}else{
+				merge[index3++]=array2[index2++];
+			}
+		}
+		while(index1<length1){
+			merge[index3++]=array1[index1++];
+		}
+		while(index2<length1){
+			merge[index3++]=array2[index2++];
+		}
+		
+		return  merge;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(size==0){
+			return oldArray;
+		}
+		int length=oldArray.length;
+		if(length==0){
+			int[] temp=new int[size];
+			for(int i=0;i<size;i++){
+				temp[i]=0;
+			}
+			return temp;
+		}
+		int num=length+size;
+		int[] grow=new int[num];
+		for(int i=0;i<size;i++){
+			grow[i]=oldArray[i];
+		}
+		for(int i=length;i<num;i++){
+			grow[i]=0;
+		}
+		return grow;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max==0||max==1){
+			return null;
+		}
+		int[] num=new int[max];
+		for(int i=2;i<max;i++){
+			for(int b=0;b<=(i/2);b++){
+				int a=0;
+				if(i%b==0){
+					a=a+b;
+				}
+				if(i==a){
+					num[i-2]=i;
+				}
+			}
+		}
+		return num;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		int length=array.length;
+		String q="";
+		for(int i=0;i<length;i++){
+			if(i==length-1){
+				q=q+array[i];
+			}else{
+				q=q+array[i]+seperator;
+			}
+		}
+		return null;
+	}
+	
+	public static void main(String args[]){
+		int q=5/2;
+		int w=7/2;
+		System.out.println(w);
+	}
+
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/LoginAction.java b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/Struts.java b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..1e3827245c
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,117 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.io.File;
+import java.lang.reflect.Method;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.junit.runners.Parameterized.Parameter;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+    	try{
+    		File f=new File("src\\com\\coderising\\litestruts\\struts.xml");//找到xml文件
+        	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//得到dom解析器工厂实例
+        	DocumentBuilder builder =factory.newDocumentBuilder();//从工厂中得到DOM解析器
+        	Document doc=builder.parse(f);//解析文件得到docunment
+        	Element root=doc.getDocumentElement();//得到xml文档的根节点
+        	NodeList books=root.getChildNodes();//得到每一个节点
+        	if(books!=null){//如果不为空节点
+        		for(int i=0;i<books.getLength();i++){
+        			Node book=books.item(i);//获取此节点
+        			String q=book.getNodeValue();
+        			if(book.getNodeType()==Node.ELEMENT_NODE){//如果节点的属性值为<??> 则
+        				String name=book.getAttributes().getNamedItem("name").getNodeValue();//获取<??>里的 属性值
+        				String classname=book.getAttributes().getNamedItem("class").getNodeValue();
+        				if(actionName.equals(name)){//如果传进来的值等于 属性name的值
+        					Class<?> localclass=Class.forName(classname);//根据class属性的值创建class
+        					Object object =localclass.newInstance();//创建class实例
+        					for(Entry<String,String> entry :parameters.entrySet()){//循环遍历传进来的参数
+        						String methodname=new StringBuffer("set").append(entry.getKey().substring(0,1).toUpperCase()).append(entry.getKey().substring(1)).toString();//根据参数来生成相应的set函数
+        						Method method=localclass.getMethod(methodname,entry.getKey().getClass());
+        						method.invoke(object, entry.getValue());//执行函数
+        					}
+        					Method methods=localclass.getMethod("execute");
+        					String returnvalue=(String)methods.invoke(object);
+        					Map<String,String> map=new HashMap<String,String>();
+        					String namepara=(String) getter(object,"name");
+        					String passwordpara=(String)getter(object,"password");
+        					String message=(String)getter(object,"message");
+        					map.put("name",namepara);
+        					map.put("password", passwordpara);
+        					map.put("message",message);
+        					View view= new View();
+        					view.setParameters(map);
+        					String jsp = null;
+        					if(returnvalue.equals(" ")){
+        						
+        					}
+        					NodeList nl = doc.getElementsByTagName("result");
+        					for(int w=0;w<nl.getLength();w++){
+        						if(returnvalue.equals(doc.getElementsByTagName("result").item(w).getAttributes().getNamedItem("name").getNodeValue()))
+        						{
+        							jsp=doc.getElementsByTagName("result").item(w).getFirstChild().getNodeValue();
+        							}
+        						}
+        					System.out.println(jsp);
+        					view.setJsp(jsp);
+        					return view;
+        				}
+        			}
+        		}
+        	}
+    	}catch(Exception e){
+    		e.printStackTrace();
+    	}
+    
+    	
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+    public static Object getter(Object object,String toGet){
+    	Method target=null;
+    	Object result=null;
+    	try{
+    		target=object.getClass().getMethod("get"+upperFirst(toGet), null);
+    		result=target.invoke(object);
+    		return result;
+    	}catch(Exception e){
+    		e.printStackTrace();
+    	}
+		return result;
+    }
+    public static String upperFirst(String toUpper){
+    	return toUpper.substring(0,1).toUpperCase()+toUpper.substring(1);
+    }
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..d60b234c2b
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<struts>
+
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+
+        <result name="success">/jsp/homepage.jsp</result>
+
+        <result name="fail">/jsp/showLogin.jsp</result>
+
+    </action>
+
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+
+    	<result name="success">/jsp/welcome.jsp</result>
+
+    	<result name="error">/jsp/error.jsp</result>
+
+    </action>
+
+</struts>
\ No newline at end of file
diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java b/group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..1f185736f9
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java b/group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group20/423184723/src/com/coding/basic/Iterator.java b/group15/1501_2535894075/2017code/src/com/coding/basic/Iterator.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/Iterator.java
rename to group15/1501_2535894075/2017code/src/com/coding/basic/Iterator.java
diff --git a/group20/423184723/src/com/coding/basic/LinkedList.java b/group15/1501_2535894075/2017code/src/com/coding/basic/LinkedList.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/LinkedList.java
rename to group15/1501_2535894075/2017code/src/com/coding/basic/LinkedList.java
diff --git a/group20/423184723/src/com/coding/basic/List.java b/group15/1501_2535894075/2017code/src/com/coding/basic/List.java
similarity index 100%
rename from group20/423184723/src/com/coding/basic/List.java
rename to group15/1501_2535894075/2017code/src/com/coding/basic/List.java
diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java b/group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..36e516e266
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java
@@ -0,0 +1,19 @@
+package com.coding.basic;
+
+public class Queue {
+	
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java b/group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..a5a04de76d
--- /dev/null
+++ b/group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java
@@ -0,0 +1,22 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group15/1501_2535894075/2017code/src/linkedlist.java b/group15/1501_2535894075/2017code/src/linkedlist.java
deleted file mode 100644
index 04a99762e5..0000000000
--- a/group15/1501_2535894075/2017code/src/linkedlist.java
+++ /dev/null
@@ -1,194 +0,0 @@
-package firstweek;
-
-
-import java.util.NoSuchElementException;
-
-public class linkedlist<E> {
-	private int size=0;
-	
-	private node<E> first;
-	
-	private node<E> next;
-	
-	private node<E> last;
-	
-	public linkedlist(){
-		
-	}
-	
-	private void linkFirst(E e){
-		final node<E> f=first;
-		final node<E> newnode=new node(null,e,f);
-		first=newnode;
-		if(f==null){
-			last=f;
-		}else{
-			f.pre=newnode;
-		}
-		size++;
-	}
-	
-	void linkLast(E e){
-		final node<E> l=last;
-		final node<E> newnode=new node(l,e,null);
-		last=newnode;
-		if(last==null){
-			last=l;
-		}else{
-			l.next=newnode;
-		}
-	}
-	
-	void linkbefore(E e,node<E> nodes ){
-		final node<E> pre=nodes.pre;
-		final node<E> newnode=new node<>(pre,e,nodes);
-		nodes.pre=newnode;
-		if(pre==null){
-			first=newnode;
-		}else{
-			pre.next=newnode;
-		}
-		size++;
-	}
-	
-	 private E unlinkFirst(node<E> f){
-		 //ɾ����һ���ǿսڵ� ȷ��fΪ��һ���ڵ㲢�ǿ�
-		final E item=f.item;
-		final node<E> next=f.next;
-		f.item=null;
-		f.next=null;//������Ϊ��gc������
-		first=next;
-		if(next==null){
-			last=null;
-		}else{
-			next.pre=null;
-		}
-		size--;
-		return item;
-	}
-	 private E unlinkLast(node<E> l){
-		 //ɾ�����һ���ǿսڵ� ȷ��lΪ���ڵ��ҷǿ�
-		 final E item=l.item;
-		 final node<E> pre=l.pre;
-		 l.item=null;
-		 l.pre=null;
-		 last=pre;
-		 if(pre==null){
-			 first=null;
-		 }else{
-			 pre.next=null;
-		 }
-		 size--;
-		 return item;
-	 }
-	 
-	 E unlinekd(node<E> e){
-		final node<E> pre=e.pre;
-		final node<E> next=e.next;
-		if(size==0){
-			System.out.println("����Ϊ�� ����ɾ��");
-			return  e.item;
-		}
-		if(e==last){
-			if(size==1){
-				last=null;
-				first=null;
-				size--;
-				return e.item;
-			}
-			last=pre;
-			pre.next=null;
-			size--;
-			return e.item;
-		}
-		if(e==first){
-			if(size==1){
-				first=null;
-				last=null;
-				size--;
-				return e.item;
-			}
-			size--;
-			first=next;
-			next.pre=null;
-			return e.item;
-		}
-		pre.next=next;
-		next.pre=pre;
-		size--;
-		return e.item;
-	 }
-	 
-	 public E getFirst(){
-		 final node<E> f=first;
-		 if(f==null){
-			throw new NoSuchElementException();
-		 }
-		 return f.item;
-	 }
-	 
-	 public E getLast(){
-		 final node<E> l=last;
-		 if(l==null){
-			 throw new NoSuchElementException();
-		 }
-		 return l.item;
-	 }
-	 public E removeFirst(){
-		 final node<E> f=first;
-		 if(f==null){
-			 throw new NoSuchElementException();
-		 }
-		 return unlinkFirst(f);
-	 }
-	 public E removeLast(){
-		 final node<E> l=last;
-		 if(l==null){
-			 throw new NoSuchElementException();
-		 }
-		 return unlinkLast(l);
-	 }
-	 public void addLast(E e){
-		 linkLast(e);
-	 }
-	 public void addFirst(E e){
-		 linkFirst(e);
-	 }
-	 public int size(){
-		 return size;
-	 }
-	 public boolean add(E e){
-		 linkLast(e);
-		 return true;
-	 }
-	 public int indexof(Object o){
-		 int index=0;
-		 if(o==null){
-			 for(node<E> x=first;x!=null;x=x.next){
-				 if(x.item==null){
-					 return index;
-				 }
-				 index++;
-			 }
-		 }else{
-			 for(node<E> x=first;x!=null;x=x.next){
-				 if(o.equals(x.item)){
-					 return index;
-				 }
-				 index++;
-			 }
-		 }
-		 return -1;
-	 }
-}
-
-class node<E>{
-	E item;
-	node<E> pre;
-	node<E> next;
-	node(node<E> pre,E item,node<E> next){
-		this.pre=pre;
-		this.next=next;
-		this.item=item;
-	}
-}
diff --git a/group15/1501_2535894075/2017code/src/queue.java b/group15/1501_2535894075/2017code/src/queue.java
deleted file mode 100644
index 8a9646a2ea..0000000000
--- a/group15/1501_2535894075/2017code/src/queue.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package firstweek;
-import java.util.AbstractList;
-import java.util.Iterator;
-import java.util.List;
-
-public class queue<E> extends AbstractList<E> implements List<E> ,java.io.Serializable {
-
-	private static final long serialVersionUID = 6203363761107460505L;
-	
-	// ָ���ͷ
-	private transient Entry<E> front;
-	
-	private transient int size ;
-	// ָ���β
-	private transient Entry<E> rear;
-	
-	public Iterator<E> singleListIterator() {
-		return new QueueIterator();
-	}
-
-	public queue() {
-		this.front = this.rear = null;
-	}
-	
-	@Override
-	public boolean add(E e) {
-		Entry<E> newData = new Entry<E>(e, null);
-		if (this.rear == null) {
-			this.rear = newData;
-			this.front = this.rear;
-		} else {
-			Entry<E> preElement = this.front;
-			while (preElement.next != null) {
-				preElement = preElement.next;
-			}
-			preElement.next = newData;
-		}
-		size ++;
-		return true;
-	}
-	
-	/**
-	 * ��β����Ԫ��
-	 * @param e
-	 * @return
-	 */
-	public boolean append(E e) {
-		return add(e);
-	}
-	
-	/**
-	 * ȡ��ͷ����
-	 */
-	@Override
-	public E get(int index) {
-		return this.front.element;
-	}
-	
-	public E getFrist() {
-		return get(0);
-	}
-	
-	/**
-	 * ������
-	 * @return
-	 */
-	public E delete() {
-		E result = null;
-		Entry<E> entry = this.front;
-		if (entry != null) {
-			result = entry.element;
-			this.front = entry.next;
-			entry = null;
-		}
-		size --;
-		return result;
-	}
-	
-	/**
-	 * �ӳ���
-	 */
-	@Override
-	public int size() {
-		return size;
-	}
-
-	private static class Entry<E> {
-		E element;
-		Entry<E> next;
-		public Entry(E element, Entry<E> next) {
-			this.element = element;
-			this.next = next;
-		}
-	}
-	
-	private class QueueIterator implements Iterator<E> {
-		private Entry<E> itFront = front;
-		@Override
-		public boolean hasNext() {
-			return itFront != null;
-		}
-	
-		@Override
-		public E next() {
-			E result = itFront.element ;
-			itFront = itFront.next;
-			return result;
-		}
-	
-		@Override
-		public void remove() {
-			throw new UnsupportedOperationException("can not remove");
-		}
-	}
-}
\ No newline at end of file
diff --git a/group15/1501_2535894075/2017code/src/stack.java b/group15/1501_2535894075/2017code/src/stack.java
deleted file mode 100644
index 64cf55168b..0000000000
--- a/group15/1501_2535894075/2017code/src/stack.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package firstweek;
-
-import java.util.Arrays;
-
-public class stack {
-    //Define capacity constant:CAPACITY
-    private static final int CAPACITY = 1024;
-    //Define capacity
-    private static int capacity;
-    //Define the top position of stack 
-    //top = -1 meaning that the stack empty
-    private static int top = -1;
-    //Basic Object class array
-    Object[] array;
-    //Initialize the capacity of stack
-    public stack() {
-        this.capacity = CAPACITY;
-        array = new Object[capacity];
-    }
-
-    //Get the size of stack
-    public int getSize(){
-        if(isEmpty()){
-            return 0;
-        }else{
-            return top + 1;
-        }
-    }
-
-    //Get whether stack is empty
-    public boolean isEmpty(){
-        return (top < 0);
-    }
-
-    //Get the top element of stack
-    public Object top() {
-
-        if(isEmpty()){
-            System.out.println("Stack is empty");
-        }
-        return array[top];
-
-    }
-
-    //Push element to stack
-    public void push(Object element) throws Exception{
-           if(getSize()== CAPACITY){
-               throw new Exception("Stack is full");
-           }
-           array[++ top] = element;
-    }
-
-    //Pop element from stack
-    public Object pop() {
-        if(isEmpty()){
-            System.out.println("Stack is empty");
-        }
-        return array[top --];
-    }
-
-
-    public String getAllElements() {
-        String[] arr = new String[top + 1];
-        if(!isEmpty()){
-            for(int i = 0;i < getSize();i ++){
-                arr[i] = (String)array[i];
-            }
-        }
-        return Arrays.toString(arr);
-    }
-}
diff --git a/group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java b/group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..de36e61726
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,283 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        int[] a = new int[origin.length];
+        for (int i = 0; i < origin.length; i++) {
+            a[i] = origin[origin.length - 1 - i];
+        }
+        for (int i = 0; i < a.length; i++) {
+            System.out.print(a[i]);
+
+        }
+
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        int count = 0;
+        int index = 0;
+        //int[] brige = new int[oldArray.length];
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+
+                count++;
+            }
+        }
+        int[] result = new int[count];
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0) {
+                result[index++] = oldArray[i];
+            }
+
+
+        }
+        return result;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        int alength = array1.length;
+        int blength = array2.length;
+        int[] newint = new int[alength + blength];
+        for (int i = 0; i < alength; i++) {
+            newint[i] = array1[i];
+        }
+        int index = alength;
+        //有相同项为true，没有为false
+        boolean flag = false;
+        for (int c = 0; c < blength; c++) {
+            for (int j = 0; j < alength; j++) {
+                if (array1[j] == array2[c]) {
+
+                    flag = true;
+                    break;
+                }
+
+            }
+            if (flag) {
+
+                flag = false;
+            } else {
+                newint[index] = array2[c];
+                index++;
+            }
+
+        }
+        // 去零
+        newint = removeZero(newint);
+        //排序
+
+        quickSort(newint);
+        return newint;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newarry = new int[oldArray.length + size];
+        for (int i = 0; i < oldArray.length; i++) {
+            newarry[i] = oldArray[i];
+        }
+        return newarry;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        int count = 0;
+        for (int i = 0; ; i++) {
+            if (createfibonacci(i + 1) < max) {
+                count++;
+            } else {
+                break;
+
+            }
+        }
+        int[] arry = new int[count];
+        for (int a = 0; a < count; a++) {
+            arry[a] = createfibonacci(a + 1);
+        }
+        return arry;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        int count = 0;
+        for (int i = 0; i < max; i++) {
+            if (isprime(i)) {
+                count++;
+            }
+        }
+        int[] arry = new int[count];
+        int sign = 0;
+        for (int i = 0; i < max; i++) {
+            if (isprime(i)) {
+                arry[sign] = i;
+                sign++;
+            }
+        }
+        return arry;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int count = 0;
+        for (int i = 0; i < max; i++) {
+            if (isperfectnmber(i)) {
+                count++;
+            }
+        }
+        int[] arry = new int[count];
+        int sign = 0;
+        for (int i = 0; i < max; i++) {
+            if (isperfectnmber(i)) {
+                arry[sign] = i;
+                sign++;
+            }
+        }
+        return arry;
+
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        String stringBuilder=new String(String.valueOf(array[0]));
+        for (int i = 1; i <array.length ; i++) {
+                stringBuilder = stringBuilder + seperator + new String(String.valueOf(array[i]));
+
+        }
+        return stringBuilder;
+    }
+
+    //快排
+    public static void quickSort(int[] arr) {
+        qsort(arr, 0, arr.length - 1);
+    }
+
+    private static void qsort(int[] arr, int low, int high) {
+        if (low < high) {
+            int pivot = partition(arr, low, high);        //将数组分为两部分
+            qsort(arr, low, pivot - 1);                   //递归排序左子数组
+            qsort(arr, pivot + 1, high);                  //递归排序右子数组
+        }
+    }
+
+    private static int partition(int[] arr, int low, int high) {
+        int pivot = arr[low];     //枢轴记录
+        while (low < high) {
+            while (low < high && arr[high] >= pivot) --high;
+            arr[low] = arr[high];             //交换比枢轴小的记录到左端
+            while (low < high && arr[low] <= pivot) ++low;
+            arr[high] = arr[low];           //交换比枢轴小的记录到右端
+        }
+        //扫描完成，枢轴到位
+        arr[low] = pivot;
+        //返回的是枢轴的位置
+        return low;
+    }
+
+    //生成斐波那契数列
+    public static int createfibonacci(int n) {
+        if (n <= 2) {
+            return 1;
+        } else {
+            return createfibonacci(n - 1) + createfibonacci(n - 2);
+        }
+    }
+
+    //判断是否是素数
+    public static boolean isprime(int a) {
+        boolean flag = true;
+        if (a < 2) {
+            return false;
+        } else {
+            for (int i = 2; i <= Math.sqrt(a); i++) {
+                if (a % i == 0) {
+                    flag = false;
+                    break;
+                }
+            }
+        }
+        return flag;
+    }
+
+    //判断是否是完数
+    public static boolean isperfectnmber(int a) {
+        boolean flag = true;
+        int temp = 0;// 定义因子之和变量
+
+        for (int n = 1; n < a / 2 + 1; n++) {
+            if (a % n == 0) {
+                temp += n;// 能被整除的除数则被加到temp中
+            }
+        }
+        if (temp == a) {// 如果因子之和与原数相等的话，说明是完数
+            //System.out.print(a + " ");// 输出完数
+            flag = true;
+        } else {
+            flag = false;
+        }
+        return flag;
+    }
+
+}
diff --git a/group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java b/group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..17f810bc0f
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,163 @@
+package com.coderising.array;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/** 
+* ArrayUtil Tester. 
+* 
+* @author <Authors name> 
+* @since <pre>���� 27, 2017</pre> 
+* @version 1.0 
+*/ 
+public class ArrayUtilTest { 
+
+@Before
+public void before() throws Exception {
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[] a = new int[10];
+    a[0] = 1;
+    a[1] = 2;
+    a[2] = 3;
+    a[3] = 4;
+    a[4] = 5;
+    a[5] = 6;
+} 
+
+@After
+public void after() throws Exception { 
+} 
+
+/** 
+* 
+* Method: reverseArray(int[] origin) 
+* 
+*/ 
+@Test
+public void testReverseArray() throws Exception { 
+//TODO: Test goes here...
+    int[] a = new int[10];
+    a[0] = 1;
+    a[1] = 2;
+    a[2] = 3;
+    a[3] = 4;
+    a[4] = 5;
+    a[5] = 6;
+    ArrayUtil arrayUtil = new ArrayUtil();
+    for (int i = 0; i <a.length ; i++) {
+        System.out.print(a[i]);
+    }
+    System.out.println();
+    //System.out.println(a.);
+    arrayUtil.reverseArray(a);
+} 
+
+/** 
+* 
+* Method: removeZero(int[] oldArray) 
+* 
+*/ 
+@Test
+public void testRemoveZero() throws Exception { 
+//TODO: Test goes here...
+    int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[] a = arrayUtil.removeZero(oldArr);
+    for (int i = 0; i <a.length ; i++) {
+        System.out.print(a[i]);
+    }
+} 
+
+/** 
+* 
+* Method: merge(int[] array1, int[] array2) 
+* 
+*/ 
+@Test
+public void testMerge() throws Exception { 
+//TODO: Test goes here...
+    int[]a1={3,5,7,8};
+
+
+    int[] a2 = {4, 5, 6, 7};
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[]c=arrayUtil.merge(a1, a2);
+    for (int i = 0; i <c.length ; i++) {
+        System.out.print(c[i]);
+    }
+} 
+
+/** 
+* 
+* Method: grow(int [] oldArray, int size) 
+* 
+*/ 
+@Test
+public void testGrow() throws Exception { 
+//TODO: Test goes here...
+    int[] oldArray = {2, 3, 6};
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[] arry=arrayUtil.grow(oldArray, 3);
+    for (int i = 0; i <arry.length ; i++) {
+        System.out.print(arry[i]);
+
+    }
+} 
+
+/** 
+* 
+* Method: fibonacci(int max) 
+* 
+*/ 
+@Test
+public void testFibonacci() throws Exception { 
+//TODO: Test goes here...
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[] he=arrayUtil.fibonacci(13);
+    for (int i = 0; i <he.length ; i++) {
+        System.out.print(he[i]);
+    }
+} 
+
+/** 
+* 
+* Method: getPrimes(int max) 
+* 
+*/ 
+@Test
+public void testGetPrimes() throws Exception { 
+//TODO: Test goes here...
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[] he=arrayUtil.getPrimes(13);
+    for (int i = 0; i <he.length ; i++) {
+        System.out.print(he[i]);
+    }
+} 
+
+/** 
+* 
+* Method: getPerfectNumbers(int max) 
+* 
+*/ 
+@Test
+public void testGetPerfectNumbers() throws Exception { 
+//TODO: Test goes here... 
+} 
+
+/** 
+* 
+* Method: join(int[] array, String seperator) 
+* 
+*/ 
+@Test
+public void testJoin() throws Exception { 
+//TODO: Test goes here...
+    ArrayUtil arrayUtil = new ArrayUtil();
+    int[] array = {3, 8, 9,8,5};
+    String seperator = "-";
+    System.out.println(arrayUtil.join(array, seperator));
+} 
+
+
+} 
diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/LoginAction.java b/group15/1502_1617273078/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/Struts.java b/group15/1502_1617273078/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..1db958632c
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,108 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.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<String,String> parameters) throws DocumentException {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+        HashMap<String, String> Parameters = new HashMap<>();
+        View view = new View();
+        SAXReader reader = new SAXReader();
+        Document document = reader.read(new File("./src/com/coderising/litestruts/struts.xml"));
+        Element root = document.getRootElement();
+        Element thiselement = null;
+        List<Element> list = root.elements();
+        String classpath = null;
+        for (Element element : list) {
+            //System.out.println(element.attribute("name").getValue());
+            if (element.attribute("name").getValue().equals(actionName)) {
+                thiselement = element;
+                classpath = element.attribute("class").getValue();
+                break;
+            }
+        }
+        Class ojbect;
+
+        try {
+            ojbect=Class.forName(classpath);
+            Object acionclass = ojbect.newInstance();
+            for (String string : parameters.keySet()) {
+                Method method = ojbect.getMethod("set"+upperCase(string),String.class);
+                method.invoke(acionclass,parameters.get(string));
+            }
+            Method execute = ojbect.getMethod("execute");
+            String result= (String) execute.invoke(acionclass);
+            //判断返回的jsp
+            List<Element> elementresult = thiselement.elements();
+            for (Element element:elementresult){
+                if (element.attribute("name").getValue().equals(result)) {
+                    view.setJsp(element.getStringValue());
+                    break;
+                }
+            }
+            // 获得getter方法,并设置Parameters
+            Method[] methods = ojbect.getDeclaredMethods();
+
+            for (Method method : methods) {
+                if (method.getName().substring(0, 3).equals("get")) {
+                    String attribute= (String) method.invoke(acionclass);
+                    Parameters.put(method.getName().substring(3).toLowerCase(), attribute);
+                }
+            }
+            view.setParameters(Parameters);
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+
+
+        return view;
+    }
+    //首字母大写
+    public static String upperCase(String str) {
+        char[] ch = str.toCharArray();
+        if (ch[0] >= 'a' && ch[0] <= 'z') {
+            ch[0] = (char) (ch[0] - 32);
+        }
+        return new String(ch);
+    }
+
+}
diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java b/group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..05b7a00aa8
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,44 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws DocumentException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws DocumentException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/View.java b/group15/1502_1617273078/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/struts.xml b/group15/1502_1617273078/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group15/1502_1617273078/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1503_1311822904/week2/src/ArrayUtil.java b/group15/1503_1311822904/week2/src/ArrayUtil.java
new file mode 100644
index 0000000000..5bd2784183
--- /dev/null
+++ b/group15/1503_1311822904/week2/src/ArrayUtil.java
@@ -0,0 +1,216 @@
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		int length=origin.length;
+		int[] reverse=new int[length];
+		int i=0;
+		for(;i<length;i++){
+			reverse[i]=origin[length-i-1];
+		}
+		for(--i;i>-1;i--){
+			origin[i]=reverse[i];
+		}
+
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		int length=oldArray.length;
+		int[] index=new int[length];
+		int i=0;
+		int j=0;
+		for(;i<length;i++){
+			if(oldArray[i]!=0)
+			index[j++]=i;
+		}
+		int[] b=new int[j];
+		for(i=0;i<j;i++){
+			b[i]=oldArray[index[i]];
+		}
+		return b;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int array1Length=array1.length;
+		int array2Length=array2.length;
+		int length=array1Length+array2Length;
+		int[] arr=new int[length];
+		for(int i=0;i<array1Length;i++)
+			arr[i]=array1[i];
+		for(int i=0;i<array2Length;i++)
+			arr[array1Length+i]=array2[i];
+
+//排序
+		for(int i = 1;i <length ; i ++){
+			if(arr[i] < arr[i-1]){
+				int temp = arr[i];
+				int j;
+				for(j = i-1; j >= 0 && arr[j] > temp; j --){
+					arr[j+1] = arr[j];
+				}
+				arr[j+1] = temp;
+			}
+		}
+		//去重合
+		int j=0;
+		for(int i = 1;i <length ; i ++){
+			if(arr[i]!=arr[j]){
+				arr[++j]=arr[i];
+			}
+		}
+		//缩小数组尺寸 后面不要的去掉
+		int[] c=new int[j+1];
+		for(int i = 0;i <j+1 ; i ++){
+			c[i]=arr[i];
+
+		}
+		return c;
+	}
+	/**
+	 * 把一个已经存满数据的数组 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 oldLength=oldArray.length;
+		int newLength=oldLength+size;
+		int[] newArray=new int[newLength];
+		System.arraycopy(oldArray,0,newArray,0,oldLength);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+
+		if(max<2){
+			int[] a={};
+			return a;
+		}
+		int[] a={1,1};
+		int last=1;
+		for(int length = 2;last<max; ){
+			a=ArrayUtil.grow(a,1);
+			length ++;
+			a[length-1]=a[length-2]+a[length-3];
+			//预测下一个
+			last=a[length-1]+a[length-2];
+		}
+		return a;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) throws Exception {
+		if(max<2)
+			throw new Exception("必须大于2");
+		int length=1;
+		int[] a={2};
+		for(int numb=3;numb<=max;numb++){
+			if(isPrimeNumber(numb)){
+				a=ArrayUtil.grow(a,1);
+				length++;
+				a[length-1]=numb;
+			}
+
+		}
+		return a;
+	}
+
+	private static boolean isPrimeNumber(int numb) {
+
+		for(int i=2;i<numb;i++){
+			if(numb%i==0)
+				return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) throws Exception {
+		if(max<1)
+			throw new Exception("必须大于0");
+		int length=1;
+		int[] a={1};
+		for(int numb=1;numb<=max;numb++){
+			if(isPerfectNumber (numb)){
+				a=ArrayUtil.grow(a,1);
+				length++;
+				a[length-1]=numb;
+			}
+
+		}
+		return a;
+	}
+
+	private static boolean isPerfectNumber(int numb) {
+		int a=0;
+		for(int i=1;i<numb;i++){
+			if(numb%i==0)
+				a+=i;
+		}
+		if (a==numb)
+			return true;
+		return false;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) throws Exception {
+		if(array==null)
+			throw new Exception("请给数组");
+		String s=array[0]+"";
+		for (int i=1;i<array.length;i++){
+			s+=seperator+array[i];
+		}
+		return s;
+	}
+	
+
+}
diff --git a/group15/1503_1311822904/week2/src/Struts.java b/group15/1503_1311822904/week2/src/Struts.java
new file mode 100644
index 0000000000..d545d0f1c6
--- /dev/null
+++ b/group15/1503_1311822904/week2/src/Struts.java
@@ -0,0 +1,112 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        SAXReader reader = new SAXReader();
+        View view=new View();
+        try {
+            File f=   new File("src/struts.xml");//E:\mygit\coding2017\liuxin\src\com\coderising\litestruts\struts.xml
+            Document e = reader.read(f);
+            //得到根节点
+            Element struts = e.getRootElement();
+            Iterator it = struts.elementIterator();
+
+            while(it.hasNext()) {//action遍历
+                Element action = (Element)it.next();
+                // 找到 name=actionName 的action
+                List<Attribute> actionAtr = action.attributes();
+                if(!actionAtr.get(0).getValue().equals(actionName))
+                  continue;
+                String className= actionAtr.get(1).getValue();
+                //得到actionName 对应的class
+                Class aClass=Class.forName(className);
+                Object o=aClass.newInstance();
+                Field field;
+                for(Map.Entry<String, String> entry:parameters.entrySet()){
+                   field = aClass.getDeclaredField( entry.getKey());
+                    field.setAccessible(true);
+                    field.set(o, entry.getValue());
+                }
+
+                Method m = aClass.getMethod("execute");
+                String resultString=(String)m.invoke(o);
+                Method m2 = aClass.getMethod("getMessage");
+                String message=(String)m2.invoke(o);
+
+                Map<String,String> map=new HashMap<>();
+
+                map.put("message",message);
+                view.setParameters(map);
+                it=action.elementIterator();
+                //遍历 <result>
+                while (it.hasNext()){
+                    Element result = (Element)it.next();
+                    String s= result.attribute(0).getValue();
+                    if(resultString.equals(s)){
+                        view.setJsp(result.getStringValue());
+                        return view;
+                    }
+
+                }
+
+                //Element results = (Element)it.next();
+                //List<Attribute> results = action.attributes();
+
+            }
+        } catch (DocumentException var9) {
+            var9.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/group15/1503_1311822904/week2/test/ArrayUtilTest.java b/group15/1503_1311822904/week2/test/ArrayUtilTest.java
new file mode 100644
index 0000000000..8ba10c75f7
--- /dev/null
+++ b/group15/1503_1311822904/week2/test/ArrayUtilTest.java
@@ -0,0 +1,114 @@
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+* ArrayUtil Tester. 
+* 
+* @author <Authors name> 
+* @since <pre>���� 1, 2017</pre> 
+* @version 1.0 
+*/ 
+public class ArrayUtilTest {
+    int[] a={0,1,2,3,4,5,6,7,8,9};
+@Before
+public void before() throws Exception { 
+} 
+
+@After
+public void after() throws Exception { 
+} 
+
+/** 
+* 
+* Method: reverseArray(int[] origin) 
+* 
+*/ 
+@Test
+public void testReverseArray() throws Exception {
+
+   ArrayUtil.reverseArray(a);
+    System.out.println(Arrays.toString(a));
+
+} 
+
+/** 
+* 
+* Method: removeZero(int[] oldArray) 
+* 
+*/ 
+@Test
+public void testRemoveZero() throws Exception {
+    int[] a={0,1,0,3,4,0,0,7,8,0,10};
+    System.out.println(Arrays.toString(ArrayUtil.removeZero(a)));
+} 
+
+/** 
+* 
+* Method: merge(int[] array1, int[] array2) 
+* 
+*/ 
+@Test
+public void testMerge() throws Exception {
+    int[] a={0,1,0,3,4,-90,0,0,7,8,0,10};
+    int[] b={-90,0,10};
+    System.out.println(Arrays.toString(ArrayUtil.merge(a,b)));
+
+//TODO: Test goes here... 
+} 
+
+/** 
+* 
+* Method: grow(int [] oldArray, int size) 
+* 
+*/ 
+@Test
+public void testGrow() throws Exception {
+    int[] b= ArrayUtil.grow(a,4);
+    System.out.println(Arrays.toString(b));
+} 
+
+/** 
+* 
+* Method: fibonacci(int max) 
+* 
+*/ 
+@Test
+public void testFibonacci() throws Exception {
+    System.out.println(Arrays.toString(ArrayUtil.fibonacci(2)));
+} 
+
+/** 
+* 
+* Method: getPrimes(int max) 
+* 
+*/ 
+@Test
+public void testGetPrimes() throws Exception {
+    System.out.println(Arrays.toString(ArrayUtil.getPrimes(99)));
+} 
+
+/** 
+* 
+* Method: getPerfectNumbers(int max) 
+* 
+*/ 
+@Test
+public void testGetPerfectNumbers() throws Exception {
+    System.out.println(Arrays.toString(ArrayUtil.getPerfectNumbers(99)));
+} 
+
+/** 
+* 
+* Method: join(int[] array, String seperator) 
+* 
+*/ 
+@Test
+public void testJoin() throws Exception {
+    System.out.println(ArrayUtil.join(a,"@"));
+} 
+
+
+} 
diff --git a/group15/1506_1084478979/1506_1084478979/.classpath b/group15/1506_1084478979/1506_1084478979/.classpath
index fceb4801b5..373dce4005 100644
--- a/group15/1506_1084478979/1506_1084478979/.classpath
+++ b/group15/1506_1084478979/1506_1084478979/.classpath
@@ -2,5 +2,6 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..ac8e1d1ea4
--- /dev/null
+++ b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/banshee/WorkTwo=GBK
+encoding//src/banshee/WorkTwo/ArrayUtil.java=UTF-8
+encoding/<project>=UTF-8
diff --git a/group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000000..5447a64fa9
--- /dev/null
+++ b/group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RemoteSystemsTempFiles</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>
+	</natures>
+</projectDescription>
diff --git a/group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000000..5447a64fa9
--- /dev/null
+++ b/group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RemoteSystemsTempFiles</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>
+	</natures>
+</projectDescription>
diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java b/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java
index d3afe067a7..5cc79a3457 100644
--- a/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java
+++ b/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java
@@ -40,16 +40,16 @@ public int size(){
 		return -1;
 	}
 	
-	public Iterator iterator(){
-		//TODO
-		//���ᡣ����
-		return null;
-	}
+//	public Iterator iterator(){
+//		//TODO
+//		//���ᡣ����
+//		return null;
+//	}
 	
 
 	private void rangeCheck( int index) {  
         if (index >= size || index < 0){
-            throw new IndexOutOfBoundsException("ָ����index��������");
+            throw new IndexOutOfBoundsException("ָ����index��������");
         }  
     }  
 	
@@ -57,7 +57,7 @@ private void rangeCheck( int index) {
 	public void ensureCapacity(int minCapacity) {
 		int oldCapacity = elementData.length;
 		if (minCapacity > oldCapacity) {
-            //�����µ�������С��Ϊ��ǰ������1.5��
+            //�����µ�������С��Ϊ��ǰ������1.5��
             int newCapacity = (oldCapacity * 3) / 2 + 1;
             if (newCapacity < minCapacity)
                 newCapacity = minCapacity;
diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java b/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java
index f5fe5b5a31..9462e7fbae 100644
--- a/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java
+++ b/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java
@@ -2,7 +2,8 @@
 
 import java.util.NoSuchElementException;
 
-public class LinkedList implements List {
+
+public class LinkedList  {
 	
 	private Node head;
 	private Node last;
@@ -74,11 +75,11 @@ public Object removeLast(){
 		size--;
 		return e;
 	}
-	public Iterator iterator(){
-		//TODO
-		//����...
-		return null;
-	}
+//	public Iterator iterator(){
+//		//TODO
+//		//����...
+//		return null;
+//	}
 	
 	
 	private static  class Node{
@@ -119,7 +120,7 @@ private void linkBrfore(Object element , Node spNode ){
 	
     private void rangeCheck(int index) {
         if (index > size || index < 0) {
-            throw new IndexOutOfBoundsException("ָ����index��������");
+            throw new IndexOutOfBoundsException("ָ����index��������");
         }
     }
     
diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000000..5447a64fa9
--- /dev/null
+++ b/group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RemoteSystemsTempFiles</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>
+	</natures>
+</projectDescription>
diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java
new file mode 100644
index 0000000000..3bac4a642c
--- /dev/null
+++ b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java
@@ -0,0 +1,165 @@
+package banshee.WorkTwo;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int j = origin.length - 1;
+		int temp;
+		for(int i = 0; i < origin.length /2; i++,j--){
+			temp = origin[j];
+			origin[j] = origin[i];
+			origin[i] = temp;
+		}
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int[] newArr = new int[oldArray.length];
+		int j = 0;
+		for (int i = 0; i < newArr.length; i++) {
+			if (oldArray[i] != 0){
+				newArr[j] = oldArray[i];
+				j++;
+			}
+		}
+		
+		return Arrays.copyOfRange(newArr, 0, j)	;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		
+		int i = 0,j = 0, k = 0;
+		int[] array3 = new int[array1.length + array2.length];
+		
+		 while (i < array1.length && j < array2.length) {    
+	            if (array1[i] < array2[j]) {    
+	            	array3[k++] = array1[i++];
+	            } else if (array1[i] > array2[j]) {
+	            	array3[k++] = array2[j++];
+				}else {
+					array3[k++] = array1[i++];
+					j++;
+				} 
+	        }    
+	        while (i < array1.length) {    
+	            array3[k++] = array1[i++];      
+	        }    
+	        while (j < array2.length) {    
+	            array3[k++] = array2[j++];       
+	        }    
+	        return Arrays.copyOf(array3, k);    
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int newCapacity = oldArray.length + size;
+		int[] newArr = Arrays.copyOf(oldArray, newCapacity);
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		if (max == 1) {
+			return  new int[0];
+		}else{
+			list.add(1);
+			list.add(1);
+			int temp = 0, a = 1,b = 1;
+			while (a + b < max) {
+				list.add(a + b);
+				temp = a;
+				a = b;
+				b = temp + b;
+			}	
+		}
+		int[] arr = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+
+	        arr[i] = (Integer) list.get(i);
+
+	    }
+		return arr;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+        StringBuilder sb = new StringBuilder();
+        for (int element : array) {
+            sb.append(element).append(seperator);
+        }
+        sb.setLength(sb.length() - 1);
+        return sb.toString();
+	}
+	
+
+   
+
+}
diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java
new file mode 100644
index 0000000000..4b0c7cd328
--- /dev/null
+++ b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java
@@ -0,0 +1,72 @@
+package banshee.WorkTwo;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	
+	private ArrayUtil util;
+
+	@Before
+	public void setUp() throws Exception {
+		util = new ArrayUtil();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() throws Exception {
+		int[] origin1 = {7, 9 , 30, 3};
+		int[] origin2 = {7, 9, 30, 3, 4};
+		util.reverseArray(origin1);
+		util.reverseArray(origin2);
+		assertArrayEquals(new int[]{3, 30, 9,7}, origin1);
+		assertArrayEquals(new int[]{4,3, 30 , 9,7}, origin2);
+	}
+
+	@Test
+	public void testRemoveZero() throws Exception {
+        int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, util.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() throws Exception{
+        int[] arr1 = new int[]{3, 5, 7, 8};
+        int[] arr2 = new int[]{4, 5, 6, 7};
+        assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, util.merge(arr1, arr2));
+	}
+
+	@Test
+	public void testGrow() throws Exception{
+        int[] old = new int[]{2, 3, 6};
+        assertArrayEquals(util.grow(old, 3), new int[]{2, 3, 6, 0, 0, 0});
+	}
+
+	@Test
+	public void testFibonacci() throws Exception {
+		 assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, util.fibonacci(15));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testJoin() throws Exception {
+        int[] arr = new int[]{3, 8, 9};
+        assertEquals("3-8-9", util.join(arr, "-"));
+	}
+
+}
diff --git a/group15/1507_977996067/src/task2/README.md b/group15/1507_977996067/src/task2/README.md
new file mode 100644
index 0000000000..8c99b55977
--- /dev/null
+++ b/group15/1507_977996067/src/task2/README.md
@@ -0,0 +1,3 @@
+## 3.5 作业文件夹
+1. ArrayUtil
+2. struts
\ No newline at end of file
diff --git a/group15/1507_977996067/src/task2/array/ArrayUtil.java b/group15/1507_977996067/src/task2/array/ArrayUtil.java
new file mode 100644
index 0000000000..21cb4286c7
--- /dev/null
+++ b/group15/1507_977996067/src/task2/array/ArrayUtil.java
@@ -0,0 +1,215 @@
+package task2.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        int length = origin.length;
+        int[] temp = new int[length];
+        for (int i = 0; i < length; i++) {
+            temp[i] = origin[length - i - 1];
+        }
+        System.arraycopy(temp, 0, origin, 0, length);
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        int count = 0;
+        int length = oldArray.length;
+        for (int i = 0; i < length; i++) {
+            int element = oldArray[i];
+            if (element != 0) {
+                oldArray[count] = element;
+                count++;
+            }
+        }
+        return Arrays.copyOf(oldArray, count);
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        int firstPos = 0;
+        int secondPos = 0;
+        int firstLength = array1.length;
+        int secondLength = array2.length;
+        int[] tempArray = new int[firstLength + secondLength];
+        int tempArrayPos = 0;
+/*        比较两个数组第一个元素的大小,小的元素放到tempArray中且数组索引加一,然后继续比较.
+        直到有一个数组遍历完,把另外一个数组剩下的元素依次放到tempArray中*/
+        while (firstPos < firstLength && secondPos < secondLength) {
+            int firstElement = array1[firstPos];
+            int secondElement = array2[secondPos];
+            if (firstElement < secondElement) {
+                tempArray[tempArrayPos++] = array1[firstPos++];
+            } else if (firstElement > secondElement) {
+                tempArray[tempArrayPos++] = array2[secondPos++];
+            } else {
+                tempArray[tempArrayPos++] = array1[firstPos++];
+                secondPos++;
+            }
+        }
+        if (firstPos == firstLength && secondPos < secondLength) {
+            System.arraycopy(array2, secondPos, tempArray, tempArrayPos, secondLength - secondPos);
+            tempArrayPos += secondLength - secondPos;
+        } else if (secondPos == secondLength && firstPos < firstLength) {
+            System.arraycopy(array1, firstPos, tempArray, tempArrayPos, firstLength - firstPos);
+            tempArrayPos += firstLength - firstPos;
+        }
+        return Arrays.copyOf(tempArray, tempArrayPos);
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] temp = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, temp, 0, oldArray.length);
+        return temp;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        if (max == 1)
+            return new int[0];
+        int[] result = new int[max + 1];
+        result[0] = 1;
+        result[1] = 1;
+        return getFibonacci(result, 2, max);
+    }
+
+    private int[] getFibonacci(int[] arr, int index, int max) {
+        if (arr[index - 1] >= max) {
+            return Arrays.copyOf(arr, index - 1);
+        }
+        arr[index] = arr[index - 1] + arr[index - 2];
+        return getFibonacci(arr, ++index, max);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        if (max == 2)
+            return new int[]{2};
+        else if (max >= 3 && max <= 4)
+            return new int[]{2, 3};
+        else if (max > 4) {
+            int[] arr = new int[max];
+            arr[0] = 2;
+            arr[1] = 3;
+            int pos = 2;
+            for (int i = 5; i < max; i++) {
+                //去掉能被2、3整除的数:6n+2 6n+3 6n+4
+                if ((i + 1) % 6 == 0 || (i - 1) % 6 == 0) {
+                    if (isPrime(i)) {
+                        arr[pos++] = i;
+                    }
+                }
+            }
+            return Arrays.copyOf(arr, pos);
+        }
+        return null;
+    }
+
+    private boolean isPrime(int number) {
+        //去掉偶数
+        if (number % 2 == 0)
+            return false;
+        //只能被自身整除的为素数
+        for (int i = 2; i < number; i++) {
+            if (number % i == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int[] arr = new int[max];
+        int pos = 0;
+        for (int i = 4; i < max; i++) {
+            //去掉素数
+            if (!isPrime(i)) {
+                List<Integer> list = new ArrayList<>();
+                for (int j = 1; j < i; j++) {
+                    if (i % j == 0)
+                        list.add(j);
+                }
+                if (i == list.stream().reduce(0, (a, b) -> a + b))
+                    arr[pos++] = i;
+            }
+        }
+        return Arrays.copyOf(arr, pos);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param separator
+     * @return
+     */
+    public String join(int[] array, String separator) {
+        StringBuilder sb = new StringBuilder();
+        for (int element : array) {
+            sb.append(element).append(separator);
+        }
+        sb.setLength(sb.length() - 1);
+        return sb.toString();
+    }
+
+}
\ No newline at end of file
diff --git a/group15/1507_977996067/src/task2/array/ArrayUtilTest.java b/group15/1507_977996067/src/task2/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..8a38dd59ce
--- /dev/null
+++ b/group15/1507_977996067/src/task2/array/ArrayUtilTest.java
@@ -0,0 +1,75 @@
+package task2.array;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.*;
+
+public class ArrayUtilTest {
+
+    private ArrayUtil util;
+
+    @Before
+    public void pre() {
+        util = new ArrayUtil();
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] i = {7, 9, 40, 30, 3};
+        int[] ii = {7, 9, 40, 30, 3, 11};
+        util.reverseArray(i);
+        util.reverseArray(ii);
+        assertArrayEquals(new int[]{3, 30, 40, 9, 7}, i);
+        assertArrayEquals(new int[]{11, 3, 30, 40, 9, 7}, ii);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, util.removeZero(oldArr));
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] arr1 = new int[]{3, 5, 7, 8};
+        int[] arr2 = new int[]{4, 5, 6, 7};
+        assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, util.merge(arr1, arr2));
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[] old = new int[]{2, 3, 6};
+        assertArrayEquals(util.grow(old, 3), new int[]{2, 3, 6, 0, 0, 0});
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, util.fibonacci(15));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int[] primes = util.getPrimes(33);
+        assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31}, primes);
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        assertArrayEquals(new int[]{6,28,496,8128}, util.getPerfectNumbers(10000));
+    }
+
+    @Test
+    public void join() throws Exception {
+        int[] arr = new int[]{3, 8, 9};
+        assertEquals("3-8-9", util.join(arr, "-"));
+    }
+
+    private void printArray(int[] arr) {
+        Arrays.stream(arr).forEach(System.out::println);
+    }
+
+
+}
\ No newline at end of file
diff --git a/group15/1507_977996067/src/task2/litestruts/LogOutAction.java b/group15/1507_977996067/src/task2/litestruts/LogOutAction.java
new file mode 100644
index 0000000000..b62d25ecc9
--- /dev/null
+++ b/group15/1507_977996067/src/task2/litestruts/LogOutAction.java
@@ -0,0 +1,34 @@
+package task2.litestruts;
+
+public class LogOutAction {
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+        if("test".equals(name) && "1234".equals(password)){
+            this.message = "logout successful";
+            return "success";
+        }
+        this.message = "logout failed,please check your user/pwd";
+        return "error";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group15/1507_977996067/src/task2/litestruts/LoginAction.java b/group15/1507_977996067/src/task2/litestruts/LoginAction.java
new file mode 100644
index 0000000000..abde57860a
--- /dev/null
+++ b/group15/1507_977996067/src/task2/litestruts/LoginAction.java
@@ -0,0 +1,34 @@
+package task2.litestruts;
+
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+        if("test".equals(name) && "1234".equals(password)){
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group15/1507_977996067/src/task2/litestruts/Struts.java b/group15/1507_977996067/src/task2/litestruts/Struts.java
new file mode 100644
index 0000000000..c2c8a61c3a
--- /dev/null
+++ b/group15/1507_977996067/src/task2/litestruts/Struts.java
@@ -0,0 +1,80 @@
+package task2.litestruts;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+//        0. 读取配置文件struts.xml,引用Jsoup
+        Document document = null;
+        try {
+            document = Jsoup.connect("http://my.977996067.cn/2017_2/struts.xml").get();
+        } catch (IOException e) {
+            System.err.println("xml解析失败");
+        }
+//        获取所有的action标签
+        Elements actions = document != null ? document.select("action") : null;
+        if (actions == null)
+            return null;
+        for (Element actionElement : actions) {
+            String name = actionElement.attr("name");
+//            反射action
+            if (actionName.equals(name)) {
+                try {
+                    Class<?> actionClass = Class.forName(actionElement.attr("class"));
+                    Object o = actionClass.getConstructor().newInstance();
+                    parameters.forEach((k, v) -> {
+                        try {
+                            Field field = actionClass.getDeclaredField(k);
+                            field.setAccessible(true);
+                            //赋值
+                            field.set(o, v);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    });
+//                  执行execute方法,获取返回值
+                    Method method = actionClass.getMethod("execute");
+                    String returnValue = (String) method.invoke(o);
+                    View view = new View();
+                    Map map = new HashMap();
+                    Arrays.stream(actionClass.getMethods())
+                            .forEach(((Method m) -> {
+                                try {
+                                    String methodName = m.getName();
+                                    if (methodName.startsWith("get"))
+                                        map.put(methodName.substring(methodName.indexOf("get") + 3).toLowerCase(), m.invoke(o));
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                }
+                            }));
+                    view.setParameters(map);
+//                    获取返回视图名
+                    Elements children = actionElement.children().select("result");
+                    for (Element aChildren : children) {
+                        if (returnValue.equals(aChildren.attr("name"))) {
+                            view.setJsp(aChildren.text());
+                        }
+                    }
+                    System.out.println(view);
+                    return view;
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/group15/1507_977996067/src/task2/litestruts/StrutsTest.java b/group15/1507_977996067/src/task2/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..ec7d992cf2
--- /dev/null
+++ b/group15/1507_977996067/src/task2/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package task2.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
diff --git a/group15/1507_977996067/src/task2/litestruts/View.java b/group15/1507_977996067/src/task2/litestruts/View.java
new file mode 100644
index 0000000000..667068ef37
--- /dev/null
+++ b/group15/1507_977996067/src/task2/litestruts/View.java
@@ -0,0 +1,33 @@
+package task2.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "View{" + "jsp='" + jsp + '\'' +
+                ", parameters=" + parameters +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/group15/1507_977996067/src/task2/litestruts/struts.xml b/group15/1507_977996067/src/task2/litestruts/struts.xml
new file mode 100644
index 0000000000..8716d96c5a
--- /dev/null
+++ b/group15/1507_977996067/src/task2/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="task2.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="task2.litestruts.LogOutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java b/group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java
new file mode 100644
index 0000000000..85276ce4da
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java
@@ -0,0 +1,232 @@
+package com.bruce.homework0305.array;
+
+import com.bruce.homework0226.LinkedListV00;
+
+import java.util.*;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin){
+		if(origin != null && origin.length > 0) {
+            int temp;
+            for (int i = 0; i < origin.length / 2; i++) {
+                temp = origin[i];
+                origin[i] = origin[origin.length-1 - i];
+                origin[origin.length-1 - i] = temp;
+            }
+        }
+		return origin;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+        int[] result = null;
+		if(oldArray != null && oldArray.length >= 0){
+		    int index = 0;
+            LinkedList linkedList = new LinkedList();
+		    for(int i = 0;i<oldArray.length;i++){
+		        if(oldArray[i] != 0){
+		            linkedList.add(oldArray[i]);
+                    index++;
+                }
+            }
+            result = new int[index];
+            for(int i = 0;i<index;i++){
+                result[i] = (int)linkedList.get(i);
+            }
+        }
+	    return result;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+        LinkedList<Integer> list = new LinkedList<>();
+        getElementFromArray(array1,list);
+        getElementFromArray(array2,list);
+        Collections.sort(list);
+        int[] result = new int[list.size()];
+        for(int n = 0;n<list.size();n++){
+            result[n] = list.get(n);
+        }
+        return result;
+	}
+
+	private void getElementFromArray(int[] array,LinkedList list){
+        if(array != null){
+            for(int i:array){
+                if(list.contains(i)){
+                    continue;
+                }
+                list.add(i);
+            }
+        }
+    }
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+	    if(oldArray == null){
+	        return null;
+        }
+		int[] result = new int[oldArray.length+size];
+        System.arraycopy(oldArray,0,result,0,oldArray.length);
+        for(int i = 0;i<size;i++){
+            result[oldArray.length+i] = 0;
+        }
+	    return result;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] result = null;
+		if (max <= 0 || max > Integer.MAX_VALUE) {
+		    return result;//抛出异常
+        } else if (max == 1) {
+        	result = new int[0];
+		} else {
+			ArrayList<Integer> list = new ArrayList();
+			list.add(1);
+			list.add(1);
+			for (int i = 2;i<Integer.MAX_VALUE;i++) {
+				if((list.get(i-2) + list.get(i-1)) > max){
+					break;
+				}
+				list.add(i,(list.get(i-2)+list.get(i-1)));
+			}
+			result = new int[list.size()];
+			for (int j=0;j<list.size();j++) {
+				result[j] = list.get(j);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] result = null;
+		if (max <= 0 || max > Integer.MAX_VALUE) {
+			return result;//抛出异常
+		} else if(max == 1){
+			result = new int[0];
+		}else {
+			ArrayList<Integer> list = new ArrayList<>();
+			for (int i=2 ; i<=max ; i++) {
+				if(isPrimes(i)){
+					list.add(i);
+				}
+			}
+			result = new int[list.size()];
+			for(int m = 0 ; m<list.size() ; m++){
+				result[m] = list.get(m);
+			}
+		}
+		return result;
+	}
+
+	//判断一个数是否是素数，true：是素数；false：不是素数。
+	private boolean isPrimes(int value){
+		for(int i=2 ; i <= Math.sqrt(value) ; i++){
+			if(value % i == 0){
+				return false;
+			}
+		}
+		return true;
+	}
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] result = null;
+		if(max <= 0 || max > Integer.MAX_VALUE){
+			return result;
+		} else {
+			LinkedList<Integer> list = new LinkedList<>();
+			for(int i = 1 ; i < max ; i++){
+				if (isPerfectNumber(i)) {
+					list.add(i);
+				}
+			}
+			result = new int[list.size()];
+			for (int i = 0 ; i < list.size() ; i++) {
+				result[i] = list.get(i);
+			}
+		}
+		return result;
+	}
+
+	//判断一个数是否是完数，true：是完数；false：不是完数。
+	public boolean isPerfectNumber(int value){
+		int sum = 0;
+		for(int i = 1 ; i < value ; i++){
+			if(value % i == 0){
+				sum += i;
+			}
+		}
+		return sum == value;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer sb = new StringBuffer();
+		if (array != null && array.length >= 1) {
+			for (int i = 0 ; i < array.length ; i++) {
+				sb.append(array[i]);
+				if (i < array.length-1) {
+					sb.append(seperator);
+				}
+			}
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java b/group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java
new file mode 100644
index 0000000000..eb5487e76d
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java
@@ -0,0 +1,84 @@
+package com.bruce.homework0305.array;
+
+import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * Created by Bruce.Jiao on 2017/3/2.
+ */
+public class JuintArrayUtil extends TestCase {
+
+    @Test
+    public void testReverse(){
+        ArrayUtil au = new ArrayUtil();
+        int[] demo0 = {};
+        int[] demo1 = {6};
+        int[] demo = {7, 9, 30, 3, 4, 6};
+        int[] nullArray = au.reverseArray(null);
+        int[] reverseArray0 = au.reverseArray(demo0);
+        int[] reverseArray1 = au.reverseArray(demo1);
+        int[] reverseArray = au.reverseArray(demo);
+        System.out.println(Arrays.toString(nullArray));
+        System.out.println(Arrays.toString(reverseArray0));
+        System.out.println(Arrays.toString(reverseArray1));
+        System.out.println(Arrays.toString(reverseArray));
+    }
+
+    @Test
+    public void testRemoveZero(){
+        ArrayUtil au = new ArrayUtil();
+        int[] one = {0};
+        int[] many = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        System.out.println(Arrays.toString(au.removeZero(one)));
+        System.out.println(Arrays.toString(au.removeZero(many)));
+        System.out.println(Arrays.toString(au.removeZero(null)));
+        System.out.println(Arrays.toString(au.removeZero(new int[0])));
+    }
+
+    @Test
+    public void testMerge(){
+        ArrayUtil au = new ArrayUtil();
+        int[] arr1 = {3,4,5,6,7,8,9};
+        int[] arr2 = {1,3,5,6,7,9,10,12,13};
+        int[] arr3 = null;
+        int[] arr4 = new int[0];
+        System.out.println(Arrays.toString(au.merge(arr1,arr2)));
+        System.out.println(Arrays.toString(au.merge(arr1,arr3)));
+        System.out.println(Arrays.toString(au.merge(arr2,arr4)));
+    }
+
+    @Test
+    public void testGrow(){
+        ArrayUtil au = new ArrayUtil();
+        int[] arr = {3,4,5,6,7,8,9};
+        System.out.println(Arrays.toString(au.grow(arr,5)));
+    }
+
+    @Test
+    public void testFibonacci(){
+        ArrayUtil au = new ArrayUtil();
+        System.out.println(Arrays.toString(au.fibonacci(15)));
+    }
+
+    @Test
+    public void testPrimes(){
+        ArrayUtil au = new ArrayUtil();
+        System.out.println(Arrays.toString(au.getPrimes(23)));
+    }
+
+    @Test
+    public void testPerfectNumbers(){
+        ArrayUtil au = new ArrayUtil();
+        System.out.println(Arrays.toString(au.getPerfectNumbers(23)));
+    }
+
+    @Test
+    public void testJoin(){
+        ArrayUtil au = new ArrayUtil();
+        int[] array = {1,6,8,8,8,8,8,8,8,8,8,};
+        System.out.println(au.join(array,"-"));
+    }
+}
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java
new file mode 100644
index 0000000000..4b509b2102
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.bruce.homework0305.mystruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java
new file mode 100644
index 0000000000..ab54fd0625
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java
@@ -0,0 +1,81 @@
+package com.bruce.homework0305.mystruts;
+
+import com.sun.deploy.util.StringUtils;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Test;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.*;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws DocumentException,
+            ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
+
+        /*
+		0. 读取配置文件struts.xml
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+        */
+        SAXReader reader = new SAXReader();
+        Document document = reader.read(new File("src/com/bruce/homework0305/mystruts/struts.xml"));
+        Element root = document.getRootElement();
+        Iterator<Element> actions = root.elementIterator("action");
+        HashMap<String,String> map = new HashMap<>();
+        View view = new View();
+        while(actions.hasNext()){
+            Element next = actions.next();
+            List<Attribute> attributes = next.attributes();
+            Attribute action_name = next.attribute("name");
+            if(actionName.equals(action_name.getValue())){
+                //找到name="login"的action,拿到其class路径
+                Attribute aClass = next.attribute("class");
+                //通过反射拿到LoginAction类
+               Class clazz = Class.forName(aClass.getValue());
+               LoginAction login = (LoginAction) clazz.newInstance();
+                //从parameters中拿到所有的key，通过这些key拿到对应的值，并且传入LoginAction对应的setter方法
+                Set<String> keys = parameters.keySet();parameters.entrySet();
+                for(String key : keys){
+                    //首字母大写，拿到setter方法,并将parameters中对应该key的value拿出来，反射传入相应方法
+                    String setter = "set"+ key.substring(0,1).toUpperCase()+key.substring(1,key.length());
+                    Method method = clazz.getMethod(setter,String.class);
+                    method.invoke(login,parameters.get(key));
+                }
+                //反射拿到execute方法，并拿到执行结果
+                Method execute = clazz.getMethod("execute");
+                String result = (String) execute.invoke(login);
+                //反射拿到getMessage方法,结果以map格式保存，并保存在view对象中
+                Method getMessage = clazz.getMethod("getMessage");
+                String message = (String)getMessage.invoke(login);
+                map.put("message",message);
+                view.setParameters(map);
+                //根据execute方法的执行结果，找到相关result的jsp路径，将该路径保存在view对象中
+                Iterator<Element> results = next.elementIterator("result");
+                while(results.hasNext()){
+                    Element element = results.next();
+                    if(result.equals(element.attribute("name").getValue())){
+                       view.setJsp(element.getText());
+                        break;
+                    }
+                }
+            }
+        }
+        return view;
+    }
+}
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java
new file mode 100644
index 0000000000..e54809e4b6
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java
@@ -0,0 +1,61 @@
+package com.bruce.homework0305.mystruts;
+
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+        try {
+            String actionName = "login";
+            Map<String,String> params = new HashMap<String,String>();
+            params.put("name","test");
+            params.put("password","1234");
+            View view  = Struts.runAction(actionName,params);
+            Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+            Assert.assertEquals("login successful", view.getParameters().get("message"));
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    }
+
+	@Test
+	public void testLoginActionFailed() {
+        try {
+            String actionName = "login";
+            Map<String,String> params = new HashMap<String,String>();
+            params.put("name","test");
+            params.put("password","123456"); //密码和预设的不一致
+            View view  = Struts.runAction(actionName,params);
+            Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+            Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java
new file mode 100644
index 0000000000..47abd77a37
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java
@@ -0,0 +1,23 @@
+package com.bruce.homework0305.mystruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml
new file mode 100644
index 0000000000..41c7be3d2f
--- /dev/null
+++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.bruce.homework0305.mystruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.bruce.homework0305.mystruts.LoginAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1511_714512544/.idea/workspace.xml b/group15/1511_714512544/.idea/workspace.xml
index e9a1aea025..cb4932867a 100644
--- a/group15/1511_714512544/.idea/workspace.xml
+++ b/group15/1511_714512544/.idea/workspace.xml
@@ -1,9 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="418f0de8-67af-48d2-a00b-7a08e5d0a4bd" name="Default" comment="">
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
-    </list>
+    <list default="true" id="418f0de8-67af-48d2-a00b-7a08e5d0a4bd" name="Default" comment="" />
     <ignored path="$PROJECT_DIR$/out/" />
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="TRACKING_ENABLED" value="true" />
@@ -15,13 +13,25 @@
   <component name="CreatePatchCommitExecutor">
     <option name="PATCH_PATH" value="" />
   </component>
+  <component name="DatabaseView">
+    <option name="GROUP_SCHEMA" value="true" />
+    <option name="GROUP_CONTENTS" value="false" />
+    <option name="SORT_POSITIONED" value="false" />
+    <option name="SHOW_TABLE_DETAILS" value="true" />
+    <option name="SHOW_EMPTY_GROUPS" value="false" />
+    <option name="AUTO_SCROLL_FROM_SOURCE" value="false" />
+  </component>
   <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
+  <component name="FavoritesManager">
+    <favorites_list name="1511_714512544" />
+  </component>
   <component name="FileEditorManager">
-    <leaf />
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="375" />
   </component>
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
+        <option value="Class" />
         <option value="JUnit4 Test Class" />
       </list>
     </option>
@@ -46,9 +56,16 @@
         <option value="$PROJECT_DIR$/src/com/coding/basic/Queue.java" />
         <option value="$PROJECT_DIR$/src/test/com/coding/basic/QueueTest.java" />
         <option value="$PROJECT_DIR$/src/com/coding/basic/ArrayList.java" />
-        <option value="$PROJECT_DIR$/src/com/coding/basic/BinarySearchTreeNode.java" />
         <option value="$PROJECT_DIR$/src/test/com/coding/basic/BinarySearchTreeTest.java" />
+        <option value="$PROJECT_DIR$/src/com/coderising/array/ArrayUtils.java" />
+        <option value="$PROJECT_DIR$/src/com/coderising/litestruts/StrutsTest.java" />
+        <option value="$PROJECT_DIR$/src/com/coderising/litestruts/LoginAction.java" />
+        <option value="$PROJECT_DIR$/src/com/coderising/litestruts/struts.xml" />
+        <option value="$PROJECT_DIR$/src/com/coderising/litestruts/Struts.java" />
+        <option value="$PROJECT_DIR$/src/com/coderising/array/ArrayUtil.java" />
+        <option value="$PROJECT_DIR$/src/com/coding/basic/BinarySearchTreeNode.java" />
         <option value="$PROJECT_DIR$/src/com/coding/basic/BinarySearchTree.java" />
+        <option value="$PROJECT_DIR$/src/com/coderising/array/ArrayUtilTest.java" />
       </list>
     </option>
   </component>
@@ -76,7 +93,7 @@
   <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
   <component name="ProjectView">
     <navigator currentView="ProjectPane" proportions="" version="1">
-      <flattenPackages />
+      <flattenPackages ProjectPane="false" />
       <showMembers />
       <showModules />
       <showLibraryContents />
@@ -89,8 +106,9 @@
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
-      <pane id="PackagesPane" />
       <pane id="Scratches" />
+      <pane id="PackagesPane" />
+      <pane id="Scope" />
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -116,6 +134,10 @@
               <option name="myItemId" value="src" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="basic" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -130,11 +152,67 @@
               <option name="myItemId" value="src" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="com" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
             <PATH_ELEMENT>
               <option name="myItemId" value="basic" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="1511_714512544" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="1511_714512544" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="com" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="coderising" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="litestruts" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="1511_714512544" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="1511_714512544" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="com" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="coderising" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="array" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
           <PATH>
             <PATH_ELEMENT>
               <option name="myItemId" value="1511_714512544" />
@@ -151,48 +229,75 @@
           </PATH>
         </subPane>
       </pane>
-      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
-    <property name="settings.editor.selected.configurable" value="project.propVCSSupport.Mappings" />
+    <property name="settings.editor.selected.configurable" value="reference.settingsdialog.IDE.editor.colors.Font" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
     <property name="nodejs_interpreter_path" value="C:/myProgram/nodejs/node" />
     <property name="js.eslint.eslintPackage" value="" />
     <property name="js-jscs-nodeInterpreter" value="C:\myProgram\nodejs\node.exe" />
-    <property name="last_opened_file_path" value="F:/六维下载/方立勋javaweb/常用开发包及配置文件/junit-4.8.2.jar!/" />
+    <property name="last_opened_file_path" value="D:/2017编程能力提高群/常用开发包及配置文件/dom4j-1.6.1.jar!/" />
     <property name="project.structure.last.edited" value="Modules" />
     <property name="project.structure.proportion" value="0.0" />
-    <property name="project.structure.side.proportion" value="0.0" />
-    <property name="SearchEverywhereHistoryKey" value="LinkedList&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/LinkedList.java&#10;ArrayList&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/ArrayList.java&#10;Stack&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/Stack.java" />
+    <property name="project.structure.side.proportion" value="0.2" />
+    <property name="SearchEverywhereHistoryKey" value="Object&#9;PSI&#9;JAVA://java.lang.Object&#10;Linked&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/LinkedList.java&#10;ArrayList&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/ArrayList.java&#10;ArrayDeque&#9;PSI&#9;JAVA://java.util.ArrayDeque&#10;LinkedList&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/LinkedList.java&#10;Stack&#9;FILE&#9;jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/Stack.java" />
     <property name="com.intellij.testIntegration.createTest.CreateTestDialog.defaultLibrary" value="JUnit4" />
   </component>
   <component name="RecentsManager">
     <key name="CreateTestDialog.RecentsKey">
+      <recent name="com.coderising.array" />
       <recent name="test.com.coding.basic" />
     </key>
     <key name="CreateTestDialog.Recents.Supers">
       <recent name="" />
     </key>
     <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\AlgorithmsIDEA\coding2017\group15\1511_714512544\src\com\coderising\litestruts" />
       <recent name="D:\AlgorithmsIDEA\coding2017\group15\1511_714512544\src\com\coding\basic" />
     </key>
   </component>
-  <component name="RunManager" selected="JUnit.BinarySearchTreeTest.testPostOrderWithoutRecursion">
-    <configuration default="false" name="BinarySearchTreeTest.testPreOrder" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+  <component name="RunManager" selected="JUnit.ArrayUtilTest.join">
+    <configuration default="false" name="ArrayUtilTest.grow" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
+        <pattern>
+          <option name="PATTERN" value="com.coderising.array.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="1511_714512544" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.coderising.array" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.array.ArrayUtilTest" />
+      <option name="METHOD_NAME" value="grow" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="false" name="ArrayUtilTest.fibonacci" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="test.com.coding.basic.*" />
+          <option name="PATTERN" value="com.coderising.array.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
       <module name="1511_714512544" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="test.com.coding.basic" />
-      <option name="MAIN_CLASS_NAME" value="test.com.coding.basic.BinarySearchTreeTest" />
-      <option name="METHOD_NAME" value="testPreOrder" />
+      <option name="PACKAGE_NAME" value="com.coderising.array" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.array.ArrayUtilTest" />
+      <option name="METHOD_NAME" value="fibonacci" />
       <option name="TEST_OBJECT" value="method" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PARAMETERS" />
@@ -206,19 +311,19 @@
       <patterns />
       <method />
     </configuration>
-    <configuration default="false" name="BinarySearchTreeTest.testMidOrder" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration default="false" name="ArrayUtilTest.getPrimes" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="test.com.coding.basic.*" />
+          <option name="PATTERN" value="com.coderising.array.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
       <module name="1511_714512544" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="test.com.coding.basic" />
-      <option name="MAIN_CLASS_NAME" value="test.com.coding.basic.BinarySearchTreeTest" />
-      <option name="METHOD_NAME" value="testMidOrder" />
+      <option name="PACKAGE_NAME" value="com.coderising.array" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.array.ArrayUtilTest" />
+      <option name="METHOD_NAME" value="getPrimes" />
       <option name="TEST_OBJECT" value="method" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PARAMETERS" />
@@ -232,19 +337,19 @@
       <patterns />
       <method />
     </configuration>
-    <configuration default="false" name="BinarySearchTreeTest.testPreOrderWithoutRecursion" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration default="false" name="ArrayUtilTest.getPerfectNumbers" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="test.com.coding.basic.*" />
+          <option name="PATTERN" value="com.coderising.array.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
       <module name="1511_714512544" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="test.com.coding.basic" />
-      <option name="MAIN_CLASS_NAME" value="test.com.coding.basic.BinarySearchTreeTest" />
-      <option name="METHOD_NAME" value="testPreOrderWithoutRecursion" />
+      <option name="PACKAGE_NAME" value="com.coderising.array" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.array.ArrayUtilTest" />
+      <option name="METHOD_NAME" value="getPerfectNumbers" />
       <option name="TEST_OBJECT" value="method" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PARAMETERS" />
@@ -258,19 +363,19 @@
       <patterns />
       <method />
     </configuration>
-    <configuration default="false" name="BinarySearchTreeTest.testMidOrderWithoutRecursion" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration default="false" name="ArrayUtilTest.join" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="test.com.coding.basic.*" />
+          <option name="PATTERN" value="com.coderising.array.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
       <module name="1511_714512544" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="test.com.coding.basic" />
-      <option name="MAIN_CLASS_NAME" value="test.com.coding.basic.BinarySearchTreeTest" />
-      <option name="METHOD_NAME" value="testMidOrderWithoutRecursion" />
+      <option name="PACKAGE_NAME" value="com.coderising.array" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.array.ArrayUtilTest" />
+      <option name="METHOD_NAME" value="join" />
       <option name="TEST_OBJECT" value="method" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PARAMETERS" />
@@ -680,72 +785,20 @@
     <configuration default="true" type="osgi.bnd.run" factoryName="Test Launcher (JUnit)">
       <method />
     </configuration>
-    <configuration default="false" name="BinarySearchTreeTest.testPostOrder" type="JUnit" factoryName="JUnit" nameIsGenerated="true">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
-        <pattern>
-          <option name="PATTERN" value="test.com.coding.basic.*" />
-          <option name="ENABLED" value="true" />
-        </pattern>
-      </extension>
-      <module name="1511_714512544" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="test.com.coding.basic" />
-      <option name="MAIN_CLASS_NAME" value="test.com.coding.basic.BinarySearchTreeTest" />
-      <option name="METHOD_NAME" value="testPostOrder" />
-      <option name="TEST_OBJECT" value="method" />
-      <option name="VM_PARAMETERS" value="-ea" />
-      <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="TEST_SEARCH_SCOPE">
-        <value defaultName="singleModule" />
-      </option>
-      <envs />
-      <patterns />
-      <method />
-    </configuration>
-    <configuration default="false" name="BinarySearchTreeTest.testPostOrderWithoutRecursion" type="JUnit" factoryName="JUnit" nameIsGenerated="true">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
-        <pattern>
-          <option name="PATTERN" value="test.com.coding.basic.*" />
-          <option name="ENABLED" value="true" />
-        </pattern>
-      </extension>
-      <module name="1511_714512544" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="test.com.coding.basic" />
-      <option name="MAIN_CLASS_NAME" value="test.com.coding.basic.BinarySearchTreeTest" />
-      <option name="METHOD_NAME" value="testPostOrderWithoutRecursion" />
-      <option name="TEST_OBJECT" value="method" />
-      <option name="VM_PARAMETERS" value="-ea" />
-      <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="TEST_SEARCH_SCOPE">
-        <value defaultName="singleModule" />
-      </option>
-      <envs />
-      <patterns />
-      <method />
-    </configuration>
-    <list size="6">
-      <item index="0" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testPostOrder" />
-      <item index="1" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testPostOrderWithoutRecursion" />
-      <item index="2" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testPreOrder" />
-      <item index="3" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testMidOrder" />
-      <item index="4" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testPreOrderWithoutRecursion" />
-      <item index="5" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testMidOrderWithoutRecursion" />
+    <list size="5">
+      <item index="0" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.grow" />
+      <item index="1" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.fibonacci" />
+      <item index="2" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.getPrimes" />
+      <item index="3" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.getPerfectNumbers" />
+      <item index="4" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.join" />
     </list>
     <recent_temporary>
-      <list size="4">
-        <item index="0" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testMidOrderWithoutRecursion" />
-        <item index="1" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testMidOrder" />
-        <item index="2" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testPreOrderWithoutRecursion" />
-        <item index="3" class="java.lang.String" itemvalue="JUnit.BinarySearchTreeTest.testPreOrder" />
+      <list size="5">
+        <item index="0" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.join" />
+        <item index="1" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.getPerfectNumbers" />
+        <item index="2" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.getPrimes" />
+        <item index="3" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.fibonacci" />
+        <item index="4" class="java.lang.String" itemvalue="JUnit.ArrayUtilTest.grow" />
       </list>
     </recent_temporary>
   </component>
@@ -770,7 +823,28 @@
       <workItem from="1487948357571" duration="3000" />
       <workItem from="1487984978664" duration="15835000" />
       <workItem from="1488004956930" duration="9000" />
-      <workItem from="1488019323274" duration="186000" />
+      <workItem from="1488019323274" duration="541000" />
+      <workItem from="1488032913369" duration="462000" />
+      <workItem from="1488073447813" duration="1412000" />
+      <workItem from="1488156417373" duration="233000" />
+      <workItem from="1488156908593" duration="684000" />
+      <workItem from="1488160087660" duration="1371000" />
+      <workItem from="1488177106138" duration="786000" />
+      <workItem from="1488179313435" duration="6000" />
+      <workItem from="1488262381989" duration="1378000" />
+      <workItem from="1488266905682" duration="15036000" />
+      <workItem from="1488328938844" duration="2490000" />
+      <workItem from="1488336197599" duration="19000" />
+      <workItem from="1488344522603" duration="512000" />
+      <workItem from="1488371478288" duration="3393000" />
+      <workItem from="1488427405409" duration="8000" />
+      <workItem from="1488427731357" duration="36000" />
+      <workItem from="1488448896707" duration="626000" />
+      <workItem from="1488463881703" duration="12000" />
+      <workItem from="1488522406058" duration="62000" />
+      <workItem from="1488534235965" duration="1768000" />
+      <workItem from="1488539022614" duration="6551000" />
+      <workItem from="1488603570274" duration="615000" />
     </task>
     <task id="LOCAL-00001" summary="xuweijay">
       <created>1487829266287</created>
@@ -828,77 +902,149 @@
       <option name="project" value="LOCAL" />
       <updated>1488019461939</updated>
     </task>
-    <option name="localTasksCounter" value="9" />
+    <task id="LOCAL-00009" summary="xuweijay">
+      <created>1488157251542</created>
+      <option name="number" value="00009" />
+      <option name="presentableId" value="LOCAL-00009" />
+      <option name="project" value="LOCAL" />
+      <updated>1488157251558</updated>
+    </task>
+    <task id="LOCAL-00010" summary="xuweijay">
+      <created>1488157483941</created>
+      <option name="number" value="00010" />
+      <option name="presentableId" value="LOCAL-00010" />
+      <option name="project" value="LOCAL" />
+      <updated>1488157483941</updated>
+    </task>
+    <task id="LOCAL-00011" summary="xuweijay">
+      <created>1488331339727</created>
+      <option name="number" value="00011" />
+      <option name="presentableId" value="LOCAL-00011" />
+      <option name="project" value="LOCAL" />
+      <updated>1488331339727</updated>
+    </task>
+    <task id="LOCAL-00012" summary="xuweijay">
+      <created>1488372676888</created>
+      <option name="number" value="00012" />
+      <option name="presentableId" value="LOCAL-00012" />
+      <option name="project" value="LOCAL" />
+      <updated>1488372676889</updated>
+    </task>
+    <task id="LOCAL-00013" summary="xuweijay">
+      <created>1488535940734</created>
+      <option name="number" value="00013" />
+      <option name="presentableId" value="LOCAL-00013" />
+      <option name="project" value="LOCAL" />
+      <updated>1488535940734</updated>
+    </task>
+    <task id="LOCAL-00014" summary="xuweijay">
+      <created>1488543482582</created>
+      <option name="number" value="00014" />
+      <option name="presentableId" value="LOCAL-00014" />
+      <option name="project" value="LOCAL" />
+      <updated>1488543482583</updated>
+    </task>
+    <task id="LOCAL-00015" summary="xuweijay">
+      <created>1488544609996</created>
+      <option name="number" value="00015" />
+      <option name="presentableId" value="LOCAL-00015" />
+      <option name="project" value="LOCAL" />
+      <updated>1488544609996</updated>
+    </task>
+    <task id="LOCAL-00016" summary="xuweijay">
+      <created>1488547243625</created>
+      <option name="number" value="00016" />
+      <option name="presentableId" value="LOCAL-00016" />
+      <option name="project" value="LOCAL" />
+      <updated>1488547243625</updated>
+    </task>
+    <task id="LOCAL-00017" summary="xuweijay">
+      <created>1488603987319</created>
+      <option name="number" value="00017" />
+      <option name="presentableId" value="LOCAL-00017" />
+      <option name="project" value="LOCAL" />
+      <updated>1488603987319</updated>
+    </task>
+    <option name="localTasksCounter" value="18" />
     <servers />
   </component>
   <component name="TestHistory">
-    <history-entry file="BinarySearchTreeTest_testContains - 2017.02.25 at 14h 18m 53s.xml">
-      <configuration name="BinarySearchTreeTest.testContains" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_fibonacci - 2017.03.04 at 13h 04m 20s.xml">
+      <configuration name="ArrayUtilTest.fibonacci" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testInsert - 2017.02.25 at 14h 18m 47s.xml">
-      <configuration name="BinarySearchTreeTest.testInsert" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_getPerfectNumbers - 2017.03.04 at 13h 05m 28s.xml">
+      <configuration name="ArrayUtilTest.getPerfectNumbers" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testMidOrder - 2017.02.25 at 14h 19m 25s.xml">
-      <configuration name="BinarySearchTreeTest.testMidOrder" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_getPerfectNumbers - 2017.03.04 at 13h 05m 37s.xml">
+      <configuration name="ArrayUtilTest.getPerfectNumbers" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testMidOrderWithoutRecursion - 2017.02.25 at 14h 19m 33s.xml">
-      <configuration name="BinarySearchTreeTest.testMidOrderWithoutRecursion" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_getPrimes - 2017.03.04 at 13h 04m 54s.xml">
+      <configuration name="ArrayUtilTest.getPrimes" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testPostOrder - 2017.02.25 at 14h 19m 42s.xml">
-      <configuration name="BinarySearchTreeTest.testPostOrder" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_grow - 2017.03.04 at 13h 03m 30s.xml">
+      <configuration name="ArrayUtilTest.grow" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testPostOrderWithoutRecursion - 2017.02.25 at 14h 19m 56s.xml">
-      <configuration name="BinarySearchTreeTest.testPostOrderWithoutRecursion" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_join - 2017.03.04 at 13h 06m 10s.xml">
+      <configuration name="ArrayUtilTest.join" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testPreOrder - 2017.02.25 at 14h 18m 58s.xml">
-      <configuration name="BinarySearchTreeTest.testPreOrder" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_merge - 2017.03.04 at 13h 02m 27s.xml">
+      <configuration name="ArrayUtilTest.merge" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="BinarySearchTreeTest_testPreOrderWithoutRecursion - 2017.02.25 at 14h 19m 17s.xml">
-      <configuration name="BinarySearchTreeTest.testPreOrderWithoutRecursion" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_removeZero - 2017.03.04 at 13h 01m 53s.xml">
+      <configuration name="ArrayUtilTest.removeZero" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="QueueTest_iterator - 2017.02.25 at 12h 04m 55s.xml">
-      <configuration name="QueueTest.iterator" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_reverseArray - 2017.03.04 at 13h 00m 34s.xml">
+      <configuration name="ArrayUtilTest.reverseArray" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="QueueTest_iterator - 2017.02.25 at 12h 05m 02s.xml">
-      <configuration name="QueueTest.iterator" configurationId="JUnit" />
+    <history-entry file="ArrayUtilTest_reverseArray - 2017.03.04 at 13h 01m 24s.xml">
+      <configuration name="ArrayUtilTest.reverseArray" configurationId="JUnit" />
     </history-entry>
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="25697000" />
+    <option name="totallyTimeSpent" value="63512000" />
+  </component>
+  <component name="TodoView">
+    <todo-panel id="selected-file">
+      <is-autoscroll-to-source value="true" />
+    </todo-panel>
+    <todo-panel id="all">
+      <are-packages-shown value="true" />
+      <is-autoscroll-to-source value="true" />
+    </todo-panel>
   </component>
   <component name="ToolWindowManager">
     <frame x="-9" y="-9" width="1938" height="1048" extended-state="6" />
     <editor active="false" />
     <layout>
       <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Nl-Palette" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="FindBugs-IDEA" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
-      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="12" side_tool="true" content_ui="tabs" />
       <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Properties" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
-      <window_info id="CheckStyle" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.23712446" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.23390558" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.22961374" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3997735" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
+      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
+      <window_info id="CheckStyle" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.20493563" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="true" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3997735" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="3" side_tool="false" content_ui="combo" />
-      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
       <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
     </layout>
@@ -933,12 +1079,14 @@
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
-      <option name="time" value="8" />
+      <option name="time" value="17" />
     </breakpoint-manager>
     <watches-manager>
       <configuration name="JUnit">
         <watch expression="current" />
         <watch expression="temp" />
+        <watch expression="loginAction" />
+        <watch expression="className" />
       </configuration>
     </watches-manager>
   </component>
@@ -947,29 +1095,6 @@
     <option name="FILTER_TARGETS" value="false" />
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinarySearchTree.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinarySearchTree.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/BinarySearchTreeTest.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="105">
-          <caret line="21" column="22" lean-forward="false" selection-start-line="21" selection-start-column="22" selection-end-line="21" selection-end-column="22" />
-        </state>
-      </provider>
-    </entry>
     <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/Stack.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="105">
@@ -1012,13 +1137,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/ArrayList.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="273">
-          <caret line="456" column="19" lean-forward="false" selection-start-line="456" selection-start-column="19" selection-end-line="456" selection-end-column="19" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/ArrayListTest.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="319">
@@ -1061,6 +1179,71 @@
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/List.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="63">
+          <caret line="3" column="19" lean-forward="false" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/QueueTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="403">
+          <caret line="59" column="25" lean-forward="false" selection-start-line="59" selection-start-column="25" selection-end-line="59" selection-end-column="25" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/BinarySearchTreeTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-122">
+          <caret line="88" column="60" lean-forward="true" selection-start-line="88" selection-start-column="60" selection-end-line="88" selection-end-column="60" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Iterator.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="42">
+          <caret line="2" column="17" lean-forward="false" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.idea/workspace.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.idea/checkstyle-idea.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="84">
+          <caret line="4" column="11" lean-forward="true" selection-start-line="4" selection-start-column="11" selection-end-line="4" selection-end-column="11" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/Collection.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="3801">
+          <caret line="206" column="13" lean-forward="false" selection-start-line="206" selection-start-column="13" selection-end-line="206" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/AbstractList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="409">
+          <caret line="600" column="28" lean-forward="false" selection-start-line="600" selection-start-column="28" selection-end-line="600" selection-end-column="28" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/ArrayDeque.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="283">
+          <caret line="84" column="13" lean-forward="false" selection-start-line="84" selection-start-column="13" selection-end-line="84" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/LinkedListTest.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="676">
@@ -1068,143 +1251,231 @@
         </state>
       </provider>
     </entry>
-    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/LinkedList.java">
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/dom4j-1.6.1.jar!/org/dom4j/Element.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="525">
-          <caret line="94" column="0" lean-forward="true" selection-start-line="94" selection-start-column="0" selection-end-line="94" selection-end-column="0" />
+        <state relative-caret-position="283">
+          <caret line="120" column="12" lean-forward="false" selection-start-line="120" selection-start-column="12" selection-end-line="120" selection-end-column="12" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/List.java">
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/Map.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="63">
-          <caret line="3" column="19" lean-forward="false" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
-          <folding />
+        <state relative-caret-position="273">
+          <caret line="211" column="6" lean-forward="false" selection-start-line="211" selection-start-column="6" selection-end-line="211" selection-end-column="6" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/StackTest.java">
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/lang/Class.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="505">
-          <caret line="49" column="34" lean-forward="true" selection-start-line="49" selection-start-column="34" selection-end-line="49" selection-end-column="34" />
+        <state relative-caret-position="409">
+          <caret line="2124" column="18" lean-forward="false" selection-start-line="2124" selection-start-column="18" selection-end-line="2124" selection-end-column="18" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/lang/reflect/Method.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="42">
-          <caret line="2" column="40" lean-forward="true" selection-start-line="2" selection-start-column="40" selection-end-line="2" selection-end-column="40" />
-          <folding>
-            <element signature="e#660#661#0" expanded="false" />
-            <element signature="e#692#693#0" expanded="false" />
-          </folding>
+        <state relative-caret-position="850">
+          <caret line="483" column="18" lean-forward="false" selection-start-line="483" selection-start-column="18" selection-end-line="483" selection-end-column="18" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/junit-4.8.2.jar!/org/junit/runner/JUnitCore.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="18">
+          <caret line="108" column="39" lean-forward="true" selection-start-line="108" selection-start-column="39" selection-end-line="108" selection-end-column="39" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/junit-4.8.2.jar!/org/junit/runners/ParentRunner.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="144">
+          <caret line="45" column="0" lean-forward="false" selection-start-line="45" selection-start-column="0" selection-end-line="45" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/junit-4.8.2.jar!/org/junit/runners/BlockJUnit4ClassRunner.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="144">
+          <caret line="48" column="0" lean-forward="false" selection-start-line="48" selection-start-column="0" selection-end-line="48" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/dom4j-1.6.1.jar!/org/dom4j/io/SAXReader.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="166">
+          <caret line="53" column="11" lean-forward="false" selection-start-line="53" selection-start-column="11" selection-end-line="53" selection-end-column="11" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/litestruts/struts.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="210">
+          <caret line="10" column="9" lean-forward="true" selection-start-line="10" selection-start-column="9" selection-end-line="10" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/litestruts/View.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="84">
+          <caret line="4" column="13" lean-forward="false" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/litestruts/LoginAction.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="231">
+          <caret line="11" column="0" lean-forward="true" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="273">
+          <caret line="427" column="13" lean-forward="false" selection-start-line="427" selection-start-column="13" selection-end-line="427" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/lang/Object.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="273">
+          <caret line="147" column="19" lean-forward="false" selection-start-line="147" selection-start-column="19" selection-end-line="147" selection-end-column="19" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/LinkedList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="273">
+          <caret line="447" column="16" lean-forward="false" selection-start-line="447" selection-start-column="16" selection-end-line="447" selection-end-column="16" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/LinkedList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="273">
+          <caret line="53" column="18" lean-forward="false" selection-start-line="53" selection-start-column="18" selection-end-line="53" selection-end-column="18" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Stack.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="273">
+          <caret line="15" column="30" lean-forward="true" selection-start-line="15" selection-start-column="30" selection-end-line="15" selection-end-column="30" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="283">
-          <caret line="126" column="20" lean-forward="false" selection-start-line="126" selection-start-column="20" selection-end-line="126" selection-end-column="20" />
-          <folding>
-            <element signature="e#2540#2541#0" expanded="false" />
-            <element signature="e#2578#2579#0" expanded="false" />
-          </folding>
+          <caret line="27" column="18" lean-forward="false" selection-start-line="27" selection-start-column="18" selection-end-line="27" selection-end-column="18" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/QueueTest.java">
+    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/StackTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="403">
-          <caret line="59" column="25" lean-forward="false" selection-start-line="59" selection-start-column="25" selection-end-line="59" selection-end-column="25" />
+        <state relative-caret-position="966">
+          <caret line="49" column="34" lean-forward="true" selection-start-line="49" selection-start-column="34" selection-end-line="49" selection-end-column="34" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Queue.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="319">
-          <caret line="33" column="22" lean-forward="false" selection-start-line="33" selection-start-column="22" selection-end-line="33" selection-end-column="22" />
-          <folding>
-            <element signature="e#201#202#0" expanded="false" />
-            <element signature="e#223#224#0" expanded="false" />
-            <element signature="e#390#391#0" expanded="false" />
-            <element signature="e#420#421#0" expanded="false" />
-            <element signature="e#450#451#0" expanded="false" />
-            <element signature="e#475#476#0" expanded="false" />
-            <element signature="e#512#513#0" expanded="false" />
-            <element signature="e#541#542#0" expanded="false" />
-          </folding>
+        <state relative-caret-position="126">
+          <caret line="6" column="3" lean-forward="true" selection-start-line="6" selection-start-column="3" selection-end-line="6" selection-end-column="3" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/ArrayList.java">
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/litestruts/Struts.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="21">
-          <caret line="1" column="0" lean-forward="true" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="193">
+          <caret line="21" column="36" lean-forward="true" selection-start-line="21" selection-start-column="36" selection-end-line="21" selection-end-column="36" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/test/com/coding/basic/BinarySearchTreeTest.java">
+    <entry file="jar://C:/Program Files/Java/jdk1.8.0_111/src.zip!/java/util/Arrays.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-122">
-          <caret line="88" column="60" lean-forward="true" selection-start-line="88" selection-start-column="60" selection-end-line="88" selection-end-column="60" />
+        <state relative-caret-position="186">
+          <caret line="4345" column="25" lean-forward="false" selection-start-line="4345" selection-start-column="25" selection-end-line="4345" selection-end-column="25" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/Iterator.java">
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/junit-4.8.2.jar!/org/junit/internal/runners/model/ReflectiveCallable.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="42">
-          <caret line="2" column="17" lean-forward="false" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
-          <folding />
+        <state relative-caret-position="252">
+          <caret line="15" column="0" lean-forward="false" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinarySearchTreeNode.java">
+    <entry file="jar://D:/2017编程能力提高群/常用开发包及配置文件/junit-4.8.2.jar!/org/junit/runners/model/FrameworkMethod.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="105">
-          <caret line="5" column="37" lean-forward="true" selection-start-line="5" selection-start-column="37" selection-end-line="5" selection-end-column="37" />
-          <folding>
-            <element signature="e#353#354#0" expanded="false" />
-            <element signature="e#371#372#0" expanded="false" />
-          </folding>
+        <state relative-caret-position="144">
+          <caret line="26" column="0" lean-forward="false" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinarySearchTree.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-84">
-          <caret line="180" column="61" lean-forward="false" selection-start-line="180" selection-start-column="61" selection-end-line="180" selection-end-column="61" />
-          <folding />
+        <state relative-caret-position="379">
+          <caret line="303" column="23" lean-forward="true" selection-start-line="303" selection-start-column="23" selection-end-line="303" selection-end-column="23" />
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="e#389#390#0" expanded="true" />
+            <element signature="e#407#408#0" expanded="true" />
+            <element signature="e#461#462#0" expanded="true" />
+            <element signature="e#484#485#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/.idea/workspace.xml">
+    <entry file="file://$PROJECT_DIR$/src/com/coding/basic/BinarySearchTreeNode.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="-185">
+          <caret line="12" column="39" lean-forward="true" selection-start-line="12" selection-start-column="39" selection-end-line="12" selection-end-column="39" />
+          <folding>
+            <element signature="e#473#474#0" expanded="true" />
+            <element signature="e#496#497#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/.idea/checkstyle-idea.xml">
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/array/ArrayUtil.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="84">
-          <caret line="4" column="11" lean-forward="true" selection-start-line="4" selection-start-column="11" selection-end-line="4" selection-end-column="11" />
-          <folding />
+        <state relative-caret-position="239">
+          <caret line="164" column="18" lean-forward="true" selection-start-line="164" selection-start-column="13" selection-end-line="164" selection-end-column="18" />
+          <folding>
+            <element signature="e#2314#2315#0" expanded="true" />
+            <element signature="e#2382#2383#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/文章地址.md">
       <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
         <state split_layout="SPLIT">
-          <first_editor relative-caret-position="21">
-            <caret line="1" column="0" lean-forward="true" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="0" />
+          <first_editor relative-caret-position="0">
+            <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
             <folding />
           </first_editor>
           <second_editor />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/litestruts/StrutsTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="210">
+          <caret line="14" column="49" lean-forward="false" selection-start-line="14" selection-start-column="48" selection-end-line="14" selection-end-column="49" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/coderising/array/ArrayUtilTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-143">
+          <caret line="13" column="13" lean-forward="false" selection-start-line="13" selection-start-column="13" selection-end-line="13" selection-end-column="13" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
   </component>
   <component name="masterDetails">
     <states>
diff --git a/group15/1511_714512544/1511_714512544.iml b/group15/1511_714512544/1511_714512544.iml
index 3ab15b1867..1868349e70 100644
--- a/group15/1511_714512544/1511_714512544.iml
+++ b/group15/1511_714512544/1511_714512544.iml
@@ -10,7 +10,16 @@
     <orderEntry type="module-library" exported="">
       <library>
         <CLASSES>
-          <root url="jar://F:/六维下载/方立勋javaweb/常用开发包及配置文件/junit-4.8.2.jar!/" />
+          <root url="jar://D:/2017编程能力提高群/常用开发包及配置文件/junit-4.8.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library" exported="">
+      <library>
+        <CLASSES>
+          <root url="jar://D:/2017编程能力提高群/常用开发包及配置文件/dom4j-1.6.1.jar!/" />
         </CLASSES>
         <JAVADOC />
         <SOURCES />
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/array/ArrayUtil.class b/group15/1511_714512544/out/production/1511_714512544/com/coderising/array/ArrayUtil.class
new file mode 100644
index 0000000000..e84a8b4b40
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coderising/array/ArrayUtil.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/array/ArrayUtilTest.class b/group15/1511_714512544/out/production/1511_714512544/com/coderising/array/ArrayUtilTest.class
new file mode 100644
index 0000000000..f7b0cd1b22
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coderising/array/ArrayUtilTest.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/LoginAction.class b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/LoginAction.class
new file mode 100644
index 0000000000..d781f45ce9
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/LoginAction.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/Struts.class b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/Struts.class
new file mode 100644
index 0000000000..02b3ad4da2
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/Struts.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/StrutsTest.class b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/StrutsTest.class
new file mode 100644
index 0000000000..ab32147b2a
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/StrutsTest.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/View.class b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/View.class
new file mode 100644
index 0000000000..e7a5112144
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/View.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList$1.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList$1.class
new file mode 100644
index 0000000000..c4306e1489
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList$1.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList$ListIterator.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList$ListIterator.class
new file mode 100644
index 0000000000..1d423f2cc8
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList$ListIterator.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList.class
new file mode 100644
index 0000000000..b3a53ec4c1
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/ArrayList.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/BinarySearchTree.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/BinarySearchTree.class
new file mode 100644
index 0000000000..5998f97032
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/BinarySearchTree.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/BinarySearchTreeNode.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/BinarySearchTreeNode.class
new file mode 100644
index 0000000000..2fbda2a306
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/BinarySearchTreeNode.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Iterator.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Iterator.class
new file mode 100644
index 0000000000..16c3f1aded
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Iterator.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$1.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$1.class
new file mode 100644
index 0000000000..648241c965
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$1.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$ListIterator.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$ListIterator.class
new file mode 100644
index 0000000000..4097ca6433
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$ListIterator.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$Node.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$Node.class
new file mode 100644
index 0000000000..466c28ba4f
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList$Node.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList.class
new file mode 100644
index 0000000000..7ac1a0fa80
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/LinkedList.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/List.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/List.class
new file mode 100644
index 0000000000..82055051ce
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/List.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Queue.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Queue.class
new file mode 100644
index 0000000000..60e7cea803
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Queue.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Stack.class b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Stack.class
new file mode 100644
index 0000000000..c309e6c5e7
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/com/coding/basic/Stack.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/ArrayListTest.class b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/ArrayListTest.class
new file mode 100644
index 0000000000..435d12baf4
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/ArrayListTest.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/BinarySearchTreeTest.class b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/BinarySearchTreeTest.class
new file mode 100644
index 0000000000..167f83c32c
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/BinarySearchTreeTest.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/LinkedListTest.class b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/LinkedListTest.class
new file mode 100644
index 0000000000..2b2fb7b768
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/LinkedListTest.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/QueueTest.class b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/QueueTest.class
new file mode 100644
index 0000000000..fcd2281a17
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/QueueTest.class differ
diff --git a/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/StackTest.class b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/StackTest.class
new file mode 100644
index 0000000000..1b08c84113
Binary files /dev/null and b/group15/1511_714512544/out/production/1511_714512544/test/com/coding/basic/StackTest.class differ
diff --git a/group15/1511_714512544/src/com/coderising/array/ArrayUtil.java b/group15/1511_714512544/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..cd48c18e32
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,183 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin){
+        int len = origin.length;
+        int temp = 0;
+        for (int i = 0; i < len/2; i++) {
+            temp = origin[i];
+            origin[i] = origin[len -1 -i];
+            origin[len -1 -i] = temp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray){
+        int[] temp = new int[oldArray.length];
+        int index = 0;
+        for (int i : oldArray) {
+            if(i != 0){
+                temp[index++] = i;
+            }
+        }
+        if(index == 0){
+            return new int[]{};
+        }
+        return Arrays.copyOf(temp, index);
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2){
+        int[] array3 = new int[array1.length+array2.length];
+        for (int i = 0; i < array1.length; i++) {
+            array3[i] = array1[i];
+        }
+        int index = array1.length;
+        for (int i = 0; i < array2.length; i++) {
+            boolean flag = true; //a2元素不在a3中
+            for (int j = 0; j < index; j++) {
+                if(array3[j] == array2[i]){
+                    flag = false;
+                }
+            }
+            if(flag){ //a2元素不在a3中
+                array3[index++] = array2[i];
+            }
+        }
+        int[] temp = Arrays.copyOf(array3, index);
+        Arrays.sort(temp);
+        return temp;
+    }
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int [] oldArray,  int size){
+        return Arrays.copyOf(oldArray, oldArray.length+size);
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max){
+        if(max == 1) return new int[]{};  //max=1，返回空数组
+        int[] arr = new int[max+1];
+        arr[0] = 1;
+        arr[1] = 1;
+
+        int sum = 2;
+        for (int i = 2; i < arr.length; i++) {
+            arr[i] = arr[i-1] + arr[i-2];
+            if(arr[i] >= max){
+                break;
+            }
+            sum ++;
+        }
+        return Arrays.copyOf(arr, sum);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max){
+        if(max<=2) return new int[]{};
+
+        int[] temp = new int[max];
+        int index = 0;
+        for (int i = 2; i < max; i++) {
+            boolean flag = true;
+            for (int j = 2; j <= Math.sqrt(i); j++) {
+                if(i % j == 0){
+                    flag = false;
+                }
+            }
+            if(flag){temp[index++] = i;}
+        }
+        return Arrays.copyOf(temp, index);
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max){
+        if(max <= 2) return new int[]{};
+
+        int[] temp = new int[max];
+        int index = 0;
+        for (int i = 2; i < max; i++) {
+            int sum = 0;
+            for (int j = 1; j <= Math.sqrt(i); j++) {
+                if(j == 1) {
+                    sum += 1;
+                }else{
+                    if(i % j == 0){
+                        sum += j + i/j;
+                    }
+                }
+            }
+            if(sum == i) temp[index++] = i;
+        }
+        return Arrays.copyOf(temp, index);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator){
+        if(array.length == 0){
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int i : array) {
+            sb.append(i).append(seperator);
+        }
+        String temp = sb.toString();
+        return temp.substring(0,temp.length()-1);
+    }
+
+
+}
\ No newline at end of file
diff --git a/group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java b/group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..939c5c7ac6
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,76 @@
+package com.coderising.array;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.*;
+
+/**
+ *  ArrayList测试
+ */
+public class ArrayUtilTest {
+    private ArrayUtil util = null;
+
+    @Before
+    public void setUp() throws Exception {
+       util = new ArrayUtil();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        util = null;
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] arr = new int[]{7, 9, 30, 3, 4};
+        util.reverseArray(arr);
+        assertArrayEquals(new int[]{4,3, 30 , 9,7}, arr);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        int[] newArr = util.removeZero(oldArr);
+        assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, newArr);
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a1 = {3, 5, 7,8};
+        int[] a2 = {4, 5, 6,7};
+        assertArrayEquals(new int[]{3,4,5,6,7,8}, util.merge(a1, a2));
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[] oldArray = {2,3,6};
+        int[] newArr = util.grow(oldArray, 3);
+        assertArrayEquals(new int[]{2,3,6,0,0,0}, newArr);
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        assertArrayEquals(new int[]{1,1,2,3,5,8,13}, util.fibonacci(15) );
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        assertArrayEquals(new int[]{2,3,5,7,11,13,17,19}, util.getPrimes(23));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        assertArrayEquals(new int[]{6} , util.getPerfectNumbers(7));
+    }
+
+    @Test
+    public void join() throws Exception {
+        int[] array= {3,8,9};
+        assertEquals("3-8-9" ,util.join(array, "-"));
+    }
+
+}
\ No newline at end of file
diff --git a/group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java b/group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1511_714512544/src/com/coderising/litestruts/Struts.java b/group15/1511_714512544/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..8822339c00
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,113 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        /*
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		根据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		("name"="test" ,  "password"="1234") ,
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+        */
+
+        try {
+            //0读取配置文件struts.xml
+            SAXReader reader = new SAXReader();
+            Document doc = reader.read(new File("src/com/coderising/litestruts/struts.xml"));
+            Element root = doc.getRootElement();  //根元素
+            Map<String,String> action = new HashMap<>();
+            Map<String,String> loginResult = new HashMap<>();
+            Map<String,String> logoutResult = new HashMap<>();
+            java.util.Iterator iterator = root.elementIterator("action");
+            while(iterator.hasNext()){
+                Element actionNode = (Element) iterator.next();
+                String key = actionNode.attributeValue("name");
+                String value = actionNode.attributeValue("class");
+                action.put(key,value);
+                java.util.Iterator it = actionNode.elementIterator("result");
+                while(it.hasNext()){
+                    Element resultNode = (Element) it.next();
+                    String k = resultNode.attributeValue("name");
+                    String v = resultNode.getText();
+                    if(key.equals("login")){
+                        loginResult.put(k,v);
+                    }else {
+                        logoutResult.put(k,v);
+                    }
+                }
+            }
+
+            //1
+            String className = action.get(actionName);  //获取类名
+            Object o = Class.forName(className).newInstance();  //创建对象
+            if(o instanceof LoginAction){
+                LoginAction loginAction = (LoginAction) o;
+                Set<Map.Entry<String,String>> set = parameters.entrySet();
+                for (Map.Entry<String, String> en : set) {
+                    if(en.getKey().equals("name")){
+                        loginAction.setName(en.getValue());
+                    }else if(en.getKey().equals("password")){
+                        loginAction.setPassword(en.getValue());
+                    }
+                }
+
+                //2
+                Class<LoginAction> clazz = (Class<LoginAction>) loginAction.getClass();
+                Method m = clazz.getDeclaredMethod("execute",null);
+                m.setAccessible(true);
+                String message = (String) m.invoke(loginAction,null);
+
+                //3
+                View view = new View();
+                Map params = new HashMap();
+                Method[] ms = clazz.getDeclaredMethods();
+                for (Method method : ms) {
+                    method.setAccessible(true);
+                    if(method.getName().equals("getName")){
+                        String value = (String) method.invoke(loginAction,null);
+                        params.put("name",value);
+                    }else if(method.getName().equals("getPassword")){
+                        String value = (String) method.invoke(loginAction,null);
+                        params.put("password",value);
+                    }else if(method.getName().equals("getMessage")){
+                        String value = (String) method.invoke(loginAction,null);
+                        params.put("message",value);
+                    }
+                }
+                view.setParameters(params);
+
+                //4
+                String jsp = loginResult.get(message);
+                view.setJsp(jsp);
+
+                return view;
+            }else {
+                return null;
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }    
+
+}
diff --git a/group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java b/group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..d28d29c0e2
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1511_714512544/src/com/coderising/litestruts/View.java b/group15/1511_714512544/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1511_714512544/src/com/coderising/litestruts/struts.xml b/group15/1511_714512544/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group15/1511_714512544/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java b/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java
index 936960abab..7f30ecd124 100644
--- a/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java
+++ b/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java
@@ -1,5 +1,7 @@
 package com.coding.basic;
 
+import edu.princeton.cs.algs4.BinarySearch;
+
 import java.util.Stack;
 
 /**
@@ -43,15 +45,19 @@ public BinarySearchTreeNode<T> insert(T data){
                 if(current.getLeft() != null){
                     current = current.getLeft();
                 }else {
-                    current.setLeft(new BinarySearchTreeNode<T>(data));
-                    return current.getLeft();
+                    BinarySearchTreeNode<T> child = new BinarySearchTreeNode<T>(data);
+                    current.setLeft(child);
+                    child.setParent(current);
+                    return child;
                 }
             }else {//当前节点数据大于root
                 if(current.getRight() != null){
                     current = current.getRight();
                 }else {
-                    current.setRight(new BinarySearchTreeNode<T>(data));
-                    return current.getRight();
+                    BinarySearchTreeNode<T> child = new BinarySearchTreeNode<T>(data);
+                    current.setRight(child );
+                    child.setParent(current);
+                    return child;
                 }
             }
         }
@@ -230,9 +236,83 @@ public void postOrderWithoutRecursion(){
         }
     }
 
-    //按层遍历，每层从左到右输出
-    /*public void  TraversalByLayer(){
+    //删除某个节点n
+    public void delete(BinarySearchTreeNode<T> n){
+        BinarySearchTreeNode<T> p = n.getParent();  //节点的父节点
+        BinarySearchTreeNode<T> child;  //节点的子节点
+
+        //该节点没有任何子节点。// 叶子结点，直接删除即可。要考虑待删除结点是root的情况。
+        if(n.getLeft()==null && n.getRight()==null){
+            //该节点是根节点
+            if(n == root){
+                root = null;
+                return ;
+            }
+            //非根节点
+            if(n == p.getLeft()){
+                p.setLeft(null);
+            }else if(n == p.getRight()){
+                p.setRight(null);
+            }
+        }
+
+        // 内部结点，把它的后继的值拷进来，然后递归删除它的后继。
+        else if(n.getLeft()!=null && n.getRight()!=null){
+            BinarySearchTreeNode<T> next = successor(n);  //找到n的中序后继节点
+            n.setData(next.getData());
+            delete(next);  //中序后继节点
+        }
+
+        //只有一个孩子的结点，把它的孩子交给它的父结点即可
+        else {
+            if(n.getLeft() != null){ //得到子节点
+                child = n.getLeft();
+            }else {
+                child = n.getRight();
+            }
+
+            if(n == root){  // n是根节点的情况
+                child.setParent(null);
+                root = child;
+                return;
+            }
+            //非根节点
+            if(n == p.getLeft()){
+                p.setLeft(child);
+                child.setParent(p);
+            }else{
+                p.setRight(child);
+                child.setParent(p);
+            }
+
+        }
+    }
+
+    //找到n的中序后继节点
+    public BinarySearchTreeNode<T> successor(BinarySearchTreeNode<T> n){
+            if( n == null) return null;
+            if( n.getRight() == null ) return null;
+            return findMin(n.getRight());
+    }
+
+    //查找n树的最小值
+    public BinarySearchTreeNode<T> findMin(BinarySearchTreeNode<T> n){
+        BinarySearchTreeNode<T> current = n;
+        while(current.getLeft() != null){
+            current = current.getLeft();
+        }
+        return current;
+    }
+
+    //查找n树的最大值
+    public BinarySearchTreeNode<T> findMax(BinarySearchTreeNode<T> n){
+        BinarySearchTreeNode<T> current = n;
+        while(current.getRight() != null){
+            current = current.getRight();
+        }
+        return current;
+    }
+
+
 
-    }*/
-    
 }
diff --git a/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java b/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java
index b4e94ff7b6..323a040832 100644
--- a/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java
+++ b/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java
@@ -5,6 +5,7 @@
  */
 public class BinarySearchTreeNode<T>{
 	private T data;
+	private BinarySearchTreeNode<T> parent;  //父节点
 	private BinarySearchTreeNode<T> left;
 	private BinarySearchTreeNode<T> right;
 	private int state;  //递归状态(非递归遍历表示一个节点运行到的状态)
@@ -13,6 +14,7 @@ public BinarySearchTreeNode(T data) {
 		this.data = data;
 		this.left = null;
 		this.right = null;
+		this.parent = null;
 	}
 
 	public T getData() {
@@ -46,4 +48,11 @@ public int getState() {
 	public void setState(int state) {
 		this.state = state;
 	}
+	public BinarySearchTreeNode<T> getParent() {
+		return parent;
+	}
+
+	public void setParent(BinarySearchTreeNode<T> parent) {
+		this.parent = parent;
+	}
 }
diff --git "a/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" "b/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md"
index f6f4c26b37..3a34a9a3fb 100644
--- "a/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md"
+++ "b/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md"
@@ -1 +1,3 @@
 (1)介绍CPU，内存，硬盘，指令以及他们之间的关系的文章地址：http://www.jianshu.com/p/f86ca5072c5d
+
+(2)程序的机器及表示：  http://www.jianshu.com/p/1eed6fe682cd
diff --git a/group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..bcb09d4d64
--- /dev/null
+++ b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+encoding//src/coding/ArrayList.java=GBK
+encoding//src/coding/BinaryTreeNode.java=GBK
+encoding//src/coding/Iterator.java=GBK
+encoding//src/coding/LinkedList.java=GBK
+encoding//src/coding/List.java=GBK
+encoding//src/coding/Queue.java=GBK
+encoding//src/coding/Stack.java=GBK
diff --git a/group15/1513_121469918/HomeWork20170305/.classpath b/group15/1513_121469918/HomeWork20170305/.classpath
new file mode 100644
index 0000000000..a851141e9a
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="jaxen-1.1-beta-6.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group15/1513_121469918/HomeWork20170305/.project b/group15/1513_121469918/HomeWork20170305/.project
new file mode 100644
index 0000000000..0e4fe1fc91
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>HomeWork20170305</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..67f156c482
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,9 @@
+eclipse.preferences.version=1
+encoding//src/com/coderising/array/ArrayUtil.java=UTF-8
+encoding//src/com/coding/basic/ArrayList.java=GBK
+encoding//src/com/coding/basic/BinaryTreeNode.java=GBK
+encoding//src/com/coding/basic/Iterator.java=GBK
+encoding//src/com/coding/basic/LinkedList.java=GBK
+encoding//src/com/coding/basic/List.java=GBK
+encoding//src/com/coding/basic/Queue.java=GBK
+encoding//src/com/coding/basic/Stack.java=GBK
diff --git a/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..7341ab1683
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml b/group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..a7cb57e188
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..985ca47709
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,281 @@
+package com.coderising.array;
+
+
+import java.util.Arrays;
+import java.util.TreeSet;
+import com.coding.basic.ArrayList;
+import com.coding.basic.Iterator;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int len = origin.length;
+		for (int i = 0; i < len / 2; i++) {
+			int temp = origin[i];
+			origin[i] = origin[len - 1 - i];
+			origin[len - 1 - i] = temp;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int count = 0;
+
+		// 创建一个临时数组装没有零的旧数组
+		int[] temp = new int[oldArray.length - count];
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				// 如果值为0，统计、跳过不加入新数组
+				count++;
+				continue;
+			} else {
+				temp[i - count] = oldArray[i];
+			}
+		}
+		// 定义返回数组的长度
+		int len = oldArray.length - count;
+		int[] resultArray = new int[len];
+		System.arraycopy(temp, 0, resultArray, 0, len);
+		return resultArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+/*		int[] result = array1;
+		// 去除重复元素
+		for (int i = 0; i < array2.length; i++) {	
+			boolean sameVal = false;
+			for (int j = 0; j < array1.length; j++) {
+				if (array1[j] == array2[i]) {
+					sameVal = true;
+					break;
+				}
+			}
+			if(sameVal == false){
+				result = grow(result, 1);
+				result[result.length-1] = array2[i];
+			}			
+		}
+		//冒泡排序
+		for (int i = 0; i < result.length-1; i++) {
+			for (int j = i+1; j < result.length; j++) {
+				if(result[i]>result[j]){
+					int temp = result[i];
+					result[i] = result[j];
+					result[j] =temp;
+				}
+			}
+		}		
+		return result;
+*/	
+		int len1=0,len2=0;//arr1长度len1
+		ArrayList list = new ArrayList();		
+		for (int k=0;k < array1.length+array2.length; k++) {
+			//如果两个数组都还有元素
+			if(len1<array1.length && len2<array2.length){
+				if(array1[len1]<array2[len2]){
+					list.add(array1[len1]); 
+					len1++;
+				}else if(array1[len1]>array2[len2]){
+					list.add(array2[len2]);
+					len2++;
+				}else{
+					list.add(array1[len1]); 
+					len1++;
+					len2++;
+				}
+			}else if(len1==array1.length && len2 < array2.length){
+				//如果数组1没有元素,并且2有元素
+				list.add(array2[len2]);
+				len2++;
+			}else if(len2==array2.length && len1 < array1.length){
+				//数组2没有元素，并且1有元素
+				list.add(array1[len1]); 
+				len1++;
+			}else{
+				break;
+			}
+		}
+		//list转数组
+		int[] result = new int[list.size()];
+		Iterator it = list.iterator();
+		int index = 0;
+		while(it.hasNext()){
+			result[index++] = ((Integer)it.next()).intValue();
+		}
+		return result;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] resultArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, resultArray, 0, oldArray.length);
+		return resultArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max <= 1) {
+			return new int[0];
+		} else {
+			int[] temp = new int[max];
+			temp[0] = 1;
+			temp[1] = 1;
+			// 定义返回数组的长度变量
+			int len = 2;
+			for (int i = 2; i < max; i++) {
+				int last = temp[i - 1] + temp[i - 2];
+				if (last >= max) {
+					break;
+				} else {
+					temp[i] = last;
+					len = i  + 1;
+				}
+			}
+			return Arrays.copyOf(temp, len);
+		}
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+
+		if (max <= 1) {
+			return new int[0];
+		} else {
+			// 创建临时数组
+			int[] temp = new int[max];
+			int count = 0;
+			// 从零开始遍历到max，如果有是素数就加入临时数组。
+			for (int i = 0; i < max; i++) {
+				if (isPrimes(i)) {
+					temp[i - count] = i;
+				} else {
+					count++;
+				}
+			}
+			// max -1 -count是最后一个元素索引
+			int len = max - count;
+			int[] resultArray = Arrays.copyOf(temp, len);
+			return resultArray;
+		}
+	}
+
+	boolean isPrimes(int x) {
+		if (x <= 1) {
+			return false;
+		} else {
+			for (int i = 2; i < x; i++) {
+				if (x % i == 0) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		if (max < 1) {
+			return new int[0];
+		} else {
+			ArrayList array = new ArrayList();
+			for (int i = 1; i <= max; i++) {
+				if (isPerfectNumber(i)) {
+					array.add(i);
+				}
+			}
+			int[] result = new int[array.size()];
+			Iterator it = array.iterator();
+			int index = 0;
+			while (it.hasNext()) {
+				result[index] = ((Integer) it.next()).intValue();
+				index++;
+			}
+			return result;
+		}
+	}
+
+	boolean isPerfectNumber(int x) {
+		if (x < 1) {
+			return false;
+		} else {
+			int count = 0;
+			for (int i = 1; i < x; i++) {
+				if (x % i == 0) {
+					count += i;
+				}
+			}
+			if (x == count) {
+				return true;
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			if(i == array.length-1){
+				sb.append(String.valueOf(array[i]));
+				break;
+			}
+			sb.append(String.valueOf(array[i])+seperator);
+		}
+		String result = sb.toString();	
+		return result;
+	}
+
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..a0dd465d25
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,116 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	
+    
+    	
+    	//读取配置文件    	
+    	try {		
+    		Document doc =new SAXReader().read(new File("./src/com/coderising/litestruts/struts.xml"));
+    		//获取XML中的action标签
+    		Element loginName = (Element)doc.selectSingleNode("//action[1]");
+    		Element logoutName = (Element)doc.selectSingleNode("//action[2]");
+    		//判断action的name属性内容
+    		if(actionName.equals(loginName.attributeValue("name"))){
+    			//传入的actionName内容为login则进行login操作
+    			
+    			//获取class路径
+    			String s = loginName.attributeValue("class");
+    			Class c = Class.forName(s);
+    			Constructor con = c.getConstructor();
+    			//实例化LoginAction
+    			LoginAction login =(LoginAction) con.newInstance();
+    			
+    			//通过parameters获取name，password
+    			String executeName = parameters.get("name");
+    			String executePassword = parameters.get("password");
+    			
+    			//获取 setter 方法,并调用
+    			Method m = c.getMethod("setName", String.class);
+    			m.invoke(login, executeName);
+    			m =c.getMethod("setPassword", String.class);
+    			m.invoke(login, executePassword);
+    			
+    			//调用LoginAction 的exectue 方法    exectueResult值为：帐号密码正确返回success，反之为fail 
+    			m = c.getMethod("execute");
+    			String exectueResult = (String)m.invoke(login);   
+    			
+    			//获取 getMessage 方法
+    			m = c.getMethod("getMessage");
+    			String message =(String) m.invoke(login);
+    			m = c.getMethod("getName");
+    			String name =(String) m.invoke(login);
+    			m = c.getMethod("getPassword");
+    			String password =(String) m.invoke(login);
+    			
+    			//创建HashMap,将登录操作返回的3个变量放到Map
+    			HashMap<String,String> hm = new HashMap<String,String>();  			    			
+    			hm.put("message", message);
+    			hm.put("name", name);
+    			hm.put("password", password);
+    			
+    			//创建View对象
+    			View view = new View();
+    			view.setParameters(hm);
+    			
+    			//读取struts.xml中的 <result> 配置
+    			List<Element> list =(List<Element>) doc.selectNodes("//action[@name = 'login']/result");
+    			for(Element e : list){
+    				String resultName = e.attributeValue("name");
+    				//exectue返回值比对XML下result 对应的值返回对应的jsp
+    				if(resultName.equals(exectueResult)){
+    					//将对应的jsp 放到view对象中
+    					view.setJsp(e.getText()); 
+    				}
+    			}
+    			return view;
+    			
+    		}else if(actionName.equals(logoutName.attributeValue("name"))){
+    			//actionName是logout则进行logout操作
+    		}
+    		
+		} catch (Exception e) {
+			// TODO: handle exception
+			e.printStackTrace();
+		}
+    	
+    	return null;
+    }    
+
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..a7cb57e188
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..951b1ce0e9
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,118 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class ArrayList implements List {
+
+	private int size = 0;
+
+	private Object[] elementData = new Object[100];
+
+	public void add(Object o) {
+		int len = size + 1;
+		// �ж�list�ĳ����Ƿ������������
+		if (len > elementData.length) {
+			// ����������
+			Object[] newElemDate = new Object[elementData.length + 1];
+			// ���ƾ���������Ԫ�ص�������
+			System.arraycopy(elementData, 0, newElemDate, 0, elementData.length);
+			elementData = newElemDate;
+		}
+		elementData[size] = o;
+		size++;
+	}
+
+	public void add(int index, Object o) {
+		// ����Ƿ�Խ��
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("index:" + index + "size:" + size);
+		}
+		// ����Ԫ�ص�ĩβֱ�ӵ���add����
+		if (index == size) {
+			add(o);
+		} else {
+			// ����������
+			Object[] newElemData = new Object[elementData.length + 1];
+			// ����index��ǰ������Ԫ�ص�������
+			System.arraycopy(elementData, 0, newElemData, 0, index);
+			newElemData[index] = o;
+			// ����index ���Ժ��Ԫ�ص�������
+			System.arraycopy(elementData, index, newElemData, index + 1, size - index);
+
+			elementData = newElemData;
+			size++;
+		}
+	}
+
+	public Object get(int index) {
+		if (index < 0 || index >= size) {
+			throw new IndexOutOfBoundsException("index:" + index + "size:" + size);
+		}
+		return elementData[index];
+	}
+
+	public Object remove(int index) {
+		if (index >= size) {
+			throw new IndexOutOfBoundsException("index:" + index + "size:" + size);
+		}
+		Object removeElement = elementData[index];
+		//�������һ��Ԫ�ص�����ֵ����Ҫ����
+		if(index != (size-1)){
+			// ����������
+			Object[] newElemData = new Object[elementData.length];
+			// ����index��ǰ������Ԫ�ص�������
+			System.arraycopy(elementData, 0, newElemData, 0, index);
+			// ����index �Ժ��Ԫ�ص�������
+			System.arraycopy(elementData, index+1, newElemData, index, size - index -1);			
+		}
+		//���һ��Ԫ�ص�����ֱֵ�Ӽ���list����
+		size--;
+		return removeElement;
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public Iterator iterator() {
+		return new MyIterator(this);
+	}
+
+	private class MyIterator implements Iterator {
+		private int poi = -1;
+		private ArrayList array = null;
+
+		private MyIterator(ArrayList array) {
+			this.array = array;
+		}
+
+		@Override
+		public boolean hasNext() {
+			return (poi + 1) < array.size;
+		}
+
+		@Override
+		public Object next() {
+			// TODO Auto-generated method stub
+			poi++;
+			if (poi >= array.size) {
+				poi--;
+				throw new IndexOutOfBoundsException();
+			}
+
+			return array.get(poi);
+		}
+
+		@Override
+		public Object remove() {
+			// TODO Auto-generated method stub
+			if (poi < 0) {
+				throw new NoSuchElementException();
+			}
+			Object val = array.remove(poi);
+			poi--;
+			return val;
+		}
+
+	}
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..b3a1ee65b6
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,53 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+	public BinaryTreeNode insert(Object o) {
+		// �жϵ�ǰ�ڵ�����Ԫ��
+		if (data == null) {
+			setData(o);
+		} else {
+			Integer i = (Integer) o;
+			// ��ǰ�ڵ����������ж����ҽڵ�
+			if (i.compareTo((Integer) data) == -1) {
+				if(right == null)
+					right = new BinaryTreeNode();
+					return right.insert(i);
+			} else if (i.compareTo((Integer) data) == 1) {
+				if(left == null)
+					left = new BinaryTreeNode();
+					return left.insert(i);
+			}
+			return null;
+		}
+		return null;
+	}
+
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..f5cf74673d
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+	public Object remove();
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..d8f759fdcb
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,170 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class LinkedList implements List {
+	private Node head;
+	private int size;
+
+	public void add(Object o) {
+		// �ж�ͷ�Ƿ�������
+		if (head == null) {
+			head = new Node(o, null);
+		} else {
+			Node newNode = head;
+			while (newNode.next != null) {
+				newNode = newNode.next;
+			}
+			newNode.next = new Node(o, null);
+		}
+		size++;
+	}
+
+	public void add(int index, Object o) {
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("index:" + index + "size:" + size);
+		}
+		Node node = head;
+		if (index != 0) {
+			// ���ǵ�һ������ֵ���ҵ�����ֵ��ǰ��һ���ڵ�
+			for (int i = 1; i < index; i++) {
+				node = node.next;
+			}
+			Node newNode = new Node(o, node.next);
+			node.next = newNode;
+			size++;
+		} else {
+			// ��һ������ֵ�ͽ�ͷ�ڵ�ָ����
+			Node newNode = new Node(o, head);
+			head = newNode;
+			size++;
+		}
+	}
+
+	public Object get(int index) {
+		indexCheck(index);
+		Node node = head;
+		for (int i = 1; i <= index; i++) {
+			node = node.next;
+		}
+		return node.data;
+	}
+
+	public Object remove(int index) {
+		indexCheck(index);
+		
+		Node node = head;
+		Node removeNode;
+		if (index == 0) {
+			//ɾ����һ���ڵ�Ͱ�ͷ�ڵ�ָ��ԭ���ĵڶ����ڵ�
+			removeNode = head;
+			head = head.next;
+		} else {
+			//�ҵ�����ֵ��ǰһ���ڵ�
+			for (int i = 1; i < index; i++) {
+				node = node.next;
+			}
+			removeNode = node.next;
+			//ǰһ���ڵ�ָ�룬ָ��ɾ���ڵ���ָ��Ľڵ�
+			node.next = removeNode.next;
+		}
+		size--;
+		return removeNode.data;
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public void addFirst(Object o) {
+		Node newNode = new Node(o, head.next);
+		head.next = newNode;
+		size++;
+	}
+
+	public void addLast(Object o) {
+		add(o);
+	}
+
+	public Object removeFirst() {
+		//û��Ԫ�ؾ����쳣
+		if (size <= 0) {
+			throw new IndexOutOfBoundsException("size:" + size);
+		}
+		Object val = head.data;
+		head = head.next;
+		size--;
+		return val;
+	}
+
+	public Object removeLast() {
+		if (size <= 0) {
+			throw new IndexOutOfBoundsException("size:" + size);
+		}
+		Node node = head;
+		while (node.next != null) {
+			node = node.next;
+		}
+		Object val = node.data;
+		node = null;
+		size--;
+		return val;
+	}
+
+	public Iterator iterator() {
+		return new MyIterator(this);
+	}
+
+	private class MyIterator implements Iterator{
+		private int poi = -1;
+		private LinkedList list ;
+		private MyIterator(LinkedList list) {
+			this.list= list;
+		}
+		@Override
+		public boolean hasNext() {
+			// TODO Auto-generated method stub
+			return (poi + 1) < list.size;
+		}
+
+		@Override
+		public Object next() {
+			// TODO Auto-generated method stub
+			poi++;
+			if (poi >= list.size) {
+				poi--;
+				throw new IndexOutOfBoundsException();
+			}
+
+			return list.get(poi);
+		}
+
+		@Override
+		public Object remove() {
+			// TODO Auto-generated method stub
+			if (poi < 0) {
+				throw new NoSuchElementException();
+			}
+			Object val = list.removeLast();
+			poi--;
+			return val;
+		}
+		
+	}
+	
+	private void indexCheck(int index) {
+		if (index < 0 || index >= size) {
+			throw new IndexOutOfBoundsException("index:" + index + "size:" + size);
+		}
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+		Node(Object data, Node next) {
+			this.data = data;
+			this.next = next;
+		}
+	}
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..ea25224bd2
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java
@@ -0,0 +1,35 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class Queue {
+	private int size;
+	private LinkedList list = new LinkedList();
+	
+	public void enQueue(Object o){
+		list.addLast(o);;
+		size++;
+	}
+	
+	public Object deQueue(){
+		if(size<=0){
+			throw new NoSuchElementException();
+		}
+		Object val = list.removeFirst();
+		size--;
+		return val;
+	}
+	
+	public boolean isEmpty(){
+		boolean flag = false;
+		if(size >= 0){
+			flag = true;
+		}
+		return flag;
+	}
+	
+	public int size(){
+		return size;
+	}
+
+}
diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..9a28ee4d36
--- /dev/null
+++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java
@@ -0,0 +1,41 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int size;
+	
+	public void push(Object o){
+		elementData.add(o);
+		size++;
+	}
+	
+	public Object pop(){
+		if(size<=0){
+			throw new NoSuchElementException();
+		}
+		int len = size-1;
+		Object val = elementData.remove(len);
+		size--;
+		return val;
+	}
+	
+	public Object peek(){
+		if(size<=0){
+			throw new NoSuchElementException();
+		}
+		int len = size-1;
+		return elementData.get(len);
+	}
+	public boolean isEmpty(){
+		boolean flag = false;
+		if(size >= 0){
+			flag = true;
+		}
+		return flag;
+	}
+	public int size(){
+		return size;
+	}
+}
diff --git a/group15/1514_616019420/.classpath b/group15/1514_616019420/.classpath
new file mode 100644
index 0000000000..3e0fb272a8
--- /dev/null
+++ b/group15/1514_616019420/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group15/1514_616019420/.gitignore b/group15/1514_616019420/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group15/1514_616019420/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group15/1514_616019420/.project b/group15/1514_616019420/.project
new file mode 100644
index 0000000000..fab8d7f04c
--- /dev/null
+++ b/group15/1514_616019420/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>2017Learning</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group15/1514_616019420/src/com/coderising/array/ArrayUtil.java b/group15/1514_616019420/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..d636e46186
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,205 @@
+package com.coderising.array;
+
+import java.lang.reflect.Array;
+import java.util.*;
+import com.coding.basic.ArrayList;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin) {
+
+		if (origin != null && origin.length > 0) {
+			int size = origin.length;
+			int[] intarray = new int[size];
+			for (int i = 0; i < size; i++) {
+				intarray[i] = origin[size - 1 - i];
+			}
+			origin = intarray;
+
+		} else if (origin != null && origin.length == 0) {
+
+		} else {
+			throw new NullPointerException();
+		}
+		return origin;
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+
+		if (oldArray != null) {
+			int[] intarry = new int[oldArray.length];
+			int x = 0;
+			int y = 0;
+			for (int i = 0; i < oldArray.length; i++) {
+				if (oldArray[i] != 0) {
+					intarry[y] = oldArray[i];
+					y++;
+				} else {
+					x++;
+				}
+			}
+			int[] newarray = new int[y];
+			System.arraycopy(intarry, 0, newarray, 0, y);
+			return newarray;
+		} else {
+			throw new NullPointerException();
+		}
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		int count = array2.length;
+		array2 = grow(array2, array1.length);
+		System.arraycopy(array1, 0, array2, count, array1.length);
+		Arrays.sort(array2);
+		int[] array3 = new int[array2.length];
+		array3[0] = array2[0];
+		int x = 0;
+		for (int i = 1; i < array2.length; i++) {
+			if (array2[i] != array3[x]) {
+				array3[x + 1] = array2[i];
+				x++;
+			}
+		}
+
+		int[] array4 = new int[x + 1];
+		System.arraycopy(array3, 0, array4, 0, x + 1);
+		return array4;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int[] array, int max) {
+		int[] array0 = new int[array.length];
+		int x = 0;
+		int y = 0;
+		for (int i = 0; i < array.length; i++) {
+			if (array[i] < max) {
+				array0[y] = array[i];
+				y++;
+			} else {
+				x++;
+			}
+		}
+		int[] array1 = new int[y];
+		return	Arrays.copyOf(array0, y);
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		
+		
+		if(max<=2) 
+			{return new int[]{};
+			
+			}
+        int[] temp = new int[max];
+        int index = 0;
+        for (int i = 2; i < max; i++) {
+            boolean flag = true;
+            for (int j = 2; j <= Math.sqrt(i); j++) {
+                if(i % j == 0){
+                    flag = false;
+                }
+            }
+            if(flag){temp[index++] = i;}
+        }
+		return Arrays.copyOf(temp, index);
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+
+		  if(max <= 2) return new int[]{};
+
+	        int[] array = new int[max];
+	        int index = 0;
+	        for (int i = 2; i < max; i++) {
+	            int x = 0;
+	            for (int j = 1; j <= Math.sqrt(i); j++) {
+	                if(j == 1) {
+	                    x += 1;
+	                }else{
+	                    if(i % j == 0){
+	                        x += j + i/j;
+	                    }
+	                }
+	            }
+	            if(x == i) array[index++] = i;
+	        }
+	        return Arrays.copyOf(array, index);
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		  if(array.length == 0){
+	            return "";
+	        }
+	        StringBuilder sb = new StringBuilder();
+	        for (int i : array) {
+	            sb.append(i).append(seperator);
+	        }
+	        String temp = sb.toString();
+	        return temp.substring(0,temp.length()-1);
+	    }
+
+}
diff --git a/group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java b/group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..0f244f272a
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,110 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	private ArrayUtil u;
+	int[] array;
+
+	@Before
+	public void setUp() throws Exception {
+
+		u = new ArrayUtil();
+
+		array = new int[100];
+
+	}
+
+	@After
+	public void tearDown() throws Exception {
+
+	}
+
+	@Test
+	public void testReverseArray() {
+		fail("Not yet implemented");
+		for (int i = 0; i < 100; i++) {
+			array[i] = i;
+
+		}
+		array = u.reverseArray(array);
+		System.out.println("testReverseArray:" + Arrays.toString(array));
+
+	}
+
+	@Test
+	public void testRemoveZero() {
+		 fail("Not yet implemented");
+		for (int i = 0; i < 100; i++) {
+			if (i < 50) {
+				array[i] = 0;
+			} else {
+				array[i] = i;
+			}
+		}
+		array = u.removeZero(array);
+		System.out.println("testRemoveZero:" + Arrays.toString(array));
+	}
+
+	@Test
+	public void testMerge() {
+		//fail("Not yet implemented");
+		int[] intarray={0,1,2,3,4,5,6,7};
+		int[] intarray0={10,11,12,13,14,15,16,17,0,3};
+		int[] intarray1=u.merge(intarray, intarray0);
+		System.out.println("testMerge:" + Arrays.toString(intarray1));
+		
+	}
+
+	@Test
+	public void testGrow() {
+		//fail("Not yet implemented");
+		int[] intarray={0,1,2,3,4,5,6,7};
+		int[] intarray0={10,11,12,13,14,15,16,17,0,3};
+		int[] intarray1=u.grow(intarray, 10);
+		System.out.println("testGrow:" + Arrays.toString(intarray1));
+		
+	}
+
+	@Test
+	public void testFibonacci() {
+		//fail("Not yet implemented");
+		int[] intarray={0,1,2,3,4,5,6,7};
+		int[] intarray0={10,11,12,13,14,15,16,17,0,3};
+		int[] intarray1=u.fibonacci(intarray0, 17);
+		System.out.println("testFibonacci:" + Arrays.toString(intarray1));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		//fail("Not yet implemented");int[] intarray={0,1,2,3,4,5,6,7};
+		int[] intarray0={10,11,12,13,14,15,16,17,0,3};
+		int[] intarray1=u.getPrimes(10);
+		System.out.println("testGetPrimes:" + Arrays.toString(intarray1));
+		
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+	//	fail("Not yet implemented");
+		int[] intarray0={10,11,12,13,14,15,16,17,0,3};
+		int[] intarray1=u.getPerfectNumbers(10);
+		System.out.println("testGetPerfectNumbers:" + Arrays.toString(intarray1));
+	}
+
+	@Test
+	public void testJoin() {
+	//	fail("Not yet implemented");
+		int[] intarray0={10,11,12,13,14,15,16,17,0,3};
+		String str=u.join(intarray0, "++");
+		System.out.println("testJoin:" + str);
+	}
+
+}
diff --git a/group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java b/group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1514_616019420/src/com/coderising/litestruts/Struts.java b/group15/1514_616019420/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..9081b94e78
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,113 @@
+package com.coderising.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        /*
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		根据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+		("name"="test" ,  "password"="1234") ,
+		那就应该调用 setName和setPassword方法
+
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+		放到View对象的parameters
+
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+		放到View对象的jsp字段中。
+        */
+
+        try {
+            //0读取配置文件struts.xml
+            SAXReader saxReader = new SAXReader();
+            Document document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml"));
+            Element rootElement = document.getRootElement();  //根元素
+            Map<String,String> actionMap = new HashMap<>();
+            Map<String,String> loginResult = new HashMap<>();
+            Map<String,String> logoutResult = new HashMap<>();
+            java.util.Iterator iterator = rootElement.elementIterator("action");
+            while(iterator.hasNext()){
+                Element actionNode = (Element) iterator.next();
+                String key = actionNode.attributeValue("name");
+                String value = actionNode.attributeValue("class");
+                action.put(key,value);
+                java.util.Iterator it = actionNode.elementIterator("result");
+                while(it.hasNext()){
+                    Element resultNode = (Element) it.next();
+                    String k = resultNode.attributeValue("name");
+                    String v = resultNode.getText();
+                    if(key.equals("login")){
+                        loginResult.put(k,v);
+                    }else {
+                        logoutResult.put(k,v);
+                    }
+                }
+            }
+
+            //1
+            String className = actionMap.get(actionName);  //获取类名
+            Object o = Class.forName(className).newInstance();  //创建对象
+            if(o instanceof LoginAction){
+                LoginAction loginAction = (LoginAction) o;
+                Set<Map.Entry<String,String>> set = parameters.entrySet();
+                for (Map.Entry<String, String> en : set) {
+                    if(en.getKey().equals("name")){
+                        loginAction.setName(en.getValue());
+                    }else if(en.getKey().equals("password")){
+                        loginAction.setPassword(en.getValue());
+                    }
+                }
+
+                //2
+                Class<LoginAction> clazz = (Class<LoginAction>) loginAction.getClass();
+                Method m = clazz.getDeclaredMethod("execute",null);
+                m.setAccessible(true);
+                String message = (String) m.invoke(loginAction,null);
+
+                //3
+                View view = new View();
+                Map params = new HashMap();
+                Method[] ms = clazz.getDeclaredMethods();
+                for (Method method : ms) {
+                    method.setAccessible(true);
+                    if(method.getName().equals("getName")){
+                        String value = (String) method.invoke(loginAction,null);
+                        params.put("name",value);
+                    }else if(method.getName().equals("getPassword")){
+                        String value = (String) method.invoke(loginAction,null);
+                        params.put("password",value);
+                    }else if(method.getName().equals("getMessage")){
+                        String value = (String) method.invoke(loginAction,null);
+                        params.put("message",value);
+                    }
+                }
+                view.setParameters(params);
+
+                //4
+                String jsp = loginResult.get(message);
+                view.setJsp(jsp);
+
+                return view;
+            }else {
+                return null;
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }    
+
+}
diff --git a/group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java b/group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1514_616019420/src/com/coderising/litestruts/View.java b/group15/1514_616019420/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1514_616019420/src/com/coderising/litestruts/struts.xml b/group15/1514_616019420/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group15/1514_616019420/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1514_616019420/ArrayList.java b/group15/1514_616019420/src/com/coding/basic/ArrayList.java
similarity index 100%
rename from group15/1514_616019420/ArrayList.java
rename to group15/1514_616019420/src/com/coding/basic/ArrayList.java
diff --git a/group15/1514_616019420/BinaryTreeNode.java b/group15/1514_616019420/src/com/coding/basic/BinaryTreeNode.java
similarity index 100%
rename from group15/1514_616019420/BinaryTreeNode.java
rename to group15/1514_616019420/src/com/coding/basic/BinaryTreeNode.java
diff --git a/group15/1514_616019420/src/com/coding/basic/Iterator.java b/group15/1514_616019420/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group15/1514_616019420/src/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group15/1514_616019420/LinkedList.java b/group15/1514_616019420/src/com/coding/basic/LinkedList.java
similarity index 100%
rename from group15/1514_616019420/LinkedList.java
rename to group15/1514_616019420/src/com/coding/basic/LinkedList.java
diff --git a/group15/1514_616019420/src/com/coding/basic/List.java b/group15/1514_616019420/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group15/1514_616019420/src/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group15/1514_616019420/Queue.java b/group15/1514_616019420/src/com/coding/basic/Queue.java
similarity index 100%
rename from group15/1514_616019420/Queue.java
rename to group15/1514_616019420/src/com/coding/basic/Queue.java
diff --git a/group15/1514_616019420/Stack.java b/group15/1514_616019420/src/com/coding/basic/Stack.java
similarity index 100%
rename from group15/1514_616019420/Stack.java
rename to group15/1514_616019420/src/com/coding/basic/Stack.java
diff --git a/group15/1514_616019420/src/com/coding/basic/readme.txt b/group15/1514_616019420/src/com/coding/basic/readme.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group15/1515_337959725/.classpath b/group15/1515_337959725/.classpath
index d171cd4c12..6a4228528e 100644
--- a/group15/1515_337959725/.classpath
+++ b/group15/1515_337959725/.classpath
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group15/1515_337959725/.project b/group15/1515_337959725/.project
index 8c7c8dd0f7..6730933705 100644
--- a/group15/1515_337959725/.project
+++ b/group15/1515_337959725/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>BasicTest</name>
+	<name>coding0305</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs b/group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..060c5ee3d2
--- /dev/null
+++ b/group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/group15/1515_337959725/src/com/coderising/array/ArrayUtil.java b/group15/1515_337959725/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..3273e77f7b
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,184 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int a;
+		int length=origin.length;
+		for(int i=0;i<length/2;i++){
+			a=origin[i];
+			origin[i]=origin[length-i-1];
+			origin[length-i-1]=a;
+		}
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int[] newArray=new int[oldArray.length];
+		int j=0;
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i]!=0){
+				newArray[j]=oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 ,  ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ�������
+	 * ���� a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    �� a3 Ϊ[3,4,5,6,7,8]    , ע�⣺ �Ѿ��������ظ�
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] array3=new int[array1.length+array2.length];
+		int i=0,j=0,k=0;
+		while(i<array1.length&&j<array2.length){
+			if(array1[i]<array2[j]){
+				array3[k]=array1[i];
+				i++;
+				k++;
+			}else if(array1[i]>array2[j]){
+				array3[k]=array1[j];
+				j++;
+				k++;
+			}
+		}
+		return  array3;
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray =new int[oldArray.length+size];
+		int i;
+		for(i=0;i<oldArray.length;i++){
+			newArray[i]=oldArray[i];
+		}
+		for(int j=0;j<size;j++){
+			newArray[i]=0;
+			i++;
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] a =new int[max];
+		if(max<=1){
+			return null;
+		}else{
+			a[0]=1;
+			a[1]=1;
+			int i=2;
+			while(a[i-1]<max){
+				a[i]=a[i-1]+a[i-2];
+				i++;
+			}
+			return a;
+		}
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] a =new int[max/2];
+		if(max<=1){
+			return null;
+		}else{
+			int k=0;
+			boolean flag=false;
+			for(int i=2;i<max;i++){
+				flag=false;
+				for(int j=2;j<i-1;j++){
+					if(i%j==0){
+						flag=true;
+					}
+				}
+				if(!flag){
+					a[k]=i;
+					k++;
+				}
+			}
+		}
+		return a;
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] a =new int[10];
+		int k=0;
+		int sum=0;
+		for(int i=1;i<max;i++){
+			sum=0;
+			for(int j=1;j<i;j++){
+				if(i%j==0){
+					sum=sum+j;
+				}
+			}
+			if(i==sum){
+				a[k]=i;
+				k++;
+			}
+		}
+		return a;
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String str = "";
+		for(int i=0;i<array.length-1;i++){
+			str=str+array[i]+seperator;
+		}
+		str=str+array[array.length-1];
+		return str;
+	}
+	
+
+}
+
diff --git a/group15/1515_337959725/src/com/coderising/array/ArrayUtilTest.java b/group15/1515_337959725/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..f729815e70
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,90 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+	ArrayUtil arrayUtil;
+	@Before
+	public void setUp() throws Exception {
+		arrayUtil =new ArrayUtil();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] a1={7, 9, 30, 3,4};
+		int[] a2={7,9,30,3};
+		arrayUtil.reverseArray(a1);
+		arrayUtil.reverseArray(a2);
+		System.out.println("testReverseArray");
+		System.out.println(Arrays.toString(a1));
+		System.out.println(Arrays.toString(a2));
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArray = arrayUtil.removeZero(oldArr);
+		System.out.println("testRemoveZero");
+		System.out.println(Arrays.toString(newArray));
+	}
+
+/*	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8};   
+		int[] a2 = {4, 5, 6,7};
+		int[] a3 = arrayUtil.merge(a1, a2);
+		System.out.println("testMerge");
+		System.out.println(Arrays.toString(a3));
+	}*/
+
+	@Test
+	public void testGrow() {
+		int[] a1 = {3, 5, 7,8}; 
+		int size=3;
+		int[] a2 = arrayUtil.grow(a1, size);
+		System.out.println("testGrow");
+		System.out.println(Arrays.toString(a2));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15;
+		int[] a = arrayUtil.fibonacci(max);
+		System.out.println("testFibonacci");
+		System.out.println(Arrays.toString(a));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max = 23;
+		int[] a = arrayUtil.getPrimes(max);
+		System.out.println("testGetPrimes");
+		System.out.println(Arrays.toString(a));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max = 80;
+		int[] a = arrayUtil.getPerfectNumbers(max);
+		System.out.println("testGetPerfectNumbers");
+		System.out.println(Arrays.toString(a));
+	}
+
+	@Test
+	public void testJoin() {
+		int[] a1 = {3, 5, 7,8};  
+		String seperator = "-";
+		String a = arrayUtil.join(a1, seperator);
+		System.out.println("testJoin");
+		System.out.println(a);
+	}
+
+}
diff --git a/group15/1515_337959725/src/com/coderising/litestruts/LoginAction.java b/group15/1515_337959725/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..d06e690172
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+ /**
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1515_337959725/src/com/coderising/litestruts/Struts.java b/group15/1515_337959725/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..dcaf1c3f46
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,135 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+
+public class Struts {
+
+    @SuppressWarnings("unchecked")
+	public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. ��ȡ�����ļ�struts.xml
+ 		
+ 		1. ����actionName�ҵ����Ӧ��class �� ����LoginAction,   ͨ������ʵ��������������
+		��parameters�е����ݣ����ö����setter������ ����parameters�е������� 
+		("name"="test" ,  "password"="1234") ,     	
+		�Ǿ�Ӧ�õ��� setName��setPassword����
+		
+		2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+		
+		3. ͨ�������ҵ����������getter���������� getMessage��,  
+		ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ���� {"message":  "��¼�ɹ�"} ,  
+		�ŵ�View�����parameters
+		
+		4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+		�ŵ�View�����jsp�ֶ��С�
+        
+        */
+    	DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+    	View view = null;
+    	try {
+			DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
+			File f = new File("E:/gitProject/coding2017/group15/1515_337959725/src/com/coderising/litestruts/struts.xml");
+			Document document = documentBuilder.parse(f);
+			NodeList actionList = document.getElementsByTagName("action");
+			Node node = null;
+			String className="";
+			for(int i=0;i<actionList.getLength();i++){
+				Node action = actionList.item(i);
+				NamedNodeMap attrs = action.getAttributes();
+				for(int j=0;j<attrs.getLength();j++){
+					String nodeValue = attrs.item(j).getNodeValue();
+					if(actionName.equals(nodeValue)){
+						node=action;
+					}
+				}
+			}
+			NamedNodeMap nodeAtts = node.getAttributes();
+			for(int j=0;j<nodeAtts.getLength();j++){
+				String nodeName =nodeAtts.item(j).getNodeName();
+				if("class".equals(nodeName)){
+					className=nodeAtts.item(j).getNodeValue();
+				}
+			}
+			Class clazz = Class.forName(className);
+			Object obj = clazz.newInstance();
+			String methodName="";
+			for (String key : parameters.keySet()) {
+				methodName="set"+key.substring(0, 1).toUpperCase()+key.substring(1,key.length());
+				Method method= clazz.getMethod(methodName, String.class);
+				method.invoke(obj, parameters.get(key));
+			}
+			Method method1 = clazz.getMethod("execute");
+			String rt = (String)method1.invoke(obj);
+			Method method2 = clazz.getMethod("getMessage");
+			String message = (String)method2.invoke(obj);
+			NodeList childNodes = node.getChildNodes();
+			Node result = null;
+			for(int j=0;j<childNodes.getLength();j++){
+				Node child= childNodes.item(j);
+				if(child.getNodeType()==Node.ELEMENT_NODE){NamedNodeMap attrs = child.getAttributes();
+				for(int k=0;k<attrs.getLength();k++){
+					String nodeValue = attrs.item(k).getNodeValue();
+					if(rt.equals(nodeValue)){
+						result=child;
+					}
+				}}
+			}
+			String jsp = result.getNodeValue();
+			parameters.put("Message", message);
+			view=new View();
+			view.setJsp(jsp);
+			view.setParameters(parameters);
+		} 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();
+		} 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 (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return view;
+    }    
+
+}
diff --git a/group15/1515_337959725/src/com/coderising/litestruts/StrutsTest.java b/group15/1515_337959725/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..2642204b7d
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,44 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //�����Ԥ��Ĳ�һ��
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
+
diff --git a/group15/1515_337959725/src/com/coderising/litestruts/View.java b/group15/1515_337959725/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1515_337959725/src/com/coderising/litestruts/struts.xml b/group15/1515_337959725/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..6f23f0a83d
--- /dev/null
+++ b/group15/1515_337959725/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1517_279137987/my/collection/linear/MyArrayList.java b/group15/1517_279137987/my/collection/linear/MyArrayList.java
deleted file mode 100644
index 380c552539..0000000000
--- a/group15/1517_279137987/my/collection/linear/MyArrayList.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package my.collection.linear;
-
-import java.util.Arrays;
-
-public class MyArrayList implements MyList{
-
-	private int size = 0;
-	private int CAPACITY = 10;
-	private Object[] elementData = new Object[CAPACITY];
-
-	public MyArrayList(int len){
-		this.elementData = new Object[len];
-	}
-	
-	public void add(Object obj){
-		add(size,obj);
-	}
-	
-	public void add(int index, Object obj){
-		if(index < 0){
-			System.out.println("insert position illegal.");
-		}else{
-			if(size + 1 < elementData.length){
-				System.arraycopy(elementData, 0, this.elementData, 0, index);
-				System.arraycopy(elementData, index, this.elementData, index+1, elementData.length-index-1);
-				this.elementData[index] = obj;
-			}else{
-				Object[] newElementData = Arrays.copyOf(elementData, elementData.length + CAPACITY);
-				System.arraycopy(elementData, index, newElementData, index+1, elementData.length - index);
-				newElementData[index] = obj;
-				this.elementData = newElementData;
-			}
-			size++;
-		}
-	}
-	
-	public Object remove(int index){
-		if(index == 0){
-			System.arraycopy(elementData, 1, this.elementData, 0, elementData.length-1);
-		}else{
-			System.arraycopy(elementData, 0, this.elementData, 0, index);
-			System.arraycopy(elementData, index + 1, this.elementData, index, elementData.length-index-1);
-		}
-		size--;
-		return elementData[index];
-	}
-	
-	public Object get(int index){
-		if(index < 0 || index > elementData.length-1){
-			return "get position illegal.";
-		}else{
-			return elementData[index];
-		}
-	} 
-	
-	public int size(){
-		return size;
-	}
-	
-	public String toString(){
-		String str ="toString():";
-		for(int i=0; i<size; i++){
-			str += elementData[i] + "\t";
-		}
-		return str;
-	}
-
-	/*private void grow(int stepLen){
-		Object[] largerElement = new Object[CAPACITY + stepLen];
-		System.arraycopy(elementData, 0, largerElement, 0, elementData.length);
-		elementData = largerElement;
-	}*/
-}
diff --git a/group15/1517_279137987/src/com/coderising/array/ArrayUtil.java b/group15/1517_279137987/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..443184b555
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,226 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+import my.collection.linear.MyArrayList;
+
+public class ArrayUtil {
+	
+	/**
+	 * 1给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int temp;
+		int len = origin.length;
+		for(int i=0; i<origin.length/2; i++){
+			temp = origin[i];
+			origin[i] = origin[--len];	//caution with --x and x--
+			origin[len] = temp;
+		}
+		for(int m : origin){
+			System.out.print(m + "\t");
+		}
+	}
+	
+	/**
+	 * 2现在有如下的一个数组：   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){
+		//calculate new array length
+		int newLen = oldArray.length;
+		for(int m : oldArray){
+			if(m == 0){
+				--newLen;
+			}
+		}
+		//set new array
+		int[] newArray = new int[newLen];
+		int newPos = 0;
+		for(int m : oldArray){
+			if(m == 0){
+				continue;
+			}else{
+				newArray[newPos++] = m;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 3给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	public int[] merge(int[] array1, int[] array2){
+		int[] retTmp = new int[array1.length + array2.length];
+		int i=0,j=0,k=0,sameCount=0;
+		//insert smaller array
+		while(i<array1.length && j<array2.length){
+			if(array1[i] < array2[j]){
+				retTmp[k++] = array1[i++];
+			}else if(array1[i] > array2[j]){
+				retTmp[k++] = array2[j++];
+			}else{
+				j++;
+				sameCount++;
+			}
+		}
+		//insert remainder array
+		while(i < array1.length){
+			retTmp[k++] = array1[i++];
+		}
+		while(j < array2.length){
+			retTmp[k++] = array2[j++];
+		}
+		int[] ret = new int[retTmp.length - sameCount];
+		if(sameCount > 0){
+			System.arraycopy(retTmp, 0, ret, 0, retTmp.length - sameCount);
+		}
+		return  ret;
+	}
+	
+	/**
+	 * 4把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size]; 
+		for(int i=0; i<oldArray.length; i++){	//there are default values
+			newArray[i] = oldArray[i];	
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 5斐波那契数列为：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){
+		MyArrayList mlist = new MyArrayList(10);
+		for(int i=1; i<max; i++){
+			if(fi(i) < max){
+				mlist.add(fi(i));
+			}else{
+				break;
+			}
+		}
+		int[] ret = new int[mlist.size()];
+		for(int i=0; i<mlist.size(); i++){
+			ret[i] = Integer.parseInt(mlist.get(i).toString());
+		}
+		return ret;
+	}
+	//origin fibonacci function
+	private int fi(int i){
+		if(i <= 2){
+			return 1;
+		}else{
+			return fi(i-2) + fi(i-1);
+		}	
+	}
+	
+	/**
+	 * 6返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		String str = "";
+		int cou = 0; 
+		boolean isPrime;
+		for(int i=2; i<max; i++){
+			isPrime = true;
+			for(int j=2; j<i; j++){
+				if(i%j == 0){
+					isPrime = false;
+					break;
+				}
+			}
+			if(isPrime){
+				str += i + ",";
+				cou++;
+			}
+		}
+		//convert string to int array
+		int[] ret = new int[cou];
+		String[] strArray = str.substring(0, str.length()-1).split(",");
+		for(int i=0; i<cou; i++){
+			ret[i] = Integer.parseInt(strArray[i]);
+		}
+		return ret;
+	}
+	
+	/**
+	 * 7所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		MyArrayList perNumArrayList = new MyArrayList(10);
+		
+		for(int i=max; i>0; i--){
+			//get divide numbers
+			MyArrayList divideNumArrayList = new MyArrayList(10);
+			for(int j=1; j<i; j++){
+				if(i%j == 0){
+					divideNumArrayList.add(j);
+				}
+			}
+			//count divide number
+			int tmpCount = 0;
+			for(int j=0; j<divideNumArrayList.size(); j++){
+				tmpCount += Integer.valueOf(divideNumArrayList.get(j).toString());
+			}
+			//judge if is a perfect number
+			if(tmpCount == i){
+				perNumArrayList.add(i);
+			}
+		}
+		//set return perfect numbers array
+		int[] perNumArray = new int[perNumArrayList.size()];	//声明位置导致perNumArrayList.size()并为获取到值
+		for(int j=0; j<perNumArrayList.size(); j++){
+			perNumArray[j] = Integer.valueOf(perNumArrayList.get(j).toString());
+		}
+		//reverse array 
+		reverseArray(perNumArray);
+		
+		return perNumArray;
+	}
+	
+	/**
+	 * 8用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String joined = "";
+		for(int x : array){
+			joined += x + seperator;
+		}
+		joined = joined.substring(0, joined.length()-1);	//String index is a range, not a character. 
+		return joined;
+	}
+}
diff --git a/group15/1517_279137987/src/com/coderising/array/ArrayUtilTest.java b/group15/1517_279137987/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..60206a8058
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,60 @@
+package com.coderising.array;
+
+public class ArrayUtilTest {
+
+	public static void main(String[] args) {
+		
+		ArrayUtil au = new ArrayUtil();
+		
+		/* test1	reverseArray(int[] origin) */
+		int[] arr = {7,9,30,3,88};
+		au.reverseArray(arr);
+		System.out.println();
+		
+		/* test2	removeZero(int[] oldArray) */
+		int[] arr2 = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		for(int x : au.removeZero(arr2)){
+			System.out.print(x + "\t");
+		}
+		System.out.println();
+		
+		/* test3	 */
+		int[] arr31 = {3,6,9,18,77};
+		int[] arr32 = {1,6,7,18,33,56,88};
+		for(int x : au.merge(arr31, arr32)){
+			System.out.print(x + "\t");
+		}
+		System.out.println();
+		
+		/* test4	grow(int [] oldArray,  int size) */
+		int[] arr4 = new int[]{2,3,6};
+		for(int x : au.grow(arr4, 3)){
+			System.out.print(x + "\t");
+		}
+		System.out.println();
+		
+		/* test5	 */
+		for(int i=0; i<au.fibonacci(13).length; i++){
+			System.out.print(au.fibonacci(111)[i] + "\t");
+		}
+		System.out.println();
+		
+		/* test6	 */
+		for(int i=0; i<au.getPrimes(114).length; i++){
+			System.out.print(au.getPrimes(114)[i] + "\t");
+			if(i%5 == 0){
+				System.out.print("\n");
+			}
+		}
+		System.out.println();
+		
+		/* test7	getPerfectNumbers(int max) */
+		au.getPerfectNumbers(495);
+		System.out.println();
+		
+		/* test8	join(int[] array, String seperator) */
+		int[] arr8 = {3,8,9};
+		System.out.println(au.join(arr8, "-"));
+	}
+
+}
diff --git a/group15/1517_279137987/src/com/coderising/litestruts/LoginAction.java b/group15/1517_279137987/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group15/1517_279137987/src/com/coderising/litestruts/Struts.java b/group15/1517_279137987/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..3e6fc9ad4f
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,102 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+    	View view = new View();
+    	/*
+    	 * 0. 读取配置文件struts.xml
+    	 * */
+    	SAXReader reader = new SAXReader();
+		try {
+			Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml"));
+			Element root = document.getRootElement();
+			Iterator iter = root.elementIterator();
+			while(iter.hasNext()){
+				Element secondNode = (Element) iter.next();
+				String nameStr = secondNode.attributeValue("name");
+				String classStr = secondNode.attributeValue("class");
+				
+				/*
+				 * 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+				据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+				("name"="test" ,  "password"="1234") ,     	
+				那就应该调用 setName和setPassword方法
+				*/
+				if(nameStr.equals(actionName)){
+					Class<?> cls = Class.forName(classStr);
+					Object obj = cls.newInstance();
+					Method mtd1 = cls.getDeclaredMethod("setName", String.class);
+					mtd1.invoke(obj, parameters.get("name"));
+					
+					Method mtd2 = cls.getDeclaredMethod("setPassword", new Class[]{String.class});
+					mtd2.invoke(obj, parameters.get("password"));
+					
+					/*
+					 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+					 * */
+					Method execute = cls.getDeclaredMethod("execute");
+					String runStatus = (String) execute.invoke(obj);
+					
+					/*
+					 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+					通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+					放到View对象的parameters
+					*/
+					Method mtd3 = cls.getDeclaredMethod("getMessage");
+					String getMes = (String) mtd3.invoke(obj);
+					Map<String,String> params = new HashMap<String,String>();
+			        params.put("message",getMes);
+					
+					/*
+					 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+					放到View对象的jsp字段中。
+					*/
+			        Iterator iterSecond = secondNode.elementIterator();
+			        while(iterSecond.hasNext()){
+			        	Element thirdNode = (Element) iterSecond.next();
+			        	String resultNameStr = thirdNode.attributeValue("name");
+						String pageStr = thirdNode.getText();
+						
+						if(runStatus.equals(resultNameStr)){
+							view.setJsp(pageStr);
+							view.setParameters(params);
+							break;
+						}
+			        }	
+				}
+			}
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+    	return view;
+    }
+}
diff --git a/group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java b/group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..9f20bbfd59
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1517_279137987/src/com/coderising/litestruts/View.java b/group15/1517_279137987/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group15/1517_279137987/src/com/coderising/litestruts/struts.xml b/group15/1517_279137987/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..ea46090bc9
--- /dev/null
+++ b/group15/1517_279137987/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group15/1517_279137987/src/my/collection/linear/MyArrayList.java b/group15/1517_279137987/src/my/collection/linear/MyArrayList.java
new file mode 100644
index 0000000000..d84b583dcb
--- /dev/null
+++ b/group15/1517_279137987/src/my/collection/linear/MyArrayList.java
@@ -0,0 +1,104 @@
+package my.collection.linear;
+
+import java.util.Arrays;
+
+public class MyArrayList implements MyList{
+
+	private int size = 0;
+	private int CAPACITY = 10;
+	private Object[] elementData = new Object[CAPACITY];
+
+	public MyArrayList(int len){
+		this.elementData = new Object[len];
+	}
+	
+	public void add(Object obj){
+		add(size,obj);
+	}
+	
+	public void add(int index, Object obj){
+		if(index < 0){
+			System.out.println("insert position illegal.");
+		}else{
+			if(size + 1 < elementData.length){
+				System.arraycopy(elementData, 0, this.elementData, 0, index);
+				System.arraycopy(elementData, index, this.elementData, index+1, elementData.length-index-1);
+				this.elementData[index] = obj;
+			}else{
+				Object[] newElementData = Arrays.copyOf(elementData, elementData.length + CAPACITY);
+				System.arraycopy(elementData, index, newElementData, index+1, elementData.length - index);
+				newElementData[index] = obj;
+				this.elementData = newElementData;
+			}
+			size++;
+		}
+	}
+	
+	public Object remove(int index){
+		if(index == 0){
+			System.arraycopy(elementData, 1, this.elementData, 0, elementData.length-1);
+		}else{
+			System.arraycopy(elementData, 0, this.elementData, 0, index);
+			System.arraycopy(elementData, index + 1, this.elementData, index, elementData.length-index-1);
+		}
+		size--;
+		return elementData[index];
+	}
+	
+	public Object get(int index){
+		if(index < 0 || index > elementData.length-1){
+			return "get position illegal.";
+		}else{
+			return elementData[index];
+		}
+	} 
+	
+	public int size(){
+		return size;
+	}
+	
+	public String toString(){
+		String str ="toString():";
+		for(int i=0; i<size; i++){
+			str += elementData[i] + "\t";
+		}
+		return str;
+	}
+
+	/*private void grow(int stepLen){
+		Object[] largerElement = new Object[CAPACITY + stepLen];
+		System.arraycopy(elementData, 0, largerElement, 0, elementData.length);
+		elementData = largerElement;
+	}*/
+	
+	public MyIterator myIterator(){
+		return new MyArrayListIterator(this);
+	}
+	
+	private class MyArrayListIterator implements MyIterator{
+		@SuppressWarnings("unused")
+		MyArrayList list = null;
+		int pos = 0;
+		
+		private MyArrayListIterator(MyArrayList list){
+			this.list = list;
+		}
+		
+		public boolean hasNext() {
+			if(++pos > size){
+				return false;
+			}else{
+				return true;
+			}
+		}
+
+		public Object next() {
+			return get(pos);
+		}
+		
+		public Object remove(){		//?
+			 return MyArrayList.this.remove(this.pos);
+		}
+		
+	}
+}
diff --git a/group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java b/group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java
new file mode 100644
index 0000000000..8b52c6f838
--- /dev/null
+++ b/group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java
@@ -0,0 +1,83 @@
+package my.collection.linear;
+
+public class MyBinaryTreeNode implements Comparable<Object>{
+	
+	private Object data;
+	private MyBinaryTreeNode left;
+	private MyBinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public MyBinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(MyBinaryTreeNode left) {
+		this.left = left;
+	}
+	public MyBinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(MyBinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public MyBinaryTreeNode insert(Object o){
+		//cast to MyBinaryTreeNode
+		MyBinaryTreeNode newNode = new MyBinaryTreeNode();
+		newNode.setData(o);
+		newNode.setLeft(null);
+		newNode.setRight(null);
+		
+		//insert to current node
+		if(data == null){
+			this.setData(o);
+			this.setLeft(null);
+			this.setRight(null);
+		}else{
+			//insert to left child
+			if(compareTo(o) == -1){
+				if(this.getLeft() == null){
+					this.setLeft(newNode);
+				}else{
+					this.data = this.getLeft().data;
+					this.setLeft(this.getLeft().getLeft());
+					this.setRight(this.getRight().getRight());
+					insert(o);
+				}
+			//insert to right child
+			}else if(compareTo(o) == 1){
+				if(this.getRight() == null){
+					this.setRight(newNode);
+				}else{
+					this.data = this.getLeft().data;
+					this.setLeft(this.getLeft().getLeft());
+					this.setRight(this.getRight().getRight());
+					insert(o);
+				}
+			//can't insert node which has same data.
+			}else{
+				
+			}
+		}
+		return  newNode;
+	}
+
+	public int compareTo(Object o) {
+		int compareFlag = 0;
+		if(o instanceof Integer){
+			if(Integer.valueOf(o.toString()) < Integer.valueOf(data.toString())){
+				compareFlag = -1;
+			}else if(Integer.valueOf(o.toString()) > Integer.valueOf(data.toString())){
+				compareFlag = 1;
+			}else{
+				compareFlag = 0;
+			}
+		}
+		return compareFlag;
+	}
+	
+}
diff --git a/group15/1517_279137987/my/collection/linear/MyIterator.java b/group15/1517_279137987/src/my/collection/linear/MyIterator.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linear/MyIterator.java
rename to group15/1517_279137987/src/my/collection/linear/MyIterator.java
diff --git a/group15/1517_279137987/my/collection/linear/MyLinkedList.java b/group15/1517_279137987/src/my/collection/linear/MyLinkedList.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linear/MyLinkedList.java
rename to group15/1517_279137987/src/my/collection/linear/MyLinkedList.java
diff --git a/group15/1517_279137987/my/collection/linear/MyList.java b/group15/1517_279137987/src/my/collection/linear/MyList.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linear/MyList.java
rename to group15/1517_279137987/src/my/collection/linear/MyList.java
diff --git a/group15/1517_279137987/my/collection/linear/MyQueue.java b/group15/1517_279137987/src/my/collection/linear/MyQueue.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linear/MyQueue.java
rename to group15/1517_279137987/src/my/collection/linear/MyQueue.java
diff --git a/group15/1517_279137987/my/collection/linear/MyStack.java b/group15/1517_279137987/src/my/collection/linear/MyStack.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linear/MyStack.java
rename to group15/1517_279137987/src/my/collection/linear/MyStack.java
diff --git a/group15/1517_279137987/my/collection/linearTest/MyArrayListTest.java b/group15/1517_279137987/src/my/collection/linearTest/MyArrayListTest.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linearTest/MyArrayListTest.java
rename to group15/1517_279137987/src/my/collection/linearTest/MyArrayListTest.java
diff --git a/group15/1517_279137987/src/my/collection/linearTest/MyBinaryTreeNodeTest.java b/group15/1517_279137987/src/my/collection/linearTest/MyBinaryTreeNodeTest.java
new file mode 100644
index 0000000000..17a6df5e5a
--- /dev/null
+++ b/group15/1517_279137987/src/my/collection/linearTest/MyBinaryTreeNodeTest.java
@@ -0,0 +1,24 @@
+package my.collection.linearTest;
+
+import my.collection.linear.MyBinaryTreeNode;
+
+public class MyBinaryTreeNodeTest {
+
+	public static void main(String[] args) {
+		MyBinaryTreeNode myTree = new MyBinaryTreeNode();
+		
+		myTree.insert(new Integer(8));
+		myTree.insert(new Integer(12));
+		myTree.insert(new Integer(6));
+		myTree.insert(new Integer(3));
+		myTree.insert(new Integer(7));
+		
+		System.out.println(myTree.getData().toString());	//8
+		System.out.println(myTree.getLeft().getData().toString());	//6
+		System.out.println(myTree.getLeft().getData().toString());	//3
+		System.out.println(myTree.getRight().getData().toString());	//12
+		
+
+	}
+
+}
diff --git a/group15/1517_279137987/my/collection/linearTest/MyLinkedListTest.java b/group15/1517_279137987/src/my/collection/linearTest/MyLinkedListTest.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linearTest/MyLinkedListTest.java
rename to group15/1517_279137987/src/my/collection/linearTest/MyLinkedListTest.java
diff --git a/group15/1517_279137987/my/collection/linearTest/MyQueueTest.java b/group15/1517_279137987/src/my/collection/linearTest/MyQueueTest.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linearTest/MyQueueTest.java
rename to group15/1517_279137987/src/my/collection/linearTest/MyQueueTest.java
diff --git a/group15/1517_279137987/my/collection/linearTest/MyStackTest.java b/group15/1517_279137987/src/my/collection/linearTest/MyStackTest.java
similarity index 100%
rename from group15/1517_279137987/my/collection/linearTest/MyStackTest.java
rename to group15/1517_279137987/src/my/collection/linearTest/MyStackTest.java
diff --git a/group15/1517_279137987/src/my/collection/linearTestJUnit/MyArrayListTest.java b/group15/1517_279137987/src/my/collection/linearTestJUnit/MyArrayListTest.java
new file mode 100644
index 0000000000..2216d2c830
--- /dev/null
+++ b/group15/1517_279137987/src/my/collection/linearTestJUnit/MyArrayListTest.java
@@ -0,0 +1,109 @@
+package my.collection.linearTestJUnit;
+
+import my.collection.linear.MyArrayList;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class MyArrayListTest {
+
+	MyArrayList mal = new MyArrayList(5);
+	
+	@Before
+	public void setUp() throws Exception {
+		for(int i=0; i<mal.size(); i++){
+			mal.remove(i);
+		}
+		//Assert.assertEquals(0,mal.size());
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testAddObject() {
+		mal.add(new String("aaa"));
+		mal.add(new String("sss"));
+		mal.add(new String("ddd"));
+		mal.add(new String("fff"));
+		mal.add(new String("ggg"));
+		mal.add(new String("hhh"));
+		Assert.assertEquals("aaa", mal.get(0));
+		Assert.assertEquals("sss", mal.get(1));
+		Assert.assertEquals("ddd", mal.get(2));
+		Assert.assertEquals("fff", mal.get(3));
+		Assert.assertEquals("ggg", mal.get(4));
+		Assert.assertEquals("hhh", mal.get(5));
+	}
+	
+	@Test
+	public void testAddIntObject() {
+		Assert.assertEquals("toString():", mal.toString());
+		mal.add(0, new Double(8.0));
+		mal.add(1, new Double(5.0));
+		Assert.assertEquals(8.0, mal.get(0));
+		Assert.assertEquals(5.0, mal.get(1));
+		Assert.assertEquals("toString():8.0	5.0	", mal.toString());
+	}
+
+	@Test
+	public void testRemove() {
+		Assert.assertEquals("toString():", mal.toString());
+		mal.add(1);
+		mal.add(2);
+		mal.add(3);
+		mal.remove(1);
+		Assert.assertEquals("toString():1	3	", mal.toString());
+	}
+
+	@Test
+	public void testGet() {
+		mal.add(new String("aaa"));
+		mal.add(new String("sss"));
+		Assert.assertEquals("sss",mal.get(1));
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(0,mal.size());
+		mal.add("aaa");
+		mal.add(new String("sss"));
+		mal.add(new String("ddd"));
+		mal.add(1, new Double(5.0));
+		Assert.assertEquals(4,mal.size());
+	}
+	
+	@Test
+	public void testToString() {
+		mal.add("aaa");
+		mal.add(new String("sss"));
+		mal.add(new String("ddd"));
+		mal.add(1, new Double(5.0));
+		Assert.assertEquals("toString():aaa	5.0	sss	ddd	", mal.toString());
+	}
+	
+	@Test
+	public void testMyIterator(){
+		Assert.assertEquals(0, mal.size());
+		Assert.assertEquals(false, mal.myIterator().hasNext());
+		mal.add(new Double(2.5));
+		Assert.assertEquals(true, mal.myIterator().hasNext());
+		mal.add(new Double(4.5));
+		mal.add(new Double(6.5));
+		
+		String str = "";
+		for(int i=0; i<mal.size(); i++){
+			str += String.valueOf(mal.get(i)) + ",";
+		}
+		Assert.assertEquals("2.5,4.5,6.5,", str);
+		
+		//mal.myIterator();		�ڲ��Ǿ�̬��ʵ�ֽӿ���δ����ķ��������ܱ�����
+ 
+	}
+
+}
diff --git a/group15/1517_279137987/src/my/collection/linearTestJUnit/MyBinaryTreeNodeTest.java b/group15/1517_279137987/src/my/collection/linearTestJUnit/MyBinaryTreeNodeTest.java
new file mode 100644
index 0000000000..c17efc1f4f
--- /dev/null
+++ b/group15/1517_279137987/src/my/collection/linearTestJUnit/MyBinaryTreeNodeTest.java
@@ -0,0 +1,61 @@
+package my.collection.linearTestJUnit;
+
+import static org.junit.Assert.*;
+import junit.framework.Assert;
+import my.collection.linear.MyBinaryTreeNode;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MyBinaryTreeNodeTest {
+
+	MyBinaryTreeNode tree = new MyBinaryTreeNode();
+	
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testInsert() {
+		Assert.assertEquals(null, tree.getData());
+		Assert.assertEquals(null, tree.getLeft());
+		Assert.assertEquals(null, tree.getRight());
+		
+		tree.insert(new Integer(8));
+		
+		Assert.assertEquals(8, tree.getData());
+		Assert.assertEquals(null, tree.getLeft());
+		Assert.assertEquals(null, tree.getRight());
+		
+		tree.insert(new Integer(12));
+		
+		Assert.assertEquals(8, tree.getData());
+		Assert.assertEquals(null, tree.getLeft());
+		Assert.assertEquals("12", tree.getRight().getData().toString());
+		
+		tree.insert(new Integer(6));
+		
+		Assert.assertEquals(8, tree.getData());
+		Assert.assertEquals("6", tree.getLeft().getData().toString());
+		Assert.assertEquals("12", tree.getRight().getData().toString());
+		
+		tree.insert(new Integer(3));
+		
+		Assert.assertEquals(6, tree.getData());
+		Assert.assertEquals("3", tree.getLeft().getData().toString());
+		Assert.assertEquals(null, tree.getRight());
+		
+		tree.insert(new Integer(7));
+		
+		Assert.assertEquals(6, tree.getData());
+		Assert.assertEquals("3", tree.getLeft().getData().toString());
+		Assert.assertEquals("7", tree.getRight().getData().toString());
+		
+	}
+
+}
diff --git a/group15/1518_164377794/ArrayUtil.java b/group15/1518_164377794/ArrayUtil.java
new file mode 100644
index 0000000000..521f49e201
--- /dev/null
+++ b/group15/1518_164377794/ArrayUtil.java
@@ -0,0 +1,203 @@
+package ArrayUtil;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ArrayUtil {
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		//创建一个容器
+		int[] arr = origin;
+		//置换数组
+		for(int i=0;i<origin.length;i++){
+			origin[origin.length-1-i]=arr[i];
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		List list = new ArrayList();
+		//将数组为0的值过滤，使用list来确定数组长度
+		for(int i=0;i<oldArray.length;i++){
+			if(oldArray[i] != 0){
+				list.add(oldArray[i]);
+			}
+		}
+		int[] arr = new int[list.size()];
+		//判断list是否有值
+		if(list.size()>0){
+			for(int i=0;i<list.size();i++){
+				arr[i] = (int)list.get(i);
+			}
+		}
+		return arr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int a=0,b=0;
+		int[] arr=new int[array1.length+array2.length];
+		for(int i=0;i<array1.length+array2.length;i++){
+			if(a>=array1.length&&b<array2.length){
+				arr[i]=array2[b];
+				b++;
+			}else if(b>=array2.length&&a<array1.length){
+				arr[i]=array1[a];
+				a++;
+			}else if(array1[a]<array2[b]){
+				arr[i]=array1[a];
+				a++;
+			}else{
+				arr[i]=array2[b];
+				b++;
+			}
+		}
+		return  arr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 * @throws Exception 
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		//当输入负数出现下标越位
+		if(size<0){
+			throw new ArrayIndexOutOfBoundsException("存在标越界风险");
+		}
+		//扩容
+		oldArray = Arrays.copyOf(oldArray, oldArray.length+size);
+		return oldArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max<2){
+			return new int[0];
+		}
+		int a=1,b=0,c=0;
+		List list = new ArrayList();
+		//获取符合要求的斐波那契数列
+		for(int i=0;i<max;i++){
+			if(a<max){
+				list.add(a);
+				a=b+a;
+				b=(int)list.get(i);
+			}else{
+				i=max;
+			}
+		}
+		int[] arr = new int[list.size()];
+		//将list值转入数组
+		for(int i=0;i<list.size();i++){
+			arr[i] = (int)list.get(i);
+		}
+		return arr;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max<2){
+			return new int[0];
+		}
+		List list = new ArrayList();
+		for (int n = 2; n <= max; n++) {
+            // 判断n是否是质数
+            int m = (int) Math.sqrt(n);
+            int i = 2;
+            for (; i <= m; i++) {
+                if (n % i == 0)break;
+			}
+            if(i>m)list.add(n);
+		}
+		int[] arr = new int[list.size()];
+		for(int i=0;i<arr.length;i++){
+			arr[i] = (int)list.get(i);
+		}
+		return arr;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int sum=0;
+		List list = new ArrayList();
+		for(int i=2;i<max;i++){
+			sum=0;
+			for(int j=1;j<i;j++){
+				if(i%j==0){
+					sum+=j;
+				}
+			}
+			//判断i否是完数
+			if(sum==i){
+				list.add(sum);
+			}
+		}
+		int[] arr = new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			arr[i]=(int)list.get(i);
+		}
+		return arr;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String str="";
+		for(int i=0;i<array.length;i++){
+			if(i==array.length-1){
+				str+=array[i];
+			}else{
+				str+=array[i]+seperator;
+			}
+		}
+		return str;
+	}
+}
diff --git a/group15/1519_137845093/.classpath b/group15/1519_137845093/.classpath
new file mode 100644
index 0000000000..fceb4801b5
--- /dev/null
+++ b/group15/1519_137845093/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group15/1519_137845093/.gitignore b/group15/1519_137845093/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group15/1519_137845093/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group15/1519_137845093/.project b/group15/1519_137845093/.project
new file mode 100644
index 0000000000..7371704aff
--- /dev/null
+++ b/group15/1519_137845093/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>helloworld</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group15/1519_137845093/3.5_homework/array/ArrayUtil.java b/group15/1519_137845093/3.5_homework/array/ArrayUtil.java
new file mode 100644
index 0000000000..e8660ed7ce
--- /dev/null
+++ b/group15/1519_137845093/3.5_homework/array/ArrayUtil.java
@@ -0,0 +1,210 @@
+package com.coderising.array;
+import java.util.*;
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin.length > 0 && origin != null){
+			int temp;
+            for (int i = 0; i < origin.length / 2; i++) {
+                temp = origin[i];
+                origin[i] = origin[origin.length-1 - i];
+                origin[origin.length-1 - i] = temp;
+            }
+		}
+		else {
+			throw new IndexOutOfBoundsException("原数组有错" );
+			}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if(oldArray.length == 0){
+			return oldArray;
+		}
+		int index = 0;
+		for(int i =0; i< oldArray.length; i++){
+			if(oldArray[index] != 0){
+				oldArray[index] = oldArray[i];
+				index++;
+			}
+		}
+		 return Arrays.copyOf(oldArray, index);
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+	    int length1 = array1.length;  
+	    int length2 = array2.length;  
+	    int newArrayLength = length1 + length2;  
+	    int[] result = new int[newArrayLength];  
+	    int i = 0, j = 0, k = 0;   //i:用于标示1数组    j：用来标示2数组  k：用来标示传入的数组  
+	  
+	    while (i < length1 && j < length2) {  
+	        /* 去重复元素 */  
+	        if (array1[i] < array2[j]) {  
+	            result[k++] = array1[i++];  
+	        } else if (array1[i] == array2[j]) {  
+	            result[k++] = array1[i];  
+	            //在某个位置上2个值相等的话，取哪个都一样，  
+	            // 然后这个相等的位置的2个值都直接向后移动1，继续比较  
+	            j++;  
+	            i++;  
+	        } else {  
+	            result[k++] = array2[j++];  
+	        }  
+	    }  	  
+	    /* 后面while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入结果数组 */  
+	    while (i < length1) {  
+	        result[k++] = array1[i++];  
+	    }  
+	  
+	    while (j < length2) {  
+	        result[k++] = array2[j++];  
+	    }  
+	    return Arrays.copyOf(result, k);
+	}  
+		
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArr = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArr, 0, oldArray.length);
+        return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] array = new int[]{};
+        for(int i=1; getfb(i)<max;i++){
+            array = grow(array, 1);
+            array[i - 1] = getfb(i);
+        }
+        return array;
+	}
+    //获取斐波那契数列中的元素
+	public static int getfb(int i) {
+		if (i == 1 || i == 2) {
+			return 1;
+		}
+		return getfb(i - 1) + getfb(i - 2);
+}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		 int[] prime = new int[]{2};
+	        if (max < 1) throw new IllegalArgumentException("没有比1小的素数");
+	        int j = 1;
+	        for (int i = 3; i < max; i++) {
+	            int k = 2;
+	            //找素数
+	            while (i > k) {
+	                if (i % k == 0)
+	                    break;
+	                k++;
+	            }
+	            //扩容
+	            prime = grow(prime, 1);
+	            prime[j++] = i;
+	        }
+	        return prime;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+	        int[] array = new int[0];
+	        int j = 0;
+	        for (int i = 1; i < max; i++) {
+	            if (isPerfect(i)) {
+	                //加入到数组中
+	                array = grow(array, 1);
+	                array[j] = i;
+	                j++;
+	            }
+	        }
+	        return array;
+	    }
+
+	    //判断一个数是否是“完数”
+	private static boolean isPerfect(int max) {
+	        int i = 1;
+	        int n = 0;
+	        while (i < max) {
+	            if (max % i == 0) {
+	                n += i;
+	            }
+	            i++;
+	        }
+	        if (n == max)
+	            return true;
+	        return false;
+	    }
+
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if (array == null)
+            return null;
+        String s = "";
+        for (int i = 0; i < array.length; i++) {
+            s += array[i];
+            if (i != array.length - 1)
+                s += seperator;
+        }
+        return s;   
+        }
+	
+}
+	
+
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java b/group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java
new file mode 100644
index 0000000000..e0ef246f9b
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java
@@ -0,0 +1,117 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class ArrayList implements List {
+  //Ԫ�ظ���
+	private int size = 0;
+  //��ʼ������Ϊ10
+	private Object[] elementData = new Object[10];
+
+	public void add(Object o) {
+		int len = size + 1;
+		// �ж�list�ĳ����Ƿ�������鳤��
+		if (len > elementData.length) {
+			// ����������
+			Object[] newElemData = new Object[elementData.length + 1];
+			// ���ƾ���������Ԫ�ص�������
+			System.arraycopy(elementData, 0, newElemData, 0, elementData.length);
+			elementData = newElemData;
+		}
+		elementData[size] = o;
+		size++;
+	}
+
+	public void add(int index, Object o) {
+		// ����±��Ƿ�Խ��
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("index:" + index + "Խ�磻" );
+		}
+		// ����Ԫ�ص������ĩβֱ�ӵ���add����
+		if (index == size) {
+			add(o);
+		} else {
+			// ����������
+			Object[] newElemData = new Object[elementData.length + 1];
+			// ����index��ǰ������Ԫ�ص�������
+			System.arraycopy(elementData, 0, newElemData, 0, index);
+			newElemData[index] = o;
+			// ����index ���Ժ��Ԫ�ص�������
+			System.arraycopy(elementData, index, newElemData, index + 1, size - index);
+
+			elementData = newElemData;
+			size++;
+		}
+	}
+
+	public Object get(int index) {
+		if (index < 0 || index >= size) {
+			throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
+		}
+		return elementData[index];
+	}
+
+	public Object remove(int index) {
+		//�±�������鳤�ȵģ��׳��쳣
+		if (index >= size) {
+			throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
+		}		
+		//index�������һ��Ԫ�ص�����ֵ����Ҫɾ������
+		if(index != (size-1)){
+			// ����������
+			Object[] newElemData = new Object[elementData.length];
+			// ����index��ǰ������Ԫ�ص�������
+			System.arraycopy(elementData, 0, newElemData, 0, index);
+			// ����index �Ժ��Ԫ�ص�������
+			System.arraycopy(elementData, index+1, newElemData, index, size - index -1);			
+		}
+		Object removeElement = elementData[index];
+		//��С����ĳ���
+		size--;
+		return removeElement;
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public Iterator iterator() {
+		return new MyItr(this);
+	}
+
+	private class MyItr implements Iterator {
+		private int l = -1;
+		private ArrayList array = null;
+
+		private MyItr(ArrayList array) {
+			this.array = array;
+		}
+
+		@Override
+		public boolean hasNext() {
+			return (l + 1) < array.size;
+		}
+
+		@Override
+		public Object next() {
+			l++;
+			if (l >= array.size) {
+				l = array.size - 1 ;
+				throw new IndexOutOfBoundsException();
+			}
+
+			return array.get(l);
+		}
+
+		@Override
+		public Object remove() {
+			if (l < 0) {
+				throw new NoSuchElementException();
+			}
+			Object val = array.remove(l);
+			l--;
+			return val;
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java b/group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java b/group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java
new file mode 100644
index 0000000000..2d4150183f
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java
@@ -0,0 +1,8 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+	public Object remove();
+
+}
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java b/group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java
new file mode 100644
index 0000000000..7f06138ec1
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java
@@ -0,0 +1,180 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	private int size;
+	
+	public void add(Object o){
+		//�ж���û��ͷ���
+		if(head == null)
+			head = new Node(o,null);
+		else {
+			Node newNode = head;
+			while(newNode.next != null){
+				newNode = newNode.next;
+			}
+			newNode.next = new Node(o,null);
+			
+			}
+		
+	}
+	public void add(int index , Object o){
+		//����±��Ƿ�Խ��
+		if(index < 0 || index > size){
+			throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
+		} 
+		Node node = head;
+		//������ǵ�һ��ͷ���
+		if(index == 0){
+			Node newNode = new Node(o,head);
+			head = newNode;
+			size ++;
+		}
+		else{
+			for(int i = 1; i < index; i++){
+				node = node.next;
+			}
+			//��index������o�����ҽ�o��next�ڵ���Ϊnode.next
+			Node newNode = new Node(o, node.next);
+			node.next = newNode;
+			size++;
+		}				
+}	
+				
+	public Object get(int index){
+		//����±��Ƿ�Խ��
+		if(index < 0 || index > size){
+			throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
+		} 
+		Node node = head;
+		for (int i = 1; i <= index; i++) {
+			node = node.next;
+		}
+		return node.data;
+	}
+	
+	public Object remove(int index){
+		//����±��Ƿ�Խ��
+		if(index < 0 || index > size){
+			throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
+		} 
+		Node node = head;
+		Node removeNode;
+		if (index == 0) {
+			//��һ���ڵ�ֱ�ӽ�ͷ�ڵ�ָ����һ���ڵ�
+			removeNode = head;
+			head = head.next;
+		} 
+		else {
+			//�ҵ�����ֵ��ǰһ���ڵ�
+			for (int i = 1; i < index; i++) {
+				node = node.next;
+			}
+			removeNode = node.next;
+			//ǰһ���ڵ�ָ�룬ָ��ɾ���ڵ���ָ��Ľڵ�
+			node.next = removeNode.next;
+		}
+		size--;
+		return removeNode.data;
+	}
+		
+	
+	public int size(){
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node newNode = new Node(o, head.next);
+		head.next = newNode;
+		size++;
+	}
+	
+	public void addLast(Object o){
+		add(o);
+	}
+	
+	public Object removeFirst(){
+		if(size <= 0){
+			throw new IndexOutOfBoundsException("û��Ԫ�أ�");	
+		}
+		Node node = head;
+		head = head.next;
+		size--;
+		return node.data;	
+	}
+	
+	public Object removeLast(){
+		if(size <= 0){
+			throw new IndexOutOfBoundsException("û��Ԫ�أ�");	
+		}
+		Node node = head;
+		while(node.next != null){
+			node = node.next;
+		}
+		Object val = node.data;
+		node = null;
+		size--;
+		return val;		
+	}
+	private static  class Node{
+		Object data;
+		Node next;
+
+		Node(Object data, Node next) {
+			this.data = data;
+			this.next = next;
+		
+		}
+	}
+
+	
+	
+	
+	public Iterator iterator(){
+		return new Itr(this);
+	}
+	
+    private class Itr implements Iterator{
+        private int l = -1;
+        private LinkedList list;
+		private Itr(LinkedList linkedList) {
+			// TODO Auto-generated constructor stub
+			this.list = list;
+			
+		}
+		
+		@Override
+		public boolean hasNext() {
+			// TODO Auto-generated method stub
+			return l < list.size - 1;
+		}
+
+		@Override
+		public Object next() {
+			// TODO Auto-generated method stub
+			l++;
+			if (l >= list.size) {
+				l--;
+				throw new IndexOutOfBoundsException();
+			}
+
+			return list.get(l);
+		}
+
+		@Override
+		public Object remove() {
+			// TODO Auto-generated method stub
+			if (l < 0) {
+				throw new NoSuchElementException();
+			}
+			Object val = list.removeLast();
+			l--;
+			return val;
+		}
+		
+	}
+	
+    }
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/List.java b/group15/1519_137845093/src_1st_homework_1519_137845093/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java b/group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java
new file mode 100644
index 0000000000..3433125a8b
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java
@@ -0,0 +1,29 @@
+package com.coding.basic;
+import java.util.NoSuchElementException;
+
+public class Queue {
+	private int size;
+	private LinkedList list = new LinkedList();	
+	
+	public void enQueue(Object o){
+		list.addLast(o);
+		size++;
+	}
+	
+	public Object deQueue(){
+		if(size<=0){
+			throw new NoSuchElementException();
+		}
+		Object deQueue = list.removeLast();
+		size--;
+		return deQueue;
+	}
+	
+	public boolean isEmpty(){
+		return (size>=0);
+	}
+	
+	public int size(){
+		return size;
+	}
+}
diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java b/group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java
new file mode 100644
index 0000000000..036baafc73
--- /dev/null
+++ b/group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java
@@ -0,0 +1,39 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int size;
+	private Object removeElement;
+	public void push(Object o){
+		elementData.add(o);
+		size++;
+	}
+	
+	public Object pop(){
+		if(size<=0){
+			throw new NoSuchElementException();
+		}
+		int l = size - 1;
+		removeElement = elementData.remove(l);
+		size--;	
+		return removeElement;
+	}
+	
+	public Object peek(){
+		if(size<=0){
+			throw new NoSuchElementException();
+		}
+		int len = size-1;
+		return elementData.get(len);
+	}
+	
+	public boolean isEmpty(){		 
+		return (size>=0);
+	}
+	
+	public int size(){
+		return size;
+	}
+}
diff --git a/group15/1521_653895972/.gitignore b/group15/1521_653895972/.gitignore
new file mode 100644
index 0000000000..6c9d8afec3
--- /dev/null
+++ b/group15/1521_653895972/.gitignore
@@ -0,0 +1,3 @@
+/out
+.idea
+*.iml
\ No newline at end of file
diff --git a/group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java b/group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..92c581254b
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,73 @@
+package com.coding.coderising.array;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * Created by wanc on 2017/2/28.
+ */
+public class ArrayUtilTest {
+
+    @Test
+    public void testReverseArray() throws Exception {
+        int[] arr = {7, 9, 30, 3};
+        SimpleArrayUtil.reverseArray(arr);
+        System.out.println(Arrays.toString(arr));
+        System.out.println("----------------------置换 end-----------------------------");
+    }
+
+
+    @Test
+    public void testRemoveZero() throws Exception {
+        int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int newArr[] = SimpleArrayUtil.removeZero(oldArr);
+        System.out.println(Arrays.toString(newArr));
+        System.out.println("----------------------去零 end-----------------------------");
+    }
+
+    @Test
+    public void testMerge() throws Exception {
+        int arr1[] = {3, 5, 7, 8};
+        int arr2[] = {4, 5, 6, 7};
+        int arr3[] = SimpleArrayUtil.merge(arr1, arr2);
+        System.out.println(Arrays.toString(arr3));
+        System.out.println("----------------------merge end-----------------------------");
+    }
+
+    @Test
+    public void testGrow() throws Exception {
+        int arr1[] = {3, 5, 7, 8};
+        int[] newArr = SimpleArrayUtil.grow(arr1, 3);
+        System.out.println(Arrays.toString(newArr));
+        System.out.println("----------------------扩展 end-----------------------------");
+    }
+
+    @Test
+    public void testFibonacci() throws Exception {
+        int[] arr = SimpleArrayUtil.fibonacci(15);
+        System.out.println(Arrays.toString(arr));
+        System.out.println("----------------------斐波那契 end-----------------------------");
+    }
+
+    @Test
+    public void testGetPrimes() throws Exception {
+        int[] arr = SimpleArrayUtil.getPrimes(23);
+        System.out.println(Arrays.toString(arr));
+        System.out.println("----------------------素数 end-----------------------------");
+    }
+
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+        int[] newArr = SimpleArrayUtil.getPerfectNumbers(50);
+        System.out.println(Arrays.toString(newArr));
+        System.out.println("----------------------完数 end-----------------------------");
+    }
+
+    @Test
+    public void testJoin() throws Exception {
+        int arr1[] = {3, 5, 7, 8};
+        System.out.println(SimpleArrayUtil.join(arr1, "-"));
+        System.out.println("----------------------Join end-----------------------------");
+    }
+}
\ No newline at end of file
diff --git a/group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java b/group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java
new file mode 100644
index 0000000000..0aa491fb16
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java
@@ -0,0 +1,250 @@
+package com.coding.coderising.array;
+
+public class SimpleArrayUtil {
+
+    private static void checkNull(int[] array) {
+        if (array == null)
+            throw new NullPointerException("array is null");
+    }
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public static void reverseArray(int[] origin) {
+        checkNull(origin);
+        int i = 0;
+        for (int j = origin.length - 1; j > i; ++i) {
+            int tmp = origin[i];
+            origin[i] = origin[j];
+            origin[j] = tmp;
+            --j;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public static int[] removeZero(int[] oldArray) {
+        checkNull(oldArray);
+        if (0 == oldArray.length)
+            return oldArray;
+        int[] temp = new int[oldArray.length];
+        int index = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (0 != oldArray[i]) {
+                temp[index++] = oldArray[i];
+            }
+        }
+        int[] tem2 = new int[index];
+
+        System.arraycopy(temp, 0, tem2, 0, Math.min(oldArray.length, index));
+        return tem2;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+    public static int[] merge(int[] array1, int[] array2) {
+        if (array1 == null && array2 == null)
+            return null;
+        if (array1.length == 0)
+            return array2.clone();
+        if (array2.length == 0)
+            return array1.clone();
+        //判断排序方向
+        boolean sort = array1[0] < array1[array1.length - 1];
+        //去重
+        for (int i = 0; i < array2.length; i++) {
+            boolean flag = true;
+            for (int j = 0; j < array1.length; j++) {
+                if (array2[i] == array1[j]) {
+                    flag = false;
+                    break;
+                }
+            }
+            if (flag) {
+                //扩容
+                array1 = grow(array1, 1);
+                array1[array1.length - 1] = array2[i];
+            }
+        }
+        //排序
+        if (sort) {//小到大
+            int tmp;
+            //冒泡排序
+            for (int i = 0; i < array1.length; i++) {
+                for (int j = i + 1; j < array1.length; j++) {
+                    if (array1[i] > array1[j]) {
+                        tmp = array1[i];
+                        array1[i] = array1[j];
+                        array1[j] = tmp;
+                    }
+                }
+            }
+        } else {//大到小
+            int tmp;
+            //冒泡排序
+            for (int i = 0; i < array1.length; i++) {
+                for (int j = i + 1; j < array1.length; j++) {
+                    if (array1[i] < array1[j]) {
+                        tmp = array1[i];
+                        array1[i] = array1[j];
+                        array1[j] = tmp;
+                    }
+                }
+            }
+        }
+        return array1;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public static int[] grow(int[] oldArray, int size) {
+        int[] newArr = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArr, 0, oldArray.length);
+        return newArr;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public static int[] fibonacci(int max) {
+        int[] arr = new int[]{};
+        int i = 1;
+        while (true) {
+            int a = fb(i);
+            if (a > 15)
+                break;
+            //扩容
+            arr = grow(arr, 1);
+            arr[i - 1] = a;
+            i++;
+        }
+        return arr;
+    }
+
+    /**
+     * 获取斐波那契数
+     * F(0)=1，F(1)=1, F(n)=F(n-1)+F(n-2)（n>=2，n∈N*）
+     */
+    public static int fb(int i) {
+        i = i < 1 ? 1 : i;
+        if (i == 1 || i == 2) {
+            return 1;
+        }
+        return fb(i - 1) + fb(i - 2);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPrimes(int max) {
+        int[] arr = new int[]{2};
+        if (max < 1) throw new IllegalArgumentException("不是大于1的自然数");
+        int j = 1;
+        for (int n = 3; n < max; n++) {
+            int k = 2;
+            while (n > k) {
+                if (n % k == 0)
+                    break;
+                k++;
+            }
+            //扩容
+            arr = grow(arr, 1);
+            arr[j++] = n;
+        }
+        return arr;
+    }
+
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPerfectNumbers(int max) {
+        int[] arr = new int[0];
+        int a = 0;
+        for (int i = 1; i < max; i++) {
+            if (isPerfect(i)) {
+                //扩容
+                arr = grow(arr, 1);
+                arr[a++] = i;
+            }
+        }
+        return arr;
+    }
+
+    //判断 “完数”
+    public static boolean isPerfect(int max) {
+        int i = 1;
+        int n = 0;
+        while (i < max) {
+            if (max % i == 0) {
+                n += i;
+            }
+            i++;
+        }
+        if (n == max)
+            return true;
+        return false;
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public static String join(int[] array, String seperator) {
+        if (array == null)
+            return null;
+        String s = "";
+        for (int i = 0; i < array.length; i++) {
+            s += array[i];
+            if (i != array.length - 1)
+                s += seperator;
+        }
+        return s;
+    }
+
+
+}
diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..273741bbfb
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coding.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author wanc
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..ed20c588fe
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java
@@ -0,0 +1,145 @@
+package com.coding.coderising.litestruts;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+        //解析xml
+        Map xmlInfo = parsersXml(actionName);
+        //获取类名
+        String allName = (String) xmlInfo.get("className");
+        try {
+            //加载类
+            Class cls = Class.forName(allName);
+            //实例化
+            Object object = cls.newInstance();
+            for (String key : parameters.keySet()) {
+                //拼接set方法名
+                String setName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
+                Method setMethod = cls.getDeclaredMethod(setName, String.class);
+                //放射执行set方法
+                setMethod.invoke(object, parameters.get(key));
+            }
+            //执行execute方法
+            Method exectue = cls.getDeclaredMethod("execute", null);
+            String reslut = (String) exectue.invoke(object, null);
+            //执行getMessage方法
+            Method getMessage = cls.getDeclaredMethod("getMessage", null);
+            String message = (String) getMessage.invoke(object, null);
+            //获取xml配置想返回结果
+            String jsp = (String) xmlInfo.get(reslut);
+            //组装view
+            Map map = new HashMap();
+            map.put("message", message);
+            View view = new View();
+            view.setJsp(jsp);
+            view.setParameters(map);
+            return view;
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    private static Map parsersXml(String actionName) {
+        File file = new File(Struts.class.getResource("").getPath() + "/struts.xml");
+        //1.获取DOM解析器工厂
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        HashMap<String, String> map = new HashMap<>();
+        try {
+            //2.获取解析器
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            //3.加载xml文档
+            Document document = builder.parse(file);
+            //4.获取指定action的action集合
+            NodeList actionlist = document.getElementsByTagName("action");
+            //5.如果actionName重复 只去第一个
+            for (int j = 0; j < actionlist.getLength(); j++) {
+                Element actionElement = (Element) actionlist.item(j);
+                if (actionElement.getAttribute("name") != null && actionElement.getAttribute("name").equalsIgnoreCase(actionName)) {
+                    //6.获取 类全限定名
+                    String className = actionElement.getAttribute("class");
+                    map.put("className", className);
+                    //7.获取 action子节点
+                    NodeList childList = actionElement.getChildNodes();
+                    int lenght = childList.getLength();
+                    for (int i = 0; i < lenght; i++) {
+                        Node node = childList.item(i);
+                        //判断为element节点 排除空格 换行
+                        if (node.getNodeType() == Node.ELEMENT_NODE) {
+                            Element child = (Element) node;
+                            switch (child.getAttribute("name")) {
+                                case "success":
+                                    map.put("success", child.getTextContent());
+                                    break;
+                                case "fail":
+                                    map.put("fail", child.getTextContent());
+                                    break;
+                                case "error":
+                                    map.put("error", child.getTextContent());
+                                    break;
+                            }
+                        }
+                    }
+                    break;
+                }
+
+            }
+
+        } catch (ParserConfigurationException e) {
+            e.printStackTrace();
+        } catch (SAXException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+}
diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..8699cc3eca
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coding.coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/View.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/View.java
new file mode 100644
index 0000000000..2c909058cb
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/View.java
@@ -0,0 +1,27 @@
+package com.coding.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml b/group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..bec462fdf5
--- /dev/null
+++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coding.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/1154151360/.classpath b/group16/1154151360/.classpath
index fb5011632c..9746a6c933 100644
--- a/group16/1154151360/.classpath
+++ b/group16/1154151360/.classpath
@@ -2,5 +2,8 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="src/dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="src/junit-3.8.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/group16/1154151360/src/com/array/ArrayUtil.java b/group16/1154151360/src/com/array/ArrayUtil.java
new file mode 100644
index 0000000000..39f587c847
--- /dev/null
+++ b/group16/1154151360/src/com/array/ArrayUtil.java
@@ -0,0 +1,266 @@
+package com.array;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin){
+		
+		int [] temp = new int [origin.length];
+		
+		for (int i = 0; i < temp.length; i++){
+			temp [i] = origin [temp.length - 1 - i];
+		}
+		
+		origin = temp;
+		
+		return origin;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		
+		int newLength = 0;
+		
+		for (int i = 0; i < oldArray.length ; i++){
+			if (oldArray[i] == 0)
+				newLength ++;
+		}
+		
+		int [] newArray = new int [oldArray.length - newLength];
+		int index = 0;
+		for (int j = 0; j < oldArray.length; j++){
+			if (oldArray[j] != 0)
+				newArray[index++] = oldArray[j];
+		}
+		
+		newArray = sort(newArray, 0, newArray.length - 1);
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		
+		int newLength = array1.length + array2.length;
+		int [] newArray = new int [newLength];
+		System.arraycopy(array1, 0, newArray, 0, array1.length);
+		System.arraycopy(array2, 0, newArray, array1.length, array2.length);
+		Set<Integer> arraySet = new HashSet<Integer>();
+		for (int i = 0; i < newArray.length; i++){
+			arraySet.add(newArray[i]);
+		}
+		int [] tempArray = new int[arraySet.size()];
+		Iterator<Integer> iterator = arraySet.iterator();
+		int index = 0;
+		while (iterator.hasNext()){
+			tempArray[index++] = iterator.next();
+		}
+		newArray = sort(tempArray, 0, tempArray.length - 1);
+		return  newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int [] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, size);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if (max > 1){
+			List<Integer> array = new ArrayList<Integer>();
+			array.add(1);
+			array.add(1);
+			for(int i = 2;;i++){
+				array.add(array.get(i - 1) + array.get(i - 2));
+				if (array.get(i) > max){
+					array.remove(i);
+					break;
+				}
+			}
+			int [] result = returnArray(array);
+			return result;
+		}else{
+			int [] b = new int[]{};
+			return b;
+		}
+		
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		ArrayList<Integer> list1 = new ArrayList<Integer>();
+		ArrayList<Integer> list2 = new ArrayList<Integer>();
+		for (int i = 2; i < max; i++){
+			list1.add(i);
+		}
+		
+		for (int m = 0; m < list1.size(); m++){
+			boolean flag = true;
+			for (int n = 2; n < list1.get(m); n++){
+				if (list1.get(m) % n == 0){
+					flag = false;
+					break;
+				}
+				
+			}
+			if (flag)
+				list2.add(list1.get(m));
+		}
+		
+		int [] result = returnArray(list2);
+		
+		return result;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		ArrayList<Integer> array = new ArrayList<Integer>();
+		Map<Integer, ArrayList<Integer>> arrayMap = new HashMap<Integer, ArrayList<Integer>>();
+		ArrayList<Integer> array2 = new ArrayList<Integer>();
+		for (int i = 2; i < max; i++){
+			array.add(i);
+		}
+		for(int m = 0; m < array.size(); m++){
+			ArrayList<Integer> tempArray = new ArrayList<Integer>();
+			for (int n = 2; n < array.get(m);n++){
+				if (array.get(m) % n == 0)
+					tempArray.add(n);
+			}
+			arrayMap.put(array.get(m), tempArray);
+		}
+		for(Map.Entry<Integer, ArrayList<Integer>> entry: arrayMap.entrySet()){
+			Integer key = entry.getKey();
+			ArrayList<Integer> tempArray = entry.getValue();
+			Integer tempInt = 0;
+			for (Integer i:tempArray){
+				tempInt += i;
+			}
+			if (key == tempInt){
+				array2.add(key);
+			}
+		}
+		int [] result = returnArray(array2);
+		
+		return result;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		
+		StringBuilder builder = new StringBuilder();
+		
+		for (int i = 0; i < array.length; i++){
+			builder.append(array[i]);
+			builder.append(seperator);
+		}
+		builder.deleteCharAt(builder.length() - 1);
+		return builder.toString();
+	}
+//***************************工具类*****************************************
+	public int [] returnArray( List list){
+		int [] result = new int[list.size()];
+		int index = 0;
+		Iterator<Integer> iterator = list.iterator();
+		while(iterator.hasNext()){
+			result[index++] = iterator.next();
+		}
+		return result;
+	}
+
+	//快速排序算法
+	public int [] sort (int [] array, int low, int height ){
+		
+		int start = low;
+		int end = height;
+		int key = array[low];
+		
+		while (end > start){
+			//从后往前遍历
+			while (end > start && array[end] >= key)
+				end--;
+			
+			if (array[end] <= key){
+				int temp = array[end];
+				array[end] = array[start];
+				array[start] = temp;
+			}
+			
+			//从前往后遍历
+			while(end > start && array[start] <= key)
+				start++;
+			
+			if (array[start] >= key){
+				int temp = array[start];
+				array[start] = array[end];
+				array[end] = temp;
+			}
+		}
+		
+		if(start > low)sort(array, low, start - 1);
+		if (end < height)sort(array, end + 1, height);
+		
+		return array;
+	}
+//******************************************************************8
+}
diff --git a/group16/1154151360/src/com/array/ArrayUtilTest.java b/group16/1154151360/src/com/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..159d497b6d
--- /dev/null
+++ b/group16/1154151360/src/com/array/ArrayUtilTest.java
@@ -0,0 +1,102 @@
+package com.array;
+
+import static org.junit.Assert.*;
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+@SuppressWarnings("deprecation")
+public class ArrayUtilTest {
+
+	ArrayUtil util;
+	
+	@Before
+	public void init(){
+		util = new ArrayUtil();
+	}
+	
+	@Test
+	public void test_reverseArray() {
+		int [] a = {7, 9, 30, 3, 4};
+		a = util.reverseArray(a);
+		Assert.assertEquals("[4,3,30,9,7]", toString(a));
+	}
+	
+	@Test
+	public void test_removeZero(){
+		int [] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		
+		oldArr = util.removeZero(oldArr);
+		
+		Assert.assertEquals("[1,3,4,5,6,6,5,4,7,6,7,5]", toString(oldArr));
+	}
+	
+	
+	@Test
+	public void test_merge(){
+		int [] a1 = {3, 5, 7,8};
+		int [] a2 = {4, 5, 6,7};
+		int [] a3 = util.merge(a1, a2);
+		
+		Assert.assertEquals("[3,4,5,6,7,8]", toString(a3));
+
+	}
+	
+	@Test
+	public void test_grow(){
+		int [] oldArray = {2,3,6};
+		int size = 3;
+		int [] newArray = util.grow(oldArray, size);
+		
+		Assert.assertEquals("[2,3,6,0,0,0]", toString(newArray));
+	}
+	
+	
+	@Test
+	public void test_fibonacci(){
+		
+		int [] array = util.fibonacci(15);
+		
+		Assert.assertEquals("[1，1，2，3，5，8，13]", toString(array));
+
+	}
+	
+	
+	@Test
+	public void test_getPrimes(){
+		
+		int [] array = util.getPrimes(23);
+		Assert.assertEquals("[2,3,5,7,11,13,17,19]", toString(array));
+
+	}
+	
+	@Test
+	public void test_getPerfectNumbers(){
+		int [] array = util.getPerfectNumbers(10);
+		
+		Assert.assertEquals("[6]", toString(array));
+
+	}
+	
+	@Test
+	public void test_join(){
+		
+		int [] array = {3,8,9};
+		String result = util.join(array, "-");
+		Assert.assertEquals("3-8-9", result);
+	}
+	
+	
+	public String toString(int [] array){
+		StringBuilder builder = new StringBuilder();
+		builder.append("[");
+		for(int item: array){
+			builder.append(item)
+					.append(",");
+		}
+		builder.replace(builder.length() - 1, builder.length(), "");
+		builder.append("]");
+		return builder.toString();
+		
+	}
+}
diff --git a/group16/1154151360/src/com/litestruts/LoginAction.java b/group16/1154151360/src/com/litestruts/LoginAction.java
new file mode 100644
index 0000000000..24369135f9
--- /dev/null
+++ b/group16/1154151360/src/com/litestruts/LoginAction.java
@@ -0,0 +1,40 @@
+package com.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+
+	 private String name ;
+	    private String password;
+	    private String message;
+
+	    public String getName() {
+	        return name;
+	    }
+
+	    public String getPassword() {
+	        return password;
+	    }
+
+	    public String execute(){
+	            if("test".equals(name) && "1234".equals(password)){
+	                this.message = "login successful";
+	                return "success";
+	            }
+	            this.message = "login failed,please check your user/pwd";
+	            return "fail";
+	    }
+
+	    public void setName(String name){
+	        this.name = name;
+	    }
+	    public void setPassword(String password){
+	        this.password = password;
+	    }
+	    public String getMessage(){
+	        return this.message;
+	    }
+}
diff --git a/group16/1154151360/src/com/litestruts/Struts.java b/group16/1154151360/src/com/litestruts/Struts.java
new file mode 100644
index 0000000000..49254d6a5f
--- /dev/null
+++ b/group16/1154151360/src/com/litestruts/Struts.java
@@ -0,0 +1,139 @@
+package com.litestruts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
+
+	/*
+
+		0. 读取配置文件struts.xml
+		
+		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+	*/
+	
+	
+		//创建SAXreader对象
+		SAXReader reader = new SAXReader();
+		//将读取的文件封装成document对象
+		Document document = reader.read(new File("src/com/litestruts/struts.xml"));
+		//获取文档的根节点
+		Element root = document.getRootElement();
+		
+		List<Element> elist = listNode(root);
+		
+		Map <String,Map<String,String>> actionMap =  getAction(elist, actionName);
+		
+		for(Map.Entry<String, Map<String,String>> entity: actionMap.entrySet()){
+			 String className = entity.getKey();
+			 Class clazz = Class.forName(className);
+			 Method setName = clazz.getMethod("setName", String.class);
+			 Method setPassword = clazz.getMethod("setPassword", String.class);
+			 Method getMessage = clazz.getMethod("getMessage");
+			 Method execute = clazz.getMethod("execute");
+			 Object object = clazz.newInstance();
+			 setName.invoke(object, parameters.get("name"));
+			 setPassword.invoke(object, parameters.get("password"));
+			 String status = (String) execute.invoke(object);
+			 String message = (String) getMessage.invoke(object);
+			 
+			 String jsp = entity.getValue().get(status);
+			 
+			 Map<String,String> parameter = new HashMap<String, String>();
+			 
+			 parameter.put("message", message);
+			 
+			 View view = new View();
+			 
+			 view.setJsp(jsp);
+			 view.setParameters(parameter);
+			 
+			 return view;
+		 }
+		 
+		return null;
+	}  
+	
+	//获取节点的所有子节点
+	private static List<Element> listNode(Element node){
+		
+			Iterator<Element> iterator = node.elementIterator();
+			List<Element> elist = new ArrayList<Element>();
+			while (iterator.hasNext()){
+				Element e = iterator.next();
+				elist.add(e);
+			}
+		if (elist.isEmpty())
+			return null;
+		else
+			return elist;
+	}
+	
+	//获取对应的Action信息
+	private static  Map <String,Map<String,String>>  getAction(List<Element> elist,String actionName){
+		
+		for (Element node:elist){
+			List<Attribute> attributes = node.attributes();
+			if (attributes.isEmpty())
+				getAction(listNode(node),actionName);
+			else{
+				Attribute attribute = node.attribute("name");
+				if (attribute.getValue().equals(actionName)){
+					String className = node.attribute("class").getValue();
+					List<Element> childElements = listNode(node);
+					Map<String,String> resMap =install(childElements);
+					Map <String,Map<String,String>> actionMap = new HashMap<String, Map<String,String>>();
+					actionMap.put(className, resMap);
+					return actionMap;
+				}
+			}
+		}
+		return null;
+	}
+	
+	//组装action的result
+	private static Map<String,String> install(List<Element> elements){
+		Map<String,String> resultMap = new HashMap<String, String>();
+		for (Element node: elements){
+			Attribute attribute  = node.attribute("name");
+			String value;
+			if (node.getTextTrim().isEmpty())
+				value = "";
+			else
+				value = node.getTextTrim();
+			
+			resultMap.put(attribute.getValue(), value);
+			
+		}
+		return resultMap;
+	}
+
+}
diff --git a/group16/1154151360/src/com/litestruts/StrutsTest.java b/group16/1154151360/src/com/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..9317cc5e26
--- /dev/null
+++ b/group16/1154151360/src/com/litestruts/StrutsTest.java
@@ -0,0 +1,51 @@
+package com.litestruts;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
+		
+		String actionName = "login";
+		
+		Map<String,String> params = new HashMap<String,String>();
+		params.put("name","test");
+		params.put("password","1234");
+	
+		View view  = Struts.runAction(actionName,params);        
+		
+		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+		Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+		params.put("name","test");
+		params.put("password","123456"); //密码和预设的不一致
+		
+		View view  = Struts.runAction(actionName,params);        
+		
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+}
diff --git a/group16/1154151360/src/com/litestruts/View.java b/group16/1154151360/src/com/litestruts/View.java
new file mode 100644
index 0000000000..af63dce301
--- /dev/null
+++ b/group16/1154151360/src/com/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/1154151360/src/com/litestruts/struts.xml b/group16/1154151360/src/com/litestruts/struts.xml
new file mode 100644
index 0000000000..ddbcbc38da
--- /dev/null
+++ b/group16/1154151360/src/com/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/1287642108/0226/src/com/coding/basic/ArrayList.java b/group16/1287642108/0226/src/com/coding/basic/ArrayList.java
index e287419dc0..f82d064e2a 100644
--- a/group16/1287642108/0226/src/com/coding/basic/ArrayList.java
+++ b/group16/1287642108/0226/src/com/coding/basic/ArrayList.java
@@ -1,63 +1,63 @@
-package com.coding.basic;
-
-public class ArrayList implements List {
-
-	private int size = 0;
-
-	private Object[] elementData = new Object[100];
-
-	public void add(Object o) {
-		IncrementsCapacity(size + 1);
-		elementData[size++] = o;
-
-	}
-
-	public void add(int index, Object o) {
-		checkIndex(index);
-		IncrementsCapacity(size + 1);
-		System.arraycopy(elementData, index, elementData, index + 1, size - index);
-		elementData[index] = o;
-		size++;
-	}
-
-	public Object get(int index) {
-		checkIndex(index);
-		return elementData[index];
-	}
-
-	public Object remove(int index) {
-		checkIndex(index);
-		Object o = elementData[index];
-		System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
-		elementData[--size] = null;
-		return o;
-	}
-
-	public int size() {
-		return size;
-	}
-	
-	public int length() {
-		return elementData.length;
-	}
-
-	// ����
-	private void IncrementsCapacity(int num) {
-		if (num > elementData.length) {
-			int oldCapacity = elementData.length; // ��ǰ���鳤��
-			int newCapacity = ((num + oldCapacity) * 3) >> 2; // ��ǰ���鳤�ȵ�1.5��
-			if (newCapacity - num < 0) {
-				newCapacity = num; // �����������ǲ���,ֱ����Ϊ����ֵ
-			}
-			Object[] oldelements = elementData;
-			elementData = new Object[newCapacity];
-			System.arraycopy(oldelements, 0, elementData, 0, size);
-		}
-	}
-
-	// �±�Խ���ж�
-	private void checkIndex(int index) {
-		if (index >= size || index < 0)
-			throw new IndexOutOfBoundsException("�����±�Խ��");
-	}
-}
+package com.coding.basic;
+
+public class ArrayList implements List {
+
+	private int size = 0;
+
+	private Object[] elementData = new Object[100];
+
+	public void add(Object o) {
+		IncrementsCapacity(size + 1);
+		elementData[size++] = o;
+
+	}
+
+	public void add(int index, Object o) {
+		checkIndex(index);
+		IncrementsCapacity(size + 1);
+		System.arraycopy(elementData, index, elementData, index + 1, size - index);
+		elementData[index] = o;
+		size++;
+	}
+
+	public Object get(int index) {
+		checkIndex(index);
+		return elementData[index];
+	}
+
+	public Object remove(int index) {
+		checkIndex(index);
+		Object o = elementData[index];
+		System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
+		elementData[--size] = null;
+		return o;
+	}
+
+	public int size() {
+		return size;
+	}
+	
+	public int length() {
+		return elementData.length;
+	}
+
+	// ����
+	private void IncrementsCapacity(int num) {
+		if (num > elementData.length) {
+			int oldCapacity = elementData.length; // ��ǰ���鳤��
+			int newCapacity = ((num + oldCapacity) * 3) >> 2; // ��ǰ���鳤�ȵ�1.5��
+			if (newCapacity - num < 0) {
+				newCapacity = num; // �����������ǲ���,ֱ����Ϊ����ֵ
+			}
+			Object[] oldelements = elementData;
+			elementData = new Object[newCapacity];
+			System.arraycopy(oldelements, 0, elementData, 0, size);
+		}
+	}
+
+	// �±�Խ���ж�
+	private void checkIndex(int index) {
+		if (index >= size || index < 0)
+			throw new IndexOutOfBoundsException("�����±�Խ��");
+	}
+}
diff --git a/group16/1287642108/0226/src/com/coding/basic/Iterator.java b/group16/1287642108/0226/src/com/coding/basic/Iterator.java
index e7cbd474ec..ff93e30377 100644
--- a/group16/1287642108/0226/src/com/coding/basic/Iterator.java
+++ b/group16/1287642108/0226/src/com/coding/basic/Iterator.java
@@ -1,6 +1,6 @@
-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/group16/1287642108/0226/src/com/coding/basic/LinkedList.java b/group16/1287642108/0226/src/com/coding/basic/LinkedList.java
index 99c92fb9f1..fc206b4cec 100644
--- a/group16/1287642108/0226/src/com/coding/basic/LinkedList.java
+++ b/group16/1287642108/0226/src/com/coding/basic/LinkedList.java
@@ -1,101 +1,101 @@
-package com.coding.basic;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	private Node tail;
-	private int size = 0 ;
-	
-	public void add(Object o){
-		addLast(o);
-	}
-
-	public void add(int index, Object o) {
-		if (index == 0) {
-			addFirst(o);
-		} else if (index >= size) {
-			addLast(o);
-		} else {
-			Node node = new Node();
-			node.data = o;
-			node.next = getNode(index);
-			getNode(index - 1).next = node;
-			size++;
-		}
-	}
-	
-	public Object get(int index) {
-		Node node = getNode(index);
-		return node.data;
-	}
-	
-	public Object remove(int index){
-		Node currentNode = getNode(index);
-		Node prevNode = getNode(index - 1);
-		Node lastNode = getNode(index + 1);
-		prevNode.next = lastNode;
-		size--;
-		return currentNode.data;
-	}
-	
-	public int size(){
-		return size;
-	}
-	
-	public void addFirst(Object o){
-		  Node node=new Node();  
-		  node.data = o;
-		  node.next = head;  
-          head = node;  
-          size++;  
-	}
-	public void addLast(Object o){
-		 Node node=new Node();  
-		 node.data = o;
-		 node.next = null; 
-         Node lastNode = getNode(size-1);
-         lastNode.next = node;
-         size++;  
-	}
-	public Object removeFirst(){
-		Object obj = getNode(0).data;
-		Node node = getNode(1);
-		node.next = head;
-		size--;
-		return obj;
-	}
-	public Object removeLast(){
-		Object obj = getNode(size - 1).data;
-		Node node = getNode(size - 2);
-		node.next = null;
-		size--;
-		return obj;
-	}
-	
-	//��ȡ�ڵ�
-    public Node getNode(int index){
-    	checkIndex(index);
-    	if(index == 0 ){
-    		return head;
-    	}else if(index == size -1 ){
-    		return tail;
-    	}else{
-    		 Node node = head;
-    	        for(int i=0;i<index;i++){
-    	        	node = node.next;
-    	        }
-    	        return node;
-    	}
-    }
-    
- // �±�Խ���ж�
- 	private void checkIndex(int index) {
- 		if (index >= size || index < 0)
- 			throw new IndexOutOfBoundsException("�����±�Խ��");
- 	}
-	
-	private static class Node {
-		Object data;
-		Node next;
-	}
-}
+package com.coding.basic;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	private Node tail;
+	private int size = 0 ;
+	
+	public void add(Object o){
+		addLast(o);
+	}
+
+	public void add(int index, Object o) {
+		if (index == 0) {
+			addFirst(o);
+		} else if (index >= size) {
+			addLast(o);
+		} else {
+			Node node = new Node();
+			node.data = o;
+			node.next = getNode(index);
+			getNode(index - 1).next = node;
+			size++;
+		}
+	}
+	
+	public Object get(int index) {
+		Node node = getNode(index);
+		return node.data;
+	}
+	
+	public Object remove(int index){
+		Node currentNode = getNode(index);
+		Node prevNode = getNode(index - 1);
+		Node lastNode = getNode(index + 1);
+		prevNode.next = lastNode;
+		size--;
+		return currentNode.data;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		  Node node=new Node();  
+		  node.data = o;
+		  node.next = head;  
+          head = node;  
+          size++;  
+	}
+	public void addLast(Object o){
+		 Node node=new Node();  
+		 node.data = o;
+		 node.next = null; 
+         Node lastNode = getNode(size-1);
+         lastNode.next = node;
+         size++;  
+	}
+	public Object removeFirst(){
+		Object obj = getNode(0).data;
+		Node node = getNode(1);
+		node.next = head;
+		size--;
+		return obj;
+	}
+	public Object removeLast(){
+		Object obj = getNode(size - 1).data;
+		Node node = getNode(size - 2);
+		node.next = null;
+		size--;
+		return obj;
+	}
+	
+	//��ȡ�ڵ�
+    public Node getNode(int index){
+    	checkIndex(index);
+    	if(index == 0 ){
+    		return head;
+    	}else if(index == size -1 ){
+    		return tail;
+    	}else{
+    		 Node node = head;
+    	        for(int i=0;i<index;i++){
+    	        	node = node.next;
+    	        }
+    	        return node;
+    	}
+    }
+    
+ // �±�Խ���ж�
+ 	private void checkIndex(int index) {
+ 		if (index >= size || index < 0)
+ 			throw new IndexOutOfBoundsException("�����±�Խ��");
+ 	}
+	
+	private static class Node {
+		Object data;
+		Node next;
+	}
+}
diff --git a/group16/1287642108/0226/src/com/coding/basic/List.java b/group16/1287642108/0226/src/com/coding/basic/List.java
index 10d13b5832..396b1f6416 100644
--- a/group16/1287642108/0226/src/com/coding/basic/List.java
+++ b/group16/1287642108/0226/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/group16/1287642108/0226/src/com/coding/basic/Queue.java b/group16/1287642108/0226/src/com/coding/basic/Queue.java
index 95dee3d81b..418e42826e 100644
--- a/group16/1287642108/0226/src/com/coding/basic/Queue.java
+++ b/group16/1287642108/0226/src/com/coding/basic/Queue.java
@@ -1,28 +1,28 @@
-package com.coding.basic;
-
-public class Queue {
-	private LinkedList elementData = new LinkedList();
-
-	public void enQueue(Object o){		
-		elementData.addLast(o);
-	}
-	
-	public Object deQueue(){
-		if (isEmpty()) {
-			return null;
-		}else{
-			return elementData.removeFirst();
-		}
-	}
-	
-	public boolean isEmpty(){
-		if (elementData.size() == 0) {
-			return true;
-		}
-		return false;
-	}
-	
-	public int size(){
-		return elementData.size();
-	}
-}
+package com.coding.basic;
+
+public class Queue {
+	private LinkedList elementData = new LinkedList();
+
+	public void enQueue(Object o){		
+		elementData.addLast(o);
+	}
+	
+	public Object deQueue(){
+		if (isEmpty()) {
+			return null;
+		}else{
+			return elementData.removeFirst();
+		}
+	}
+	
+	public boolean isEmpty(){
+		if (elementData.size() == 0) {
+			return true;
+		}
+		return false;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group16/1287642108/0226/src/com/coding/basic/Stack.java b/group16/1287642108/0226/src/com/coding/basic/Stack.java
index c0b7da89f8..6138bc6973 100644
--- a/group16/1287642108/0226/src/com/coding/basic/Stack.java
+++ b/group16/1287642108/0226/src/com/coding/basic/Stack.java
@@ -1,38 +1,38 @@
-package com.coding.basic;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-
-	public void push(Object o) {
-		if (isEmpty()) {
-			elementData.add(elementData.length() - 1, o);
-		}
-		elementData.add(elementData.length() - elementData.size() - 1, o);
-	}
-
-	public Object pop() {
-		if (isEmpty()) {
-			return null;
-		}
-		return elementData.remove(elementData.length() - elementData.size() - 1);
-	}
-
-	public Object peek() {
-		if (isEmpty()) {
-			return null;
-		}
-		return elementData.get(elementData.length() - elementData.size() - 1);
-	}
-
-	public boolean isEmpty() {
-		if (elementData.size() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	public int size() {
-		return elementData.size();
-	}
-
-}
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+
+	public void push(Object o) {
+		if (isEmpty()) {
+			elementData.add(elementData.length() - 1, o);
+		}
+		elementData.add(elementData.length() - elementData.size() - 1, o);
+	}
+
+	public Object pop() {
+		if (isEmpty()) {
+			return null;
+		}
+		return elementData.remove(elementData.length() - elementData.size() - 1);
+	}
+
+	public Object peek() {
+		if (isEmpty()) {
+			return null;
+		}
+		return elementData.get(elementData.length() - elementData.size() - 1);
+	}
+
+	public boolean isEmpty() {
+		if (elementData.size() == 0) {
+			return true;
+		}
+		return false;
+	}
+
+	public int size() {
+		return elementData.size();
+	}
+
+}
diff --git a/group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java b/group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..8e0d8af87b
--- /dev/null
+++ b/group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,205 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = {7, 9 , 30, 3} , 置换后为 {3, 30, 9,7} 如果 a =
+	 * {7, 9, 30, 3, 4} , 置换后为 {4,3, 30 , 9,7}
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int[] temp = new int[origin.length];
+		int index = 0;
+		for (int i = origin.length - 1; i >= 0; i--) {
+			temp[index++] = origin[i];
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		int countZero = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if(oldArray[i] == 0){
+				countZero++;
+			}
+		}
+		
+		int[] temp = new int[oldArray.length - countZero];
+		int index = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				temp[index++] = oldArray[i];
+			}
+		}
+		return temp;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * {3, 5, 7,8} a2 = {4, 5, 6,7} 则 a3 为{3,4,5,6,7,8} , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public Integer[] merge(int[] array1, int[] array2) {
+        Integer[] temp = new Integer[array1.length + array2.length];
+        int i = 0,j = 0;
+        int index = 0;
+        
+        while(i < array1.length && j < array2.length){
+        	if(array1[i] <= array2[j]){
+        		temp[index++] = array1[i++];
+        	}else{
+        		temp[index++] = array2[j++];
+        	}
+        }
+        
+        while(i < array1.length){
+        	temp[index++] = array1[i++];
+        }
+        while(j < array2.length){
+        	temp[index++] = array2[j++];
+        }
+		return removeRepetition(temp);
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = {2,3,6} , size = 3,则返回的新数组为
+	 * {2,3,6,0,0,0}
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] temp = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, temp, 0, oldArray.length);
+		return temp;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		int[] temp = new int[max];
+		if(max == 1){
+			return null;
+		}
+		int index = 0;
+		for(int i = 0;i<max;i++){
+			if(fibonacciNum(i) < max){
+				temp[index++] = fibonacciNum(i);
+			}
+		}
+		return removeZero(temp);
+	}
+
+	public static int fibonacciNum(int n) {
+		if (n <= 1) {
+			return 1;
+		}
+		return fibonacciNum(n-1) + fibonacciNum(n-2);
+	}
+	
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为{2,3,5,7,11,13,17,19}
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		boolean isPrime = false;
+		ArrayList<Integer> temp = new ArrayList<>();
+		for(int i=2; i < max; i++){
+		   isPrime = true;
+		   for (int j = 2; j < i; j++){
+		      if ((i % j) == 0) {
+		         isPrime = false;
+		         break;
+		      }
+		   }
+		   if(isPrime){
+			   temp.add(i);
+		   }
+		}
+		int[] array = new int[temp.size()];
+		int index = 0;
+		for(Integer te : temp){
+			array[index++] = te;
+		}
+		return array;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static Integer[] getPerfectNumbers(int max) {
+		Integer[] temp = new Integer[max];
+		int index = 0;
+		for (int i = 2; i < max; i++) {
+			int sum = 0;
+			for (int j = 1; j < i; j++) {
+				if (i % j == 0) {
+					sum += j;
+				}
+				if (sum == i){
+					temp[index++] = i;
+				}
+			}
+		}
+		return removeRepetition(temp);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= {3,8,9}, seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		String temp = "";
+		for(int i = 0;i < array.length -1; i++){
+			temp += array[i] + seperator;
+		}
+		temp += array[array.length-1];
+		return temp;
+	}
+
+	public static Integer[] removeRepetition(Integer[] oldArray){
+		ArrayList<Integer> temp = new ArrayList<>();  
+		for(int i=0;i<oldArray.length;i++){  
+		    for(int j=i+1;j<oldArray.length;j++){  
+		        if(oldArray[i] == oldArray[j]){  
+		            j = ++i;  
+		        }  
+		    }  
+		    temp.add(oldArray[i]);  
+		}  
+		Integer[] result = (Integer[]) temp.toArray(new Integer[temp.size()]);  
+		return result;
+	}
+	
+}
diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/LoginAction.java b/group16/1287642108/0305/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..904daea228
--- /dev/null
+++ b/group16/1287642108/0305/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,41 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    
+    public String getPassword() {
+        return password;
+    }
+    
+    public void setPassword(String password){
+        this.password = password;
+    }
+    
+    public String getMessage(){
+        return this.message;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+}
diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/Struts.java b/group16/1287642108/0305/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..cb20956a88
--- /dev/null
+++ b/group16/1287642108/0305/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,57 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+    public static View runAction(String actionName, Map<String,String> parameters) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+        //创建SAXReader读取器，专门用于读取xml  
+    	SAXReader saxReader = new SAXReader();  
+        Document document = null;
+		try {
+			 document = saxReader.read(new File("D:/DemoSpace/coding2017/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml"));
+			 Element root = document.getRootElement(); 
+			 //根据节点名称找节点
+			 Node node = root.selectSingleNode("action[@name='"+actionName+"']");
+			 String classPath = ((Element) node).attributeValue("class");
+			 //根据类名反射实例化
+			 Class<?> onwClass = Class.forName(classPath);
+			 Object o = onwClass.newInstance();
+			 Method setName = onwClass.getMethod("setName",String.class);
+	         Method setPassword = onwClass.getMethod("setPassword",String.class);
+	         Method execute = onwClass.getMethod("execute");
+	         Method getName = onwClass.getMethod("getName");
+	         Method getPassword = onwClass.getMethod("getPassword");
+	         Method getMessage = onwClass.getMethod("getMessage");
+	         setName.invoke(o,parameters.get("name"));
+	         setPassword.invoke(o,parameters.get("password"));
+	         String result = (String) execute.invoke(o);
+	         //组装params参数
+	         HashMap<String,String> map = new HashMap<>();
+	         String name = (String) getName.invoke(o);
+	         String password = (String) getPassword.invoke(o);
+	         String message = (String) getMessage.invoke(o);
+	         map.put("name", name);
+	         map.put("password", password);
+	         map.put("message", message);
+	         //组装view数据
+	         View view = new View();
+	         view.setParameters(map);
+	         //根据execute的返回值，找对应的jsp页面路径
+	         String jspPath = node.valueOf("//result[@name='"+result+"']");
+	         view.setJsp(jspPath);
+	         return view;
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+    	return null;
+    }   
+}
diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java b/group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..2a8ed76022
--- /dev/null
+++ b/group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/View.java b/group16/1287642108/0305/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group16/1287642108/0305/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml b/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e22003fc12
--- /dev/null
+++ b/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts> 
\ No newline at end of file
diff --git a/group16/1325756593/src/com/coderising/array/ArrayUtil.java b/group16/1325756593/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..0f67e6b54f
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,273 @@
+package com.coderising.array;
+
+import static org.hamcrest.CoreMatchers.nullValue;
+
+import java.util.Arrays;
+
+import com.dong.week1.ArrayList;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin==null||origin.length==0){
+			return;
+		}
+		int len = origin.length;
+		for(int i=0;i<len/2;i++){
+			int temp = origin[i];
+			origin[i]=origin[len-i-1];
+			origin[len-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 newArrayLen=0;
+		int len = oldArray.length;
+		for(int i=0;i<len;i++){
+			if(oldArray[i]!=0){
+				newArrayLen++;
+			}
+		}
+		int[] retArray = new int[newArrayLen];
+		int retIndex=0;
+		for(int i=0;i<len;i++){
+			if(oldArray[i]!=0){
+				retArray[retIndex++]=oldArray[i];
+			}
+		}
+		return retArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int len1 = array1.length;
+		int len2 = array2.length;	
+		int index1=0,index2=0;
+		ArrayList arrayList = new ArrayList();
+		while(index1<len1&&index2<len2){
+		
+			if(array1[index1]>array2[index2]){
+				arrayList.add(array2[index2]);
+				index2++;
+			}else if(array1[index1]==array2[index2]){
+				arrayList.add(array2[index2]);
+				index1++;
+				index2++;
+			}
+			else{
+				arrayList.add(array1[index1]);			
+				index1++;
+			}			
+		}
+		if(index1==len1){
+			for(int i=index2;i<len2;i++){
+				arrayList.add(array2[i]);
+			}
+			
+		}else{
+			for(int i=index1;i<len1;i++){
+				arrayList.add(array1[i]);
+			}
+		}
+		return ListToArray(arrayList);
+	}
+	
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		
+		return Arrays.copyOf(oldArray, oldArray.length+size);
+		
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		ArrayList arrayList = new ArrayList();
+		int first=1;
+		int second=1;
+		int third=0;
+		for(int i=1;i<max;i++){	
+			if(i==1){
+				arrayList.add(first);
+				arrayList.add(second);
+			}			
+			third= first+second;
+			if(third>=max){
+				break;
+			}
+			arrayList.add(third);
+			first = second;
+			second=third;
+			
+			
+		}
+		return ListToArray(arrayList);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		ArrayList arrayList = new ArrayList();
+		for(int i=2;i<max;i++){
+			if(isPrime(i)){
+				arrayList.add(i);
+			}
+		}
+		return ListToArray(arrayList);
+	}
+	
+	public int[] getAbsolutePrimes(int max){
+		ArrayList arrayList = new ArrayList();
+		for(int i=2;i<=max;i++){
+			if(isPrime(i)){
+				arrayList.add(i);
+			}
+		}		
+		return ListToArray(arrayList);
+	}
+	
+	public static int[] ListToArray(ArrayList arrayList){
+		if(arrayList==null){
+			return null;
+		}
+		int[] retArray = new int[arrayList.size()];
+		for(int i=0;i<retArray.length;i++){
+			retArray[i] =(int) arrayList.get(i);
+		}
+		return retArray;
+	}
+	
+	
+	
+	private boolean isPrime(int input){
+		
+		if(input==2){
+			return true;
+		}
+		for(int i=2;i<=Math.sqrt(input);i++){
+			if(input%i==0){
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		ArrayList arrayList = new ArrayList();
+		if(max==1){
+			arrayList.add(1);
+		}
+		for(int i=1;i<max;i++){
+			if (new ArrayUtil().isPerfect(i)) {
+				arrayList.add(i);
+			}
+		}
+		
+		 return ListToArray(arrayList);
+	}
+	
+	
+	public boolean isPerfect(int i){
+		int itemp = i;
+		if(i==1){
+			return true;
+		}
+		int[] primes = this.getAbsolutePrimes(i);
+		ArrayList arrayList = new ArrayList();
+		arrayList.add(1);
+		
+		
+		while(i!=1){
+			for(int div:primes){
+				if(i%div==0){
+					arrayList.add(div);
+					i=i/div;
+				}
+			}
+		}
+		int sum = getSum(arrayList);
+		if(sum==itemp){
+			return true;
+		}
+		return false;
+	}
+
+	private int getSum(ArrayList arrayList) {
+		int sum = 0;
+		for(int j=0;j<arrayList.size();j++){
+			sum += (int)arrayList.get(j);
+		}
+		return sum;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为""3-8-9
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer sb = new StringBuffer();
+		if(array==null){
+			return null;
+		}else{
+			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/group16/1325756593/src/com/coderising/array/ArrayUtilTest.java b/group16/1325756593/src/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..13d1989851
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,80 @@
+package com.coderising.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		int[] input = {7, 9 , 30, 3};
+		new ArrayUtil().reverseArray(input);
+		int[] inputResult = {3, 30, 9,7};
+		assertArrayEquals(inputResult, input);
+		
+		int[] input1 = {7, 9, 30, 3, 4};
+		new ArrayUtil().reverseArray(input1);
+		int[] inputResult1 = {4,3, 30 , 9,7};
+		assertArrayEquals(inputResult1, input1);
+	}
+	
+	@Test
+	public void removeZero() {
+		 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		 int retArr[] =  {1,3,4,5,6,6,5,4,7,6,7,5} ;
+		assertArrayEquals(retArr, new ArrayUtil().removeZero(oldArr));
+	}
+
+	@Test
+	public void grow(){
+		int[] array = {2,3,6};
+		
+		int[] retArray = {2,3,6,0,0,0};
+		assertArrayEquals(new ArrayUtil().grow(array, 3),retArray );
+		
+	}
+	
+	@Test
+	public void join(){
+		int[] array = {3,8,9};
+		
+		
+		assertEquals(new ArrayUtil().join(array, "-"), "3-8-9");
+		
+	}
+	
+	@Test
+	public void getPrimes(){
+		// 23, 返回的数组为[2,3,5,7,11,13,17,19]
+		int[] array = {2,3,5,7,11,13,17,19};
+		
+		
+		assertArrayEquals(new ArrayUtil().getPrimes(23), array);
+		
+	}
+	
+	@Test
+	public void getPerfectNumbers(){
+		// 23, 返回的数组为[2,3,5,7,11,13,17,19]
+		int[] array = {1,6};
+		
+		
+		assertArrayEquals(new ArrayUtil().getPerfectNumbers(7), array);
+		
+	}
+	
+	@Test
+	public void fibonacci(){
+		// 23, 返回的数组为[2,3,5,7,11,13,17,19]
+		int[] array =  {1,1,2,3,5,8,13,21};
+		
+		
+		assertArrayEquals(new ArrayUtil().fibonacci(23), array);
+		
+	}
+	
+	
+	
+	
+}
\ No newline at end of file
diff --git a/group16/1325756593/src/com/coderising/litestruts/Action.java b/group16/1325756593/src/com/coderising/litestruts/Action.java
new file mode 100644
index 0000000000..0aef721e3e
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/litestruts/Action.java
@@ -0,0 +1,36 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class Action {
+	private String actioName;
+	private String className;
+	private Map<String,String> resultAndViewMap;
+	public String getActioName() {
+		return actioName;
+	}
+	public void setActioName(String actioName) {
+		this.actioName = actioName;
+	}
+	@Override
+	public String toString() {
+		return "Action [actioName=" + actioName + ", className=" + className + ", resultAndViewMap=" + resultAndViewMap
+				+ "]";
+	}
+	public String getClassName() {
+		return className;
+	}
+	public void setClassName(String className) {
+		this.className = className;
+	}
+	public Map<String, String> getResultAndViewMap() {
+		return resultAndViewMap;
+	}
+	public void setResultAndViewMap(Map<String, String> resultAndViewMap) {
+		this.resultAndViewMap = resultAndViewMap;
+	}
+	
+	
+	
+
+}
diff --git a/group16/1325756593/src/com/coderising/litestruts/LoginAction.java b/group16/1325756593/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group16/1325756593/src/com/coderising/litestruts/Struts.java b/group16/1325756593/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..ae6289d5f0
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,246 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+
+public class Struts {
+	
+	public static String strutsPath;
+	
+
+	public static String getStrutsPath() {
+		return strutsPath;
+	}
+
+	public static void setStrutsPath(String strutsPath) {
+		Struts.strutsPath = strutsPath;
+	}
+
+
+
+
+	public static View runAction(String actionName, Map<String,String> parameters) throws ParserConfigurationException, SAXException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+		if(strutsPath==null||strutsPath.equals("")){
+			strutsPath = initStrutsPath();
+		}
+    	List<Action> actions = parseXml(strutsPath);
+    	Action action = getAction(actions,actionName);  	
+    	NotBeNull(action);  	
+    	
+    	
+    	String actionClassName = action.getClassName();
+    	Class actionClass =  Class.forName(actionClassName);
+    	Object actionClassObject  = actionClass.newInstance();
+
+    	doSetterMethod(parameters, actionClass, actionClassObject);
+    	
+    	Method excuteMethod = actionClass.getMethod("execute", null);
+    	String result = excuteMethod.invoke(actionClassObject, null).toString();
+    	String viewPath = action.getResultAndViewMap().get(result);
+    	View view = new View();
+    	view.setJsp(viewPath);
+    	Map<String, Object> parametersMap = doGetterMethod(actionClass, actionClassObject);
+    	view.setParameters(parametersMap);
+    
+    	return view;
+    }
+
+	
+	/**
+	 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+	 * @param actionClass
+	 * @param actionClassObject
+	 * @return
+	 * @throws IllegalAccessException
+	 * @throws InvocationTargetException
+	 */
+	private static Map<String, Object> doGetterMethod(Class actionClass, Object actionClassObject)
+			throws IllegalAccessException, InvocationTargetException {
+		Map<String,Object> parametersMap = new HashMap<>();
+    	for(Method method :actionClass.getMethods()){
+    		if(method.getName().startsWith("get")){
+    			String getValue =   getMethodValue(method.getName());
+    			parametersMap.put(getValue, method.invoke(actionClassObject, null));
+    		}    		
+    	}
+		return parametersMap;
+	}
+
+	/**
+	 * 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+	 * @param parameters
+	 * @param actionClass
+	 * @param actionClassObject
+	 * @throws NoSuchMethodException
+	 * @throws IllegalAccessException
+	 * @throws InvocationTargetException
+	 */
+	private static void doSetterMethod(Map<String, String> parameters, Class actionClass, Object actionClassObject)
+			throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+		for( Map.Entry<String, String> entry: parameters.entrySet()){
+    		String param = entry.getKey();
+    		Method methodKeySet = actionClass.getMethod(getMethodSet(param), String.class);
+    		methodKeySet.invoke(actionClassObject, entry.getValue());		
+    	}
+	}
+
+	/**
+	 * 初始化strutsPath
+	 * @return
+	 */
+	private static String initStrutsPath() {
+		String path = Struts.class.getClassLoader().getResource("").getPath();
+    	String strutsXmlPath = path+"/com/coderising/litestruts/struts.xml";
+		return strutsXmlPath;
+	}   
+    
+
+	/**
+	 * 通过name构造setName
+	 * @param name
+	 * @return
+	 */
+	public static String getMethodSet(String name){
+	   String firstChar = name.substring(0, 1).toUpperCase();
+	   return "set"+firstChar+name.substring(1);
+	}
+	
+	/**
+	 * 获取getMessage对应的message
+	 * @param name
+	 * @return
+	 */
+	public static String getMethodValue(String name){
+		if(name.length()>=3){
+			name = name.substring(3);
+		}
+		 String firstChar = name.substring(0, 1).toLowerCase();
+		  return firstChar+name.substring(1);
+		}
+	
+   
+    
+    /**
+     * 将xml解析成为Action的List结构
+     * @param xmlPath
+     * @return
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws IOException
+     */
+    public static List<Action> parseXml(String xmlPath) throws ParserConfigurationException, SAXException, IOException{
+    	List<Action> retActionList = new ArrayList<>();
+    	File xmlFile = new File(xmlPath);
+    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    	DocumentBuilder builder = factory.newDocumentBuilder();
+    	Document doc = builder.parse(xmlFile);
+    	NodeList actionLists = doc.getElementsByTagName("action");
+    	for(int i=0;i<actionLists.getLength();i++){
+    		Node currentNode= actionLists.item(i);
+    		Action action = new Action();
+    		
+    		String actionName = getAttribute(currentNode,"name");
+    		String actionClass = getAttribute(currentNode,"class");
+    		action.setActioName(actionName);
+    		action.setClassName(actionClass);
+    		HashMap<String, String> resultAndViewMap=getResultAndViewNodeList(currentNode);
+    		action.setResultAndViewMap(resultAndViewMap);
+    		retActionList.add(action);
+    	}
+    	return retActionList;
+    }
+
+    /**
+     * 获取该Node对应的result和对应的jsppath
+     * @param currentNode
+     * @param resultAndViewMap
+     */
+	private static HashMap<String, String> getResultAndViewNodeList(Node currentNode) {
+		Map<String, String> resultAndViewMap = new HashMap<>();
+		NodeList resultAndViewNodeList =   currentNode.getChildNodes();
+		
+		for(int j=0;j<resultAndViewNodeList.getLength();j++){
+			Node resultAndViewNode= resultAndViewNodeList.item(j);
+			if("result".equals(resultAndViewNode.getNodeName())){
+				String result = getAttribute(resultAndViewNode,"name");
+				String viewPath = resultAndViewNode.getTextContent();
+				NotBeNull(result);
+				NotBeNull(viewPath);
+				resultAndViewMap.put(result, viewPath);   	
+			}    					
+		}
+		return (HashMap<String, String>) resultAndViewMap;
+	}
+
+	
+	private static void NotBeNull(Object result) {
+		if(result==null){
+			throw new IllegalArgumentException();
+		}
+	}
+	
+
+    
+    public static String getAttribute(Node node ,String name){
+    	NamedNodeMap nameNodeMap = node.getAttributes();
+    	NotBeNull(nameNodeMap);
+    	Node nameNode = nameNodeMap.getNamedItem(name);
+    	NotBeNull(nameNode);
+		String actionName =nameNode.getNodeValue();
+		return actionName;
+    }
+    
+    public static Action getAction(List<Action> actions ,String actionName){
+    	for(Action action:actions){
+    		if(action.getActioName().equals(actionName)){
+    			return action;
+    		}
+    	}
+		return null;
+    	
+    }
+    
+    
+
+}
diff --git a/group16/1325756593/src/com/coderising/litestruts/StrutsTest.java b/group16/1325756593/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..487f05542c
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,48 @@
+package com.coderising.litestruts;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ParserConfigurationException, SAXException, IOException {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ParserConfigurationException, SAXException, IOException {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group16/1325756593/src/com/coderising/litestruts/View.java b/group16/1325756593/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/1325756593/src/com/coderising/litestruts/struts.xml b/group16/1325756593/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..07f80b6476
--- /dev/null
+++ b/group16/1325756593/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/214074094/src/com/coding/basic/ArrayList.java b/group16/214074094/src/com/coding/basic/ArrayList.java
deleted file mode 100644
index 158c866d45..0000000000
--- a/group16/214074094/src/com/coding/basic/ArrayList.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package coding.basic;
-
-
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-/**
- * @Author shane
- * @Time 2017/2/25 13:06
- * @Email stevenchenguang@gmail.com
- * @Desc OwnArrayList
- */
-public class ArrayList implements List {
-
-    private int size = 0;
-
-    private final static Object[] EMPTY_ELEMENTDATA = {};
-
-    /**
-     * 默认容量
-     */
-    private static int DEFAULT_CAPACITY = 10;
-
-    private Object[] elementData;
-
-    public ArrayList() {
-        this.elementData = EMPTY_ELEMENTDATA;
-    }
-
-    @Override
-    public void add(Object o) {
-        if (elementData == EMPTY_ELEMENTDATA) {
-            elementData = Arrays.copyOf(elementData, DEFAULT_CAPACITY);
-            elementData[0] = o;
-        } else if (size < elementData.length) {
-            elementData[size] = o;
-        } else {
-            _grow();
-            elementData[size] = o;
-        }
-        size++;
-        _analyze();
-    }
-
-    @Override
-    public void add(int index, Object o) {
-        if (index < 0) {
-            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
-        }
-        if (elementData == EMPTY_ELEMENTDATA) {
-            if (index != 0) {
-                throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
-            } else {
-                elementData = new Object[DEFAULT_CAPACITY];
-                elementData[0] = o;
-            }
-        } else if (index > size) {
-            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
-        } else if (index == size) {
-            _grow();
-            elementData[size] = o;
-            size++;
-        } else {
-            if (elementData.length == size) {
-                _grow();
-            }
-            System.arraycopy(elementData, index, elementData, index + 1, size - index);
-            elementData[index] = o;
-            size++;
-        }
-        _analyze();
-    }
-
-    @Override
-    public Object get(int index) {
-        if (index < 0 || index > size) {
-            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
-        }
-        return elementData[index];
-    }
-
-    @Override
-    public Object remove(int index) {
-
-        if (index < 0 || index > size) {
-            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
-        }
-        Object oldValue = elementData[index];
-        //需要复制的长度
-        int needMoveLength = size - index - 1;
-        //如果该长度小于0,　说明只有一个元素,　直接置空即可
-        if (needMoveLength > 0) {
-            System.arraycopy(elementData, index + 1, elementData, index, needMoveLength);
-        }
-        elementData[--size] = null;
-        _analyze();
-        return oldValue;
-    }
-
-    @Override
-    public int size() {
-        return size;
-    }
-
-    public Iterator iterator() {
-        return new ArrayListItrator();
-    }
-
-    /**
-     * @Author: shane
-     * @Time: 2017/2/25 20:18
-     * @Email: stevenchenguang@gmail.com
-     * @param:
-     * @Return:
-     * @Throw:
-     * @Desc: 返回真实长度的数组数据
-     */
-    private void _analyze() {
-        if (size < elementData.length) {
-            elementData = Arrays.copyOf(elementData, size);
-        }
-    }
-
-    /**
-     * @Author: shane
-     * @Time: 2017/2/25 20:19
-     * @Email: stevenchenguang@gmail.com
-     * @param:
-     * @Return:
-     * @Throw:
-     * @Desc: 将数组的长度扩容至2倍
-     */
-    private void _grow() {
-        elementData = Arrays.copyOf(elementData, elementData.length << 1);
-    }
-
-    @Override
-    public String toString() {
-        return Arrays.toString(elementData);
-    }
-
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    private class ArrayListItrator implements Iterator {
-
-        private int position = 0;
-
-        @Override
-        public boolean hasNext() {
-            return position != size;
-        }
-
-        @Override
-        public Object next() {
-            int i = position;
-            if (i >= size) {
-                throw new NoSuchElementException();
-            }
-            position = i + 1;
-            return elementData[i];
-        }
-    }
-}
diff --git a/group16/214074094/src/com/coding/basic/BinaryTreeNode.java b/group16/214074094/src/com/coding/basic/BinaryTreeNode.java
deleted file mode 100644
index b40066ebe1..0000000000
--- a/group16/214074094/src/com/coding/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package coding.basic;
-
-public class BinaryTreeNode {
-
-    private Object data;
-
-    private BinaryTreeNode left;
-
-    private BinaryTreeNode right;
-
-    public Object getData() {
-        return data;
-    }
-
-    public void setData(Object data) {
-        this.data = data;
-    }
-
-    public BinaryTreeNode getLeft() {
-        return left;
-    }
-
-    public void setLeft(BinaryTreeNode left) {
-        this.left = left;
-    }
-
-    public BinaryTreeNode getRight() {
-        return right;
-    }
-
-    public void setRight(BinaryTreeNode right) {
-        this.right = right;
-    }
-
-    public BinaryTreeNode insert(Object o) {
-        return null;
-    }
-
-}
diff --git a/group16/214074094/src/com/coding/basic/Iterator.java b/group16/214074094/src/com/coding/basic/Iterator.java
deleted file mode 100644
index 1acc5349a4..0000000000
--- a/group16/214074094/src/com/coding/basic/Iterator.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package coding.basic;
-
-public interface Iterator {
-
-    boolean hasNext();
-
-    Object next();
-
-}
diff --git a/group16/214074094/src/com/coding/basic/LinkedList.java b/group16/214074094/src/com/coding/basic/LinkedList.java
deleted file mode 100644
index 9108c2b6fe..0000000000
--- a/group16/214074094/src/com/coding/basic/LinkedList.java
+++ /dev/null
@@ -1,222 +0,0 @@
-package coding.basic;
-
-/**
- * @Author shane
- * @Time 2017/2/25 21:01
- * @Email stevenchenguang@gmail.com
- * @Desc OwnLinkedList
- */
-public class LinkedList implements List {
-
-    private int size = 0;
-
-    private Node first;
-
-    private Node last;
-
-    public void add(Object o) {
-        if (size == 0) {
-            first = new Node(null, o, null);
-            last = first;
-            size++;
-        } else {
-            addLast(o);
-        }
-    }
-
-    public void add(int index, Object o) {
-        _checkIndex(index);
-        if (index == size - 1) {
-            addLast(o);
-        } else {
-            Node prev = _node(index);
-            Node next = _node(index + 1);
-            Node newNode = new Node(prev, o, next);
-            prev.next = newNode;
-            next.prev = newNode;
-            size++;
-        }
-    }
-
-    public Object get(int index) {
-        _checkIndex(index);
-        return node(index);
-    }
-
-    public Object remove(int index) {
-        _checkIndex(index);
-        if (index == 0) {
-            return removeFirst();
-        } else if (index == size - 1) {
-            return removeLast();
-        }
-        Node curr = _node(index);
-        Object data = curr.data;
-        final Node prev = curr.prev;
-        final Node next = curr.next;
-
-        prev.next = next;
-        next.prev = prev;
-        curr = null;
-        size--;
-
-        return data;
-    }
-
-    private Object removeFirst() {
-        Node oldFirst = first;
-        Object data = first.data;
-        final Node oldSecond = oldFirst.next;
-        if (null == oldSecond) {
-            first = null;
-            last = null;
-        } else {
-            oldSecond.prev = null;
-            first = oldSecond;
-            oldFirst = null;
-        }
-        size--;
-        return data;
-    }
-
-    private Object removeLast() {
-        Node oldLast = last;
-        Object data = last.data;
-        final Node oldLastButOne = last.prev;
-        if (null == oldLastButOne) {
-            first = null;
-            last = null;
-        } else {
-            oldLastButOne.next = null;
-            last = oldLastButOne;
-            oldLast = null;
-        }
-        size--;
-        return data;
-    }
-
-    public void addFirst(Object o) {
-        final Node oldFirst = first;
-        final Node param = new Node(null, o, null);
-        if (null == oldFirst) {
-            first = param;
-        } else {
-            oldFirst.prev = param;
-            param.next = oldFirst;
-            first = param;
-        }
-        size++;
-    }
-
-    public void addLast(Object o) {
-        final Node n = last;
-        final Node newNode = new Node(n, o, null);
-        last = newNode;
-        n.next = newNode;
-        size++;
-    }
-
-    public int size() {
-        return size;
-    }
-
-    public Iterator iterator() {
-        return null;
-    }
-
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    private static class Node {
-        Node prev;
-        Object data;
-        Node next;
-
-        public Node(Node prev, Object data, Node next) {
-            this.prev = prev;
-            this.data = data;
-            this.next = next;
-        }
-    }
-
-    /**
-     * @Author: shane
-     * @Time: 2017/2/25 22:44
-     * @Email: stevenchenguang@gmail.com
-     * @param: int index
-     * @Return: Node
-     * @Throw:
-     * @Desc: 根据下标获取节点元素上的数据
-     */
-    private Object node(int index) {
-        //如果下标在左一半, 从左往右取
-        if (index < size >> 1) {
-            Node tmp = first;
-            for (int i = 0; i < index; i++) {
-                tmp = tmp.next;
-            }
-            return tmp.data;
-        } else {
-            Node tmp = last;
-            for (int i = size - 1; i > index; i--) {
-                tmp = tmp.prev;
-            }
-            return tmp.data;
-        }
-    }
-
-    /**
-     * @Author: shane
-     * @Time: 2017/2/25 22:44
-     * @Email: stevenchenguang@gmail.com
-     * @param: int index
-     * @Return: Node
-     * @Throw:
-     * @Desc: 根据下标获取节点元素
-     */
-    private Node _node(int index) {
-        //如果下标在左一半, 从左往右取
-        if (index < size >> 1) {
-            Node tmp = first;
-            for (int i = 0; i < index; i++) {
-                tmp = tmp.next;
-            }
-            return tmp;
-        } else {
-            Node tmp = last;
-            for (int i = size - 1; i > index; i--) {
-                tmp = tmp.prev;
-            }
-            return tmp;
-        }
-    }
-
-    /**
-     * @Author: shane
-     * @Time: 2017/2/25 22:43
-     * @Email: stevenchenguang@gmail.com
-     * @param: int index
-     * @Return:
-     * @Throw: IndexOutOfBoundsException
-     * @Desc: 校验下标是否合法
-     */
-    private void _checkIndex(int index) {
-        if (index < 0 || index >= size) {
-            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
-        }
-    }
-
-    @Override
-    public String toString() {
-        if (0 == size) {
-            return "[]";
-        }
-        StringBuffer sb = new StringBuffer();
-        for (int i = 0; i < this.size; i++) {
-            sb.append(get(i)).append(", ");
-        }
-        String tmp = sb.substring(0, sb.length() - 2);
-        return "[" + tmp + "]";
-    }
-}
\ No newline at end of file
diff --git a/group16/214074094/src/com/coding/basic/List.java b/group16/214074094/src/com/coding/basic/List.java
deleted file mode 100644
index 5da9b0d4c6..0000000000
--- a/group16/214074094/src/com/coding/basic/List.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package coding.basic;
-
-public interface List {
-
-    void add(Object o);
-
-    void add(int index, Object o);
-
-    Object get(int index);
-
-    Object remove(int index);
-
-    int size();
-
-}
diff --git a/group16/214074094/src/com/coding/basic/Queue.java b/group16/214074094/src/com/coding/basic/Queue.java
deleted file mode 100644
index 869d0f7333..0000000000
--- a/group16/214074094/src/com/coding/basic/Queue.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package coding.basic;
-
-/**
- * @Author shane
- * @Time 2017/2/26 17:19
- * @Email stevenchenguang@gmail.com
- * @Desc Own Queue
- */
-public class Queue {
-
-    private LinkedList elementData = new LinkedList();
-
-    public void enQueue(Object o) {
-        elementData.add(o);
-    }
-
-    public Object deQueue() {
-        if (isEmpty()) {
-            throw new RuntimeException("Queue is empty");
-        }
-        return elementData.remove(0);
-    }
-
-    public boolean isEmpty() {
-        return elementData.isEmpty();
-    }
-
-    public int size() {
-        return elementData.size();
-    }
-
-    @Override
-    public String toString() {
-        return elementData.toString();
-    }
-}
diff --git a/group16/214074094/src/com/coding/basic/Stack.java b/group16/214074094/src/com/coding/basic/Stack.java
deleted file mode 100644
index 7ef1c9ad06..0000000000
--- a/group16/214074094/src/com/coding/basic/Stack.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package coding.basic;
-
-/**
- * @Author shane
- * @Time 2017/2/26 16:55
- * @Email stevenchenguang@gmail.com
- * @Desc Own Stack
- */
-public class Stack {
-
-    private ArrayList elementData = new ArrayList();
-
-    public void push(Object o) {
-        elementData.add(o);
-    }
-
-    public Object pop() {
-        return elementData.remove(elementData.size() - 1);
-    }
-
-    public Object peek() {
-        return elementData.get(elementData.size() - 1);
-    }
-
-    public boolean isEmpty() {
-        return elementData.isEmpty();
-    }
-
-    public int size() {
-        return elementData.size();
-    }
-
-    @Override
-    public String toString() {
-        return elementData.toString();
-    }
-}
diff --git a/group16/214074094/src/com/reading/blog_test.txt b/group16/214074094/src/com/reading/blog_test.txt
deleted file mode 100644
index b7e5cbfe14..0000000000
--- a/group16/214074094/src/com/reading/blog_test.txt
+++ /dev/null
@@ -1 +0,0 @@
-just test new fork
\ No newline at end of file
diff --git a/group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java b/group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..c2b0c62a79
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java
@@ -0,0 +1,213 @@
+package study.coderising.array;
+
+
+import study.coding.basic.ArrayList;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public static void reverseArray(int[] origin) {
+        int tmp;
+        for (int i = 0; i < origin.length / 2; i++) {
+            tmp = origin[i];
+            origin[i] = origin[origin.length - i - 1];
+            origin[origin.length - i - 1] = tmp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public static int[] removeZero(int[] oldArray) {
+        int[] newArray = new int[oldArray.length];
+        int k = 0;
+        for (int i = 0; i < oldArray.length; i++) {
+            if (0 != oldArray[i]) {
+                newArray[k++] = oldArray[i];
+            }
+        }
+        return Arrays.copyOf(newArray, k);
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组，a1和a2，创建一个新的数组a3，使得a3包含a1和a2的所有元素，并且仍然是有序的
+     * 例如 a1 = {3, 5, 7, 8}，a2 = {4, 5, 6, 7}，则 a3 为[3,4,5,6,7,8]，注意：已经消除了重复
+     *
+     * @param a1
+     * @param a2
+     * @return
+     */
+
+    public static int[] merge(int[] a1, int[] a2) {
+        Set set = new HashSet();
+
+        for (int i = 0; i < a1.length + a2.length; i++) {
+            if (i < a1.length) {
+                set.add(a1[i]);
+            } else {
+                set.add(a2[i - a1.length]);
+            }
+        }
+
+        int[] a3 = new int[set.size()];
+
+        Iterator it = set.iterator();
+        int i = 0;
+        while (it.hasNext()) {
+            a3[i++] = (Integer) it.next();
+        }
+        return a3;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public static int[] grow(int[] oldArray, int size) {
+        return Arrays.copyOf(oldArray, oldArray.length + size);
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public static int[] fibonacci(int max) {
+        if (max == 1) {
+            return new int[0];
+        }
+        ArrayList<Integer> list = new ArrayList<Integer>();
+        list.add(1);
+        list.add(1);
+        for (int i = 0; ; i++) {
+            int tmp = list.get(i) + list.get(i + 1);
+            if (tmp >= max) {
+                break;
+            }
+            list.add(i + 2, tmp);
+        }
+
+        return convertIntegerArray2Int(list);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPrimes(int max) {
+        if (max < 2) {
+            return null;
+        }
+        ArrayList<Integer> list = new ArrayList<>();
+        for (int i = 2; i < max; i++) {
+            if (isPrime(i)) {
+                list.add(i);
+            }
+        }
+        return convertIntegerArray2Int(list);
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public static int[] getPerfectNumbers(int max) {
+        if (max < 2) {
+            return null;
+        }
+        ArrayList<Integer> list = new ArrayList<>();
+
+        int count = 0;
+        //如果p是质数，且2^p-1也是质数，那么（2^p-1）X2^（p-1）便是一个完全数
+        for (int i = 2; i <= max / 2; i++) {
+            count++;
+            if (isPrime(i) && isPrime((int) Math.pow(2, i) - 1)) {
+                System.out.println("count " + i + ":" + (int) (Math.pow(2, i) - 1) + " * " + (int) Math.pow(2, (i - 1)));
+                int perfectNum = (int) ((Math.pow(2, i) - 1) * Math.pow(2, (i - 1)));
+                if (perfectNum > max) {
+                    break;
+                }
+                if (perfectNum < max) {
+                    list.add(perfectNum);
+                }
+            }
+        }
+        System.out.println("total count : " + count);
+        return convertIntegerArray2Int(list);
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public static String join(int[] array, String seperator) {
+        if (null == array || array.length < 1) {
+            return null;
+        }
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < array.length; i++) {
+            sb.append(array[i]).append(seperator);
+        }
+        return sb.substring(0, sb.length() - 1);
+    }
+
+    private static boolean isPrime(int n) {
+        if (n == 2) {
+            return true;
+        }
+        for (int j = 2; j <= Math.sqrt(n); j++) {
+            if (n % j == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static int[] convertIntegerArray2Int(ArrayList<Integer> list) {
+        int[] arr = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            arr[i] = list.get(i).intValue();
+        }
+        return arr;
+    }
+
+
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java b/group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..043df200d8
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package study.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author liuxin
+ */
+public class LoginAction {
+
+    private String name;
+    private String password;
+    private String message;
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java b/group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..e3a10a6726
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,39 @@
+package study.coderising.litestruts;
+
+/**
+ * @Author shane
+ * @Time 2017/3/4 12:13
+ * @Email stevenchenguang@gmail.com
+ * @Desc ...
+ */
+public class LogoutAction {
+
+    private String name;
+
+    private String message;
+
+    public String execute() {
+        if ("test".equalsIgnoreCase(name)) {
+            message = name + " logout success";
+            return "success";
+        }
+        message = name + " logout fail";
+        return "error";
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/Struts.java b/group16/214074094/src/main/java/study/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..9a70e7a525
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/Struts.java
@@ -0,0 +1,147 @@
+package study.coderising.litestruts;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import study.coderising.litestruts.bean.Action;
+import study.coderising.litestruts.bean.Result;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.*;
+
+
+public class Struts {
+
+    private static final String EXECUTE = "execute";
+
+    public static View runAction(String actionName, Map<String, String> parameters)
+            throws DocumentException, ClassNotFoundException, NoSuchMethodException,
+            InvocationTargetException, IllegalAccessException, InstantiationException {
+
+        //0. 读取配置文件struts.xml
+        SAXReader reader = new SAXReader();
+        Document doc = reader.read("./src/main/resources/struts.xml");
+        Element root = doc.getRootElement();
+        Action action = getAction(actionName, root);
+
+        //1. 根据actionName找到相对应的class
+        Class clz = Class.forName(action.getClassPath());
+        //获取一个实例,方便接下来对同一个对象赋值
+        Object obj = clz.newInstance();
+
+        //1.1 据parameters中的数据，调用对象的setter方法
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            String setFunctionName = getFunctionName("set", entry.getKey());
+            Method set = clz.getDeclaredMethod(setFunctionName, String.class);
+            set.invoke(obj, entry.getValue());
+        }
+
+        //2. 通过反射调用对象的exectue方法， 并获得返回值
+        Method execute = clz.getDeclaredMethod(EXECUTE);
+        String response = execute.invoke(obj).toString();
+
+        //3. 通过反射找到对象的所有getter方法并调用， 把值和属性形成一个HashMap
+        Method[] methods = clz.getDeclaredMethods();
+        Map<String, Object> map = new HashMap<>();
+        for (Method m : methods) {
+            if (m.getName().startsWith("get")) {
+                String paramName = m.getName().replaceFirst("get", "");
+                map.put(paramName.toLowerCase(), m.invoke(obj));
+            }
+        }
+
+        //3.1 放到View对象的parameters
+        View view = new View();
+        view.setParameters(map);
+
+        //4. 根据struts.xml中的配置,以及execute的返回值，确定jsp，放到View对象的jsp字段中。
+        for (Result result : action.getResults()) {
+            if (response.equalsIgnoreCase(result.getResult())) {
+                view.setJsp(result.getJumpPath());
+                break;
+            }
+        }
+
+        return view;
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/3/4 23:53
+     * @Email: stevenchenguang@gmail.com
+     * @param: begin, key
+     * @Return: String
+     * @Throw:
+     * @Desc: 根据开始名称和key获取方法名
+     * e.g.: begin: get, key: name, return getName
+     */
+    private static String getFunctionName(String begin, String key) {
+        if (key == null || "".equals(key)) {
+            return null;
+        }
+        StringBuffer sb = new StringBuffer(begin);
+        if (key.length() < 2) {
+            sb.append(key.toUpperCase());
+        } else {
+            String first = String.valueOf(key.charAt(0));
+            sb.append(first.toUpperCase());
+            sb.append(key.substring(1, key.length()));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/3/4 23:55
+     * @Email: stevenchenguang@gmail.com
+     * @param: actionName, node
+     * @Return: Action
+     * @Throw:
+     * @Desc: 根据actionName和xml节点获取Action
+     */
+    private static Action getAction(String actionName, Element node) {
+        Action action = new Action();
+
+        Iterator<Element> iterator = node.elementIterator();
+        boolean flag = false;
+        while (iterator.hasNext()) {
+            Element e = iterator.next();
+            List<Attribute> list = e.attributes();
+
+            //遍历属性节点
+            for (Attribute attr : list) {
+                if ("name".equalsIgnoreCase(attr.getName())) {
+                    if (!actionName.equalsIgnoreCase(attr.getValue())) {
+                        continue;
+                    } else {
+                        flag = true;
+                    }
+                    action.setName(attr.getValue());
+                }
+                if ("class".equalsIgnoreCase(attr.getName())) {
+                    action.setClassPath(attr.getValue());
+                }
+
+                List<Result> results = new ArrayList<>();
+
+                Iterator<Element> it = e.elementIterator();
+                while (it.hasNext()) {
+                    Result result = new Result();
+                    Element el = it.next();
+                    result.setResult(el.attribute(0).getValue());
+                    result.setJumpPath(el.getText());
+                    results.add(result);
+                }
+                action.setResults(results);
+            }
+            if (flag) {
+                break;
+            }
+        }
+        return action;
+    }
+
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java b/group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..db1b37de1b
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,109 @@
+package study.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.DocumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "1234");
+
+        View view = null;
+        try {
+            view = Struts.runAction(actionName, params);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLoginActionFailed() {
+        String actionName = "login";
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = null;
+        try {
+            view = Struts.runAction(actionName, params);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLogoutSuccess() {
+        String actionName = "logout";
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+
+        View view = null;
+        try {
+            view = Struts.runAction(actionName, params);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Assert.assertEquals("/jsp/welcome.jsp", view.getJsp());
+        Assert.assertEquals("test logout success", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLogoutFail() {
+        String actionName = "logout";
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "unknownUser");
+
+        View view = null;
+        try {
+            view = Struts.runAction(actionName, params);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Assert.assertEquals("/jsp/error.jsp", view.getJsp());
+        Assert.assertEquals("unknownUser logout fail", view.getParameters().get("message"));
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/View.java b/group16/214074094/src/main/java/study/coderising/litestruts/View.java
new file mode 100644
index 0000000000..af3df5b9e9
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/View.java
@@ -0,0 +1,27 @@
+package study.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java
new file mode 100644
index 0000000000..12aa461cfc
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java
@@ -0,0 +1,43 @@
+package study.coderising.litestruts.bean;
+
+
+import java.util.List;
+
+/**
+ * @Author shane
+ * @Time 2017/3/4 21:49
+ * @Email shanbaohua@lxfintech.com
+ * @Desc ...
+ */
+public class Action {
+
+    private String name;
+
+    private String classPath;
+
+    private List<Result> results;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassPath() {
+        return classPath;
+    }
+
+    public void setClassPath(String classPath) {
+        this.classPath = classPath;
+    }
+
+    public List<Result> getResults() {
+        return results;
+    }
+
+    public void setResults(List<Result> results) {
+        this.results = results;
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java
new file mode 100644
index 0000000000..649844ff31
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java
@@ -0,0 +1,30 @@
+package study.coderising.litestruts.bean;
+
+/**
+ * @Author shane
+ * @Time 2017/3/4 21:50
+ * @Email shanbaohua@lxfintech.com
+ * @Desc ...
+ */
+public class Result {
+
+    private String result;
+
+    private String jumpPath;
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public String getJumpPath() {
+        return jumpPath;
+    }
+
+    public void setJumpPath(String jumpPath) {
+        this.jumpPath = jumpPath;
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coding/basic/ArrayList.java b/group16/214074094/src/main/java/study/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..ebe04dd177
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/ArrayList.java
@@ -0,0 +1,170 @@
+package study.coding.basic;
+
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+/**
+ * @Author shane
+ * @Time 2017/2/25 13:06
+ * @Email stevenchenguang@gmail.com
+ * @Desc OwnArrayList
+ */
+public class ArrayList<E> implements List<E> {
+
+    private int size = 0;
+
+    private final static Object[] EMPTY_ELEMENTDATA = {};
+
+    /**
+     * 默认容量
+     */
+    private static int DEFAULT_CAPACITY = 10;
+
+    private Object[] elementData;
+
+    public ArrayList() {
+        this.elementData = EMPTY_ELEMENTDATA;
+    }
+
+    @Override
+    public void add(E e) {
+        if (elementData == EMPTY_ELEMENTDATA) {
+            elementData = Arrays.copyOf(elementData, DEFAULT_CAPACITY);
+            elementData[0] = e;
+        } else if (size < elementData.length) {
+            elementData[size] = e;
+        } else {
+            _grow();
+            elementData[size] = e;
+        }
+        size++;
+        _analyze();
+    }
+
+    @Override
+    public void add(int index, E e) {
+        if (index < 0) {
+            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
+        }
+        if (elementData == EMPTY_ELEMENTDATA) {
+            if (index != 0) {
+                throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
+            } else {
+                elementData = new Object[DEFAULT_CAPACITY];
+                elementData[0] = e;
+            }
+        } else if (index > size) {
+            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
+        } else if (index == size) {
+            _grow();
+            elementData[size] = e;
+            size++;
+        } else {
+            if (elementData.length == size) {
+                _grow();
+            }
+            System.arraycopy(elementData, index, elementData, index + 1, size - index);
+            elementData[index] = e;
+            size++;
+        }
+        _analyze();
+    }
+
+    @Override
+    public E get(int index) {
+        if (index < 0 || index >= size) {
+            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
+        }
+        return (E) elementData[index];
+    }
+
+    @Override
+    public E remove(int index) {
+
+        if (index < 0 || index >= size) {
+            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
+        }
+        E oldValue = (E) elementData[index];
+        //需要复制的长度
+        int needMoveLength = size - index - 1;
+        //如果该长度小于0,　说明只有一个元素,　直接置空即可
+        if (needMoveLength > 0) {
+            System.arraycopy(elementData, index + 1, elementData, index, needMoveLength);
+        }
+        elementData[--size] = null;
+        _analyze();
+        return oldValue;
+    }
+
+    @Override
+    public int size() {
+        return size;
+    }
+
+    @Override
+    public E[] toArray() {
+        return (E[]) elementData;
+    }
+
+    public Iterator iterator() {
+        return new ArrayListItrator();
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/2/25 20:18
+     * @Email: stevenchenguang@gmail.com
+     * @param:
+     * @Return:
+     * @Throw:
+     * @Desc: 返回真实长度的数组数据
+     */
+    private void _analyze() {
+        if (size < elementData.length) {
+            elementData = Arrays.copyOf(elementData, size);
+        }
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/2/25 20:19
+     * @Email: stevenchenguang@gmail.com
+     * @param:
+     * @Return:
+     * @Throw:
+     * @Desc: 将数组的长度扩容至2倍
+     */
+    private void _grow() {
+        elementData = Arrays.copyOf(elementData, elementData.length << 1);
+    }
+
+    @Override
+    public String toString() {
+        return Arrays.toString(elementData);
+    }
+
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    private class ArrayListItrator implements Iterator {
+
+        private int position = 0;
+
+        @Override
+        public boolean hasNext() {
+            return position != size;
+        }
+
+        @Override
+        public Object next() {
+            int i = position;
+            if (i >= size) {
+                throw new NoSuchElementException();
+            }
+            position = i + 1;
+            return elementData[i];
+        }
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java b/group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..4eae81c97a
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,95 @@
+package study.coding.basic;
+
+/**
+ * @Author shane
+ * @Time 2017/2/26 19:30
+ * @Email stevenchenguang@gmail.com
+ * @Desc Own BinaryTreeNode
+ */
+public class BinaryTreeNode {
+
+    private Object data;
+
+    private BinaryTreeNode left;
+
+    private BinaryTreeNode right;
+
+    public BinaryTreeNode insert(Object o) {
+        if (null == data) {
+            data = o;
+            return this;
+        }
+        if (bigger(data, o)) {
+            if (null == left) {
+                left = new BinaryTreeNode();
+                left.data = o;
+            } else {
+                left.insert(o);
+            }
+        } else if (smaller(data, o)) {
+            if (null == right) {
+                right = new BinaryTreeNode();
+                right.data = o;
+            } else {
+                right.insert(o);
+            }
+        } else {
+            throw new RuntimeException("The value has exists");
+        }
+        return this;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public BinaryTreeNode getLeft() {
+        return left;
+    }
+
+    public void setLeft(BinaryTreeNode left) {
+        this.left = left;
+    }
+
+    public BinaryTreeNode getRight() {
+        return right;
+    }
+
+    public void setRight(BinaryTreeNode right) {
+        this.right = right;
+    }
+
+    private boolean bigger(Object data1, Object data2) {
+        return data1.toString().compareTo(data2.toString()) > 0;
+    }
+
+    private boolean smaller(Object data1, Object data2) {
+        return data1.toString().compareTo(data2.toString()) < 0;
+    }
+
+    private ArrayList list = new ArrayList();
+
+    /**
+     * 对二叉树进行遍历 结果存储到list中
+     */
+    private void sort(BinaryTreeNode node) {
+
+        list.add(node.data);
+        if(null != node.left){
+            sort(node.left);
+        }
+        if(null != node.right){
+            sort(node.right);
+        }
+    }
+
+    @Override
+    public String toString() {
+        sort(this);
+        return list.toString();
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coding/basic/Iterator.java b/group16/214074094/src/main/java/study/coding/basic/Iterator.java
new file mode 100644
index 0000000000..0befe6a209
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/Iterator.java
@@ -0,0 +1,9 @@
+package study.coding.basic;
+
+public interface Iterator {
+
+    boolean hasNext();
+
+    Object next();
+
+}
diff --git a/group16/214074094/src/main/java/study/coding/basic/LinkedList.java b/group16/214074094/src/main/java/study/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..b6fede6824
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/LinkedList.java
@@ -0,0 +1,228 @@
+package study.coding.basic;
+
+/**
+ * @Author shane
+ * @Time 2017/2/25 21:01
+ * @Email stevenchenguang@gmail.com
+ * @Desc OwnLinkedList
+ */
+public class LinkedList implements List {
+
+    private int size = 0;
+
+    private Node first;
+
+    private Node last;
+
+    public void add(Object o) {
+        if (size == 0) {
+            first = new Node(null, o, null);
+            last = first;
+            size++;
+        } else {
+            addLast(o);
+        }
+    }
+
+    public void add(int index, Object o) {
+        _checkIndex(index);
+        if (index == size - 1) {
+            addLast(o);
+        } else {
+            Node prev = _node(index);
+            Node next = _node(index + 1);
+            Node newNode = new Node(prev, o, next);
+            prev.next = newNode;
+            next.prev = newNode;
+            size++;
+        }
+    }
+
+    public Object get(int index) {
+        _checkIndex(index);
+        return node(index);
+    }
+
+    public Object remove(int index) {
+        _checkIndex(index);
+        if (index == 0) {
+            return removeFirst();
+        } else if (index == size - 1) {
+            return removeLast();
+        }
+
+        Node curr = _node(index);
+        Object data = curr.data;
+        final Node prev = curr.prev;
+        final Node next = curr.next;
+
+        prev.next = next;
+        next.prev = prev;
+        curr = null;
+        size--;
+
+        return data;
+    }
+
+    private Object removeFirst() {
+        Node oldFirst = first;
+        Object data = first.data;
+        final Node oldSecond = oldFirst.next;
+        if (null == oldSecond) {
+            first = null;
+            last = null;
+        } else {
+            oldSecond.prev = null;
+            first = oldSecond;
+            oldFirst = null;
+        }
+        size--;
+        return data;
+    }
+
+    private Object removeLast() {
+        Node oldLast = last;
+        Object data = last.data;
+        final Node oldLastButOne = last.prev;
+        if (null == oldLastButOne) {
+            first = null;
+            last = null;
+        } else {
+            oldLastButOne.next = null;
+            last = oldLastButOne;
+            oldLast = null;
+        }
+        size--;
+        return data;
+    }
+
+    public void addFirst(Object o) {
+        final Node oldFirst = first;
+        final Node param = new Node(null, o, null);
+        if (null == oldFirst) {
+            first = param;
+        } else {
+            oldFirst.prev = param;
+            param.next = oldFirst;
+            first = param;
+        }
+        size++;
+    }
+
+    public void addLast(Object o) {
+        final Node n = last;
+        final Node newNode = new Node(n, o, null);
+        last = newNode;
+        n.next = newNode;
+        size++;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    @Override
+    public Object[] toArray() {
+        return new Object[0];
+    }
+
+    public Iterator iterator() {
+        return null;
+    }
+
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    private static class Node {
+        Node prev;
+        Object data;
+        Node next;
+
+        public Node(Node prev, Object data, Node next) {
+            this.prev = prev;
+            this.data = data;
+            this.next = next;
+        }
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/2/25 22:44
+     * @Email: stevenchenguang@gmail.com
+     * @param: int index
+     * @Return: Node
+     * @Throw:
+     * @Desc: 根据下标获取节点元素上的数据
+     */
+    private Object node(int index) {
+        //如果下标在左一半, 从左往右取
+        if (index < size >> 1) {
+            Node tmp = first;
+            for (int i = 0; i < index; i++) {
+                tmp = tmp.next;
+            }
+            return tmp.data;
+        } else {
+            Node tmp = last;
+            for (int i = size - 1; i > index; i--) {
+                tmp = tmp.prev;
+            }
+            return tmp.data;
+        }
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/2/25 22:44
+     * @Email: stevenchenguang@gmail.com
+     * @param: int index
+     * @Return: Node
+     * @Throw:
+     * @Desc: 根据下标获取节点元素
+     */
+    private Node _node(int index) {
+        //如果下标在左一半, 从左往右取
+        if (index < size >> 1) {
+            Node tmp = first;
+            for (int i = 0; i < index; i++) {
+                tmp = tmp.next;
+            }
+            return tmp;
+        } else {
+            Node tmp = last;
+            for (int i = size - 1; i > index; i--) {
+                tmp = tmp.prev;
+            }
+            return tmp;
+        }
+    }
+
+    /**
+     * @Author: shane
+     * @Time: 2017/2/25 22:43
+     * @Email: stevenchenguang@gmail.com
+     * @param: int index
+     * @Return:
+     * @Throw: IndexOutOfBoundsException
+     * @Desc: 校验下标是否合法
+     */
+    private void _checkIndex(int index) {
+        if (index < 0 || index >= size) {
+            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
+        }
+    }
+
+    @Override
+    public String toString() {
+        if (0 == size) {
+            return "[]";
+        }
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < this.size; i++) {
+            sb.append(get(i)).append(", ");
+        }
+        String tmp = sb.substring(0, sb.length() - 2);
+        return "[" + tmp + "]";
+    }
+}
\ No newline at end of file
diff --git a/group16/214074094/src/main/java/study/coding/basic/List.java b/group16/214074094/src/main/java/study/coding/basic/List.java
new file mode 100644
index 0000000000..e62dd86d52
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/List.java
@@ -0,0 +1,16 @@
+package study.coding.basic;
+
+public interface List<E> {
+
+    void add(E e);
+
+    void add(int index, E e);
+
+    E get(int index);
+
+    E remove(int index);
+
+    int size();
+
+    E[] toArray();
+}
diff --git a/group16/214074094/src/main/java/study/coding/basic/Queue.java b/group16/214074094/src/main/java/study/coding/basic/Queue.java
new file mode 100644
index 0000000000..b15950ac36
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/Queue.java
@@ -0,0 +1,36 @@
+package study.coding.basic;
+
+/**
+ * @Author shane
+ * @Time 2017/2/26 17:19
+ * @Email stevenchenguang@gmail.com
+ * @Desc Own Queue
+ */
+public class Queue {
+
+    private LinkedList elementData = new LinkedList();
+
+    public void enQueue(Object o) {
+        elementData.add(o);
+    }
+
+    public Object deQueue() {
+        if (isEmpty()) {
+            throw new RuntimeException("Queue is empty");
+        }
+        return elementData.remove(0);
+    }
+
+    public boolean isEmpty() {
+        return elementData.isEmpty();
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+
+    @Override
+    public String toString() {
+        return elementData.toString();
+    }
+}
diff --git a/group16/214074094/src/main/java/study/coding/basic/Stack.java b/group16/214074094/src/main/java/study/coding/basic/Stack.java
new file mode 100644
index 0000000000..188de74ee9
--- /dev/null
+++ b/group16/214074094/src/main/java/study/coding/basic/Stack.java
@@ -0,0 +1,37 @@
+package study.coding.basic;
+
+/**
+ * @Author shane
+ * @Time 2017/2/26 16:55
+ * @Email stevenchenguang@gmail.com
+ * @Desc Own Stack
+ */
+public class Stack {
+
+    private ArrayList elementData = new ArrayList();
+
+    public void push(Object o) {
+        elementData.add(o);
+    }
+
+    public Object pop() {
+        return elementData.remove(elementData.size() - 1);
+    }
+
+    public Object peek() {
+        return elementData.get(elementData.size() - 1);
+    }
+
+    public boolean isEmpty() {
+        return elementData.isEmpty();
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+
+    @Override
+    public String toString() {
+        return elementData.toString();
+    }
+}
diff --git a/group16/214074094/src/main/java/study/reading/blog.txt b/group16/214074094/src/main/java/study/reading/blog.txt
new file mode 100644
index 0000000000..f112f8ea6a
--- /dev/null
+++ b/group16/214074094/src/main/java/study/reading/blog.txt
@@ -0,0 +1 @@
+学习-CPU、内存、硬盘、指令及它们之间的关系:　https://stevenshane.github.io/study/2017/02/27/coding2017-reading.html
\ No newline at end of file
diff --git a/group16/214074094/src/main/resources/struts.xml b/group16/214074094/src/main/resources/struts.xml
new file mode 100644
index 0000000000..f93213e241
--- /dev/null
+++ b/group16/214074094/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="study.coderising.litestruts.LoginAction">
+        <result result="success">/jsp/homepage.jsp</result>
+        <result result="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="study.coderising.litestruts.LogoutAction">
+        <result result="success">/jsp/welcome.jsp</result>
+        <result result="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/214074094/src/test/coding/basic/AbstractTest.java b/group16/214074094/src/test/coding/basic/AbstractTest.java
deleted file mode 100644
index 80eaaa6fe5..0000000000
--- a/group16/214074094/src/test/coding/basic/AbstractTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package coding.basic;
-
-/**
- * @Author shane
- * @Time 2017/2/25 13:06
- * @Email stevenchenguang@gmail.com
- * @Desc 测试基类
- */
-public class AbstractTest {
-
-    protected void printStar() {
-        System.out.println("********************************************");
-    }
-
-    protected void printHyphen() {
-        System.out.println("--------------------------------------------");
-    }
-
-}
diff --git a/group16/214074094/src/test/coding/basic/ArrayListTest.java b/group16/214074094/src/test/coding/basic/ArrayListTest.java
deleted file mode 100644
index 2f03342d61..0000000000
--- a/group16/214074094/src/test/coding/basic/ArrayListTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package coding.basic;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @Author shane
- * @Time 2017/2/25 13:02
- * @Email stevenchenguang@gmail.com
- * @Desc ...
- */
-
-public class ArrayListTest extends AbstractTest {
-
-    private static ArrayList list;
-
-    @Before
-    public void before() {
-
-        list = new ArrayList();
-        list.add("a");
-        list.add("b");
-        list.add("c");
-        list.add("d");
-        list.add("e");
-
-        printStar();
-        System.out.println("Before Test data :" + list);
-        printHyphen();
-    }
-
-    @After
-    public void after() {
-        printHyphen();
-        System.out.println("After Test data : " + list);
-        printStar();
-    }
-
-    @Test
-    public void testAddI() {
-        int index = list.size();
-        list.add(index, "test add i");
-        Assert.assertEquals(list.get(index), "test add i");
-    }
-
-    @Test
-    public void test() {
-        java.util.ArrayList<String> list = new java.util.ArrayList<String>();
-        list.add("a");
-        list.add("b");
-        java.util.Iterator<String> it = list.iterator();
-        while (it.hasNext()) {
-
-        }
-        System.out.println(it.next());
-        System.out.println(it.next());
-        System.out.println(it.next());
-    }
-
-    @Test
-    public void testSize() {
-        Assert.assertEquals(5, list.size());
-    }
-
-    @Test
-    public void testRemove() {
-        list.remove(5);
-        Assert.assertEquals(list.get(3), "d");
-    }
-
-    @Test
-    public void testIterator() {
-        Iterator it = list.iterator();
-        while (it.hasNext()) {
-            System.out.println(it.next());
-        }
-    }
-
-}
diff --git a/group16/214074094/src/test/coding/basic/LinkedListTest.java b/group16/214074094/src/test/coding/basic/LinkedListTest.java
deleted file mode 100644
index bc78728a25..0000000000
--- a/group16/214074094/src/test/coding/basic/LinkedListTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package coding.basic;
-
-import junit.framework.Assert;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @Author shane
- * @Time 2017/2/25 23:32
- * @Email stevenchenguang@gmail.com
- * @Desc ...
- */
-public class LinkedListTest extends AbstractTest {
-
-    private static LinkedList list;
-
-    @Before
-    public void before() {
-        list = new LinkedList();
-        list.add("a");
-        list.add("b");
-        list.add("c");
-        list.add("d");
-        list.add("e");
-
-        printStar();
-        System.out.println("Before Test data :" + list);
-        printHyphen();
-    }
-
-    @After
-    public void after() {
-        printHyphen();
-        System.out.println("After Test data : " + list);
-        printStar();
-    }
-
-    @Test
-    public void testAddIndex() {
-        list.add(0, "after a");
-        Assert.assertEquals("after a", list.get(1));
-
-        list.add(3, "after c");
-        Assert.assertEquals("after c", list.get(4));
-
-        list.add(6, "after e");
-        Assert.assertEquals("after e", list.get(7));
-    }
-
-    @Test
-    public void testRemove() {
-        list.remove(0);
-        Assert.assertEquals("b", list.get(0));
-
-        list.remove(list.size() - 1);
-        Assert.assertEquals("d", list.get(list.size() - 1));
-
-        Object obj = list.remove(1);
-        Assert.assertEquals("c", obj);
-        Assert.assertEquals(2, list.size());
-    }
-}
diff --git a/group16/214074094/src/test/coding/basic/QueueTest.java b/group16/214074094/src/test/coding/basic/QueueTest.java
deleted file mode 100644
index 12302783b3..0000000000
--- a/group16/214074094/src/test/coding/basic/QueueTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package coding.basic;
-
-import junit.framework.Assert;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @Author shane
- * @Time 2017/2/26 17:24
- * @Email stevenchenguang@gmail.com
- * @Desc ...
- */
-public class QueueTest extends AbstractTest {
-
-    private static Queue queue;
-
-    @Before
-    public void before() {
-        queue = new Queue();
-
-        queue.enQueue("a");
-        queue.enQueue("b");
-        queue.enQueue("c");
-        queue.enQueue("d");
-        queue.enQueue("e");
-
-        printStar();
-        System.out.println("Before Test data :" + queue);
-        printHyphen();
-    }
-
-    @After
-    public void after() {
-        printHyphen();
-        System.out.println("After Test data : " + queue);
-        printStar();
-    }
-
-    @Test
-    public void testDeQueueAndIsEmpty() {
-        Assert.assertEquals("a", queue.deQueue());
-
-        queue.deQueue();
-        queue.deQueue();
-        queue.deQueue();
-        queue.deQueue();
-
-        Assert.assertEquals(true, queue.isEmpty());
-
-        try {
-            queue.deQueue();
-        } catch (RuntimeException e) {
-            Assert.assertEquals("Queue is empty", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testSize() {
-        Assert.assertEquals(5, queue.size());
-    }
-}
diff --git a/group16/214074094/src/test/coding/basic/StackTest.java b/group16/214074094/src/test/coding/basic/StackTest.java
deleted file mode 100644
index f289744a67..0000000000
--- a/group16/214074094/src/test/coding/basic/StackTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package coding.basic;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @Author shane
- * @Time 2017/2/26 16:58
- * @Email stevenchenguang@gmail.com
- * @Desc ...
- */
-public class StackTest extends AbstractTest {
-
-    private static Stack stack;
-
-    @Before
-    public void before() {
-        stack = new Stack();
-
-        stack.push("a");
-        stack.push("b");
-        stack.push("c");
-        stack.push("d");
-        stack.push("e");
-
-        printStar();
-        System.out.println("Before Test data :" + stack);
-        printHyphen();
-    }
-
-    @After
-    public void after() {
-        printHyphen();
-        System.out.println("After Test data : " + stack);
-        printStar();
-    }
-
-    @Test
-    public void testPop() {
-        Assert.assertEquals("e", stack.pop());
-    }
-
-    @Test
-    public void testPeek() {
-        Assert.assertEquals("e", stack.peek());
-    }
-
-    @Test
-    public void testIsEmpty() {
-        Assert.assertEquals(false, stack.isEmpty());
-
-        stack.pop();
-        stack.pop();
-        stack.pop();
-        stack.pop();
-        stack.pop();
-
-        Assert.assertEquals(true, stack.isEmpty());
-    }
-
-    @Test
-    public void testSize() {
-        Assert.assertEquals(5, stack.size());
-    }
-
-}
diff --git a/group16/214074094/src/test/java/study/AbstractTest.java b/group16/214074094/src/test/java/study/AbstractTest.java
new file mode 100644
index 0000000000..42737e270f
--- /dev/null
+++ b/group16/214074094/src/test/java/study/AbstractTest.java
@@ -0,0 +1,24 @@
+package study;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * @Author shane
+ * @Time 2017/2/25 13:06
+ * @Email stevenchenguang@gmail.com
+ * @Desc 测试基类
+ */
+public class AbstractTest {
+
+    protected void printStar() {
+        System.out.println("********************************************");
+    }
+
+    protected void printHyphen() {
+        System.out.println("--------------------------------------------");
+    }
+
+    protected void printJson(Object obj) {
+        System.out.println(JSON.toJSONString(obj));
+    }
+}
diff --git a/group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java b/group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java
new file mode 100644
index 0000000000..24cdeadb64
--- /dev/null
+++ b/group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java
@@ -0,0 +1,82 @@
+package study.coderising;
+
+import org.junit.Assert;
+import org.junit.Test;
+import study.AbstractTest;
+import study.coderising.array.ArrayUtil;
+
+/**
+ * @Author shane
+ * @Time 2017/3/1 20:29
+ * @Email shanbaohua@lxfintech.com
+ * @Desc ...
+ */
+public class ArrayUtilTest extends AbstractTest {
+
+    @Test
+    public void testReverseArray(){
+        int[] a = {7, 9 , 30, 3};
+        printJson(a);
+        ArrayUtil.reverseArray(a);
+        printJson(a);
+    }
+
+    @Test
+    public void testremoveZero(){
+        int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+        int newArr[] = ArrayUtil.removeZero(oldArr);
+        printJson(oldArr);
+        printJson(newArr);
+    }
+
+    @Test
+    public void testMerge(){
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+
+        int[] a3 = ArrayUtil.merge(a1, a2);
+        printJson(a1);
+        printJson(a2);
+        printJson(a3);
+    }
+
+    @Test
+    public void testGrow(){
+        int[] oldArray = {2,3,6};
+        printJson(oldArray);
+        int[] newArray = ArrayUtil.grow(oldArray, 3);
+        printJson(newArray);
+    }
+
+    @Test
+    public void testFibonacci(){
+        int[] onlyOne = {};
+        int[] before15 = {1, 1, 2, 3, 5, 8, 13};
+        int[] before21 = {1, 1, 2, 3, 5, 8, 13};
+        Assert.assertArrayEquals(onlyOne, ArrayUtil.fibonacci(1));
+        Assert.assertArrayEquals(before15, ArrayUtil.fibonacci(15));
+        Assert.assertArrayEquals(before21, ArrayUtil.fibonacci(21));
+    }
+
+    @Test
+    public void testGetPrimes(){
+        int[] _19 = {2,3,5,7,11,13,17,19};
+        Assert.assertArrayEquals(_19, ArrayUtil.getPrimes(23));
+        int[] _32 = {2,3,5,7,11,13,17,19,23,29,31};
+        Assert.assertArrayEquals(_32, ArrayUtil.getPrimes(32));
+    }
+
+    @Test
+    public void testGetPerfectNumbers(){
+        int[] arr = {6,28,496,8128,33550336};
+        Assert.assertArrayEquals(arr, ArrayUtil.getPerfectNumbers(33550337));
+    }
+
+    @Test
+    public void testJoin(){
+        int[] arr = {3,8,9};
+        String seperator = "-";
+        Assert.assertEquals("3-8-9", ArrayUtil.join(arr, seperator));
+    }
+
+}
diff --git a/group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java b/group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java
new file mode 100644
index 0000000000..6ffe2e5715
--- /dev/null
+++ b/group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java
@@ -0,0 +1,82 @@
+package study.coding.basic;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import study.AbstractTest;
+
+/**
+ * @Author shane
+ * @Time 2017/2/25 13:02
+ * @Email stevenchenguang@gmail.com
+ * @Desc ...
+ */
+
+public class ArrayListTest extends AbstractTest {
+
+    private static ArrayList list;
+
+    @Before
+    public void before() {
+
+        list = new ArrayList();
+        list.add("a");
+        list.add("b");
+        list.add("c");
+        list.add("d");
+        list.add("e");
+
+        printStar();
+        System.out.println("Before Test data :" + list);
+        printHyphen();
+    }
+
+    @After
+    public void after() {
+        printHyphen();
+        System.out.println("After Test data : " + list);
+        printStar();
+    }
+
+    @Test
+    public void testAddI() {
+        int index = list.size();
+        list.add(index, "test add i");
+        Assert.assertEquals(list.get(index), "test add i");
+    }
+
+    @Test
+    public void test() {
+        java.util.ArrayList<String> list = new java.util.ArrayList<String>();
+        list.add("a");
+        list.add("b");
+        java.util.Iterator<String> it = list.iterator();
+        while (it.hasNext()) {
+
+        }
+        System.out.println(it.next());
+        System.out.println(it.next());
+        System.out.println(it.next());
+    }
+
+    @Test
+    public void testSize() {
+        Assert.assertEquals(5, list.size());
+    }
+
+    @Test
+    public void testRemove() {
+        list.remove(5);
+        Assert.assertEquals(list.get(3), "d");
+    }
+
+    @Test
+    public void testIterator() {
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+
+}
diff --git a/group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java b/group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..370b339434
--- /dev/null
+++ b/group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java
@@ -0,0 +1,33 @@
+package study.coding.basic;
+
+import org.junit.Test;
+import study.AbstractTest;
+
+/**
+ * @Author shane
+ * @Time 2017/2/26 19:57
+ * @Email shanbaohua@lxfintech.com
+ * @Desc ...
+ */
+public class BinaryTreeNodeTest extends AbstractTest {
+
+    @Test
+    public void test(){
+        BinaryTreeNode node = new BinaryTreeNode();
+        node.insert(8);
+        node.insert(5);
+        node.insert(9);
+        node.insert(1);
+        node.insert(6);
+        node.insert(11);
+        node.insert(10);
+        node.insert(15);
+        node.insert(13);
+        node.insert(19);
+
+        printStar();
+        System.out.println(node.getData());
+        System.out.println(node);
+        printStar();
+    }
+}
diff --git a/group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java b/group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java
new file mode 100644
index 0000000000..f22d1cc611
--- /dev/null
+++ b/group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java
@@ -0,0 +1,64 @@
+package study.coding.basic;
+
+import junit.framework.Assert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import study.AbstractTest;
+
+/**
+ * @Author shane
+ * @Time 2017/2/25 23:32
+ * @Email stevenchenguang@gmail.com
+ * @Desc ...
+ */
+public class LinkedListTest extends AbstractTest {
+
+    private static LinkedList list;
+
+    @Before
+    public void before() {
+        list = new LinkedList();
+        list.add("a");
+        list.add("b");
+        list.add("c");
+        list.add("d");
+        list.add("e");
+
+        printStar();
+        System.out.println("Before Test data :" + list);
+        printHyphen();
+    }
+
+    @After
+    public void after() {
+        printHyphen();
+        System.out.println("After Test data : " + list);
+        printStar();
+    }
+
+    @Test
+    public void testAddIndex() {
+        list.add(0, "after a");
+        Assert.assertEquals("after a", list.get(1));
+
+        list.add(3, "after c");
+        Assert.assertEquals("after c", list.get(4));
+
+        list.add(6, "after e");
+        Assert.assertEquals("after e", list.get(7));
+    }
+
+    @Test
+    public void testRemove() {
+        list.remove(0);
+        Assert.assertEquals("b", list.get(0));
+
+        list.remove(list.size() - 1);
+        Assert.assertEquals("d", list.get(list.size() - 1));
+
+        Object obj = list.remove(1);
+        Assert.assertEquals("c", obj);
+        Assert.assertEquals(2, list.size());
+    }
+}
diff --git a/group16/214074094/src/test/java/study/coding/basic/QueueTest.java b/group16/214074094/src/test/java/study/coding/basic/QueueTest.java
new file mode 100644
index 0000000000..cdfe5c95ab
--- /dev/null
+++ b/group16/214074094/src/test/java/study/coding/basic/QueueTest.java
@@ -0,0 +1,63 @@
+package study.coding.basic;
+
+import junit.framework.Assert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import study.AbstractTest;
+
+/**
+ * @Author shane
+ * @Time 2017/2/26 17:24
+ * @Email stevenchenguang@gmail.com
+ * @Desc ...
+ */
+public class QueueTest extends AbstractTest {
+
+    private static Queue queue;
+
+    @Before
+    public void before() {
+        queue = new Queue();
+
+        queue.enQueue("a");
+        queue.enQueue("b");
+        queue.enQueue("c");
+        queue.enQueue("d");
+        queue.enQueue("e");
+
+        printStar();
+        System.out.println("Before Test data :" + queue);
+        printHyphen();
+    }
+
+    @After
+    public void after() {
+        printHyphen();
+        System.out.println("After Test data : " + queue);
+        printStar();
+    }
+
+    @Test
+    public void testDeQueueAndIsEmpty() {
+        Assert.assertEquals("a", queue.deQueue());
+
+        queue.deQueue();
+        queue.deQueue();
+        queue.deQueue();
+        queue.deQueue();
+
+        Assert.assertEquals(true, queue.isEmpty());
+
+        try {
+            queue.deQueue();
+        } catch (RuntimeException e) {
+            Assert.assertEquals("Queue is empty", e.getMessage());
+        }
+    }
+
+    @Test
+    public void testSize() {
+        Assert.assertEquals(5, queue.size());
+    }
+}
diff --git a/group16/214074094/src/test/java/study/coding/basic/StackTest.java b/group16/214074094/src/test/java/study/coding/basic/StackTest.java
new file mode 100644
index 0000000000..8269967dff
--- /dev/null
+++ b/group16/214074094/src/test/java/study/coding/basic/StackTest.java
@@ -0,0 +1,69 @@
+package study.coding.basic;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import study.AbstractTest;
+
+/**
+ * @Author shane
+ * @Time 2017/2/26 16:58
+ * @Email stevenchenguang@gmail.com
+ * @Desc ...
+ */
+public class StackTest extends AbstractTest {
+
+    private static Stack stack;
+
+    @Before
+    public void before() {
+        stack = new Stack();
+
+        stack.push("a");
+        stack.push("b");
+        stack.push("c");
+        stack.push("d");
+        stack.push("e");
+
+        printStar();
+        System.out.println("Before Test data :" + stack);
+        printHyphen();
+    }
+
+    @After
+    public void after() {
+        printHyphen();
+        System.out.println("After Test data : " + stack);
+        printStar();
+    }
+
+    @Test
+    public void testPop() {
+        Assert.assertEquals("e", stack.pop());
+    }
+
+    @Test
+    public void testPeek() {
+        Assert.assertEquals("e", stack.peek());
+    }
+
+    @Test
+    public void testIsEmpty() {
+        Assert.assertEquals(false, stack.isEmpty());
+
+        stack.pop();
+        stack.pop();
+        stack.pop();
+        stack.pop();
+        stack.pop();
+
+        Assert.assertEquals(true, stack.isEmpty());
+    }
+
+    @Test
+    public void testSize() {
+        Assert.assertEquals(5, stack.size());
+    }
+
+}
diff --git a/group16/2816977791/.gitignore b/group16/2816977791/.gitignore
new file mode 100644
index 0000000000..4ede1404d2
--- /dev/null
+++ b/group16/2816977791/.gitignore
@@ -0,0 +1,181 @@
+# Created by https://www.gitignore.io/api/java,intellij,eclipse,emacs,svn,maven
+
+### Java ###
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+
+### Intellij ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff:
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/dictionaries
+.idea/vcs.xml
+.idea/jsLibraryMappings.xml
+*.idea
+
+# Sensitive or high-churn files:
+.idea/dataSources.ids
+.idea/dataSources.xml
+.idea/dataSources.local.xml
+.idea/sqlDataSources.xml
+.idea/dynamic.xml
+.idea/uiDesigner.xml
+
+# Gradle:
+.idea/gradle.xml
+.idea/libraries
+
+# Mongo Explorer plugin:
+.idea/mongoSettings.xml
+
+## File-based project format:
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+### Intellij Patch ###
+*.iml
+
+
+### Eclipse ###
+
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# Eclipse Core
+.project
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+
+### Emacs ###
+# -*- mode: gitignore; -*-
+*~
+\#*\#
+/.emacs.desktop
+/.emacs.desktop.lock
+*.elc
+auto-save-list
+tramp
+.\#*
+
+# Org-mode
+.org-id-locations
+*_archive
+
+# flymake-mode
+*_flymake.*
+
+# eshell files
+/eshell/history
+/eshell/lastdir
+
+# elpa packages
+/elpa/
+
+# reftex files
+*.rel
+
+# AUCTeX auto folder
+/auto/
+
+# cask packages
+.cask/
+
+# Flycheck
+flycheck_*.el
+
+# server auth directory
+/server/
+
+# projectiles files
+.projectile
+
+### SVN ###
+.svn/
+
+
+### Maven ###
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+
+Servers/
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java b/group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..7ac196b700
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,94 @@
+package com.coding.basic;
+
+public class ArrayList implements List {
+
+    private int size = 0;
+
+    private Object[] elementData = new Object[10];
+
+    public void add(Object o) {
+        ensureCapacity(size + 1);
+        elementData[size++] = o;
+    }
+
+    public void add(int index, Object o) {
+        checkForLength(index);
+
+        ensureCapacity(size + 1);
+        System.arraycopy(elementData, index, elementData, index + 1, size - index);
+        elementData[index] = o;
+        size++;
+    }
+
+    public Object get(int index) {
+        checkForLength(index);
+        return elementData[index];
+    }
+
+    public Object remove(int index) {
+        checkForLength(index);
+        Object oldValue = elementData[index];
+        System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
+        size--;
+        return oldValue;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public Iterator iterator() {
+        return null;
+    }
+
+    private void checkForLength(int index) {
+        if (index < 0 || index >= size) {
+            throw new RuntimeException("out of memory");
+        }
+    }
+
+    private void ensureCapacity(int minCapacity) {
+        if (minCapacity - elementData.length > 0) {
+            grow(minCapacity);
+        }
+    }
+
+    private void grow(int minCapacity) {
+        int oldCapacity = elementData.length;
+        int newCapacity = oldCapacity + (oldCapacity >> 1);//增大容量
+        if (newCapacity - minCapacity < 0) {
+            newCapacity = minCapacity;
+        }
+        elementData = copyOf(elementData, newCapacity);
+    }
+
+    private Object[] copyOf(Object[] src, int newCapacity) {
+        Object[] target = new Object[newCapacity];
+        System.arraycopy(src, 0, target, 0, src.length);
+        return target;
+    }
+
+    public static void main(String[] args) {
+        ArrayList list = new ArrayList();
+        String num = "num";
+        for (int i = 0; i < 100; i++) {
+            list.add(num + String.valueOf(i));
+            System.out.println(String.valueOf(i) + ":size:" + list.size());
+            System.out.println(String.valueOf(i) + ":length:" + list.elementData.length);
+        }
+        System.out.println(list.size());
+
+        for (int i = 0; i < 100; i++) {
+            list.add(i, num + String.valueOf(i));
+            System.out.println(String.valueOf(i) + ":size:" + list.size());
+            System.out.println(String.valueOf(i) + ":length:" + list.elementData.length);
+        }
+        System.out.println(list.size());
+
+        for (int i = 0; i < 200; i++) {
+            System.out.println(list.remove(0));
+        }
+
+        System.out.println(list.size());
+    }
+}
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java b/group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..e34a68b3c2
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,67 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+
+    private Object data;
+    private BinaryTreeNode left;
+    private BinaryTreeNode right;
+    private BinaryTreeNode root;
+
+    public BinaryTreeNode(Object data, BinaryTreeNode left, BinaryTreeNode right) {
+        this.data = data;
+        this.left = left;
+        this.right = right;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public BinaryTreeNode getLeft() {
+        return left;
+    }
+
+    public void setLeft(BinaryTreeNode left) {
+        this.left = left;
+    }
+
+    public BinaryTreeNode getRight() {
+        return right;
+    }
+
+    public void setRight(BinaryTreeNode right) {
+        this.right = right;
+    }
+
+    public BinaryTreeNode insert(Object o) {
+        BinaryTreeNode binaryTreeNode = new BinaryTreeNode(o, null, null);
+        if (root == null) {
+            root = binaryTreeNode;
+        } else {
+            add(o, root);
+        }
+        return binaryTreeNode;
+    }
+
+    private BinaryTreeNode add(Object o, BinaryTreeNode target) {
+        if (target == null) {
+            target = new BinaryTreeNode(o, null, null);
+        } else {
+            if (compare(o, target.data) > 0) {
+                target.right = add(o, target.right);
+            } else if (compare(o, target.data) < 0) {
+                target.left = add(o, target.left);
+            }
+        }
+        return target;
+    }
+
+    private int compare(Object src, Object target) {
+        return ((String) src).compareTo((String) target);
+    }
+
+}
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java b/group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java b/group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..be5b236700
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,140 @@
+package com.coding.basic;
+
+public class LinkedList implements List {
+
+    private Node head;
+    private Node last;
+
+    private int size = 0;
+
+    public void add(Object o) {
+        addLast(o);
+    }
+
+    public void add(int index, Object o) {
+        checkPosition(index);
+        if (index == size) {
+            addLast(o);
+        } else {
+            addIndex(index, o);
+        }
+    }
+
+    public Object get(int index) {
+        return node(index).data;
+    }
+
+    public Object remove(int index) {
+        checkPosition(index);
+        Object old = get(index);
+        if (index == 0) {
+            removeFirst();
+        } else if (index == size - 1) {
+            removeLast();
+        } else {
+            node(index - 1).next = node(index + 1);
+            size--;
+        }
+        return old;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public void addFirst(Object o) {
+        Node h = head;
+        Node newNode = new Node(o, h);
+        head = newNode;
+        if (h == null) {
+            last = newNode;
+        }
+        size++;
+    }
+
+    public void addLast(Object o) {
+        Node l = last;
+        Node newNode = new Node(o, null);
+        last = newNode;
+        if (l == null) {
+            head = newNode;
+        } else {
+            l.next = newNode;
+        }
+        size++;
+    }
+
+    public Object removeFirst() {
+        Node old = head;
+        head = old.next;
+        size--;
+        return old.data;
+    }
+
+    public Object removeLast() {
+        Node old = last;
+        Node prev = node(size - 2);
+        last = prev;
+        size--;
+        return old.data;
+    }
+
+    public Iterator iterator() {
+        return null;
+    }
+
+    private void checkPosition(int index) {
+        if (index < 0 || index >= size) {
+            throw new RuntimeException("out of memory");
+        }
+    }
+
+    private void addIndex(int index, Object o) {
+        checkPosition(index);
+        Node newNode = new Node(o, node(index));
+        if (index != 0) {
+            node(index - 1).next = newNode;
+        } else {
+            head = newNode;
+        }
+        size++;
+    }
+
+    private Node node(int index) {
+        Node x = head;
+        for (int i = 0; i < index; i++) {
+            x = x.next;
+        }
+        return x;
+    }
+
+    private static class Node {
+        Object data;
+        Node next;
+
+        public Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+
+    public static void main(String[] args) {
+        LinkedList list = new LinkedList();
+        list.addLast("last");
+        System.out.println(list.size());
+        list.addFirst("head");
+        System.out.println(list.size());
+        list.add(0, "0Object");
+        System.out.println(list.size());
+        list.add(2, "2Object");
+        System.out.println(list.size());
+        list.removeLast();
+        System.out.println(list.size());
+        list.removeFirst();
+        System.out.println(list.size());
+        list.removeLast();
+        System.out.println(list.size());
+        list.get(0);
+        System.out.println(list.size());
+    }
+}
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/List.java b/group16/2816977791/firstExercise/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..01398944e6
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/List.java
@@ -0,0 +1,13 @@
+package com.coding.basic;
+
+public interface List {
+    public void add(Object o);
+
+    public void add(int index, Object o);
+
+    public Object get(int index);
+
+    public Object remove(int index);
+
+    public int size();
+}
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/Queue.java b/group16/2816977791/firstExercise/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..f2475fcfd6
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/Queue.java
@@ -0,0 +1,21 @@
+package com.coding.basic;
+
+public class Queue {
+    private ArrayList elementData = new ArrayList();
+
+    public void enQueue(Object o) {
+        elementData.add(o);
+    }
+
+    public Object deQueue() {
+        return elementData.get(0);
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() == 0 ? true : false;
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+}
diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/Stack.java b/group16/2816977791/firstExercise/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..12a89eb613
--- /dev/null
+++ b/group16/2816977791/firstExercise/src/com/coding/basic/Stack.java
@@ -0,0 +1,25 @@
+package com.coding.basic;
+
+public class Stack {
+    private ArrayList elementData = new ArrayList();
+
+    public void push(Object o) {
+        elementData.add(0, o);
+    }
+
+    public Object pop() {
+        return elementData.remove(0);
+    }
+
+    public Object peek() {
+        return elementData.get(0);
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() == 0 ? true : false;
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java b/group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..3572229739
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,258 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     *
+     * @param origin
+     * @return
+     */
+    public void reverseArray(int[] origin) {
+        int i = 0;
+        while (i < origin.length - 1 - i) {
+            int temp = origin[origin.length - 1 - i];
+            origin[origin.length - 1 - i] = origin[i];
+            origin[i] = temp;
+            i++;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     *
+     * @param oldArray
+     * @return
+     */
+
+    public int[] removeZero(int[] oldArray) {
+        int point = 0;
+        for (int i : oldArray) {
+            if (i != 0) {
+                oldArray[point++] = i;
+            }
+        }
+        int[] newArray = new int[point];
+        System.arraycopy(oldArray, 0, newArray, 0, point);
+        return newArray;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     *
+     * @param array1
+     * @param array2
+     * @return
+     */
+
+    public int[] merge(int[] array1, int[] array2) {
+        //两个指针
+        int pos1 = 0;
+        int pos2 = 0;
+        int point = 0;
+        int[] newArray = new int[array1.length + array2.length];
+        while (pos1 < array1.length && pos2 < array2.length) {
+            if (array1[pos1] > array2[pos2]) {
+                newArray[point++] = array2[pos2++];
+            } else if (array1[pos1] < array2[pos2]) {
+                newArray[point++] = array1[pos1++];
+            } else {
+                newArray[point++] = array1[pos1++];
+                pos2++;
+            }
+        }
+        while (pos1 < array1.length) {
+            newArray[point++] = array1[pos1++];
+        }
+        while (pos1 < array2.length) {
+            newArray[point++] = array1[pos2++];
+        }
+        int[] array = new int[point];
+        System.arraycopy(newArray, 0, array, 0, point);
+        return array;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     *
+     * @param oldArray
+     * @param size
+     * @return
+     */
+    public int[] grow(int[] oldArray, int size) {
+        int[] newArray = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     *
+     * @param max
+     * @return
+     */
+    public int[] fibonacci(int max) {
+        int a = 0;
+        int b = 1;
+        int[] array = new int[max];
+        int i = 0;
+        if (max >= 2) {
+            array[i++] = 1;
+        }
+        while (a + b < max) {
+            int temp = b;
+            b = a + b;
+            a = temp;
+            array[i++] = b;
+        }
+        int[] newArray = new int[i];
+        System.arraycopy(array, 0, newArray, 0, i);
+        return newArray;
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPrimes(int max) {
+        int[] array = new int[max / 2 + 1];
+        int pos = 0;
+        for (int i = 1; i < max; i++) {
+            if (prime(i)) {
+                array[pos++] = i;
+            }
+        }
+        int[] newArray = new int[pos];
+        System.arraycopy(array, 0, newArray, 0, pos);
+        return newArray;
+    }
+
+    private boolean prime(int value) {
+        if (value < 2) {
+            return false;
+        } else if (value == 2) {
+            return true;
+        } else {
+            for (int i = 2; i < value / 2 + 1; i++) {
+                if (value % 2 == 0) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     *
+     * @param max
+     * @return
+     */
+    public int[] getPerfectNumbers(int max) {
+        int pos = 0;
+        int[] array = new int[max];
+        for (int i = 1; i < max; i++) {
+            if (perfectNumber(i)) {
+                array[pos++] = i;
+            }
+        }
+        int[] newArray = new int[pos];
+        System.arraycopy(array, 0, newArray, 0, pos);
+        return newArray;
+    }
+
+    private boolean perfectNumber(int value) {
+        if (value == 1 || prime(value)) {
+            return false;
+        } else {
+            int sum = 0;
+            for (int i = 1; i <= value / 2; i++) {
+                if (value % i == 0) {
+                    sum += i;
+                }
+            }
+            if (sum == value) {
+                return true;
+            }
+            return false;
+        }
+    }
+
+    /**
+     * 用seperator 把数组 array给连接起来
+     * 例如array= [3,8,9], seperator = "-"
+     * 则返回值为"3-8-9"
+     *
+     * @param array
+     * @param seperator
+     * @return
+     */
+    public String join(int[] array, String seperator) {
+        String out = "";
+        for (int i = 0; i < array.length; i++) {
+            if (i == 0) {
+                out += String.valueOf(i);
+            } else {
+                out += seperator + String.valueOf(i);
+            }
+        }
+        return out;
+    }
+
+
+    public static void main(String[] args) {
+        ArrayUtil arrayUtil = new ArrayUtil();
+        //reverse
+        int[] a = {7, 9, 30, 3};
+        arrayUtil.reverseArray(a);
+        System.out.println(a);
+
+        //remove zero
+        int[] zero = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
+        int[] afterZero = arrayUtil.removeZero(zero);
+        System.out.println(afterZero);
+
+        //merge
+        int[] a1 = {3, 5, 7, 8};
+        int[] a2 = {4, 5, 6, 7};
+        int[] merge = arrayUtil.merge(a1, a2);
+        System.out.println(merge);
+
+        //grow
+        int[] oldArray = {2, 3, 6};
+        int[] grow = arrayUtil.grow(oldArray, 3);
+        System.out.println(grow);
+
+        //fibonacci
+        int[] fibonacci = arrayUtil.fibonacci(2);
+        System.out.println(fibonacci);
+
+        //primes
+        int[] primes = arrayUtil.getPrimes(15);
+        System.out.println(primes);
+
+        //perfect
+        int[] perfect = arrayUtil.getPerfectNumbers(500);
+        System.out.println(perfect);
+
+        //join
+        int[] joinArray = {2};
+        String join = arrayUtil.join(joinArray, "-");
+        System.out.println(join);
+
+    }
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java
new file mode 100644
index 0000000000..55988befbe
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java
@@ -0,0 +1,37 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+/**
+ * @author nvarchar
+ *         date 2017/3/1
+ */
+public class ActionXml {
+    private String name;
+    private String className;
+    private Map<String, String> map;
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Map<String, String> getMap() {
+        return map;
+    }
+
+    public void setMap(Map<String, String> map) {
+        this.map = map;
+    }
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..f169cb1cbb
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,150 @@
+package com.coderising.litestruts;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+    private static Map<String, ActionXml> actionXmlMap;
+
+    static {
+        //0. 读取配置文件struts.xml
+        actionXmlMap = parserXml("src/com/coderising/litestruts/struts.xml");
+        System.out.println("parse end");
+    }
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        try {
+            ActionXml actionXml = actionXmlMap.get(actionName);
+            if (actionName == null) {
+                return null;
+            } else {
+                String className = actionXml.getClassName();
+                Class cls = Class.forName(className);
+                Object obj = cls.newInstance();
+                /**
+                 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+                 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+                 ("name"="test" ,  "password"="1234") ,
+                 那就应该调用 setName和setPassword方法
+                 */
+                Method[] methods = cls.getMethods();
+                for (String field : parameters.keySet()) {
+                    for (Method method : methods) {
+                        if (method.getName().startsWith("set") && method.getName().toLowerCase().endsWith(field.toLowerCase())) {
+                            method.invoke(obj, parameters.get(field));
+                            break;
+                        }
+                    }
+                }
+                Method action = cls.getMethod("execute");
+                //通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+                String result = (String) action.invoke(obj);
+                /**
+                 通过反射找到对象的所有getter方法（例如 getMessage）,
+                 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+                 放到View对象的parameters
+                 */
+                Field[] fields = cls.getDeclaredFields();
+                Map<String, Object> params = new HashMap<>();
+                for (Field field : fields) {
+                    for (Method method : methods) {
+                        if (method.getName().startsWith("get") && method.getName().toLowerCase().endsWith(field.getName().toLowerCase())) {
+                            String viewResult = (String) method.invoke(obj);
+                            params.put(field.getName(), viewResult);
+                            break;
+                        }
+                    }
+                }
+                /**
+                 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+                 放到View对象的jsp字段中。
+                 */
+                View view = new View();
+                view.setParameters(params);
+                view.setJsp(actionXmlMap.get(actionName).getMap().get(result));
+                return view;
+            }
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+            return null;
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+            return null;
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+            return null;
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    //解析xml文件
+    private static Map<String, ActionXml> parserXml(String fileName) {
+        try {
+            Map<String, ActionXml> map = new HashMap<>();
+            //create documentBuilder
+            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+            DocumentBuilder db = dbf.newDocumentBuilder();
+            //create document
+            Document document = db.parse(fileName);
+            //extract root element
+            Element root = document.getDocumentElement();
+            System.out.println("Root element :" + document.getDocumentElement().getNodeName());
+            NodeList nodeList = document.getElementsByTagName("action");
+            System.out.println("----------------------------");
+            for (int temp = 0; temp < nodeList.getLength(); temp++) {
+                Node nNode = nodeList.item(temp);
+                System.out.println("\nCurrent Element :"
+                    + nNode.getNodeName());
+                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+                    ActionXml actionXml = new ActionXml();
+                    Element eElement = (Element) nNode;
+                    System.out.println("action name : "
+                        + eElement.getAttribute("name"));
+                    System.out.println("class name : "
+                        + eElement.getAttribute("class"));
+                    actionXml.setName(eElement.getAttribute("name"));
+                    actionXml.setClassName(eElement.getAttribute("class"));
+                    NodeList result = eElement.getElementsByTagName("result");
+                    Map<String, String> results = new HashMap<>();
+                    for (int i = 0; i < result.getLength(); i++) {
+                        Node resultNode = result.item(i);
+                        if (resultNode.getNodeType() == Node.ELEMENT_NODE) {
+                            Element resultElement = (Element) resultNode;
+                            System.out.println("result name:" + resultElement.getAttribute("name"));
+                            System.out.println("result context:" + resultElement.getTextContent());
+                            results.put(resultElement.getAttribute("name"), resultElement.getTextContent());
+                        }
+                        actionXml.setMap(results);
+                    }
+                    map.put(actionXml.getName(), actionXml);
+                }
+            }
+            return map;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+//        parserXml("src/com/coderising/litestruts/struts.xml");
+    }
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml b/group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..246b3595ad
--- /dev/null
+++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/313001956/src/com/coding/basic/ArrayList.java b/group16/313001956/src/com/coding/basic/ArrayList.java
index eaaa690fa6..3bec144013 100644
Binary files a/group16/313001956/src/com/coding/basic/ArrayList.java and b/group16/313001956/src/com/coding/basic/ArrayList.java differ
diff --git a/group16/313001956/src/com/coding/basic/LinkedList.java b/group16/313001956/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..de886c9084
--- /dev/null
+++ b/group16/313001956/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,140 @@
+package com.coding.basic;
+
+public class LinkedList implements List {
+
+	private Node head;
+	private int size;
+
+	public LinkedList() {
+
+	}
+
+	public void add(Object o) {
+		addLast(o);
+	}
+
+	public void add(int index, Object o) {
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("Խ�磡");
+		}
+		if (head == null) {
+			head = new Node();
+			head.data = o;
+		} else {
+
+			Node n = getNodebyIndex(index);
+
+			Node newnode = new Node();
+			newnode.data = o;
+			newnode.next = n.next;
+			n.next = newnode;
+		}
+		size++;
+	}
+
+	public Object get(int index) {
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("Խ�磡");
+		}
+		if (head == null)
+			return null;
+		Node n = getNodebyIndex(index);
+		return n.data;
+	}
+
+	public Object remove(int index) {
+		if (index < 0 || index > size) {
+			throw new IndexOutOfBoundsException("Խ�磡");
+		}
+		Node n = getNodebyIndex(index - 1);
+		Object o = n.next.data;
+		n.next = n.next.next;
+		size--;
+		return o;
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public void addFirst(Object o) {
+		if (head == null) {
+			head = new Node();
+			head.data = o;
+		} else {
+			Node newnode = new Node();
+			newnode.data = o;
+			newnode.next = head;
+			head = newnode;
+		}
+		size++;
+	}
+
+	public void addLast(Object o) {
+		if (head == null) {
+			head = new Node();
+			head.data = o;
+		} else {
+			Node n = getNodebyIndex(size);
+			Node newnode = new Node();
+			newnode.data = o;
+			n.next = newnode;
+		}
+		size++;
+	}
+
+	public Object removeFirst() {
+		if (head == null)
+			return null;
+
+		head = head.next;
+		size--;
+		return head.data;
+	}
+
+	public Object removeLast() {
+		if (head == null)
+			return null;
+		Node n = getNodebyIndex(size - 1);
+		Object o = n.next.data;
+		n.next = null;
+		size--;
+		return o;
+	}
+
+	public Iterator iterator() {
+		return null;
+	}
+
+	private Node getNodebyIndex(int index) {
+		int i = 0;
+		Node n = head;
+		while (i < index) {
+			n = n.next;
+			i++;
+		}
+		return n;
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+		Object Getdata() {
+			return data;
+		}
+
+		void Setdata(Object o) {
+			data = o;
+		}
+
+		Node Getnext() {
+			return next;
+		}
+
+		void Setnext(Node n) {
+			next = n;
+		}
+	}
+}
+
diff --git a/group16/313001956/src/com/coding/basic/Queue.java b/group16/313001956/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..4b9f311f99
--- /dev/null
+++ b/group16/313001956/src/com/coding/basic/Queue.java
@@ -0,0 +1,24 @@
+package com.coding.basic;
+
+public class Queue {
+	
+	private LinkedList elementData = new LinkedList();
+	public void enQueue(Object o){
+		elementData.addLast(o);
+	}
+	
+	public Object deQueue(){
+		Object o= elementData.get(0);
+		elementData.removeFirst();
+		return o;
+	}
+	
+	
+	public boolean isEmpty(){
+		return elementData.size()==0;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group16/313001956/src/com/coding/basic/Stack.java b/group16/313001956/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..6ec157201e
--- /dev/null
+++ b/group16/313001956/src/com/coding/basic/Stack.java
@@ -0,0 +1,37 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+
+	public Stack() {
+		// TODO Auto-generated constructor stub
+	}
+
+	public void push(Object o) {
+		elementData.add(o);
+	}
+
+	public Object pop() {
+		int size = elementData.size();
+		Object o = elementData.get(size - 1);
+		elementData.remove(size - 1);
+		return o;
+	}
+
+	public Object peek() {
+		int size = elementData.size();
+		Object o = elementData.get(size - 1);
+		
+		return o;
+	}
+
+	public boolean isEmpty() {
+		if (elementData.size() == 0)
+			return true;
+		return false;
+	}
+
+	public int size() {
+		return elementData.size();
+	}
+}
diff --git a/group16/420355244/Homework1/.classpath b/group16/420355244/Homework1/.classpath
new file mode 100644
index 0000000000..373dce4005
--- /dev/null
+++ b/group16/420355244/Homework1/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group16/420355244/Homework1/.gitignore b/group16/420355244/Homework1/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group16/420355244/Homework1/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group16/420355244/Homework1/.project b/group16/420355244/Homework1/.project
new file mode 100644
index 0000000000..ec1134f33a
--- /dev/null
+++ b/group16/420355244/Homework1/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Homework1</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs b/group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group16/420355244/Homework1/src/com/coding/basic/ArrayList.java b/group16/420355244/Homework1/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..6534c3c029
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,91 @@
+package com.coding.basic;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		if(size < elementData.length){
+			elementData[size] = o;
+		}else{
+			Object[] newElementData = new Object[elementData.length + elementData.length/2];
+			System.arraycopy(elementData, 0, newElementData, 0, size);
+			newElementData[size] = o;
+			this.elementData = newElementData;
+		}
+		size++;
+		
+	}
+	public void add(int index, Object o){
+		if(index >= 0 && index <= size){
+			//1.不扩容
+			if(index == size - 1){
+				//1.1 加在最后
+				elementData[index] = o;
+			}else{
+				//1.2 加在前面
+				//index的位置的数值变为改对象，index以后位置的都往后挪一位
+				Object[] newElementData = new Object[elementData.length];
+				System.arraycopy(elementData, 0, newElementData, 0, index);
+				newElementData[index] = o ;
+				System.arraycopy(elementData, index, newElementData, index + 1, size - index);
+				this.elementData = newElementData;
+			}
+			size++;
+		}else{
+			throw new IndexOutOfBoundsException();
+		}
+	}
+	
+	public Object get(int index){
+		if(index < size){
+			return elementData[index];
+		}else{
+			throw new IndexOutOfBoundsException();
+		}
+	}
+	
+	public Object remove(int index){
+		if(index < size){
+			Object obj = elementData[index];
+			Object[] newElementData = new Object[elementData.length];
+			if(size != 1){
+				//1.若集合长度为1
+				if(0 == index){
+					//1.1.如果remove的是0索引的
+					System.arraycopy(elementData, 1, newElementData, 0, size - 1);
+				}else if(index == size -1){
+					//1.2.如果remove的是最后索引的
+					System.arraycopy(elementData, 0, newElementData, 0, size - 1);
+				}else{
+					//1.3.在中间
+					System.arraycopy(elementData, 0, newElementData, 0, index);
+					System.arraycopy(elementData, index + 1, newElementData, index, size - index - 1);
+				}
+			}
+			this.elementData = newElementData;
+			size--;
+			return obj;
+		}else{
+			throw new IndexOutOfBoundsException();
+		}
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	@Override
+	public String toString() {
+		return "ArrayList [size=" + size + ", elementData=" + Arrays.toString(elementData) + "]";
+	}
+	
+	
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java b/group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java
new file mode 100644
index 0000000000..420c412a7b
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java
@@ -0,0 +1,62 @@
+package com.coding.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayListTest {
+
+	private static ArrayList arrayList = new ArrayList();
+	
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testAddObject() {
+		for(int i = 0 ;i < 150; i++){
+			arrayList.add("aaa");
+		}
+		System.out.println(arrayList);
+		System.out.println(arrayList.size());
+	}
+
+	@Test
+	public void testAddIntObject() {
+		arrayList.add("aaa");
+		arrayList.add("bbb");
+		arrayList.add("ccc");
+		arrayList.add("ddd");
+		arrayList.add(1,"eee");
+		System.out.println(arrayList);
+	}
+
+	@Test
+	public void testGet() {
+		arrayList.add("aaa");
+		arrayList.add("bbb");
+		arrayList.add("ccc");
+		arrayList.add("ddd");
+		Object object = arrayList.get(0);
+		System.out.println(object);
+	}
+
+	@Test
+	public void testRemove() {
+		arrayList.add("aaa");
+		arrayList.add("bbb");
+		arrayList.add("ccc");
+		arrayList.add("ddd");
+		arrayList.remove(0);
+		System.out.println(arrayList);
+	}
+
+	@Test
+	public void testSize() {
+		arrayList.add("aaa");
+		arrayList.add("bbb");
+		arrayList.add("ccc");
+		arrayList.add("ddd");
+		System.out.println(arrayList.size());
+	}
+
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java b/group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/Iterator.java b/group16/420355244/Homework1/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/LinkedList.java b/group16/420355244/Homework1/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..9af35a399d
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,224 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+public class LinkedList implements List {
+	
+	
+	private Node first;
+	
+	private Node last;
+	
+	private int size = 0;
+	
+	public void add(Object o){
+		if(null == first){
+			//当链表元素为空时，新建一个Node
+			Node node = new Node();
+			node.data = o;
+			node.next = null;
+			first = node;
+			last = node;
+			size ++;
+		}else{
+			addLast(o);
+		}
+	}
+	public void add(int index , Object o){
+		if(index < 0 || index >= size){
+			//数组越界异常
+			throw new IndexOutOfBoundsException();
+		}else{
+			if(0 == index){
+				//1.如果加在头上
+				addFirst(o);
+			}else{
+				//2.加在中间位置
+				Node node = first.next;
+				int nodeIndex = 1;
+				if(nodeIndex == index){
+					//如果是第二个位置的话
+					Node nodeAdd = new Node();
+					nodeAdd.data = o;
+					first.next = nodeAdd;
+					nodeAdd.next = node;
+					last = node;
+					size ++;
+				}
+				//第三个位置及以后、开始遍历所有的索引
+				while(null != node.next){
+					//保留遍历中node之前的结点
+					Node nodeLast = node;
+					node = node.next;
+					nodeIndex++;
+					if(nodeIndex == index){
+						Node nodeAdd = new Node();
+						nodeAdd.data = o;
+						nodeLast.next = nodeAdd;
+						nodeAdd.next = node;
+						size ++;
+						break;
+					}
+				}
+			}
+		}
+		
+	}
+	public Object get(int index){
+		if(index < 0 || index >= size){
+			//数组越界异常
+			throw new IndexOutOfBoundsException();
+		}else{
+			if(0 == index){
+				//1.如果加在头上
+				return first.data;
+			}
+			Node node = first.next;
+			int nodeIndex = 1;
+			if(nodeIndex == index){
+				//如果是第二个位置的话
+				return node.data;
+			}
+			//第三个位置及以后、开始遍历所有的索引
+			while(null != node.next){
+				//保留遍历中node之前的结点
+				node = node.next;
+				nodeIndex++;
+				if(nodeIndex == index){
+					return node.data;
+				}
+			}
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	public Object remove(int index){
+		if(index < 0 || index >= size){
+			//数组越界异常
+			throw new IndexOutOfBoundsException();
+		}else{
+			if(0 == index){
+				//1.如果移除头
+				removeFirst();
+			}else if(index == (size - 1)){
+				//2.移除尾
+				removeLast();
+			}else{
+				//3.移除中间位置
+				Node node = first.next;
+				//从first的零号索引开始
+				int nodeIndex = 1;
+				
+				//开始遍历所有的索引，记住要移除的索引位数据的前后结点
+				Node lastNode = first;
+				if(index == nodeIndex){
+					//第一次不匹配则后续的循环执行
+					Object o = node.data;
+					lastNode.next = node.next;
+					size--;
+					return o;
+				}else{
+					while(null != node.next){
+						lastNode = node;
+						node = node.next;
+						nodeIndex++;
+						if(index == nodeIndex){
+							Object o = node.data;
+							lastNode.next = node.next;
+							size--;
+							return o;
+						}
+					}
+				}
+			}
+		}
+		throw new IndexOutOfBoundsException();
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node node = new Node();
+		node.data = o ;
+		node.next = first;
+		first = node;
+		size++;
+	}
+	public void addLast(Object o){
+		Node node = new Node();
+		node.data = o ;
+		node.next = null;
+		last.next = node;
+		last = node;
+		size++;
+	}
+	public Object removeFirst(){
+		Object o = first.data;
+		Node node = first.next;
+		first = node;
+		size--;
+		return o;
+	}
+	public Object removeLast(){
+		if(0 == size){
+			throw new NoSuchElementException();
+			
+		}else if(1 == size){
+			//只有一个元素
+			removeFirst();
+		}else{
+			//第二个元素
+			Node node = first.next;
+			if(null == node.next){
+				Object o = node.data;
+				last = first;
+				first.next = null;
+				return o;
+			}else{
+				while(null != node.next){
+					//若不止只有2个 ，记录最后一个结点的前一个。
+					Node lastNode = node;
+					node = node.next;
+					if(null == node.next){
+						Object o = node.data;
+						lastNode.next = null;
+						last = lastNode;
+						size--;
+						return o;
+					}
+				}
+			}
+		}
+		throw new NoSuchElementException();
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		if(null != first){
+			sb.append(first.data.toString() + ",");
+			Node node = first.next;
+			sb.append(node.data.toString() + ",");
+			while(null != node.next){
+				node = node.next;
+				sb.append(node.data.toString() + ",");
+			}
+		}
+		return sb.toString();
+	}
+
+
+	
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java b/group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java
new file mode 100644
index 0000000000..2caea9679b
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java
@@ -0,0 +1,112 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class LinkedListTest {
+	private static LinkedList linkedList = new LinkedList();
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testAddObject() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		System.out.println(linkedList);
+	}
+
+	@Test
+	public void testAddIntObject() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		linkedList.add(2,"ddd");
+		System.out.println(linkedList);
+		System.out.println(linkedList.size());
+	}
+
+	@Test
+	public void testGet() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		linkedList.add("eee");
+		linkedList.add("fff");
+		linkedList.add("ddd");
+//		System.out.println(linkedList.size());
+		System.out.println(linkedList.get(3));
+	}
+
+	@Test
+	public void testRemove() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		linkedList.add("eee");
+		linkedList.add("fff");
+		linkedList.add("ddd");
+		linkedList.remove(5);
+		linkedList.remove(1);
+		linkedList.remove(2);
+		System.out.println(linkedList);
+		System.out.println(linkedList.size());
+	}
+
+	@Test
+	public void testSize() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		linkedList.add("eee");
+		linkedList.add("fff");
+		linkedList.add("ddd");
+		System.out.println(linkedList.size());
+	}
+
+	@Test
+	public void testAddFirst() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.addFirst("sss");
+		System.out.println(linkedList);
+	}
+
+	@Test
+	public void testAddLast() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		System.out.println(linkedList);
+	}
+
+	@Test
+	public void testRemoveFirst() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		linkedList.removeFirst();
+		linkedList.addFirst("eee");
+		linkedList.removeFirst();
+		System.out.println(linkedList);
+	}
+
+	@Test
+	public void testRemoveLast() {
+		linkedList.add("aaa");
+		linkedList.add("bbb");
+		linkedList.add("ccc");
+		linkedList.removeLast();
+		linkedList.add("eee");
+		linkedList.addFirst("xxx");
+		System.out.println(linkedList);
+	}
+
+	@Test
+	public void testIterator() {
+		fail("Not yet implemented");
+	}
+
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/List.java b/group16/420355244/Homework1/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/Queue.java b/group16/420355244/Homework1/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..a2f9577b7b
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/Queue.java
@@ -0,0 +1,66 @@
+package com.coding.basic;
+
+public class Queue {
+	private Node first;
+	private Node last;
+	private int size = 0;
+	public void enQueue(Object o){	
+		if(null == first){
+			Node node = new Node();
+			node.data = o;
+			node.next = null;
+			first = node;
+			last = node;
+		}else{
+			Node node = new Node();
+			node.data = o;
+			node.next = null;
+			last.next = node;
+			last = node;
+		}
+		size++;
+	}
+	
+	public Object deQueue(){
+		Node second = first.next;
+		Object o = first.data;
+		if(null != second){
+			first = second;
+			return o;
+		}else{
+			first = null;
+			size = 0;
+			return o;
+		}
+	}
+	
+	public boolean isEmpty(){
+		if(size > 0){
+			return false;
+		}else{
+			return true;
+		}
+	}
+	
+	public int size(){
+		return size;
+	}
+	static class Node{
+		Node next;
+		Object data;
+	}
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		if(null != first){
+			sb.append(first.data.toString() + ",");
+			Node node = first.next;
+			sb.append(node.data.toString() + ",");
+			while(null != node.next){
+				node = node.next;
+				sb.append(node.data.toString() + ",");
+			}
+		}
+		return sb.toString();
+	}
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/QueueTest.java b/group16/420355244/Homework1/src/com/coding/basic/QueueTest.java
new file mode 100644
index 0000000000..50d7fc0903
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/QueueTest.java
@@ -0,0 +1,56 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class QueueTest {
+
+	public static Queue queue = new Queue();
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testEnQueue() {
+		queue.enQueue("aaa");
+		queue.enQueue("bbb");
+		queue.enQueue("ccc");
+		queue.enQueue("aaa");
+		System.out.println(queue);
+	}
+
+	@Test
+	public void testDeQueue() {
+		queue.enQueue("aaa");
+		queue.enQueue("bbb");
+		queue.enQueue("ccc");
+		queue.enQueue("ddd");
+		queue.enQueue("eee");
+		queue.deQueue();
+		System.out.println(queue);
+	}
+
+	@Test
+	public void testIsEmpty() {
+		System.out.println(queue.isEmpty());
+		
+	}
+
+	@Test
+	public void testSize() {
+		queue.enQueue("aaa");
+		queue.enQueue("bbb");
+		queue.enQueue("ccc");
+		queue.enQueue("ddd");
+		queue.enQueue("eee");
+		System.out.println(queue.size());
+	}
+
+	@Test
+	public void testToString() {
+		fail("Not yet implemented");
+	}
+
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/Stack.java b/group16/420355244/Homework1/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..5c59bf34fc
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/Stack.java
@@ -0,0 +1,39 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int size = 0;
+	public void push(Object o){	
+		//入栈在栈顶进入最后压入
+		elementData.add(o);
+		size ++;
+	}
+	
+	public Object pop(){
+		Object object = elementData.get(size -1);
+		elementData.remove(size -1);
+		size --;
+		return object;
+	}
+	
+	public Object peek(){
+		Object object = elementData.get(size -1);
+		return object;
+	}
+	public boolean isEmpty(){
+		if(size <= 0){
+			return true;
+		}else{
+			return false;
+		}
+	}
+	public int size(){
+		return size;
+	}
+
+	@Override
+	public String toString() {
+		return elementData.toString();
+	}
+	
+}
diff --git a/group16/420355244/Homework1/src/com/coding/basic/StackTest.java b/group16/420355244/Homework1/src/com/coding/basic/StackTest.java
new file mode 100644
index 0000000000..b436785574
--- /dev/null
+++ b/group16/420355244/Homework1/src/com/coding/basic/StackTest.java
@@ -0,0 +1,62 @@
+package com.coding.basic;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class StackTest {
+	private static Stack stack = new Stack();
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void testPush() {
+		stack.push("aaa");
+		stack.push("bbb");
+		stack.push("ccc");
+		System.out.println(stack);
+	}
+
+	@Test
+	public void testPop() {
+		stack.push("aaa");
+		stack.push("bbb");
+		stack.push("ccc");
+		Object pop = stack.pop();
+		System.out.println(pop);
+		System.out.println(stack);
+	}
+
+	@Test
+	public void testPeek() {
+		stack.push("aaa");
+		stack.push("bbb");
+		stack.push("ccc");
+		Object peek = stack.peek();
+		System.out.println(peek);
+	}
+
+	@Test
+	public void testIsEmpty() {
+		System.out.println(stack.isEmpty());
+		stack.push("aaa");
+		stack.push("bbb");
+		stack.push("ccc");
+		System.out.println(stack.isEmpty());
+		stack.pop();
+		stack.pop();
+		stack.pop();
+		System.out.println(stack.isEmpty());
+	}
+
+	@Test
+	public void testSize() {
+		stack.push("aaa");
+		stack.push("bbb");
+		stack.push("ccc");
+		stack.pop();
+		stack.pop();
+		System.out.println(stack.size());
+	}
+
+}
diff --git a/group16/420355244/Homework2/.classpath b/group16/420355244/Homework2/.classpath
new file mode 100644
index 0000000000..f5d4a033ec
--- /dev/null
+++ b/group16/420355244/Homework2/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group16/420355244/Homework2/.gitignore b/group16/420355244/Homework2/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group16/420355244/Homework2/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group16/420355244/Homework2/.project b/group16/420355244/Homework2/.project
new file mode 100644
index 0000000000..1a13fc592d
--- /dev/null
+++ b/group16/420355244/Homework2/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Homework2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group16/420355244/Homework2/src/com/coderising/action/LoginAction.java b/group16/420355244/Homework2/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..5496d8084d
--- /dev/null
+++ b/group16/420355244/Homework2/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java b/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..5fd5f1efba
--- /dev/null
+++ b/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,120 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		for(int i = 0;i < origin.length/2; i++){
+			int x = origin[i];
+			origin[i] = origin[origin.length - i -1];
+			origin[origin.length - i -1] = x;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static  int[] removeZero(int[] oldArray){
+		for(int i = 0;i < oldArray.length ;i++){
+			if(oldArray[i] == 0){
+				int[] a = {};
+				System.arraycopy(oldArray, 0, a, 0, i);
+				System.arraycopy(oldArray, 0, a, i, oldArray.length);
+				oldArray = a;
+				removeZero(oldArray);
+			}
+		}
+		return oldArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static  int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static  int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static  int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public  static int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static  int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static  String join(int[] array, String seperator){
+		return null;
+	}
+	
+	public static void main(String[] args) {
+		/*int[] a = {7, 9 , 30, 3};
+		reverseArray(a);
+		for (int i : a) {
+			System.out.print(i+",");
+		}*/
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} ;
+		removeZero(oldArr);
+		for (int i : oldArr) {
+			System.out.print(i+",");
+		}
+	}
+}
diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java b/group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..40af955dfa
--- /dev/null
+++ b/group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,133 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	//0. 读取配置文件struts.xml
+    	SAXReader reader = new SAXReader();
+    	try {
+    		//0.2 读取文件
+			Document doc = reader.read(new File("./src/com/coderising/litestruts/struts.xml"));
+			//0.3 得到根标签
+			Element rootElement = doc.getRootElement();
+			//0.4 得到根标签下的所有action标签 
+			Iterator<Element> elementIterator = rootElement.elementIterator("action");
+			while(elementIterator.hasNext()){
+				Element element = elementIterator.next();
+				String nameValue = element.attributeValue("name");
+				try {
+					if(null != actionName && actionName.trim() != ""){
+						if(actionName.equals(nameValue)){
+							View view = new View();
+							//进入该action标签内,结束后停止循环
+							String classValue = element.attributeValue("class");
+							//1.1 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）据parameters中的数据
+							Class clazz =Class.forName(classValue);
+							Object instance = clazz.newInstance();
+							Method[] methods = clazz.getMethods();
+							for (Entry<String, String> entry :  parameters.entrySet()) {
+								String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1);
+								//1.2调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,  "password"="1234") ,那就应该调用 setName和setPassword方法
+								for (Method setterMethod : methods) {
+									if(methodName.equals(setterMethod.getName())){
+										setterMethod.invoke(instance,entry.getValue());
+											break;
+									}
+								}
+							}
+							//2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+							Method method = clazz.getMethod("execute", null);
+							Object exectueResult = method.invoke(instance, null); 
+							Iterator<Element> resultElement = element.elementIterator("result");
+							while(resultElement.hasNext()){
+								Element result = resultElement.next();
+								if(exectueResult.equals(result.attributeValue("name"))){
+									String jsp = result.getText();
+									view.setJsp(jsp);
+									break;
+								}
+							}
+							/*3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+								通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+								放到View对象的parameters*/
+							HashMap<Object, Object> hashMap = new HashMap<>();
+							for (Method getterMethod : methods) {
+								if(getterMethod.getName().contains("get")){
+									Object resultValue = getterMethod.invoke(instance,null);
+									String resultKey = getterMethod.getName().replace("get", "").substring(0,1).toLowerCase() 
+											+ getterMethod.getName().replace("get", "").substring(1);
+									hashMap.put(resultKey, resultValue);
+								}
+							}
+							view.setParameters(hashMap);
+							return view;
+						}
+					}
+				} catch (ClassNotFoundException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (InstantiationException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IllegalAccessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (SecurityException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IllegalArgumentException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (NoSuchMethodException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+    	return null;
+    }   
+    public static void main(String[] args) {
+    	runAction("login",null);
+	}
+
+}
diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java b/group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/View.java b/group16/420355244/Homework2/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group16/420355244/Homework2/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml b/group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/502059278/.classpath b/group16/502059278/.classpath
index fb5011632c..c0abaf014f 100644
--- a/group16/502059278/.classpath
+++ b/group16/502059278/.classpath
@@ -2,5 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="src/lib/dom4j-1.6.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git "a/group16/502059278/homework/\350\256\241\347\256\227\346\234\272\346\274\253\350\260\210_\344\275\234\344\270\232.docx" "b/group16/502059278/homework/\350\256\241\347\256\227\346\234\272\346\274\253\350\260\210_\344\275\234\344\270\232.docx"
deleted file mode 100644
index 31dfe4c14b..0000000000
Binary files "a/group16/502059278/homework/\350\256\241\347\256\227\346\234\272\346\274\253\350\260\210_\344\275\234\344\270\232.docx" and /dev/null differ
diff --git a/group16/502059278/src/cn/mark/MyArrayList.java b/group16/502059278/src/cn/mark/MyArrayList.java
deleted file mode 100644
index 9e0e406274..0000000000
--- a/group16/502059278/src/cn/mark/MyArrayList.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package cn.mark;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 自定义实现ArrayList的数据结构
- * @author hilih
- *
- */
-public class MyArrayList implements MyList{
-    
-    private int size = 0;
-    
-    private Object[] elementData;
-    
-    public MyArrayList(){
-        //默认容量初始化为10
-        this(10);
-    }
-    
-    /**
-     * 初始即指定大小的构造方法
-     * @param size 集合容量
-     */
-    public MyArrayList(int size){
-        if ( size < 0 ){
-            System.out.println("不合法的容量输入");
-            return;
-        }
-        elementData = new Object[size];
-    }
-    
-    /**
-     * 集合增容
-     * @param minSize
-     */
-    private void ensureSize(int minSize){
-        int oldSize = elementData.length;
-        if(minSize > oldSize){
-            int newSize = 3 * oldSize / 2 + 1;
-            if(minSize > newSize){
-                newSize = minSize;
-            }
-            elementData = Arrays.copyOf(elementData, newSize);
-        }
-    }
-    
-    /**
-     * 下标范围判断
-     * @param index
-     */
-    private boolean rangeCheck(int index){
-        if ( index >= size || index < 0 ){
-            System.out.println("索引不合法！");
-            return false;
-        }
-        return true;
-    }
-    
-    @Override 
-    public boolean add(Object o) {
-       ensureSize(size+1);
-       elementData[size++] = o;
-       return true;
-    }
-
-    @Override
-    public boolean add(int index, Object o) {
-        if (!rangeCheck(index)){
-           return false; 
-        }
-        ensureSize(size + 1);
-        System.arraycopy(elementData, index, elementData, index + 1, size - index);
-        elementData[index] = o;
-        size++;
-        return true;
-    }
-
-    @Override
-    public Object get(int index) {
-        if (!rangeCheck(index)){
-            return null; 
-         }
-        Object o = elementData[index];
-        return o;
-    }
-
-    @Override
-    public Object remove(int index) {
-        if (!rangeCheck(index)){
-            return null; 
-         }
-        Object oldValue = elementData[index];
-        int numMoved = size - index - 1;
-        if( numMoved > 0 ){
-            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
-        }
-        return oldValue;
-    }
-
-    @Override
-    public int size() {
-        return size;
-    }
-    
-    
-    
-    @Override
-    public String toString() {
-        StringBuilder s = new StringBuilder();
-        s.append("[");
-        for (int i = 0; i < size; i++){
-            Object o = elementData[i];
-            s.append(o.toString());
-            if( i < size-1 ){
-                s.append(",");
-            }
-        }
-        s.append("]");
-        return s.toString();
-    }
-
-    /**
-     * 判断当前集合是否为空
-     * @return
-     */
-    public boolean isEmpty(){
-        return size == 0;
-    }
-    
-    public static void main(String[] args) {
-      MyList list =  new MyArrayList();
-      list.add("a");
-      list.add("b");
-      list.add("c");
-      list.add(2,"d");
-      Object o = list.get(5);
-      System.out.println(o);
-      System.out.println(list.size());
-      System.out.println(list);
-    }
-}
diff --git a/group16/502059278/src/cn/mark/MyLinkedList.java b/group16/502059278/src/cn/mark/MyLinkedList.java
deleted file mode 100644
index 7f9c3856a2..0000000000
--- a/group16/502059278/src/cn/mark/MyLinkedList.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package cn.mark;
-/**
- * 自定义实现LinkedList数据结构
- * @author hilih
- *
- */
-public class MyLinkedList implements MyList{
-	
-	private Node head;
-	private int size;//集合的长度
-
-	/**
-	 * 添加元素
-	 */
-	@Override
-	public boolean add(Object o) {
-		//为空判断
-		if ( o == null ){
-			System.out.println("不允许null的元素插入!");
-			return false;
-		}
-		if(head == null){
-			head = new Node();
-			head.data = o;
-		}else{
-			
-		}
-		
-		return false;
-	}
-
-	@Override
-	public boolean add(int index, Object o) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public Object get(int index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Object remove(int index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public int size() {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-	
-	private static class Node{
-		Object data;
-		Node next;
-	}
-
-
-	public static void main(String[] args) {
-		
-
-	}
-
-}
diff --git a/group16/502059278/src/cn/mark/MyList.java b/group16/502059278/src/cn/mark/MyList.java
deleted file mode 100644
index 19bc3f92fe..0000000000
--- a/group16/502059278/src/cn/mark/MyList.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package cn.mark;
-
-public interface MyList {
-    /**
-     * 向集合中增加元素
-     * @param o 
-     */
-    public boolean add(Object o);
-    /**
-     * 向集合指定的位置中增加元素
-     * @param index 下标
-     * @param o 元素
-     */
-    public boolean add(int index, Object o);
-    /**
-     * 从集合指定位置取出元素
-     * @param index 下标
-     * @return
-     */
-    public Object get(int index);
-    /**
-     * 从集合中删除指定位置的元素
-     * @param index 下标
-     * @return
-     */
-    public Object remove(int index);
-    /**
-     * 当前集合的元素个数
-     * @return
-     */
-    public int size();
-}
\ No newline at end of file
diff --git a/group16/502059278/src/cn/mark/work0219/MyArrayList.java b/group16/502059278/src/cn/mark/work0219/MyArrayList.java
new file mode 100644
index 0000000000..3d7a064919
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0219/MyArrayList.java
@@ -0,0 +1,144 @@
+package cn.mark.work0219;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 自定义实现ArrayList的数据结构
+ * @author hilih
+ *
+ */
+public class MyArrayList implements MyList{
+    
+    private int size = 0;
+    
+    private Object[] elementData;
+    
+    public MyArrayList(){
+        //默认容量初始化为10
+        this(10);
+    }
+    
+    /**
+     * 初始即指定大小的构造方法
+     * @param size 集合容量
+     */
+    public MyArrayList(int size){
+        if ( size < 0 ){
+            System.out.println("不合法的容量输入");
+            return;
+        }
+        elementData = new Object[size];
+    }
+    
+    /**
+     * 集合增容
+     * @param minSize
+     */
+    private void ensureSize(int minSize){
+        int oldSize = elementData.length;
+        if(minSize > oldSize){
+            int newSize = 3 * oldSize / 2 + 1;
+            if(minSize > newSize){
+                newSize = minSize;
+            }
+            elementData = Arrays.copyOf(elementData, newSize);
+        }
+    }
+    
+    /**
+     * 下标范围判断
+     * @param index
+     */
+    private boolean rangeCheck(int index){
+        if ( index >= size || index < 0 ){
+            System.out.println("索引不合法！");
+            return false;
+        }
+        return true;
+    }
+    
+    @Override 
+    public boolean add(Object o) {
+       ensureSize(size+1);
+       elementData[size++] = o;
+       return true;
+    }
+
+    @Override
+    public boolean add(int index, Object o) {
+        if (!rangeCheck(index)){
+           return false; 
+        }
+        ensureSize(size + 1);
+        System.arraycopy(elementData, index, elementData, index + 1, size - index);
+        elementData[index] = o;
+        size++;
+        return true;
+    }
+
+    @Override
+    public Object get(int index) {
+        if (!rangeCheck(index)){
+            return null; 
+         }
+        Object o = elementData[index];
+        return o;
+    }
+
+    @Override
+    public Object remove(int index) {
+        if (!rangeCheck(index)){
+            return null; 
+         }
+        Object oldValue = elementData[index];
+        int numMoved = size - index - 1;
+        if( numMoved > 0 ){
+            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
+        }
+        return oldValue;
+    }
+
+    @Override
+    public int size() {
+        return size;
+    }
+    
+    
+    
+    @Override
+    public String toString() {
+        StringBuilder s = new StringBuilder();
+        s.append("[");
+        for (int i = 0; i < size; i++){
+            Object o = elementData[i];
+            s.append(o.toString());
+            if( i < size-1 ){
+                s.append(",");
+            }
+        }
+        s.append("]");
+        return s.toString();
+    }
+
+    /**
+     * 判断当前集合是否为空
+     * @return
+     */
+    public boolean isEmpty(){
+        return size == 0;
+    }
+    
+    public static void main(String[] args) {
+      MyList list =  new MyArrayList();
+      list.add("a");
+      list.add("b");
+      list.add("c");
+      list.add(2,"d");
+      Object o = list.get(5);
+      System.out.println(o);
+      System.out.println(list.size());
+      System.out.println(list);
+    }
+}
diff --git a/group16/502059278/src/cn/mark/work0219/MyLinkedList.java b/group16/502059278/src/cn/mark/work0219/MyLinkedList.java
new file mode 100644
index 0000000000..896d7bcb79
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0219/MyLinkedList.java
@@ -0,0 +1,67 @@
+package cn.mark.work0219;
+/**
+ * 自定义实现LinkedList数据结构
+ * @author hilih
+ *
+ */
+public class MyLinkedList implements MyList{
+	
+	private Node head;
+	private int size;//集合的长度
+
+	/**
+	 * 添加元素
+	 */
+	@Override
+	public boolean add(Object o) {
+		//为空判断
+		if ( o == null ){
+			System.out.println("不允许null的元素插入!");
+			return false;
+		}
+		if(head == null){
+			head = new Node();
+			head.data = o;
+		}else{
+			
+		}
+		
+		return false;
+	}
+
+	@Override
+	public boolean add(int index, Object o) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public Object get(int index) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Object remove(int index) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public int size() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+	
+	private static class Node{
+		Object data;
+		Node next;
+	}
+
+
+	public static void main(String[] args) {
+		
+
+	}
+
+}
diff --git a/group16/502059278/src/cn/mark/work0219/MyList.java b/group16/502059278/src/cn/mark/work0219/MyList.java
new file mode 100644
index 0000000000..91f26ff8d5
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0219/MyList.java
@@ -0,0 +1,32 @@
+package cn.mark.work0219;
+
+public interface MyList {
+    /**
+     * 向集合中增加元素
+     * @param o 
+     */
+    public boolean add(Object o);
+    /**
+     * 向集合指定的位置中增加元素
+     * @param index 下标
+     * @param o 元素
+     */
+    public boolean add(int index, Object o);
+    /**
+     * 从集合指定位置取出元素
+     * @param index 下标
+     * @return
+     */
+    public Object get(int index);
+    /**
+     * 从集合中删除指定位置的元素
+     * @param index 下标
+     * @return
+     */
+    public Object remove(int index);
+    /**
+     * 当前集合的元素个数
+     * @return
+     */
+    public int size();
+}
\ No newline at end of file
diff --git a/group16/502059278/src/cn/mark/work0226/ArrayUtil.java b/group16/502059278/src/cn/mark/work0226/ArrayUtil.java
new file mode 100644
index 0000000000..94e253e8bb
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/ArrayUtil.java
@@ -0,0 +1,166 @@
+package cn.mark.work0226;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int[] target = new int[origin.length];//声明置换后数组
+		int temp = target.length - 1;//记录置换后下标位置
+		for( int i = 0; i < origin.length; i++ ){
+			target[temp] = origin[i];
+			temp--;
+		}
+		System.out.println("置换前："+Arrays.toString(origin));
+		System.out.println("置换后："+Arrays.toString(target));
+		
+		
+
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int[] target = new int[1];
+		boolean flag = true;
+		for( int i = 0; i < oldArray.length; i++ ){
+			if ( oldArray[i] == 0 ){ // 跳过值为0的元素
+				continue;
+			}
+			
+			if ( flag ){
+				//首位赋值无需扩容
+				target[target.length-1] = oldArray[i];
+				flag = false;
+			}else{
+				//确定值不是0才能进入扩容步骤
+				target = Arrays.copyOf(target, target.length+1);
+				target[target.length-1] = oldArray[i];	
+			}
+			
+		
+			
+		}
+		System.out.println("去0前："+Arrays.toString(oldArray));
+		System.out.println("去0后："+Arrays.toString(target));
+		return target;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		//1.去重
+		int[] array3 = Arrays.copyOf(array1, array1.length);
+		for( int i = 0; i < array1.length; i++ ){
+			for( int j = 0; j < array2.length ; j++ ){
+				if ( array1[i] == array2[j] ){
+					
+				}
+			}
+			
+			
+			
+			
+		}
+		
+		System.out.println(Arrays.toString(array1));
+		System.out.println(Arrays.toString(array2));
+		//2.合并
+		
+		//3.排序
+		
+		
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = Arrays.copyOf(oldArray, oldArray.length+size);
+		System.out.println("扩容后："+Arrays.toString(newArray));
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sb = new StringBuilder();
+		for( int i = 0; i < array.length; i++ ){
+			if ( i == 0 ){
+				sb.append(array[i]);
+			}else{
+				sb.append(seperator+array[i]);
+			}
+		}
+		return sb.toString();
+	}
+	
+
+	public static void main(String[] args) {
+		int[] a1 =new int[]{3,8},   a2 = new int[]{4, 5, 6,7};
+		System.out.println(new ArrayUtil().join(a1, "*"));
+		
+	}
+}
diff --git a/group16/502059278/src/cn/mark/work0226/TestArrayUtil.java b/group16/502059278/src/cn/mark/work0226/TestArrayUtil.java
new file mode 100644
index 0000000000..da1abd3b38
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/TestArrayUtil.java
@@ -0,0 +1,35 @@
+package cn.mark.work0226;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestArrayUtil {
+	ArrayUtil arrayUtil = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		arrayUtil = new ArrayUtil();
+		
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void reverseArray() {
+		int[] origin = new int[]{1,2,8,31};
+		arrayUtil.reverseArray(origin);
+	}
+	
+	@Test
+	public void removeZero() {
+		int[] origin = new int[]{0,1,2,0,3,0,4,7,0};
+		Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 7}, arrayUtil.removeZero(origin));
+	}
+
+}
diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java b/group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java
new file mode 100644
index 0000000000..4966d7d170
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package cn.mark.work0226.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/Struts.java b/group16/502059278/src/cn/mark/work0226/litestruts/Struts.java
new file mode 100644
index 0000000000..93a449adaf
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/litestruts/Struts.java
@@ -0,0 +1,84 @@
+package cn.mark.work0226.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	String classPath = null;
+    	String className = null;
+    	
+    	Document dom = XMLUtils.getDocument("bin"+File.separator+"struts.xml");
+    	Element ele = XMLUtils.getElement(dom, actionName);
+    	Attribute classAttr = ele.attribute("class");
+		classPath = classAttr.getValue();
+		className = classPath.substring(classPath.lastIndexOf(".")+1);
+    	System.out.println(className);
+    	
+    	
+    	
+		try {
+			Class clz = Class.forName(classPath);
+			System.out.println(clz.getName());
+			
+		
+			
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}  catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} 
+    	
+    	
+    	return null;
+    }    
+
+    
+    public static void main(String[] args) {
+    	
+    	String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+       Struts.runAction(actionName,params);        
+	}
+}
diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java b/group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..1a60626460
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package cn.mark.work0226.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/View.java b/group16/502059278/src/cn/mark/work0226/litestruts/View.java
new file mode 100644
index 0000000000..31e3df3427
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/litestruts/View.java
@@ -0,0 +1,23 @@
+package cn.mark.work0226.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java b/group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java
new file mode 100644
index 0000000000..2eeb6e624e
--- /dev/null
+++ b/group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java
@@ -0,0 +1,49 @@
+package cn.mark.work0226.litestruts;
+
+import java.util.List;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class XMLUtils {
+	/**
+	 * 获取Document
+	 * @param filePath 配置文件路径名
+	 * @return Document对象
+	 */
+	public static Document getDocument(String filePath){
+		//1.创建解析器
+		SAXReader reader = new SAXReader();
+		//2.解析XML文档，返回document对象
+		Document dom = null;
+		try {
+			dom = reader.read(filePath);
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+		return dom;
+	}
+	/**
+	 * 获取指定action元素
+	 * @param doc Document
+	 * @param actionName 要获取的元素属性名
+	 * @return 包含所要属性的元素
+	 */
+	public static Element getElement(Document doc , String actionName){
+		Element result = null;
+		Element root = doc.getRootElement();
+    	List<Element> elements = root.elements();
+    	for(Element e : elements){
+    		Attribute attr = e.attribute("name");
+    		if(attr.getValue().equals(actionName)){
+    			result = e;
+    			return result;
+    		}
+    	}
+		return result;
+	}
+	
+}
diff --git a/group16/502059278/src/struts.xml b/group16/502059278/src/struts.xml
new file mode 100644
index 0000000000..1aaa6ea5a0
--- /dev/null
+++ b/group16/502059278/src/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="cn.mark.work0226.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="cn.mark.work0226.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml b/group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..99063bcb0c
--- /dev/null
+++ b/group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result = "success">/jsp/welcome.jsp</result>
+    	<result = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml b/group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..848f04cfba
--- /dev/null
+++ b/group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="net.coding.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="net.coding.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/542087872/src/com/coding/basic/ArrayList.java b/group16/542087872/src/com/coding/basic/ArrayList.java
deleted file mode 100644
index 1b10b441cf..0000000000
--- a/group16/542087872/src/com/coding/basic/ArrayList.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.coding.basic;
-
-import java.util.Arrays;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData = new Object[10];
-
-    // 每次乘2增长
-    private void grow() {
-        elementData = Arrays.copyOf(elementData, elementData.length * 2);
-    }
-
-
-	public void add(Object o){
-        if (size >= elementData.length) {
-            this.grow();
-        }
-
-        elementData[size++] = o;
-	}
-	public void add(int index, Object o){
-        if (size >= elementData.length) {
-            this.grow();
-        }
-        System.arraycopy(elementData, index, elementData, index + 1, size - index);
-
-        elementData[index] = o;
-        size++;
-	}
-	
-	public Object get(int index){
-        if (index >= size) {
-            throw new IndexOutOfBoundsException();
-        }
-        return elementData[index];
-	}
-	
-	public Object remove(int index){
-        if (index >= size) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        Object el = elementData[index];
-        System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
-
-        size--;
-        return el;
-	}
-	
-	public int size(){
-		return size;
-	}
-
-    private class ArrIter implements Iterator {
-        int cursor = 0;
-
-        @Override
-        public boolean hasNext() {
-            return cursor < size;
-        }
-
-        @Override
-        public Object next() {
-            return elementData[cursor++];
-        }
-    }
-	
-	public Iterator iterator(){
-        return new ArrIter();
-	}
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("[");
-        for (int i = 0; i < size; i++) {
-            sb.append(elementData[i]);
-            if (i < size - 1) {
-                sb.append(",");
-            }
-        }
-        sb.append("]");
-        return sb.toString();
-    }
-}
diff --git a/group16/542087872/src/com/coding/basic/BinaryTreeNode.java b/group16/542087872/src/com/coding/basic/BinaryTreeNode.java
deleted file mode 100644
index df167343a0..0000000000
--- a/group16/542087872/src/com/coding/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.coding.basic;
-
-public class BinaryTreeNode {
-	
-	private int data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-	
-	public int getData() {
-		return data;
-	}
-	public void setData(int data) {
-		this.data = data;
-	}
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-
-
-	public BinaryTreeNode(int data) {
-		this.data = data;
-	}
-
-	private BinaryTreeNode insertAt(BinaryTreeNode node, int o) {
-		if (o < node.getData()) {
-			if (node.getLeft() != null) {
-				return insertAt(node.getLeft(), o);
-			} else {
-				BinaryTreeNode nowNode = new BinaryTreeNode(o);
-				node.setLeft(nowNode);
-
-				return nowNode;
-			}
-		} else {
-			if (node.getRight() != null) {
-				return insertAt(node.getRight(), o);
-			} else {
-				BinaryTreeNode nowNode = new BinaryTreeNode(o);
-				node.setRight(nowNode);
-				return nowNode;
-			}
-		}
-	}
-
-	public BinaryTreeNode insert(int o){
-		return insertAt(this, o);
-	}
-
-	@Override
-	public String toString() {
-		return "data: " + data;
-	}
-}
diff --git a/group16/542087872/src/com/coding/basic/LinkedList.java b/group16/542087872/src/com/coding/basic/LinkedList.java
deleted file mode 100644
index 144af4ec8d..0000000000
--- a/group16/542087872/src/com/coding/basic/LinkedList.java
+++ /dev/null
@@ -1,192 +0,0 @@
-package com.coding.basic;
-
-public class LinkedList implements List {
-
-	private Node head;
-	private Node tail;
-
-	public void add(Object o){
-		Node nowNode = new Node(o);
-		if (head == null) {
-			head = nowNode;
-		} else {
-			tail.next = nowNode;
-		}
-		tail = nowNode;
-	}
-	public void add(int index , Object o){
-		int count = 0;
-        Node lastOne = null;
-		Node tpHead = head;
-		while (tpHead != null && count != index) {
-			count++;
-            lastOne = tpHead;
-			tpHead = tpHead.next;
-		}
-        if (count != index) {
-            throw new IndexOutOfBoundsException();
-        }
-
-
-        Node nowNode = new Node(o);
-        if (lastOne == null) {
-            head = nowNode;
-            head.next = tpHead;
-        } else {
-            lastOne.next = nowNode;
-            nowNode.next = tpHead;
-        }
-	}
-	public Object get(int index){
-        int count = 0;
-        Node tpHead = head;
-        while (tpHead != null && count != index) {
-            count++;
-            tpHead = tpHead.next;
-        }
-        if (count != index) {
-            throw new IndexOutOfBoundsException();
-        }
-
-		return tpHead.data;
-	}
-	public Object remove(int index){
-        int count = 0;
-        Node lastOne = null;
-        Node tpHead = head;
-        while (tpHead != null && count != index) {
-            count++;
-            lastOne = tpHead;
-            tpHead = tpHead.next;
-        }
-        if (count != index) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        if (lastOne == null) {
-            head = tpHead.next;
-        } else {
-            lastOne.next = tpHead.next;
-        }
-
-        if (tpHead.next == null) {
-            tail = lastOne;
-        }
-
-		return tpHead.data;
-	}
-	
-	public int size(){
-        int count = 0;
-        Node tpHead = head;
-        while (tpHead != null) {
-            count ++;
-            tpHead = tpHead.next;
-        }
-
-        return count;
-	}
-	
-	public void addFirst(Object o){
-        Node nowNode = new Node(o);
-        if (head == null) {
-            head = nowNode;
-            tail = nowNode;
-        } else {
-            nowNode.next = head;
-            head = nowNode;
-        }
-	}
-	public void addLast(Object o){
-        Node nowNode = new Node(o);
-        if (head == null) {
-            head = nowNode;
-            tail = nowNode;
-        } else {
-            tail.next = nowNode;
-            tail = nowNode;
-        }
-	}
-	public Object removeFirst(){
-        if (head == null) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        Node nowValue = head;
-
-        Node nextNode = head.next;
-        if (nextNode == null) {
-            tail = null;
-        }
-        head = nextNode;
-
-		return nowValue.data;
-	}
-	public Object removeLast(){
-        if (head == null) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        Node nowValue = tail;
-
-        Node lastOne = null;
-        Node tpHead = head;
-        while (tpHead != tail) {
-            lastOne = tpHead;
-            tpHead = tpHead.next;
-        }
-        if (lastOne == null) {
-            head = null;
-        } else {
-            lastOne.next = null;
-        }
-        tail = lastOne;
-
-		return nowValue.data;
-	}
-
-    private class LinkIter implements Iterator {
-
-        Node cursor = head;
-
-        @Override
-        public boolean hasNext() {
-            return cursor != null;
-        }
-
-        @Override
-        public Object next() {
-            Node ret = cursor;
-            cursor = cursor.next;
-            return ret.data;
-        }
-    }
-
-	public Iterator iterator(){
-        return new LinkIter();
-	}
-	
-	
-	private static class Node{
-		Object data;
-		Node next;
-
-		public Node(Object data) {
-			this.data = data;
-		}
-	}
-
-    @Override
-    public String toString() {
-        Node tpHead = head;
-        StringBuilder sb = new StringBuilder("[");
-        while (tpHead != null) {
-            sb.append(tpHead.data);
-            sb.append(",");
-            tpHead = tpHead.next;
-        }
-        sb.append("]");
-        return sb.toString();
-    }
-
-}
diff --git a/group16/542087872/src/com/coding/basic/Queue.java b/group16/542087872/src/com/coding/basic/Queue.java
deleted file mode 100644
index 8e4285464b..0000000000
--- a/group16/542087872/src/com/coding/basic/Queue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.coding.basic;
-
-public class Queue {
-
-	private LinkedList linkedList = new LinkedList();
-
-	public void enQueue(Object o){
-		linkedList.addLast(o);
-	}
-	
-	public Object deQueue(){
-		return linkedList.removeFirst();
-	}
-	
-	public boolean isEmpty(){
-		return linkedList.size() == 0;
-	}
-	
-	public int size(){
-		return linkedList.size();
-	}
-}
diff --git a/group16/542087872/src/com/coding/basic/Stack.java b/group16/542087872/src/com/coding/basic/Stack.java
deleted file mode 100644
index bfe98dd8b7..0000000000
--- a/group16/542087872/src/com/coding/basic/Stack.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.coding.basic;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){
-		elementData.add(o);
-	}
-	
-	public Object pop(){
-		Object o = elementData.get(elementData.size() - 1);
-		elementData.remove(elementData.size() - 1);
-		return o;
-	}
-	
-	public Object peek(){
-		return elementData.get(elementData.size() - 1);
-	}
-	public boolean isEmpty(){
-		return elementData.size() == 0;
-	}
-	public int size(){
-		return elementData.size();
-	}
-}
diff --git a/group16/542087872/src/com/coding/basic/Test.java b/group16/542087872/src/com/coding/basic/Test.java
deleted file mode 100644
index 2db5b2f9ab..0000000000
--- a/group16/542087872/src/com/coding/basic/Test.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.coding.basic;
-
-
-/**
- * Created by xiaoyuan on 25/02/2017.
- */
-public class Test {
-    public static void main(String[] args) {
-
-        testArrayList();
-        testLinkedList();
-
-        testQueue();
-        testStack();
-
-
-        testBinaryTreeNode();
-    }
-
-    private static void testBinaryTreeNode() {
-
-        BinaryTreeNode binaryTreeNode = new BinaryTreeNode(10);
-        binaryTreeNode.insert(5);
-        binaryTreeNode.insert(4);
-        binaryTreeNode.insert(6);
-        binaryTreeNode.insert(11);
-
-        traverse(binaryTreeNode);
-
-    }
-
-    private static void traverse(BinaryTreeNode node) {
-        if (node.getLeft() != null) {
-            traverse(node.getLeft());
-        }
-
-        System.out.println("-- " + node.getData() + " --");
-
-        if (node.getRight() != null) {
-            traverse(node.getRight());
-        }
-
-    }
-
-
-    static void testStack() {
-
-        Stack stack = new Stack();
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-        stack.push(4);
-
-        System.out.println(stack.size());
-        System.out.println(stack.isEmpty());
-
-        System.out.println(stack.pop());
-        System.out.println(stack.pop());
-        System.out.println(stack.pop());
-        System.out.println(stack.pop());
-
-        System.out.println(stack.isEmpty());
-
-    }
-
-    static void testQueue() {
-        Queue queue = new Queue();
-        queue.enQueue(1);
-        queue.enQueue(2);
-
-        System.out.println(queue.size());
-        System.out.println(queue.deQueue());
-        System.out.println(queue.deQueue());
-        System.out.println(queue.size());
-    }
-    static void testLinkedList() {
-        LinkedList linkedList = new LinkedList();
-        linkedList.add(1);
-        linkedList.add(2);
-
-        System.out.println(linkedList.size());
-        System.out.println(linkedList);
-
-        linkedList.add(4);
-        linkedList.add(5);
-        System.out.println(linkedList.size());
-        System.out.println(linkedList);
-
-
-        linkedList.add(0, 10);
-        linkedList.add(0, 9);
-        System.out.println(linkedList.size());
-        System.out.println(linkedList);
-
-        System.out.println(linkedList.get(3));
-
-        linkedList.remove(0);
-        System.out.println(linkedList.size());
-        System.out.println(linkedList);
-
-
-        linkedList.addFirst(100);
-        linkedList.addLast(8888);
-        System.out.println(linkedList.size());
-        System.out.println(linkedList);
-
-
-        linkedList.removeFirst();
-        linkedList.removeLast();
-        System.out.println(linkedList.size());
-        System.out.println(linkedList);
-
-        Iterator iterator = linkedList.iterator();
-        while (iterator.hasNext()) {
-            System.out.println(iterator.next());
-        }
-
-    }
-
-    static void testArrayList() {
-        ArrayList arrayList = new ArrayList();
-        arrayList.add("1");
-        arrayList.add("2");
-        // test size and add
-        System.out.println(arrayList.size());
-        System.out.println(arrayList);
-
-
-        arrayList.add("3");
-        arrayList.add("4");
-        arrayList.add("5");
-        arrayList.add("6");
-        arrayList.add("7");
-        arrayList.add("8");
-        arrayList.add("9");
-        arrayList.add("10");
-        arrayList.add("11");
-        arrayList.add("12");
-        arrayList.add("13");
-
-        // test size
-        // test grow
-        System.out.println(arrayList.size());
-        System.out.println(arrayList);
-
-        // test add at index
-        arrayList.add(2, 100);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList);
-
-        // test remove
-        arrayList.remove(0);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList);
-        arrayList.remove(2);
-        System.out.println(arrayList.size());
-        System.out.println(arrayList);
-
-        // test iterator
-        Iterator iterator = arrayList.iterator();
-        while (iterator.hasNext()) {
-            System.out.println(iterator.next());
-        }
-
-    }
-}
diff --git a/group16/542087872/src/net/coding/basic/ArrayList.java b/group16/542087872/src/net/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..a0286827d6
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/ArrayList.java
@@ -0,0 +1,88 @@
+package net.coding.basic;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[10];
+
+    // 每次乘2增长
+    private void grow() {
+        elementData = Arrays.copyOf(elementData, elementData.length * 2);
+    }
+
+
+	public void add(Object o){
+        if (size >= elementData.length) {
+            this.grow();
+        }
+
+        elementData[size++] = o;
+	}
+	public void add(int index, Object o){
+        if (size >= elementData.length) {
+            this.grow();
+        }
+        System.arraycopy(elementData, index, elementData, index + 1, size - index);
+
+        elementData[index] = o;
+        size++;
+	}
+	
+	public Object get(int index){
+        if (index >= size) {
+            throw new IndexOutOfBoundsException();
+        }
+        return elementData[index];
+	}
+	
+	public Object remove(int index){
+        if (index >= size) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        Object el = elementData[index];
+        System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
+
+        size--;
+        return el;
+	}
+	
+	public int size(){
+		return size;
+	}
+
+    private class ArrIter implements Iterator {
+        int cursor = 0;
+
+        @Override
+        public boolean hasNext() {
+            return cursor < size;
+        }
+
+        @Override
+        public Object next() {
+            return elementData[cursor++];
+        }
+    }
+	
+	public Iterator iterator(){
+        return new ArrIter();
+	}
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        for (int i = 0; i < size; i++) {
+            sb.append(elementData[i]);
+            if (i < size - 1) {
+                sb.append(",");
+            }
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+}
diff --git a/group16/542087872/src/net/coding/basic/BinaryTreeNode.java b/group16/542087872/src/net/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..4cac873d08
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,62 @@
+package net.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private int data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public int getData() {
+		return data;
+	}
+	public void setData(int data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+
+	public BinaryTreeNode(int data) {
+		this.data = data;
+	}
+
+	private BinaryTreeNode insertAt(BinaryTreeNode node, int o) {
+		if (o < node.getData()) {
+			if (node.getLeft() != null) {
+				return insertAt(node.getLeft(), o);
+			} else {
+				BinaryTreeNode nowNode = new BinaryTreeNode(o);
+				node.setLeft(nowNode);
+
+				return nowNode;
+			}
+		} else {
+			if (node.getRight() != null) {
+				return insertAt(node.getRight(), o);
+			} else {
+				BinaryTreeNode nowNode = new BinaryTreeNode(o);
+				node.setRight(nowNode);
+				return nowNode;
+			}
+		}
+	}
+
+	public BinaryTreeNode insert(int o){
+		return insertAt(this, o);
+	}
+
+	@Override
+	public String toString() {
+		return "data: " + data;
+	}
+}
diff --git a/group16/542087872/src/net/coding/basic/Iterator.java b/group16/542087872/src/net/coding/basic/Iterator.java
new file mode 100644
index 0000000000..ca3fd054ae
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package net.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group16/542087872/src/net/coding/basic/LinkedList.java b/group16/542087872/src/net/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..0f9d326545
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/LinkedList.java
@@ -0,0 +1,192 @@
+package net.coding.basic;
+
+public class LinkedList implements List {
+
+	private Node head;
+	private Node tail;
+
+	public void add(Object o){
+		Node nowNode = new Node(o);
+		if (head == null) {
+			head = nowNode;
+		} else {
+			tail.next = nowNode;
+		}
+		tail = nowNode;
+	}
+	public void add(int index , Object o){
+		int count = 0;
+        Node lastOne = null;
+		Node tpHead = head;
+		while (tpHead != null && count != index) {
+			count++;
+            lastOne = tpHead;
+			tpHead = tpHead.next;
+		}
+        if (count != index) {
+            throw new IndexOutOfBoundsException();
+        }
+
+
+        Node nowNode = new Node(o);
+        if (lastOne == null) {
+            head = nowNode;
+            head.next = tpHead;
+        } else {
+            lastOne.next = nowNode;
+            nowNode.next = tpHead;
+        }
+	}
+	public Object get(int index){
+        int count = 0;
+        Node tpHead = head;
+        while (tpHead != null && count != index) {
+            count++;
+            tpHead = tpHead.next;
+        }
+        if (count != index) {
+            throw new IndexOutOfBoundsException();
+        }
+
+		return tpHead.data;
+	}
+	public Object remove(int index){
+        int count = 0;
+        Node lastOne = null;
+        Node tpHead = head;
+        while (tpHead != null && count != index) {
+            count++;
+            lastOne = tpHead;
+            tpHead = tpHead.next;
+        }
+        if (count != index) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        if (lastOne == null) {
+            head = tpHead.next;
+        } else {
+            lastOne.next = tpHead.next;
+        }
+
+        if (tpHead.next == null) {
+            tail = lastOne;
+        }
+
+		return tpHead.data;
+	}
+	
+	public int size(){
+        int count = 0;
+        Node tpHead = head;
+        while (tpHead != null) {
+            count ++;
+            tpHead = tpHead.next;
+        }
+
+        return count;
+	}
+	
+	public void addFirst(Object o){
+        Node nowNode = new Node(o);
+        if (head == null) {
+            head = nowNode;
+            tail = nowNode;
+        } else {
+            nowNode.next = head;
+            head = nowNode;
+        }
+	}
+	public void addLast(Object o){
+        Node nowNode = new Node(o);
+        if (head == null) {
+            head = nowNode;
+            tail = nowNode;
+        } else {
+            tail.next = nowNode;
+            tail = nowNode;
+        }
+	}
+	public Object removeFirst(){
+        if (head == null) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        Node nowValue = head;
+
+        Node nextNode = head.next;
+        if (nextNode == null) {
+            tail = null;
+        }
+        head = nextNode;
+
+		return nowValue.data;
+	}
+	public Object removeLast(){
+        if (head == null) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        Node nowValue = tail;
+
+        Node lastOne = null;
+        Node tpHead = head;
+        while (tpHead != tail) {
+            lastOne = tpHead;
+            tpHead = tpHead.next;
+        }
+        if (lastOne == null) {
+            head = null;
+        } else {
+            lastOne.next = null;
+        }
+        tail = lastOne;
+
+		return nowValue.data;
+	}
+
+    private class LinkIter implements Iterator {
+
+        Node cursor = head;
+
+        @Override
+        public boolean hasNext() {
+            return cursor != null;
+        }
+
+        @Override
+        public Object next() {
+            Node ret = cursor;
+            cursor = cursor.next;
+            return ret.data;
+        }
+    }
+
+	public Iterator iterator(){
+        return new LinkIter();
+	}
+	
+	
+	private static class Node{
+		Object data;
+		Node next;
+
+		public Node(Object data) {
+			this.data = data;
+		}
+	}
+
+    @Override
+    public String toString() {
+        Node tpHead = head;
+        StringBuilder sb = new StringBuilder("[");
+        while (tpHead != null) {
+            sb.append(tpHead.data);
+            sb.append(",");
+            tpHead = tpHead.next;
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+}
diff --git a/group16/542087872/src/net/coding/basic/List.java b/group16/542087872/src/net/coding/basic/List.java
new file mode 100644
index 0000000000..189fe091d8
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/List.java
@@ -0,0 +1,9 @@
+package net.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group16/542087872/src/net/coding/basic/Queue.java b/group16/542087872/src/net/coding/basic/Queue.java
new file mode 100644
index 0000000000..d233a02617
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/Queue.java
@@ -0,0 +1,22 @@
+package net.coding.basic;
+
+public class Queue {
+
+	private LinkedList linkedList = new LinkedList();
+
+	public void enQueue(Object o){
+		linkedList.addLast(o);
+	}
+	
+	public Object deQueue(){
+		return linkedList.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		return linkedList.size() == 0;
+	}
+	
+	public int size(){
+		return linkedList.size();
+	}
+}
diff --git a/group16/542087872/src/net/coding/basic/Stack.java b/group16/542087872/src/net/coding/basic/Stack.java
new file mode 100644
index 0000000000..4a8099bcee
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/Stack.java
@@ -0,0 +1,25 @@
+package net.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		Object o = elementData.get(elementData.size() - 1);
+		elementData.remove(elementData.size() - 1);
+		return o;
+	}
+	
+	public Object peek(){
+		return elementData.get(elementData.size() - 1);
+	}
+	public boolean isEmpty(){
+		return elementData.size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group16/542087872/src/net/coding/basic/Test.java b/group16/542087872/src/net/coding/basic/Test.java
new file mode 100644
index 0000000000..d973793899
--- /dev/null
+++ b/group16/542087872/src/net/coding/basic/Test.java
@@ -0,0 +1,166 @@
+package net.coding.basic;
+
+
+/**
+ * Created by xiaoyuan on 25/02/2017.
+ */
+public class Test {
+    public static void main(String[] args) {
+
+        testArrayList();
+        testLinkedList();
+
+        testQueue();
+        testStack();
+
+
+        testBinaryTreeNode();
+    }
+
+    private static void testBinaryTreeNode() {
+
+        BinaryTreeNode binaryTreeNode = new BinaryTreeNode(10);
+        binaryTreeNode.insert(5);
+        binaryTreeNode.insert(4);
+        binaryTreeNode.insert(6);
+        binaryTreeNode.insert(11);
+
+        traverse(binaryTreeNode);
+
+    }
+
+    private static void traverse(BinaryTreeNode node) {
+        if (node.getLeft() != null) {
+            traverse(node.getLeft());
+        }
+
+        System.out.println("-- " + node.getData() + " --");
+
+        if (node.getRight() != null) {
+            traverse(node.getRight());
+        }
+
+    }
+
+
+    static void testStack() {
+
+        Stack stack = new Stack();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+
+        System.out.println(stack.size());
+        System.out.println(stack.isEmpty());
+
+        System.out.println(stack.pop());
+        System.out.println(stack.pop());
+        System.out.println(stack.pop());
+        System.out.println(stack.pop());
+
+        System.out.println(stack.isEmpty());
+
+    }
+
+    static void testQueue() {
+        Queue queue = new Queue();
+        queue.enQueue(1);
+        queue.enQueue(2);
+
+        System.out.println(queue.size());
+        System.out.println(queue.deQueue());
+        System.out.println(queue.deQueue());
+        System.out.println(queue.size());
+    }
+    static void testLinkedList() {
+        LinkedList linkedList = new LinkedList();
+        linkedList.add(1);
+        linkedList.add(2);
+
+        System.out.println(linkedList.size());
+        System.out.println(linkedList);
+
+        linkedList.add(4);
+        linkedList.add(5);
+        System.out.println(linkedList.size());
+        System.out.println(linkedList);
+
+
+        linkedList.add(0, 10);
+        linkedList.add(0, 9);
+        System.out.println(linkedList.size());
+        System.out.println(linkedList);
+
+        System.out.println(linkedList.get(3));
+
+        linkedList.remove(0);
+        System.out.println(linkedList.size());
+        System.out.println(linkedList);
+
+
+        linkedList.addFirst(100);
+        linkedList.addLast(8888);
+        System.out.println(linkedList.size());
+        System.out.println(linkedList);
+
+
+        linkedList.removeFirst();
+        linkedList.removeLast();
+        System.out.println(linkedList.size());
+        System.out.println(linkedList);
+
+        Iterator iterator = linkedList.iterator();
+        while (iterator.hasNext()) {
+            System.out.println(iterator.next());
+        }
+
+    }
+
+    static void testArrayList() {
+        ArrayList arrayList = new ArrayList();
+        arrayList.add("1");
+        arrayList.add("2");
+        // test size and add
+        System.out.println(arrayList.size());
+        System.out.println(arrayList);
+
+
+        arrayList.add("3");
+        arrayList.add("4");
+        arrayList.add("5");
+        arrayList.add("6");
+        arrayList.add("7");
+        arrayList.add("8");
+        arrayList.add("9");
+        arrayList.add("10");
+        arrayList.add("11");
+        arrayList.add("12");
+        arrayList.add("13");
+
+        // test size
+        // test grow
+        System.out.println(arrayList.size());
+        System.out.println(arrayList);
+
+        // test add at index
+        arrayList.add(2, 100);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList);
+
+        // test remove
+        arrayList.remove(0);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList);
+        arrayList.remove(2);
+        System.out.println(arrayList.size());
+        System.out.println(arrayList);
+
+        // test iterator
+        Iterator iterator = arrayList.iterator();
+        while (iterator.hasNext()) {
+            System.out.println(iterator.next());
+        }
+
+    }
+}
diff --git a/group16/542087872/src/net/coding/coderising/array/ArrayUtil.java b/group16/542087872/src/net/coding/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..7cf4e1fd3f
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/array/ArrayUtil.java
@@ -0,0 +1,203 @@
+package net.coding.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		int l = 0, r = origin.length - 1;
+		while (l < r) {
+			int tmp = origin[l];
+			origin[l] = origin[r];
+			origin[r] = tmp;
+			l++;
+			r--;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int cntZero = 0;
+		for (int i = 0; i < oldArray.length;i++) {
+			if (oldArray[i] == 0) {
+				cntZero ++;
+			}
+		}
+		if (cntZero == 0) {
+			return oldArray;
+		}
+
+		int[] newArray = new int[oldArray.length - cntZero];
+		int j = 0;
+		for (int i = 0; i < oldArray.length;i++) {
+			if (oldArray[i] != 0) {
+				newArray[j++] = oldArray[i];
+			}
+		}
+
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] result = new int[array1.length + array2.length];
+		int l = 0;
+		int r = 0;
+
+		int cnt = 0;
+		while (true) {
+			if (l >= array1.length && r >= array2.length) {
+				break;
+			}
+			if (l >= array1.length) {
+				result[cnt++] = array2[r];
+				r++;
+			} else if (r >= array1.length) {
+				result[cnt++] = array1[l];
+				l++;
+			} else {
+				if (array1[l] < array2[r]) {
+					result[cnt++] = array1[l];
+					l++;
+				} else {
+					result[cnt++] = array2[r];
+					r++;
+				}
+			}
+		}
+
+		return  result;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] result = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, result, 0, oldArray.length);
+		return result;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] result = {};
+		int a = 0;
+		int b = 1;
+
+		int cnt = 0;
+		while (b < max) {
+			result = grow(result, 1);
+			result[cnt++] = b;
+			int tmp = a + b;
+			a = b;
+			b = tmp;
+		}
+
+		return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[1,2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	private boolean isPrime(int n) {
+		for (int i = 2; i <= Math.sqrt(n + 1.0); i++) {
+			if (n % i == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+	public int[] getPrimes(int max){
+		int[] result = {};
+		int cnt = 0;
+		for (int i = 1; i < max; i++) {
+			if (isPrime(i)) {
+				result = grow(result, 1);
+				result[cnt++] = i;
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	private boolean isPerfect(int n) {
+		int total = 0;
+		for (int i = 1; i < n; i++) {
+			if (n % i == 0) {
+				total += i;
+			}
+		}
+
+		return total == n;
+	}
+	public int[] getPerfectNumbers(int max){
+		int[] result = {};
+		int cnt = 0;
+		for (int i = 1; i < max; i++) {
+			if (isPerfect(i)) {
+				result = grow(result, 1);
+				result[cnt++] = i;
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			if (sb.length() > 0) {
+				sb.append(seperator);
+			}
+			sb.append(array[i]);
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java b/group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..0ae290bbfd
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,76 @@
+package net.coding.coderising.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by xiaoyuan on 02/03/2017.
+ */
+public class ArrayUtilTest {
+
+    @Test
+    public void testReverseArray() {
+        int[] nums = {1, 2, 3};
+        new ArrayUtil().reverseArray(nums);
+        Assert.assertArrayEquals(nums, new int[]{3, 2, 1});
+    }
+    // removeZero
+    @Test
+    public void testRemoveZero() {
+        int[] nums = {0, 1, 0, 2, 3};
+        int[] ans = new ArrayUtil().removeZero(nums);
+        Assert.assertArrayEquals(ans, new int[]{1, 2, 3});
+    }
+
+    // merge
+    @Test
+    public void testMerge() {
+        int[] nums1 = {1, 3, 9};
+        int[] nums2 = {2, 4, 5};
+        int[] ans = new ArrayUtil().merge(nums1, nums2);
+        Assert.assertArrayEquals(ans, new int[]{1, 2, 3, 4, 5, 9});
+    }
+
+    // grow
+    @Test
+    public void testGrow() {
+        int[] nums = {1, 3, 9};
+        int[] ans = new ArrayUtil().grow(nums, 2);
+        Assert.assertArrayEquals(ans, new int[]{1, 3, 9, 0, 0});
+    }
+
+    // fibonacci
+    @Test
+    public void testFibonacci() {
+        int[] ans = new ArrayUtil().fibonacci(10);
+        Assert.assertArrayEquals(ans, new int[]{1, 1, 2, 3, 5, 8});
+    }
+
+
+    // getPrimes
+    @Test
+    public void testgetPrimes() {
+        int[] ans = new ArrayUtil().getPrimes(10);
+        Assert.assertArrayEquals(ans, new int[]{1, 2, 3, 5, 7});
+    }
+
+
+    // getPerfectNumbers
+    @Test
+    public void testGetPerfectNumbers() {
+        int[] ans = new ArrayUtil().getPerfectNumbers(10);
+        Assert.assertArrayEquals(ans, new int[]{6});
+    }
+
+
+    // join
+
+    @Test
+    public void testJoin() {
+        String ans = new ArrayUtil().join(new int[]{1, 3, 4}, "-");
+        Assert.assertEquals(ans, "1-3-4");
+    }
+
+
+
+}
diff --git a/group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java b/group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..5e4f956c2f
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package net.coding.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java b/group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..560d8f4fd8
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,36 @@
+package net.coding.coderising.litestruts;
+
+/**
+ * Created by xiaoyuan on 02/03/2017.
+ */
+public class LogoutAction {
+
+    String ifLogout;
+    String message;
+
+    public String execute() {
+        if (ifLogout.equals("yes")) {
+            this.message = "success";
+            return "success";
+        } else {
+            this.message = "error";
+            return "error";
+        }
+    }
+
+    public String getIfLogout() {
+        return ifLogout;
+    }
+
+    public void setIfLogout(String ifLogout) {
+        this.ifLogout = ifLogout;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/group16/542087872/src/net/coding/coderising/litestruts/Struts.java b/group16/542087872/src/net/coding/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..1d9337f4f2
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/litestruts/Struts.java
@@ -0,0 +1,126 @@
+package net.coding.coderising.litestruts;
+
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+        Map<String, String> name2ClassMap = new HashMap<String, String>();
+        Map<String, String> result2JSPMap = new HashMap<String, String>();
+
+
+        try {
+            File xmlFile = new File("group16/542087872/src/net/coding/coderising/litestruts/struts.xml");
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder documentBuilder = factory.newDocumentBuilder();
+            Document doc = documentBuilder.parse(xmlFile);
+
+            doc.getDocumentElement().normalize();
+
+            NodeList actionList = doc.getElementsByTagName("action");
+            for (int i = 0; i < actionList.getLength(); i++) {
+                Node node = actionList.item(i);
+                System.out.println(node.getNodeName());
+                if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    Element element = (Element)node;
+                    String acName = element.getAttribute("name");
+                    String acClass = element.getAttribute("class");
+                    name2ClassMap.put(acName, acClass);
+
+                    NodeList resultList = element.getElementsByTagName("result");
+                    for (int j = 0; j < resultList.getLength(); j++) {
+                        Element resultElemet = (Element)(resultList.item(j));
+                        String acResultName = resultElemet.getAttribute("name");
+                        String acResultJSP = resultElemet.getTextContent();
+
+                        result2JSPMap.put(acName + "_" + acResultName, acResultJSP);
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("parse XML ERROR!");
+        }
+
+        String classStr = name2ClassMap.get(actionName);
+        if (classStr == null) {
+            throw new RuntimeException("ACTION FOUND ERROR!");
+        }
+
+        try {
+            Class actionClass = Class.forName(classStr);
+            Object actionObj = actionClass.newInstance();
+            for (String key : parameters.keySet()) {
+                String value = parameters.get(key);
+                Method theMethod = actionClass.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class);
+                theMethod.invoke(actionObj, value);
+            }
+
+            // execut
+            Method exeMethod = actionClass.getMethod("execute");
+            String result = (String)exeMethod.invoke(actionObj);
+
+            // find JSP
+            String JSPPath = result2JSPMap.get(actionName + "_" + result);
+            View view = new View();
+            view.setJsp(JSPPath);
+
+            // generate map
+            Map map = new HashMap();
+            for(Method method: actionClass.getMethods()) {
+                if (method.getName().startsWith("get")) {
+                    Object key = method.getName().substring(3).toLowerCase();
+                    Object value = method.invoke(actionObj);
+                    map.put(key, value);
+                }
+            }
+            view.setParameters(map);
+
+            return view;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static void main(String[] args) {
+        runAction(null, null);
+    }
+
+}
diff --git a/group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java b/group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..8c4de18ac4
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,70 @@
+package net.coding.coderising.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+
+        View view  = Struts.runAction(actionName,params);
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+
+    @Test
+    public void testLogoutActionSuccess() {
+        String actionName = "logout";
+
+        Map<String,String> params = new HashMap<String,String>();
+        params.put("ifLogout","yes");
+
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/welcome.jsp", view.getJsp());
+        Assert.assertEquals("success", view.getParameters().get("message"));
+    }
+
+    @Test
+    public void testLogoutActionError() {
+        String actionName = "logout";
+
+        Map<String,String> params = new HashMap<String,String>();
+        params.put("ifLogout","no");
+
+
+        View view  = Struts.runAction(actionName,params);
+
+        Assert.assertEquals("/jsp/error.jsp", view.getJsp());
+        Assert.assertEquals("error", view.getParameters().get("message"));
+    }
+
+}
diff --git a/group16/542087872/src/net/coding/coderising/litestruts/View.java b/group16/542087872/src/net/coding/coderising/litestruts/View.java
new file mode 100644
index 0000000000..63fb1d025e
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package net.coding.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/542087872/src/net/coding/coderising/litestruts/struts.xml b/group16/542087872/src/net/coding/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..848f04cfba
--- /dev/null
+++ b/group16/542087872/src/net/coding/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="net.coding.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="net.coding.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/63912401/.classpath b/group16/63912401/.classpath
new file mode 100644
index 0000000000..74368f11c3
--- /dev/null
+++ b/group16/63912401/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_67"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="lib/commons-lang3-3.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group16/63912401/.gitignore b/group16/63912401/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group16/63912401/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group16/63912401/.project b/group16/63912401/.project
new file mode 100644
index 0000000000..ec6117b543
--- /dev/null
+++ b/group16/63912401/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>63912401</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group16/63912401/src/com/coderising/action/LoginAction.java b/group16/63912401/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..64d4d355b6
--- /dev/null
+++ b/group16/63912401/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,45 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/group16/63912401/src/com/coderising/array/ArrayUtil.java b/group16/63912401/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..c8510b08e1
--- /dev/null
+++ b/group16/63912401/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,270 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * ArrayUtil
+ * @author greenhills
+ * 2017年2月28日 下午10:49:41
+ */
+public class ArrayUtil {
+	
+	public static void main(String[] args) {
+//		int[] array1={5,8,9,0,-4};
+//		int[] array2={4,5,6,7,8,9};
+//		int[] array3=ArrayUtil.merge(array1, array2);
+//		for(Integer t:array3){
+//			System.out.print(t +"\t");
+//		}
+		
+//		int[] array3={4,5,6,7,8,9};
+//		array3 = ArrayUtil.grow(array3,5);
+//		for(int t:array3){
+//			System.out.print(t +"\t");
+//		}
+		
+//		int[] array4=ArrayUtil.fibonacci(100);
+//		for(Integer t:array4){
+//			System.out.print(t +"\t");
+//		}
+		
+//		int[] array5=ArrayUtil.getPrimes(2);
+//		for(Integer t:array5){
+//			System.out.print(t +"\t");
+//		}
+		
+		int[] array6=ArrayUtil.getPerfectNumbers(2000);
+		for(Integer t:array6){
+			System.out.print(t +"\t");
+		}
+			
+	}
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		for (int i = 0; i < origin.length>>1; i++) {
+			origin[i]^=origin[origin.length - 1 - i]^(origin[origin.length - 1 - i]=origin[i]);
+		}
+		
+		//方法2 可以使用Collections.reverse(list)方法，但是int 和 Integer数组之间转化消耗性能
+		//Collections.reverse(list);
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   Integer oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		List<Integer> list=new ArrayList<Integer>();
+		for(Integer data:oldArray){
+			if(data != 0){
+				list.add(data);
+			}
+		}
+		int[] newArray=new int[list.size()];
+		for(Integer i=0;i<list.size();i++){
+			newArray[i] = list.get(i);
+		}
+		
+		//newArray = list.toArray(newArray); //Integer类型可用此方法
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		Set<Integer> set=new HashSet<Integer>();
+		for(Integer t:array1){
+			set.add(t);
+		}
+		for(Integer t:array2){
+			set.add(t);
+		}
+		List<Integer> list=new ArrayList<Integer>(set);
+		java.util.Collections.sort(list);
+		int[] result =new int[list.size()];
+		for(int i=0;i<list.size();i++){
+			result[i] = list.get(i);
+		}
+		return  result;
+	}
+	
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int len = oldArray.length;
+		return Arrays.copyOf(oldArray, len + size);
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		int [] result=new int[0];
+		if(max > 1){
+			List<Integer> list=new ArrayList<Integer>();
+			list.add(1);
+			list.add(1);
+			int i=0;
+			int temp=list.get(i)+list.get(i+1);
+			while(temp < max){
+				list.add(temp);
+				i++;
+				temp=list.get(i)+list.get(i+1);
+			}
+			
+			result=new int[list.size()];
+			
+			i=0;
+			for(int d:list){
+				result[i]=d;
+				i++;
+			}
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		List<Integer> list=new ArrayList<Integer>();
+		for(int i=2;i<max;i++){
+			if(ArrayUtil.isPrimes(i)){
+				list.add(i);
+			}
+		}
+		
+		int[] result=new int[list.size()];
+		
+		int i=0;
+		for(int d:list){
+			result[i]=d;
+			i++;
+		}
+		return result;
+	}
+	
+	/**
+	 * 判断一个数是否为素数
+	 * 
+	 * @param d
+	 * @return  true是素数，false不是素数
+	 */
+	public static boolean isPrimes(int d){
+		if(d<=1) return false;
+		if(d==2) return true;
+		
+		int base=(int) Math.sqrt(d);
+		for(int i=2;i<=base;i++){
+			if(d%i==0){
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		List<Integer> list=new ArrayList<Integer>();
+		for(int i=1;i<max;i++){
+			if(ArrayUtil.isPerfectNumber(i)){
+				list.add(i);
+			}
+		}
+		
+		int[] result=new int[list.size()];
+		
+		int i=0;
+		for(int d:list){
+			result[i]=d;
+			i++;
+		}
+		return result;
+	}
+	
+	/**
+	 * 判断一个数是否为完数(这个数等于它的所有因子之和)
+	 * 
+	 * @param d
+	 * @return true是完数，false不是完数
+	 * @author greenhills
+	 * 2017年2月28日 下午10:18:29
+	 */
+	public static boolean isPerfectNumber(int d){
+		int sum=0;
+		for(int i=1;i<d;i++){
+			if(d%i==0){
+				sum+=i;
+			}
+		}
+		if(d==sum) return true;
+		
+		return false;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(Integer[] array, String seperator){
+		StringBuffer sb=new StringBuffer();
+		for(Integer i:array){
+			sb.append(i+seperator);
+		}
+		String result=null;
+		//去除末尾的seperator
+		if(sb.lastIndexOf(seperator) == sb.length()-seperator.length()){
+			result = sb.substring(0, sb.length()-seperator.length());
+		}else{
+			result = sb.toString();
+		}
+		return result;
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/ActionMapping.java b/group16/63912401/src/com/coderising/litestruts/ActionMapping.java
new file mode 100644
index 0000000000..4d7d78abb0
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/ActionMapping.java
@@ -0,0 +1,68 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+/** 
+ * @author greenhills
+ * @version 创建时间：2017年2月27日 下午10:36:35 
+ * 
+ */
+public class ActionMapping {
+	/**
+	 * action名称
+	 */
+	private String name;
+	/**
+	 * 执行action的类
+	 */
+	private String className;
+	/**
+	 * 执行action的类方法
+	 */
+	private String method;
+	/**
+	 * 保存ResultMapping结果，以result标签的name作为key
+	 */
+	private Map<String,ResultMapping> resultMappings=new HashMap<String,ResultMapping>();
+	
+	public ActionMapping() {}
+
+	public ActionMapping(String name, String className, String method) {
+		this.name = name;
+		this.className = className;
+		this.method = StringUtils.isBlank(method) ? "execute" : method; //未配置时，默认查找execute方法执行
+	}
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getClassName() {
+		return className;
+	}
+	public void setClassName(String className) {
+		this.className = className;
+	}
+	public String getMethod() {
+		return method;
+	}
+	public void setMethod(String method) {
+		this.method = method;
+	}
+	public Map<String, ResultMapping> getResultMappings() {
+		return resultMappings;
+	}
+	public void setResultMappings(Map<String, ResultMapping> resultMappings) {
+		this.resultMappings = resultMappings;
+	}
+	
+	//扩展的方法，用于保存
+	public void setResultMappings(String key, ResultMapping value) {
+		this.resultMappings.put(key, value);
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java b/group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java
new file mode 100644
index 0000000000..55204d1b38
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java
@@ -0,0 +1,83 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+/**
+ * 解析XML文件
+ * ConfigurationManager
+ * @author greenhills
+ * 2017年2月27日 下午10:18:10
+ */
+public class ConfigurationManager {
+	/**
+	 * 读取xml文件的文档对象
+	 */
+	private static Document document;
+	/**
+	 * 配置文件路径
+	 */
+	static  String configureFileName="struts.xml";
+	/**
+	 * 当前类路径
+	 */
+	static  String currentPath;	
+	static{
+		currentPath = ConfigurationManager.class.getResource("").getPath().substring(1);
+	}
+	
+	static{
+		try {
+			SAXReader sax=new SAXReader();
+			document = sax.read(new File(currentPath+configureFileName));
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 解析配置文件
+	 * ConfigurationManager.java
+	 * @param @return
+	 * @author greenhills
+	 * 2017年2月27日 下午11:28:59
+	 */
+	public static Map<String,ActionMapping> loadXml(){
+		Map<String,ActionMapping> actionMappings=new HashMap<String, ActionMapping>();
+		
+		Element root=document.getRootElement();
+		List<Element> actionList= root.elements("action");
+		
+		for(Element actionElemnt:actionList){
+			ActionMapping actionMapping=new ActionMapping(
+					actionElemnt.attributeValue("name"),
+					actionElemnt.attributeValue("class"),
+					actionElemnt.attributeValue("method")
+				);
+			//获取action下的result节点
+			List<Element> resultList = actionElemnt.elements("result");
+			for(Element resultElemnt:resultList){
+				ResultMapping resultMapping=new ResultMapping(
+						resultElemnt.attributeValue("name"), 
+						resultElemnt.attributeValue("type"), 
+						resultElemnt.getTextTrim()
+					);
+				
+				//保存ResultMapping（以result标签的name为key）
+				actionMapping.setResultMappings(resultMapping.getName(),resultMapping);
+			}
+			
+			//保存ActionMapping（以action标签的name为key）
+			actionMappings.put(actionMapping.getName(), actionMapping);
+		}
+		
+		return actionMappings;
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/DefaultAction.java b/group16/63912401/src/com/coderising/litestruts/DefaultAction.java
new file mode 100644
index 0000000000..c654a11a02
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/DefaultAction.java
@@ -0,0 +1,121 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/** 
+ * @author greenhills
+ * @version 创建时间：2017年2月27日 下午11:48:56 
+ * 
+ */
+public class DefaultAction {
+	private ActionMapping actionMapping;
+	private  Object targetAction;   //由DefaultAction反射调用的目标对象
+	
+	//构造方法，实例化对象
+	public DefaultAction(ActionMapping actionMapping) {
+		this.actionMapping = actionMapping;
+		//实例化对象
+		try {
+			this.targetAction = Class.forName(this.actionMapping.getClassName()).newInstance();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 初始化参数
+	 * DefaultAction.java
+	 * @param 
+	 * @author greenhills
+	 * 2017年2月27日 下午11:58:05
+	 */
+	public void initParam(Map<String,String> parameters){
+		Class clazz=this.targetAction.getClass();
+		Set<String> keys=parameters.keySet();
+		try {
+			for(String key:keys){
+				String _key = getFirstUpper(key);
+				//调用set方法赋值
+				Method method=clazz.getDeclaredMethod("set"+_key,clazz.getDeclaredField(key).getType());
+				method.invoke(this.targetAction, parameters.get(key));
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 调用实例方法
+	 * DefaultAction.java
+	 * @param @return
+	 * @author greenhills
+	 * 2017年2月27日 下午11:53:56
+	 */
+	public String runMethod(){
+		String methodName=this.actionMapping.getMethod();
+		Class clazz=this.targetAction.getClass();
+		String result="success";
+		//调用set方法赋值
+		try {
+			Method method=clazz.getDeclaredMethod(methodName);
+			result = (String) method.invoke(this.targetAction);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	/**
+	 * 获取action字段的值
+	 * DefaultAction.java
+	 * @param @param fields
+	 * @param @return
+	 * @author greenhills
+	 * 2017年2月28日 上午12:39:01
+	 */
+	public Map<String,Object> getFieldValue(String[] fields){
+		Map<String,Object> result=new HashMap<String, Object>();
+		try {
+			Class clazz=this.targetAction.getClass();
+			for(String field:fields){
+				String _field = getFirstUpper(field);
+				//调用get方法获取值
+				Method method=clazz.getDeclaredMethod("get"+_field);
+				result.put(field,method.invoke(this.targetAction));
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	
+	
+	/**
+	 * 将首字母改为大写
+	 * DefaultAction.java
+	 * @param @param val
+	 * @param @return
+	 * @author greenhills
+	 * 2017年2月28日 上午12:24:34
+	 */
+	private String getFirstUpper(String val){
+		return val.substring(0, 1).toUpperCase()+val.substring(1);
+	}
+	
+	
+	public ActionMapping getActionMapping() {
+		return actionMapping;
+	}
+	public void setActionMapping(ActionMapping actionMapping) {
+		this.actionMapping = actionMapping;
+	}
+	public Object getTargetAction() {
+		return targetAction;
+	}
+	public void setTargetAction(Object targetAction) {
+		this.targetAction = targetAction;
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/ResultMapping.java b/group16/63912401/src/com/coderising/litestruts/ResultMapping.java
new file mode 100644
index 0000000000..9a2650db09
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/ResultMapping.java
@@ -0,0 +1,48 @@
+package com.coderising.litestruts;
+
+import org.apache.commons.lang3.StringUtils;
+
+/** 
+ * @author greenhills
+ * @version 创建时间：2017年2月27日 下午10:39:20 
+ * 
+ */
+public class ResultMapping {
+	/**
+	 * 映射结构：<result name="success" type="redirect">/jsp/homepage.jsp</result>
+	 */
+	private String name;
+	private String type;
+	private String urlPath;
+	
+	public ResultMapping() {
+		super();
+	}
+	
+	public ResultMapping(String name, String type, String urlPath) {
+		super();
+		this.name = StringUtils.isBlank(name) ? "success" : name; //默认成功
+		this.type = StringUtils.isBlank(type) ? "dispatcher" : type; //默认转发
+		this.urlPath = urlPath;
+	}
+	
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getUrlPath() {
+		return urlPath;
+	}
+	public void setUrlPath(String urlPath) {
+		this.urlPath = urlPath;
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/Struts.java b/group16/63912401/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..06a23bb864
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,37 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+//		0. 读取配置文件struts.xml
+    	Map<String,ActionMapping> actionMappings = ConfigurationManager.loadXml();
+    	
+// 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+//		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+//		("name"="test" ,  "password"="1234") ,     	
+//		那就应该调用 setName和setPassword方法
+    	ActionMapping actionMapping = actionMappings.get(actionName);
+    	DefaultAction action=new DefaultAction(actionMapping);
+    	action.initParam(parameters);
+    	
+//		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		String result= action.runMethod();
+		
+//		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+//		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+//		放到View对象的parameters
+		
+		Map<String,Object> messageMaps=action.getFieldValue(new String[]{"message"});
+		
+//		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+//		放到View对象的jsp字段中。
+        View view =new View();
+        view.setJsp(actionMapping.getResultMappings().get(result).getUrlPath());
+        view.setParameters(messageMaps);
+    	return view;
+    }    
+
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/StrutsTest.java b/group16/63912401/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..4061019b2e
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/View.java b/group16/63912401/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group16/63912401/src/com/coderising/litestruts/struts.xml b/group16/63912401/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..76cc617a8a
--- /dev/null
+++ b/group16/63912401/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction" method="execute">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction" method="execute">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group16/63912401/src/com/coding/basic/ArrayList.java b/group16/63912401/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..f86a2e7a8a
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,206 @@
+package com.coding.basic;
+
+import java.util.Arrays;
+
+/** 
+ * ArrayList
+ * @author greenhills
+ * @version 创建时间：2017年2月19日 下午10:54:02 
+ * @param
+ * 
+ */
+public class ArrayList implements List {
+	/**
+	 * 默认容量
+	 */
+	private static final int DEFAULT_CAPACITY = 10;
+	
+	/**
+	 * 数据存放区
+	 */
+	private Object[] elementData;
+	
+	/**
+	 * 真实的数据数量
+	 */
+	private int size = 0;
+	
+	/**
+	 * 无参构造函数
+	 */
+	public ArrayList(){
+		this.elementData=new Object[DEFAULT_CAPACITY];
+	}
+	
+	/**
+	 * 带初始大小的构造函数
+	 * @param beginSize
+	 */
+	public ArrayList(int beginSize){
+		if(beginSize<0) 
+			this.elementData=new Object[DEFAULT_CAPACITY];
+		else
+			this.elementData=new Object[beginSize];
+	}
+	
+	/**
+	 * 在后面追加数据
+	 */
+	@Override
+	public void add(Object o){
+		autoGrow(size+1);
+		this.elementData[size++] = o; //在尾部追加数据
+	}
+	
+	/**
+	 * 把数据加入指定索引处
+	 */
+	@Override
+	public void add(int index, Object o){
+		rangeCheck(index);
+		autoGrow(size+1);
+		//把index处的所有数据往后移
+		//System.arraycopy(elementData, index, elementData, index+1, size-index);
+		
+		for(int i=size;i>index;i--){
+			elementData[i] = elementData[i-1];
+		}
+		
+		this.elementData[index] = o; //使数据连续加入
+		size++;
+	}
+	
+	/**
+	 * 获取指定索引处的数据
+	 */
+	@Override
+	public Object get(int index){
+		rangeCheck(index);
+		return elementData[index];
+	}
+	
+	/**
+	 * 获取末尾数据
+	 */
+	public Object getLast(){
+		return elementData[this.size-1];
+	}
+	
+	/**
+	 * 移除索引处数据
+	 */
+	@Override
+	public Object remove(int index){
+		rangeCheck(index);
+		
+		Object removed = elementData[index];
+		int num=size - index - 1;  //移动数量
+		if(num>0) {
+			System.arraycopy(elementData, index+1, elementData, index,num);
+		}
+		elementData[--size] = null; //清除最后一个数据位
+		return removed;
+	}
+	
+	/**
+	 * 移除末尾数据
+	 */
+	public Object removeLast(){
+		return remove(this.size-1);
+	}
+	
+	/**
+	 * 获取数据量
+	 */
+	@Override
+	public int size(){
+		return this.size;
+	}
+	
+	/**
+	 * 获取存储数据的容量大小
+	 */
+	@Override
+	public int capacity() {
+		return this.elementData.length;
+	}
+	
+	/**
+	 * 判断是否为空
+	 */
+	@Override
+	public boolean isEmpty() {
+		return this.size==0;
+	}
+
+	/**
+	 * 空间容量自增长
+	 * @param minCapacity 增长后最小容量
+	 */
+	private void autoGrow(int minCapacity){
+		int oldCapacity = elementData.length;
+		if (minCapacity >= oldCapacity) {
+		    int newCapacity = oldCapacity<<1;  //空间翻倍
+	    	if (newCapacity < minCapacity){
+	    		newCapacity = minCapacity;
+	    	}
+	        elementData = Arrays.copyOf(elementData, newCapacity);
+		}
+	}
+
+	/**
+	 * 判断是否为有效索引
+	 * @param @param index
+	 * @param @return
+	 */
+	private void rangeCheck(int index) {
+        if (!isEffectiveIndex(index))
+            throw new IndexOutOfBoundsException("Index: "+index+" Out Of Bounds, 有效数据索引范围:0~"+(this.size-1));
+    }
+	
+	/**
+	 * 判断是否为有效索引
+	 * @param @param index
+	 * @param @return
+	 */
+	private boolean isEffectiveIndex(int index){
+		return index >-1 && index < this.size;
+	}
+	
+	/**
+	 * 返回遍历数据对象
+	 * @param @return
+	 * @author greenhills
+	 * 2017年2月25日 下午9:55:31
+	 */
+	public Iterator iterator(){
+		return new Its();
+	}
+	
+	/**
+	 * 实现Iterator的内部实现类
+	 * Its
+	 * @author greenhills
+	 * 2017年2月25日 下午9:54:54
+	 */
+	private class Its implements Iterator {
+		private int index=0;
+		
+		public Its(){
+			//this.len = size;  //逆向遍历
+		}
+		
+		@Override
+		public boolean hasNext() {
+//			return this.len > 0;  //逆向遍历
+			return this.index < size; //正向遍历
+		}
+
+		@Override
+		public Object next() {
+//			return get(--this.len); //逆向遍历
+//			return elementData[--this.len];//逆向遍历
+			return get(this.index++); //正向遍历
+		}
+	}
+}
diff --git a/group16/63912401/src/com/coding/basic/BinaryTreeNode.java b/group16/63912401/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..3ab1e431c0
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,99 @@
+package com.coding.basic;
+
+/**
+ * 二叉树数据结构
+ * BinaryTreeNode
+ * @author greenhills
+ * 2017年2月25日 下午9:51:05
+ */
+public class BinaryTreeNode implements Comparable<Object>{
+	
+	private int height=0; //当前树高度
+	private Object data;        //当前节点数据
+	private BinaryTreeNode left;  //小于当前节点数据data的节点
+	private BinaryTreeNode right; //大于当前节点数据data的节点
+	
+	public BinaryTreeNode() {
+	}
+
+	public BinaryTreeNode(Object data) {
+		this.data = data;
+	}
+
+	public BinaryTreeNode insert(Object o){
+		BinaryTreeNode newNode=new BinaryTreeNode(o);
+		BinaryTreeNode that = findNode(o);
+		int result=that.compareTo(o);
+		
+		if(result<0){//节点数据小于插入数据，进右树
+			that.setRight(newNode);
+		}else if(result>0){ //当前节点数据大于插入数据，进左树
+			that.setLeft(newNode);
+		}else{
+			return null;
+		}
+		newNode.height++; //树高度加1
+		return  newNode;
+	}
+	
+	private BinaryTreeNode findNode(Object data){
+		int result=this.compareTo(data);
+		BinaryTreeNode that = new BinaryTreeNode(); //空节点
+		if(result<0){ //当前节点数据小于插入数据，进右树
+			if(this.right==null){
+				that = this;
+			}else{
+				that = findNode(this.getRight());
+			}
+		}else if(result>0){ //当前节点数据大于插入数据，进左树
+			if(this.left==null){
+				that = this;
+			}else{
+				that = findNode(this.getLeft());
+			}
+		}else{
+			System.out.println("无效数据");
+		}
+		return that;
+	}
+	
+	public int getTreeMaxHeight(){
+		int h=0;
+		//TODO
+		
+		return h;
+	}
+	
+	public int getHeight() {
+		return height;
+	}
+
+	public void setHeight(int height) {
+		this.height = height;
+	}
+
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+	@Override
+	public int compareTo(Object o) {
+		if(this.data==null || o==null)  return 0;
+		return Double.valueOf(this.data.toString()).compareTo(Double.valueOf(o.toString()));
+	}
+}
diff --git a/group16/63912401/src/com/coding/basic/Iterator.java b/group16/63912401/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..fa815258c1
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/Iterator.java
@@ -0,0 +1,8 @@
+package com.coding.basic;
+
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group16/63912401/src/com/coding/basic/LinkedList.java b/group16/63912401/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..2120a5a4b8
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,320 @@
+package com.coding.basic;
+
+import java.util.NoSuchElementException;
+
+/**
+ * 链表数据结构
+ * LinkedList
+ * @author greenhills
+ * 2017年2月22日 下午11:52:41
+ */
+public class LinkedList implements List {
+	/**
+	 * 链表数据量
+	 */
+	private int size=0;
+	/**
+	 * 链表头节点
+	 */
+	private Node head;
+	/**
+	 * 链表尾节点
+	 */
+	private Node tail;
+	
+	
+	/**
+	 * 在数据链尾部添加数据
+	 */
+	@Override
+	public void add(Object o) {
+		addLast(o);
+	}
+	
+	/**
+	 * 在数据链指定位置添加数据
+	 */
+	@Override
+	public void add(int index, Object data) {
+		checkIndex(index);
+		Node old=getNode(index);
+        link2Before(old,data);
+	}
+	
+	/**
+	 * 获取指定索引处数据
+	 */
+	@Override
+	public Object get(int index) {
+		checkIndex(index);
+		return getNode(index).data;
+	}
+	
+	/**
+	 * 移除指定索引位置的节点
+	 */
+	@Override
+	public Object remove(int index) {
+		checkIndex(index);
+		return unlink(getNode(index));
+	}
+	
+	/**
+	 * 获取数据链的数据量
+	 */
+	@Override
+	public int size() {
+		return this.size;
+	}
+	
+	/**
+	 * 获取数据链的数据量
+	 */
+	@Override
+	@Deprecated
+	public int capacity() {
+		return size();
+	}
+	
+	/**
+	 * 判断是否为空
+	 */
+	@Override
+	public boolean isEmpty() {
+		return this.size==0;
+	}
+	
+	/**
+	 * 在数据链头部追加数据
+	 * @param data
+	 */
+	public void addFirst(Object data){
+		final Node oldNode=this.head;
+		final Node newNode=new Node(null,data,oldNode);//形成新节点，并指向第一个节点
+		this.head = newNode; //变更集合保存的首节点
+		
+		if(oldNode == null){ //没有数据
+			this.tail = newNode; //变更集合保存的尾节点
+		}else{
+			oldNode.prev = newNode; //原首节点指向新的首节点
+		}
+		this.size++;//数据量加1
+	}
+	
+	/**
+	 * 在数据链尾部追加数据
+	 * @param data
+	 */
+	public void addLast(Object data){
+		final Node oldNode=this.tail;
+		final Node newNode=new Node(oldNode,data,null);//形成新节点，并指向最后一个节点
+		this.tail = newNode; //变更集合保存的尾节点
+		
+		if(oldNode == null){ //没有数据
+			this.head = newNode; //变更集合保存的首节点
+		}else{
+			oldNode.next = newNode;//原尾节点指向新的尾节点
+		}
+		this.size++;//数据量加1
+	}
+	
+	/**
+	 * 把指定数据链接到指定节点前面
+	 */
+	void link2Before(Node node,Object data){
+		//传进来的node就是后节点
+		final Node prev=node.prev; //指定节点的上一个节点（前节点）
+		//生成新节点，并指向前后的节点
+		final Node newNode=new Node(prev,data,node);//生成新节点
+		//后节点指向新节点
+		node.prev = newNode;
+		//前节点指向新节点
+		if(prev == null){//没有前节点了（当前节点已是首节点）
+			this.head = newNode;//把新的节点作为首节点
+		}else{
+			prev.next = newNode;
+		}
+		this.size++;//数据量加1
+	}
+	
+	/**
+	 * 把指定数据链接到指定节点后面
+	 */
+	void link2Last(Node node,Object data){
+		//传进来的node就是前节点
+		final Node next=node.next; //指定节点的下一个节点(后节点)
+		//生成新节点，并指向前后的节点
+		final Node newNode=new Node(node,data,next);
+		//前节点指向新节点
+		node.next = newNode;
+		//后节点指向新节点
+		if(next == null){//没有后节点了（当前节点已是尾节点）
+			this.tail = newNode;//把新的节点作为尾节点
+		}else{
+			next.prev = newNode;
+		}
+		this.size++;//数据量加1
+	}
+	
+	/**
+	 * 移除首节点
+	 * @return
+	 */
+	public Object removeFirst(){
+		return unlink(getNode(0));
+	}
+	
+	/**
+	 * 移除尾节点
+	 * @return
+	 */
+	public Object removeLast(){
+		return unlink(getNode(this.size-1));
+	}
+	
+	/**
+	 * 移除节点
+	 * @return
+	 */
+	Object unlink(Node node){
+		final Object element = node.data;
+        final Node next = node.next; //下一个节点
+        final Node prev = node.prev;//前一个节点
+
+        if (prev == null) {//待删除节点是首节点
+            head = next;
+        } else {
+            prev.next = next;
+            node.prev = null;//解除待删除节点的引用关系
+        }
+
+        if (next == null) {//待删除节点是尾节点
+            tail = prev;
+        } else {
+            next.prev = prev;
+            node.next = null;//解除待删除节点的引用关系
+        }
+
+        node.data = null;//清除节点数据
+        size--;
+        return element;//返回清除节点数据
+	}
+	
+	/**
+	 * 在中间位置创建Iterator遍历
+	 * @return
+	 */
+	public Iterator iterator() {
+        return new Its(this.size>>1);
+    }
+	
+	/**
+	 * 在指定位置创建Iterator遍历
+	 * @return
+	 */
+	public Iterator iterator(int index) {
+		checkIndex(index);
+        return new Its(index);
+    }
+	
+	/**
+	 * 获取指定索引的节点对象
+	 * @param @param index
+	 * @param @return
+	 */
+	private Node getNode(int index){
+		if (index < (this.size >> 1)) { //在前半部分
+            Node node = this.head;
+            for (int i = 0; i < index; i++){
+            	node = node.next; //向后查找
+            }
+            return node;
+        } else { //在后半部分
+            Node node = this.tail;
+            for (int i = this.size - 1; i > index; i--){
+            	node = node.prev; //向前查找
+            }
+            return node;
+        }
+	}
+	
+	/**
+	 * 判断是否为有效索引
+	 * @param @param index
+	 * @param @return
+	 */
+	private boolean isEffectiveIndex(int index){
+		return (index>=0 && index < size);
+	}
+	
+	/**
+	 * 检测索引有效性，无效时抛出异常
+	 * @param index
+	 */
+	private void checkIndex(int index) {
+        if (!isEffectiveIndex(index))
+            throw new IndexOutOfBoundsException("Index: "+index+" Out Of Bounds, 最大索引: "+(size-1));
+    }
+	
+	
+	/**
+	 * 实现Iterator的内部实现类
+	 */
+	private class Its implements Iterator {
+		private Node lastReturned = null;
+        private Node node;//当前节点
+        private int index;//当前节点索引
+		
+		public Its(int index){
+			node = isEffectiveIndex(index) ? getNode(index) : null;
+			this.index = index;
+		}
+		
+		@Override
+		public boolean hasNext() {
+			return index < size;
+		}
+
+		@Override
+		public Object next() {
+			if (!hasNext())
+                throw new NoSuchElementException();
+
+            lastReturned = node;
+            node = node.next;
+            index++;
+            return lastReturned.data;
+			
+		}
+		
+		public boolean hasPrevious() {
+            return index >= 0;
+        }
+
+        public Object previous() {
+            if (!hasPrevious())
+                throw new NoSuchElementException();
+            
+            lastReturned = node;
+            node = node.prev;
+            index--;
+            return lastReturned.data;
+        }
+	}
+	
+	/**
+	 * 节点数据
+	 * Node
+	 */
+	private static class Node{
+		Object data;
+		Node prev;
+		Node next;
+		
+		Node(Node prev,Object data,Node next){
+			this.prev=prev;
+			this.data=data;
+			this.next=next;
+		}
+	}
+}
diff --git a/group16/63912401/src/com/coding/basic/List.java b/group16/63912401/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..7fe012ccab
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/List.java
@@ -0,0 +1,16 @@
+package com.coding.basic;
+/** 
+ * 集合接口
+ * @author greenhills
+ * @version 创建时间：2017年2月19日 下午10:49:40 
+ * 
+ */
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+	public int capacity();
+	boolean isEmpty();
+}
diff --git a/group16/63912401/src/com/coding/basic/Queue.java b/group16/63912401/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..c6007c9e99
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/Queue.java
@@ -0,0 +1,43 @@
+package com.coding.basic;
+
+/**
+ * 队列数据结构
+ * Queue
+ * @author greenhills
+ * 2017年2月25日 下午9:50:04
+ */
+public class Queue {
+	private LinkedList elementData = new LinkedList();
+	
+	/**
+	 * 入队
+	 * @param o
+	 */
+	public void enQueue(Object o){
+		elementData.addLast(o);
+	}
+	
+	/**
+	 * 出队
+	 * @return
+	 */
+	public Object deQueue(){
+		return elementData.removeFirst();
+	}
+	
+	/**
+	 * 判断是否为空
+	 * @return
+	 */
+	public boolean isEmpty(){
+		return elementData.size()==0;
+	}
+	
+	/**
+	 * 获取栈内数据量
+	 * @return
+	 */
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group16/63912401/src/com/coding/basic/Stack.java b/group16/63912401/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..b343c6de1d
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/Stack.java
@@ -0,0 +1,51 @@
+package com.coding.basic;
+
+/**
+ * 栈数据结构
+ * Stack
+ * @author greenhills
+ * 2017年2月25日 下午9:49:41
+ */
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	/**
+	 * 入栈
+	 * @param o
+	 */
+	public void push(Object o){	
+		elementData.add(o);
+	}
+	
+	/**
+	 * 出栈
+	 * @return
+	 */
+	public Object pop(){
+		return elementData.removeLast();
+	}
+	
+	/**
+	 * 获取栈顶数据
+	 * @return
+	 */
+	public Object peek(){
+		return elementData.getLast();
+	}
+	
+	/**
+	 * 判断是否为空
+	 * @return
+	 */
+	public boolean isEmpty(){
+		return elementData.size()==0;
+	}
+	
+	/**
+	 * 获取栈内数据量
+	 * @return
+	 */
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group16/63912401/src/com/coding/basic/Stack2.java b/group16/63912401/src/com/coding/basic/Stack2.java
new file mode 100644
index 0000000000..8c10ccdf06
--- /dev/null
+++ b/group16/63912401/src/com/coding/basic/Stack2.java
@@ -0,0 +1,51 @@
+package com.coding.basic;
+
+/**
+ * 栈数据结构
+ * Stack
+ * @author greenhills
+ * 2017年2月25日 下午9:49:41
+ */
+public class Stack2 {
+	private LinkedList elementData = new LinkedList();
+	
+	/**
+	 * 入栈
+	 * @param o
+	 */
+	public void push(Object o){	
+		elementData.addFirst(o);
+	}
+	
+	/**
+	 * 出栈
+	 * @return
+	 */
+	public Object pop(){
+		return elementData.removeFirst();
+	}
+	
+	/**
+	 * 获取栈顶数据
+	 * @return
+	 */
+	public Object peek(){
+		return elementData.get(0);
+	}
+	
+	/**
+	 * 判断是否为空
+	 * @return
+	 */
+	public boolean isEmpty(){
+		return elementData.size()==0;
+	}
+	
+	/**
+	 * 获取栈内数据量
+	 * @return
+	 */
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group16/932886072/djj/ArrayList.java b/group16/932886072/djj/ArrayList.java
new file mode 100644
index 0000000000..df3a11c386
--- /dev/null
+++ b/group16/932886072/djj/ArrayList.java
@@ -0,0 +1,64 @@
+package djj;
+
+
+import java.util.Arrays;
+
+/**
+ * Created by jerry on 2017/2/26.
+ */
+public class ArrayList implements List {
+
+    private int size = 0;
+
+    private Object[] elementData = new Object[100];
+
+    public void add(Object o){
+        if(size>elementData.length*0.8){
+            Arrays.copyOf(elementData,elementData.length*2);
+        }
+        elementData[size]=o;
+        size++;
+    }
+    public void add(int index, Object o){
+        if (size>=index){
+            Object[] temp=new Object[elementData.length];
+            System.arraycopy(elementData,0,temp,0,index);
+            temp[index]=o;
+            System.arraycopy(elementData,index,temp,index+1,size-index);
+            elementData=temp;
+        }else if(size<index){
+            throw new RuntimeException("越界");
+        }
+        size++;
+    }
+
+    public Object get(int index){
+        if(index>size){
+            throw new RuntimeException("越界");
+        }else{
+            return elementData[index];
+        }
+    }
+
+    public Object remove(int index){
+        Object tempObj=null;
+        if(index<=size){
+            Object[] temp=new Object[elementData.length];
+            System.arraycopy(elementData,0,temp,0,index);
+            tempObj=elementData[index];
+            System.arraycopy(elementData,index+1,temp,index,size-index-1);
+            elementData=temp;
+        }
+        size--;
+        return tempObj;
+    }
+
+    public int size(){
+        return size;
+    }
+
+    public Iterator iterator(){
+        return null;
+    }
+
+}
diff --git a/group16/932886072/djj/BinaryTreeNode.java b/group16/932886072/djj/BinaryTreeNode.java
new file mode 100644
index 0000000000..d697be6ffc
--- /dev/null
+++ b/group16/932886072/djj/BinaryTreeNode.java
@@ -0,0 +1,34 @@
+package djj;
+
+public class BinaryTreeNode {
+
+	private BinaryTreeNode root;
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+
+	public BinaryTreeNode insert(Object o){
+		
+		return  null;
+	}
+
+
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+}
diff --git a/group16/932886072/djj/Iterator.java b/group16/932886072/djj/Iterator.java
new file mode 100644
index 0000000000..4482e3a408
--- /dev/null
+++ b/group16/932886072/djj/Iterator.java
@@ -0,0 +1,9 @@
+package djj;
+
+/**
+ * Created by jerry on 2017/2/26.
+ */
+public interface Iterator {
+    public boolean hasNext();
+    public Object next();
+}
diff --git a/group16/932886072/djj/LinkedList.java b/group16/932886072/djj/LinkedList.java
new file mode 100644
index 0000000000..6e40d5cc69
--- /dev/null
+++ b/group16/932886072/djj/LinkedList.java
@@ -0,0 +1,96 @@
+package djj;
+
+public class LinkedList implements List {
+	//头节点
+	private Node head;
+    //尾节点
+//    private Node tail;
+    //当前游标节点
+    private Node curNode;
+    public int size=0;
+
+	
+	public void add(Object o){
+		if(head==null){
+            head=new Node(o);
+            head.next=null;
+        }else{
+            curNode=head;
+            while(curNode.next!=null){
+                curNode=curNode.next;
+            }
+            curNode.next=new Node(o);
+        }
+        size++;
+	}
+	public void add(int index , Object o){
+        if(index>size||index<=0){
+            throw new RuntimeException("越界");
+        }else{
+            curNode=head;
+            for(int i=0;i<index;i++){
+                curNode=curNode.next;
+            }
+            Node newNode=new Node(o);
+            newNode.next=curNode.next;
+            curNode.next=newNode;
+            size++;
+        }
+	}
+	public Object get(int index){
+        if(index>size||index<=0){
+            throw new RuntimeException("越界");
+        }
+        Node temp=head;
+        for(int i=0;i<index;i++){
+            temp=temp.next;
+        }
+		return temp.data;
+	}
+	public Object remove(int index){
+        if(index>size||index<=0){
+            throw new RuntimeException("越界");
+        }
+        Node temp=head;
+        for(int i=0;i<index-1;i++){
+            temp=temp.next;
+        }
+        Node delNode=temp.next;
+        temp.next=delNode.next;
+        delNode.next=null;
+        size--;
+		return delNode.data;
+	}
+	
+	public int size(){
+		return this.size;
+	}
+	
+	public void addFirst(Object o){
+        add(1,o);
+	}
+	public void addLast(Object o){
+		add(size,o);
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static class Node{
+		Object data;
+		Node next;
+
+        public Node(Object o){
+            data=o;
+            next=null;
+        }
+
+	}
+}
diff --git a/group16/932886072/djj/List.java b/group16/932886072/djj/List.java
new file mode 100644
index 0000000000..d1e9a3b553
--- /dev/null
+++ b/group16/932886072/djj/List.java
@@ -0,0 +1,12 @@
+package djj;
+
+/**
+ * Created by jerry on 2017/2/26.
+ */
+public interface List {
+    public void add(Object o);
+    public void add(int index, Object o);
+    public Object get(int index);
+    public Object remove(int index);
+    public int size();
+}
diff --git a/group16/932886072/djj/Queue.java b/group16/932886072/djj/Queue.java
new file mode 100644
index 0000000000..37c9ce6dd0
--- /dev/null
+++ b/group16/932886072/djj/Queue.java
@@ -0,0 +1,27 @@
+package djj;
+
+import java.util.*;
+
+//队列
+public class Queue {
+	private LinkedList elementList;
+
+	//入队
+	public void enQueue(Object o){
+		elementList.add(o);
+	}
+
+	//出队
+	public Object deQueue(){
+		return elementList.remove(1);
+	}
+	
+	public boolean isEmpty(){
+		return elementList.size==0?true:false;
+
+	}
+	
+	public int size(){
+		return elementList.size;
+	}
+}
diff --git a/group16/932886072/djj/Stack.java b/group16/932886072/djj/Stack.java
new file mode 100644
index 0000000000..2d388760b2
--- /dev/null
+++ b/group16/932886072/djj/Stack.java
@@ -0,0 +1,27 @@
+package djj;
+//栈
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	private int pointer=0;
+	
+	public void push(Object o){
+		elementData.add(o);
+		pointer++;
+	}
+	
+	public Object pop(){
+		Object temp=elementData.remove(pointer);
+		pointer--;
+		return temp;
+	}
+	
+	public Object peek(){
+		return elementData.get(pointer);
+	}
+	public boolean isEmpty(){
+		return pointer==0?true:false;
+	}
+	public int size(){
+		return pointer;
+	}
+}
diff --git a/group17/.gitignore b/group17/.gitignore
new file mode 100644
index 0000000000..2a5296f902
--- /dev/null
+++ b/group17/.gitignore
@@ -0,0 +1,21 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
diff --git a/group17/102228177/work2_26/.classpath b/group17/102228177/work2_26/.classpath
index dfa83d7793..80437ca942 100644
--- a/group17/102228177/work2_26/.classpath
+++ b/group17/102228177/work2_26/.classpath
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/dom4j-1.6.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java
index 0434776317..60949d043e 100644
--- a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java
+++ b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java
@@ -1,8 +1,10 @@
 package com.coderising.array;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 
 public class ArrayUtil {
@@ -29,7 +31,10 @@ public static void main(String[] args) {
 		
 		int[] a1 = {3, 5, 7,8};
 		int[] a2 = {4, 5, 6,7};
-		System.out.println(Arrays.toString(util.merge(a1, a2)));
+//		System.out.println(Arrays.toString(util.merge(a1, a2)));
+		System.out.println(Arrays.toString(util.fibonacci(15)));
+		
+		System.out.println(Arrays.toString(util.getPrimes(23)));
 	}
 	
 	/**
@@ -96,7 +101,9 @@ public int[] merge(int[] array1, int[] array2){
 	 * @return
 	 */
 	public int[] grow(int [] oldArray,  int size){
-		return null;
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, newArray.length);
+		return newArray;
 	}
 	
 	/**
@@ -107,7 +114,21 @@ public int[] grow(int [] oldArray,  int size){
 	 * @return
 	 */
 	public int[] fibonacci(int max){
-		return null;
+		List<Integer> list = new ArrayList<Integer>();
+		int f1 = 1, f2 = 1, f = 0;
+		list.add(f1);
+		list.add(f2);
+		while(f < max){
+			f = f1+f2;
+			f1 = f2;
+			f2 = f;
+			list.add(f);
+		}
+		int[] arr = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			arr[i] = list.get(i);
+		}
+		return arr;
 	}
 	
 	/**
@@ -117,7 +138,24 @@ public int[] fibonacci(int max){
 	 * @return
 	 */
 	public int[] getPrimes(int max){
-		return null;
+		List<Integer> list = new ArrayList<Integer>();
+		for (int i = 2; i < max; i++) {
+			boolean flag = true;
+			for (int j = 2; j < i; j++) {
+				if ( i % j == 0) {
+					flag = false;
+					break;
+				}
+			}
+			if(flag){
+				list.add(i);
+			}
+		}
+		int[] arr = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			arr[i] = list.get(i);
+		}
+		return arr;
 	}
 	
 	/**
@@ -127,7 +165,23 @@ public int[] getPrimes(int max){
 	 * @return
 	 */
 	public int[] getPerfectNumbers(int max){
-		return null;
+		 List<Integer> list = new ArrayList<Integer>();
+		 for (int i = 1; i <= max; i++){
+	            int sum=0;
+	            for (int j = 1; j < i; j++){
+		            if(i%j==0){
+		                sum+=j;
+		            }   
+	            }
+	            if(i==sum){
+	            	list.add(sum);
+	            }
+	        }
+		int[] arr = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			arr[i] = list.get(i);
+		}
+		return arr;
 	}
 	
 	/**
@@ -139,8 +193,10 @@ public int[] getPerfectNumbers(int max){
 	 * @return
 	 */
 	public String join(int[] array, String seperator){
-		return null;
+		String str = "";
+		for (int i = 0; i < array.length; i++) {
+			str += seperator+array[i];
+		}
+		return str.substring(1);
 	}
-	
-
 }
diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java b/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java
index efbc56607a..0aeaf71537 100644
--- a/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java
+++ b/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java
@@ -7,8 +7,6 @@
 
 import org.dom4j.Element;
 
-
-
 public class Struts {
 
     public static View runAction(String actionName, Map<String,String> parameters) {
@@ -37,7 +35,7 @@ public static View runAction(String actionName, Map<String,String> parameters) {
 		Map<String, String> attribute = Dom4jUtil.getAttribute(element);
 		String className = attribute.get(actionName);
 		try {
-			Class clazz = Class.forName(className);
+			Class<?> clazz = Class.forName(className);
 			Object o = clazz.newInstance();
 			for (Map.Entry<String, String> entry : parameters.entrySet()) {
 				String key = entry.getKey();
@@ -46,14 +44,14 @@ public static View runAction(String actionName, Map<String,String> parameters) {
 				Method method = clazz.getDeclaredMethod(BeanUtil.setter(field.getName()),String.class);
 				method.invoke(o, value);
 			}
-			Method method = clazz.getDeclaredMethod("execute",null);
+			Method method = clazz.getDeclaredMethod("execute");
 			String str = (String) method.invoke(o);
 			Field[] fields = clazz.getDeclaredFields();
 			Map<String, String> map = new HashMap<String, String>();
 			for (Field field : fields) {
 				String fieldName = field.getName();
-				Method method2 =  clazz.getDeclaredMethod(BeanUtil.getter(fieldName),null);
-				String ret = (String) method2.invoke(o, null);
+				Method method2 =  clazz.getDeclaredMethod(BeanUtil.getter(fieldName));
+				String ret = (String) method2.invoke(o);
 				map.put(fieldName, ret);
 			}
 			View view = new View();
diff --git a/group17/1158154002/src/test02/array/ArrayUtil.java b/group17/1158154002/src/test02/array/ArrayUtil.java
new file mode 100644
index 0000000000..1757a08958
--- /dev/null
+++ b/group17/1158154002/src/test02/array/ArrayUtil.java
@@ -0,0 +1,241 @@
+package test02.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import com.sun.javafx.image.impl.IntArgb;
+
+public class ArrayUtil {
+	
+	public static void main(String[] args) {
+//		int[] arr={7, 9, 30, 3, 4};
+//		reverseArray(arr);
+		
+//		int[] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+//		removeZero(oldArr);
+		
+//		int[] a1={3, 5, 7,8};
+//		int[] a2={4, 5, 6,7};
+//		merge(a1,a2);
+		
+//		int[] a1={3, 5, 7,8};
+//		grow(a1, 3);
+		
+//		fibonacci(15);
+		
+//		getPrimes(23);
+		
+//		getPerfectNumbers(4000);
+		
+		int[] a={1,2,3,4};
+		join(a, "-");
+	}
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin){
+		int[] newArr=new int[origin.length];
+		int j=0;
+		for (int i = origin.length-1; i >=0; i--) {
+			newArr[j++]=origin[i];
+		}
+		System.out.println(Arrays.toString(newArr));
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		ArrayList<Integer> list=new ArrayList<>();
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i]!=0) {
+				list.add(oldArray[i]);
+			}
+		}
+		
+		int[] newArr=new int[list.size()];
+		int j=0;
+		for (int i : list) {
+			newArr[j++]=i;
+		}
+		System.out.println(Arrays.toString(newArr));
+		return newArr;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		ArrayList<Integer> list=new ArrayList<>();
+		for (Integer arr1 : array1) {
+			list.add(arr1);
+		}
+		
+		for (Integer arr2 : array2) {
+			if (!list.contains(arr2)) {
+				list.add(arr2);
+			}
+		}
+		
+		int[] newArr=new int[list.size()];
+		int i=0;
+		for (int one : list) {
+			newArr[i++]=one;
+		}
+		
+		for (int j = 0; j < newArr.length-1; j++) {
+			for (int k = 0; k < newArr.length-1-j; k++) {
+				
+				if (newArr[k]>newArr[k+1]) {
+					int temp=newArr[k];
+					newArr[k]=newArr[k+1];
+					newArr[k+1]=temp;
+				}
+			}
+		}
+		System.out.println(Arrays.toString(newArr));
+		return  newArr;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int[] newArr=new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArr, 0, oldArray.length);
+		System.out.println(Arrays.toString(newArr));
+		return newArr;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if (max>1) {
+			ArrayList<Integer> list=new ArrayList<>();
+			list.add(1);
+			list.add(1);
+			while (list.get(list.size()-1)<max) {
+				if ((list.get(list.size()-1)+list.get(list.size()-2))<max) {
+					list.add(list.get(list.size()-1)+list.get(list.size()-2));
+				}else {
+					break;
+				}
+			}
+			int[] newArr=new int[list.size()];
+			int i=0;
+			for (int item : list) {
+				newArr[i++]=item;
+			}
+			System.out.println(Arrays.toString(newArr));
+			return newArr;
+		} else {
+			return null;
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		ArrayList<Integer> list = new ArrayList<>();
+
+		for (int i = 2; i < max; i++) {
+			int j = 2;
+			while (j < i) {
+//				System.out.println("i:"+i+",j:"+j+",i%j:"+(i%j));
+				if (i%j==0) {
+					break;
+				}
+				j++;
+			}
+			if (j==i) {
+				list.add(i);
+			}
+		}
+
+		int[] newArr = new int[list.size()];
+		int i = 0;
+		for (int item : list) {
+			newArr[i++] = item;
+		}
+		System.out.println(Arrays.toString(newArr));
+
+		return newArr;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		ArrayList<Integer> list = new ArrayList<>();	
+		for (int i = 1; i < max; i++) {
+			int j = 1;
+			int sum=0;
+			while (j < i) {
+//				System.out.println("i:"+i+",j:"+j+",i%j:"+(i%j));
+				if (i%j==0) {
+					sum=sum+j;
+				}
+				j++;
+			}
+			
+			if (sum==i) {
+				list.add(i);
+			}
+		}			
+		
+		int[] newArr = new int[list.size()];
+		int i = 0;
+		for (int item : list) {
+			newArr[i++] = item;
+		}
+		System.out.println(Arrays.toString(newArr));
+
+		return newArr;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		String result=Arrays.toString(array).replace(" ", "").replace("[", "").replace("]", "").replace(",", seperator);
+		System.out.println(result);
+		return result;
+	}
+}
diff --git a/group17/1158154002/src/test02/litestruts/Action.java b/group17/1158154002/src/test02/litestruts/Action.java
new file mode 100644
index 0000000000..d7a88fac57
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/Action.java
@@ -0,0 +1,22 @@
+package test02.litestruts;
+
+import java.util.HashMap;
+
+public class Action {
+	String className;
+	HashMap<String, String> resultJspMap;
+	
+	public String getClassName() {
+		return className;
+	}
+	public void setClassName(String className) {
+		this.className = className;
+	}
+	public HashMap<String, String> getResultJspMap() {
+		return resultJspMap;
+	}
+	public void setResultJspMap(HashMap<String, String> resultJspMap) {
+		this.resultJspMap = resultJspMap;
+	}
+
+}
diff --git a/group17/1158154002/src/test02/litestruts/LoginAction.java b/group17/1158154002/src/test02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..037c6f6d58
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package test02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/Struts.java b/group17/1158154002/src/test02/litestruts/Struts.java
new file mode 100644
index 0000000000..cb556a5652
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/Struts.java
@@ -0,0 +1,60 @@
+package test02.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import test02.litestruts.sax.SAXParserDemo;
+import test02.litestruts.util.StringUtil;
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters){
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+		Action action = SAXParserDemo.run();
+		View view=new View();
+		try {
+			Class<?> clazz = Class.forName(action.getClassName());
+			Object obj = clazz.newInstance();
+			for (String element : parameters.keySet()) {
+				Method method = clazz.getMethod("set" + StringUtil.captureName(element), String.class);
+				method.invoke(obj, parameters.get(element));
+			}
+			Method exectue = clazz.getMethod("execute", null);
+			String result = (String) exectue.invoke(obj, null);
+			view.setJsp(action.getResultJspMap().get(result));
+			
+			Method getMsg = clazz.getMethod("getMessage", null);
+			String msg=(String) getMsg.invoke(obj, null);
+			Map map=new HashMap<>();
+			map.put("message", msg);
+			System.out.println(map);
+			view.setParameters(map);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+    	return view;
+    }    
+
+}
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/StrutsTest.java b/group17/1158154002/src/test02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..ad3c0f2b80
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package test02.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/View.java b/group17/1158154002/src/test02/litestruts/View.java
new file mode 100644
index 0000000000..73fc11eb13
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/View.java
@@ -0,0 +1,23 @@
+package test02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group17/1158154002/src/test02/litestruts/sax/SAXParser.java b/group17/1158154002/src/test02/litestruts/sax/SAXParser.java
new file mode 100644
index 0000000000..4efcd0b5cb
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/sax/SAXParser.java
@@ -0,0 +1,221 @@
+package test02.litestruts.sax;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+
+import test02.litestruts.Action;
+
+public class SAXParser {
+    private static SAXParser parserInstance = new SAXParser();
+    private static SAXParserHandler parserHandler;
+    private SAXParser(){} // Singleton Pattern, a private constructor
+    private static SAXParserState state = SAXParserState.OUT_OF_TAG; // initial state
+
+    public static SAXParser getInstance() {
+        return parserInstance;
+    }
+
+    public Action parse(String path){
+		try {
+			BufferedReader br = new BufferedReader(new FileReader(path));
+	        int currentCharCode;
+	        // callback start document
+	        parserHandler.startDocument();
+	        try {
+				while((currentCharCode = br.read()) != -1){
+				    char currentChar = (char)currentCharCode;
+				    handleParser(currentChar);
+				}
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+       return parserHandler.endDocument();
+    }
+
+    public void setHandler(SAXParserHandler handler){
+        parserHandler = handler;
+    }
+
+    private static void handleParser(char c) {
+        // This SAX Parser will ignore any line wrap.
+        if(c == '\n'){
+            return;
+        }
+        switch (state){
+            case OUT_OF_TAG:{
+                if(c == '<'){
+                    if(SAXParsedData.innerText.trim().length() != 0) {
+                        parserHandler.innerText(SAXParsedData.innerText);
+                    }
+                    SAXParsedData.innerText = "";
+                    SAXParsedData.tagName = "";
+                    state = SAXParserState.BEGIN_START_OR_END_TAG;
+                } else if (c == '>') {
+                    state = SAXParserState.SYNTAX_ERROR;
+                } else {
+                    SAXParsedData.innerText += c;
+                }
+                break;
+            }
+            case BEGIN_START_OR_END_TAG:{
+                if(c == '/') {
+                    SAXParsedData.tagName = "";
+                    state = SAXParserState.IN_END_TAG;
+                }else if(c == '?' || c == '!'){
+                    state = SAXParserState.METADATA;
+                }else{
+                    SAXParsedData.tagName += c;
+                    state = SAXParserState.IN_START_TAG;
+                }
+                break;
+            }
+            case IN_START_TAG:{
+                if(c == ' '){
+                    state = SAXParserState.SPACE_IN_START_TAG;
+                }else if(c == '>'){
+                    // callback startElement event;
+                    parserHandler.startElement(SAXParsedData.tagName, SAXParsedData.attributes);
+                    SAXParsedData.clear();
+                    state = SAXParserState.CLOSE_START_TAG;
+                }else {
+                    SAXParsedData.tagName += c;
+                }
+                break;
+            }
+            case SPACE_IN_START_TAG:{
+                if(SAXParsedData.tagName.length() > 0){
+                    if(c != ' '){
+                        SAXParsedData.attribKey += c;
+                        state = SAXParserState.IN_ATTRIB_KEY;
+                    }
+                }
+                break;
+            }
+            case IN_ATTRIB_KEY:{
+                if(c == '='){
+                    state = SAXParserState.IN_ATTRIB_EQUAL;
+                }else{
+                    SAXParsedData.attribKey += c;
+                }
+                break;
+            }
+            case IN_ATTRIB_EQUAL:{
+                if(c == '"'){
+                    state = SAXParserState.IN_ATTRIB_VALUE;
+                }
+                break;
+            }
+            case IN_ATTRIB_VALUE:{
+                if(c == '"'){
+                    SAXParsedData.newAttribute();
+                    state = SAXParserState.IN_START_TAG;
+                }else{
+                    SAXParsedData.attribValue += c;
+                }
+                break;
+            }
+            case CLOSE_START_TAG:{
+                if(c == '<') {
+                    state = SAXParserState.BEGIN_START_OR_END_TAG;
+                }else{
+                    SAXParsedData.innerText += c;
+                    state = SAXParserState.OUT_OF_TAG;
+                }
+                break;
+            }
+            case IN_END_TAG:{
+                if(c == '>'){
+                    // callback endElement event
+                    parserHandler.endElement(SAXParsedData.tagName);
+                    state = SAXParserState.CLOSE_END_TAG;
+                }else{
+                    SAXParsedData.tagName += c;
+                }
+                break;
+            }
+            case CLOSE_END_TAG:{
+                if(c == ' '){
+                    state = SAXParserState.OUT_OF_TAG;
+                }else if(c == '<'){
+                    SAXParsedData.tagName = "";
+                    state = SAXParserState.BEGIN_START_OR_END_TAG;
+                }
+                break;
+            }
+            case METADATA:{
+                if(c == '>'){
+                    state = SAXParserState.CLOSE_END_TAG;
+                }
+                break;
+            }
+            case SYNTAX_ERROR:{
+                try {
+					throw new Exception();
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+            }
+        }
+
+    }
+
+    private enum SAXParserState {
+        // The state when parser meets "<". This is a pending state.
+        // If the next char is "/", the state will be IN_END_TAG,
+        // Otherwise, the state will be IN_START_TAG
+        BEGIN_START_OR_END_TAG,
+
+        // The state when parser is reading between start tag(<...>).
+        // When parser meets ">", callback "startElement" event
+        IN_START_TAG,
+
+        // The state when parser is reading between end tag(</...>).
+        // When parser meets "<", callback "endElement" event
+        IN_END_TAG,
+
+        // The state when parser meets " ", and is in IN_START_TAG state.
+        // If the length of tag_name is non-zero, finish parsing tag_name.
+        // Otherwise, finish parsing a key/value attribute.
+        SPACE_IN_START_TAG,
+        IN_ATTRIB_KEY,IN_ATTRIB_EQUAL,IN_ATTRIB_VALUE,
+        CLOSE_START_TAG,CLOSE_END_TAG,
+
+        // The state when parser is reading any char at the outside of <XXX>, or between two <XXX>. This is a pending state.
+        // Contents between <XXX> will be recorded, but if the contents consist only spaces, the content will be discarded.
+        // Otherwise, callback "innerText" event.
+        OUT_OF_TAG,
+
+        METADATA, SYNTAX_ERROR
+    }
+
+    private static class SAXParsedData{
+        private static String tagName = "";
+        private static String attribKey = "";
+        private static String attribValue = "";
+        private static String innerText = "";
+        private static HashMap<String,String> attributes = new HashMap<>();
+
+        private static void clear(){
+            tagName = "";
+            attribKey = "";
+            attribValue = "";
+            innerText = "";
+            attributes.clear();
+        }
+
+        private static void newAttribute(){
+            attributes.put(attribKey, attribValue);
+            attribKey = "";
+            attribValue = "";
+        }
+    }
+}
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java b/group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java
new file mode 100644
index 0000000000..88c3056a07
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java
@@ -0,0 +1,76 @@
+package test02.litestruts.sax;
+
+import java.util.HashMap;
+
+import test02.litestruts.Action;
+
+public class SAXParserDemo{
+    
+    public static Action run( ){
+        //创建实例
+        SAXParser parser = SAXParser.getInstance();
+        //为解析器设置好各个事件的回调函数
+        parser.setHandler(new SAXParserHandler() {
+            //创建好自定义变量，用以记录XML文档中需要的数据
+            String resultName = "";
+            String className = "";
+            HashMap<String, String> resultJspMap = new HashMap<>();
+
+            boolean foundClass = false;
+
+            //当解析开始时调用
+            @Override
+            public void startDocument() {
+                System.out.println("Start parsing");
+            }
+
+            //当完成一个XML开始标签（例如<XXX>）的解析时调用
+            @Override
+            public void startElement(String tagName, HashMap<String, String> attributes) {
+                if(tagName.equals("action")){
+                    if(attributes.get("name").equals("login")){
+                        className = attributes.get("class");
+                        foundClass = true;
+                    }else{
+                        foundClass = false;
+                    }
+                }else if(tagName.equals("result") && foundClass){
+                    resultName = attributes.get("name");
+                }
+            }
+
+           //当完成一个XML结束标签（例如</XXX>）的解析时调用
+            @Override
+            public void endElement(String tagName) {
+
+            }
+
+           //当一段XML标签之间的内容被解析完成时调用
+            @Override
+            public void innerText(String innerText) {
+                if(foundClass){
+                    String jsp = innerText;
+                    resultJspMap.put(resultName,jsp);
+                }
+            }
+
+            @Override
+            //当解析器读到XML文档结尾时调用
+            public Action endDocument() {
+            	
+                System.out.println(className);
+                System.out.println(resultJspMap);
+                System.out.println("End parsing");
+                
+                Action action=new Action();
+                action.setClassName(className);
+                action.setResultJspMap(resultJspMap);
+                return action;
+            }
+        });
+
+    //调用此方式，开始解析    
+        return parser.parse("src/test02/litestruts/struts.xml");
+    }
+    
+}
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java b/group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java
new file mode 100644
index 0000000000..d93bdb0133
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java
@@ -0,0 +1,13 @@
+package test02.litestruts.sax;
+
+import java.util.HashMap;
+
+import test02.litestruts.Action;
+
+public interface SAXParserHandler {
+    void startDocument();
+    void startElement(String tagName, HashMap<String, String> attributes);
+    void endElement(String tagName);
+    Action endDocument();
+    void innerText(String innerText);
+}
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/struts.xml b/group17/1158154002/src/test02/litestruts/struts.xml
new file mode 100644
index 0000000000..238ddf58a2
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="test02.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="test02.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/1158154002/src/test02/litestruts/util/StringUtil.java b/group17/1158154002/src/test02/litestruts/util/StringUtil.java
new file mode 100644
index 0000000000..63bc8f2f74
--- /dev/null
+++ b/group17/1158154002/src/test02/litestruts/util/StringUtil.java
@@ -0,0 +1,13 @@
+package test02.litestruts.util;
+
+public class StringUtil {
+
+    //首字母大写
+    public static String captureName(String name) {
+    //     name = name.substring(0, 1).toUpperCase() + name.substring(1);
+ //        return  name;
+         char[] cs=name.toCharArray();
+         cs[0]-=32;
+         return String.valueOf(cs);        
+     }
+}
diff --git a/group17/1204187480/.gitignore b/group17/1204187480/.gitignore
new file mode 100644
index 0000000000..2a5296f902
--- /dev/null
+++ b/group17/1204187480/.gitignore
@@ -0,0 +1,21 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
diff --git a/group17/1204187480/code/homework/coderising/pom.xml b/group17/1204187480/code/homework/coderising/pom.xml
new file mode 100644
index 0000000000..b457f36dab
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>coderising</artifactId>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent/pom.xml</relativePath>
+    </parent>
+
+    <properties>
+        <commons-digester.version>2.1</commons-digester.version>
+        <fastjson.version>1.2.24</fastjson.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-digester</groupId>
+            <artifactId>commons-digester</artifactId>
+            <version>${commons-digester.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..5496d8084d
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..9aa6404d2a
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,252 @@
+package com.coderising.array;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ArrayUtil {
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+	    int length = origin.length;
+	    int mid = length >> 1;
+		for (int i = 0; i < mid; i++) {
+		    int hIndex = length - 1 -i;
+		    int l = origin[i];
+		    int h = origin[hIndex];
+		    origin[hIndex] = l;
+		    origin[i] = h;
+        }
+
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+	    int removeValue = 0;
+	    return removeValue(oldArray, removeValue);
+	}
+
+    private int[] removeValue(int[] oldArray, int removeValue) {
+	    int length = oldArray.length;
+	    int[] dest = new int[length];
+	    int j = 0;
+	    for(int i = 0; i < length; i++) {
+	        int v = oldArray[i];
+	        if (v != removeValue) {
+	            dest[j++] = v;
+            }
+        }
+
+        int[] retArray = new int[j];
+	    System.arraycopy(dest, 0, retArray, 0, j);
+        return retArray;
+    }
+
+    /**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * todo 数组 a1, b1 自身去重
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int length1 = array1.length;
+		int length2 = array2.length;
+		int length = length1 + length2;
+	    int[] newArray = new int[length];
+
+	    return findAndSetLeastWithOutDuplicate(array1, array2, 0, 0, 0, 0, newArray);
+	}
+
+    /**
+     * todo 优化递归出口判断, 优化三个条件判断为一个
+     * @param array1
+     * @param array2
+     * @param i
+     * @param j
+     * @param k
+     * @param duplicate
+     * @param newArray
+     * @return
+     */
+    private int[] findAndSetLeastWithOutDuplicate(int[] array1, int[] array2, int i, int j, int k, int duplicate, int[] newArray) {
+
+	        if (i == array1.length && j < array2.length) {
+	            System.arraycopy(array2, j, newArray, k, array2.length - j);
+                return copyLastValues(newArray, duplicate);
+            }
+            if (j == array2.length && i < array1.length) {
+                System.arraycopy(array1, i, newArray, k, array1.length - i);
+                return copyLastValues(newArray, duplicate);
+            }
+            if (j == array2.length && i == array1.length) {
+                return copyLastValues(newArray, duplicate);
+            }
+
+            int v1 = array1[i];
+            int v2 = array2[j];
+            if (v1 < v2) {
+                newArray [k] = v1;
+                return findAndSetLeastWithOutDuplicate(array1, array2, ++i, j,  ++k, duplicate, newArray);
+            } else if (v1 > v2){
+                newArray [k] = v2;
+                return findAndSetLeastWithOutDuplicate(array1, array2, i, ++j,  ++k, duplicate, newArray);
+            } else {
+                newArray [k] = v2;
+                return findAndSetLeastWithOutDuplicate(array1, array2, ++i, ++j,  ++k, ++duplicate, newArray);
+            }
+
+    }
+
+    private int[] copyLastValues(int[] newArray, int duplicate) {
+        int[] retArray = new int[newArray.length - duplicate];
+        System.arraycopy(newArray, 0, retArray, 0, retArray.length);
+        return retArray;
+    }
+
+
+    /**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+	    int[] newArray = new int[oldArray.length + size];
+	    System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+	    if (max <= 1) {
+	        return new int[]{};
+        }
+        int [] newArray = new int[max];
+	    newArray[0] = 1;
+	    return fibonacciN(1, 1, 1, max, newArray);
+	}
+
+    private int[] fibonacciN(int size, int current, int next, int max, int[] newArray) {
+        if (next >= max) {
+            int[] retArray = new int[size];
+            System.arraycopy(newArray, 0, retArray, 0, size);
+            return retArray;
+        } else {
+            newArray[++size - 1] = next;
+            return fibonacciN(size, next, current + next,  max, newArray);
+        }
+    }
+
+    /**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * todo 使用已有的质数序列 优化质数验证
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+	    if (max <= 2) {
+	        return new int[]{};
+        }
+
+	    int[] newArray = new int[max];
+	    int j = 0;
+	    for (int i = 2; i < max; i++) {
+	        if (isPrime(i)) {
+	            newArray[j++] = i;
+            }
+        }
+        int[] retArray = new int[j];
+	    System.arraycopy(newArray, 0, retArray, 0, j);
+		return retArray;
+	}
+
+    private boolean isPrime(int number) {
+        int limit = Double.valueOf(Math.sqrt(number)).intValue();
+        for(int i = 2; i <= limit; i++) {
+            if (number % i == 0 ) {
+                return false;
+            }
+        }
+        return true;
+
+    }
+
+    /**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+	    int[] newArray = new int[48];   // 经过不少数学家研究，到2013年2月6日为止，一共找到了48个完全数。
+        int j = 0;
+        for (int i = 2; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                if (j >= newArray.length) {
+                    newArray = this.grow(newArray, 1);
+                }
+                newArray[j++] = i;
+
+            }
+        }
+        int[] retArray = new int[j];
+        System.arraycopy(newArray, 0, retArray, 0, j);
+		return retArray;
+	}
+
+    private boolean isPerfectNumber(int number) {
+	    int sum = 0;
+	    for (int i = 1; i < number; i++) {
+	        if (number % i == 0) {
+	            sum += i;
+            }
+        }
+
+        return sum == number;
+    }
+
+    /**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+	    StringBuilder builder = new StringBuilder(20);
+	    int length = array.length;
+	    for (int i = 0; i< length; i++) {
+	        builder.append(array[i]).append(seperator);
+        }
+        builder.deleteCharAt(builder.length() - seperator.length());
+		return builder.toString();
+	}
+	
+
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..4e1cf74391
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,122 @@
+package com.coderising.litestruts;
+
+import com.coderising.litestruts.parser.ActionConfig;
+import com.coderising.litestruts.parser.DefaultStrutsParser;
+import com.coderising.litestruts.parser.StrutsConfig;
+import com.coderising.litestruts.parser.StrutsParser;
+import com.coderising.litestruts.util.BeanUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Struts {
+
+    private static StrutsParser strutsParser = new DefaultStrutsParser();
+
+    private static final String STRUTS_CONFIG_PATH = "struts.xml";
+    private static final BeanUtils beanUtils = new BeanUtils();
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+
+        */
+
+        /**
+         * 0. 读取配置文件struts.xml
+         */
+        StrutsConfig strutsConfig = strutsParser.parser(STRUTS_CONFIG_PATH);
+        ActionConfig actionConfig = strutsConfig.getActions().get(actionName);
+        /**
+         * 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+         据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+         ("name"="test" ,  "password"="1234") ,
+         那就应该调用 setName和setPassword方法
+         */
+        Object action = setPropertiesForAction(actionConfig, actionName, parameters);
+
+        /**
+         * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+         */
+        String resultName = doExecute(action);
+        /**
+         * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+         通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+         放到View对象的parameters
+         */
+        View view = createViewAndSetParameters(action);
+        /**
+         * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+         放到View对象的jsp字段中。
+         */
+        setViewValue(view, resultName, actionConfig);
+        return view;
+    }
+
+    private static void setViewValue(View view, String resultName, ActionConfig config) {
+        view.setJsp(config.getResults().get(resultName).getView());
+    }
+
+    private static View createViewAndSetParameters(Object action) {
+        View view = new View();
+        view.setParameters(beanUtils.describe(action));
+        return view;
+    }
+
+    private static String doExecute(Object action) {
+        return (String) beanUtils.invokeWithNoParamter("execute", action);
+    }
+
+    private static Object setPropertiesForAction(ActionConfig actionConfig, String actionName, Map<String, String> parameters) {
+        Object action = createInstance(findActionClass(actionConfig.getClassName()));
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            setProperty(entry.getKey(), entry.getValue(), action);
+        }
+        return action;
+    }
+
+    /**
+     * todo 校验 key 是否存在
+     *
+     * @param key
+     * @param value
+     * @param action
+     */
+    private static void setProperty(String key, String value, Object action) {
+        beanUtils.setPara(value, key, action);
+    }
+
+    private static Object createInstance(Class classValue) {
+        try {
+            return classValue.newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private static Class findActionClass(String className) {
+        try {
+            return Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
new file mode 100644
index 0000000000..4aaba284fb
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
@@ -0,0 +1,45 @@
+package com.coderising.litestruts.parser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ActionConfig {
+    private String name;
+    private String className;
+    private Map<String, Result> results = new HashMap<>(10);
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Map<String, Result> getResults() {
+        return results;
+    }
+
+    public void setResults(Map<String, Result> results) {
+        this.results = results;
+    }
+
+    public void addResult(Result result) {
+        this.results.put(result.getName(), result);
+    }
+
+
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
new file mode 100644
index 0000000000..ea58507738
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
@@ -0,0 +1,52 @@
+package com.coderising.litestruts.parser;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.commons.digester.Digester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 解析 struts.xml 文件
+ * @apiNote 借鉴 http://www.everycoding.com/coding/78.html; http://blog.csdn.net/caihaijiang/article/details/5944955
+ * Created by luoziyihao on 3/5/17.
+ */
+public class DefaultStrutsParser implements StrutsParser {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Override
+    public StrutsConfig parser(String filePathInClasspath) {
+        String path = this.getClass().getClassLoader().getResource(filePathInClasspath).getPath();
+        File input = new File(path);
+        Digester digester = new Digester();
+        // 创建 StrutsConfig 对象
+        digester.addObjectCreate("struts", StrutsConfig.class);
+        // 将 struts 节点上的attribute属性映射到 StrutsConfig 对象的属性上
+        digester.addSetProperties("struts");
+        digester.addObjectCreate("struts/action", ActionConfig.class);
+        // 将 struts/action 节点上的attribute属性映射到 Action 对象的属性上, 并自定义属性映射
+        digester.addSetProperties("struts/action"
+                , new String[]{"name", "class"}, new String[]{"name", "className"});
+        digester.addObjectCreate("struts/action/result", Result.class);
+        digester.addSetProperties("struts/action/result"
+                , new String[]{"name"}, new String[]{"name"});
+        // 将 struts/action/result 节点上的body属性映射到 Result 对象的属性上
+        digester.addCallMethod("struts/action/result", "setView", 0);
+        // 对应struts/action/result 生成的对象添加到 Action中
+        digester.addSetNext("struts/action/result", "addResult");
+        // 对应struts/action 生成的对象添加到 Struts中
+        digester.addSetNext("struts/action", "addAction");
+
+        try {
+            StrutsConfig strutsConfig = (StrutsConfig) digester.parse(input);
+            logger.debug("strutsConfig={}", JSON.toJSONString(strutsConfig));
+            return strutsConfig;
+        } catch (IOException | SAXException e) {
+            throw new IllegalStateException(e);
+        }
+
+    }
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
new file mode 100644
index 0000000000..c402418e6b
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
@@ -0,0 +1,22 @@
+package com.coderising.litestruts.parser;
+
+public class Result {
+    private String name;
+    private String view;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getView() {
+        return view;
+    }
+
+    public void setView(String view) {
+        this.view = view;
+    }
+}
\ No newline at end of file
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
new file mode 100644
index 0000000000..88f769157e
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StrutsConfig {
+    public Map<String, ActionConfig> actions = new HashMap<>(10);
+
+    public Map<String, ActionConfig> getActions() {
+        return actions;
+    }
+
+    public void setActions(Map<String, ActionConfig> actions) {
+        this.actions = actions;
+    }
+
+    public void addAction(ActionConfig action) {
+        this.actions.put(action.getName(), action);
+    }
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
new file mode 100644
index 0000000000..ab7358c777
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
@@ -0,0 +1,8 @@
+package com.coderising.litestruts.parser;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public interface StrutsParser {
+    StrutsConfig parser(String filePathInClasspath);
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java
new file mode 100755
index 0000000000..775b005466
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java
@@ -0,0 +1,144 @@
+package com.coderising.litestruts.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 5/25/16.
+ */
+public class BeanUtils {
+
+
+    public static final String SET = "set";
+    public static final String GET = "get";
+    // 日志输出类
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private final StringUtils stringUtils = new StringUtils();
+
+    public Object setInvoke(Object para, String methodName, Object obj) {
+        Method method = null;
+        Object returnObj = null;
+        try {
+
+            method = obj.getClass().getMethod(methodName, para.getClass());
+            returnObj = method.invoke(obj, para);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+    public Object getInvoke(String methodName, Object obj) {
+        Method method = null;
+        Object returnObj = null;
+        try {
+            method = obj.getClass().getMethod(methodName);
+            returnObj = method.invoke(obj);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+    public Object invokeWithNoParamter(String methodName, Object obj) {
+        Method method;
+        Object returnObj = null;
+        try {
+            method = obj.getClass().getMethod(methodName);
+            returnObj = method.invoke(obj);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+
+
+    public Object getPara(String paraName, Object object) {
+        if (stringUtils.isSpaceOrNull(paraName)) {
+            throw new RuntimeException("paraname is null or space");
+        }
+        String methodName = new StringBuilder().append(GET).append(stringUtils.toUpperCase(paraName, 0)).toString();
+        return getInvoke(methodName, object);
+    }
+
+
+
+    public Object setPara(Object para, String paraName, Object object) {
+        if (stringUtils.isSpaceOrNull(paraName)) {
+            throw new RuntimeException("paraname is null or space");
+        }
+        String methodName = new StringBuilder().append(SET).append(stringUtils.toUpperCase(paraName, 0)).toString();
+        return setInvoke(para, methodName, object);
+    }
+
+    public <T> T get(String paraName, Object object, Class<T> clazz) {
+        return (T) getPara(paraName, object);
+    }
+
+    public Integer getInt(String paraName, Object object) {
+        return (Integer) getPara(paraName, object);
+    }
+
+    public Long getLong(String paraName, Object object) {
+        return (Long) getPara(paraName, object);
+    }
+
+    public Double getDouble(String paraName, Object object) {
+        return (Double) getPara(paraName, object);
+    }
+
+    public BigDecimal getBigDecimal(String paraName, Object object) {
+        return (BigDecimal) getPara(paraName, object);
+    }
+
+    public String getString(String paraName, Object object) {
+        return getPara(paraName, object).toString();
+    }
+
+    public Date getDate(String paraName, Object object) {
+        return (Date) getPara(paraName, object);
+    }
+
+    public Long getLongByString(String paraName, Object object) {
+        return Long.parseLong(getString(paraName, object));
+    }
+
+    public Integer getIntByString(String paraName, Object object) {
+        return Integer.parseInt(getString(paraName, object));
+    }
+
+    public Double getDoubleByString(String paraName, Object object) {
+        return Double.parseDouble(getString(paraName, object));
+    }
+
+    public BigDecimal getBigDecimalByString(String paraName, Object object) {
+        return new BigDecimal(getString(paraName, object));
+    }
+
+    private final static String GETTER_PRE = "get";
+    public Map<String, Object> describe(Object model) {
+        Method[] methods = model.getClass().getDeclaredMethods(); //获取实体类的所有属性，返回Field数组
+        Map<String, Object> properties = new HashMap<>();
+        for (Method method : methods) {
+            String methodName = method.getName();
+            if (methodName.startsWith(GETTER_PRE)) {
+                try {
+                    Object o = method.invoke(model);
+                    String valueName = stringUtils.toLowwerCase(methodName.substring(GETTER_PRE.length()), 0);
+                    properties.put(valueName, o);
+                } catch (IllegalAccessException | InvocationTargetException e) {
+                   throw new IllegalStateException(e);
+                }
+            }
+        }
+        return properties;
+    }
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java
new file mode 100644
index 0000000000..7fe2ed5ac4
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts.util;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StringUtils {
+
+    /**
+     * 改变指定位置的 char的大小写
+     */
+    public String toUpperCase(String str, int index) {
+        char[] chars = str.toCharArray();
+        if (index + 1 > chars.length) {
+            throw new RuntimeException("the char at the index don't exist");
+        }
+        chars[index] = Character.toUpperCase(chars[index]);
+        return new String(chars);
+    }
+
+    /**
+     * 改变指定位置的 char的大小写
+     */
+    public String toLowwerCase(String str, int index) {
+        char[] chars = str.toCharArray();
+        if (index + 1 > chars.length ) {throw new RuntimeException("the char at the index don't exist");}
+        chars[index] = Character.toLowerCase(chars[index]);
+        return new String(chars);
+    }
+
+    public boolean isSpaceOrNull(String paraName) {
+        return (paraName == null || paraName.trim().isEmpty());
+    }
+
+}
diff --git a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
new file mode 100644
index 0000000000..0ea94e4183
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
@@ -0,0 +1,19 @@
+package com.coderising.api;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ComputeTest {
+
+    @Test
+    public void testDivisionExactly(){
+        System.out.println( 7 >> 1);
+    }
+
+    @Test
+    public void testSqrt() {
+        System.out.println(Math.sqrt(10));
+    }
+}
diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
new file mode 100644
index 0000000000..6abb5d925d
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
@@ -0,0 +1,25 @@
+package com.coderising.api;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class CycleTest {
+
+    /**
+     * checkIndex will be excuted in each cycle
+     */
+    @Test
+    public void  testForSize() {
+        int[] arr = new int[]{1, 2, 3, 4, 54};
+        for (int i = 0; checkIndex(i, arr); i++ ) {
+
+        }
+    }
+
+    private boolean checkIndex(int i, int[] arr) {
+        System.out.println(i);
+        return i < arr.length;
+    }
+}
diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..be29b01d42
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,76 @@
+package com.coderising.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil creatArrayUtil(){
+        return new ArrayUtil();
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] origin = new int[]{1, 2, 3};
+        int[] destArray = new int[]{3, 2, 1};
+        creatArrayUtil().reverseArray(origin);
+        Assert.assertArrayEquals(destArray, origin);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int[] origin = new int[]{1, 2, 3, 0, 10};
+        int[] destArray = new int[]{1, 2, 3, 10};
+        int[] retArray = creatArrayUtil().removeZero(origin);
+        Assert.assertArrayEquals(destArray, retArray);
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a = new int[]{1, 2, 3};
+        int[] b = new int[]{2, 3};
+
+        int[] newArray = creatArrayUtil().merge(a, b);
+        info(newArray);
+        assertArrayEquals(new int[]{1, 2, 3}, newArray);
+    }
+
+    @Test
+    public void grow() throws Exception {
+        assertArrayEquals(new int[]{1, 2, 0, 0}, creatArrayUtil().grow(new int[]{1, 2}, 2));
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8}, creatArrayUtil().fibonacci(10));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int max = Double.valueOf(Math.pow(2, 4)).intValue();
+        assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13}, creatArrayUtil().getPrimes(max));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int max = Double.valueOf(Math.pow(2, 16)).intValue();
+        assertArrayEquals(new int[]{6, 28, 496, 8128}, creatArrayUtil().getPerfectNumbers(max));
+
+    }
+
+    @Test
+    public void join() throws Exception {
+        assertEquals("1_2_3_10", creatArrayUtil().join(new int[]{1, 2, 3, 10}, "_"));
+    }
+
+    private void info(int[] array) {
+        System.out.println(Arrays.toString(array));
+    }
+}
\ No newline at end of file
diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
new file mode 100644
index 0000000000..72e841a230
--- /dev/null
+++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
@@ -0,0 +1,14 @@
+package com.coderising.litestruts.parser;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StructsParserTest {
+    @Test
+    public void parser() throws Exception {
+        new DefaultStrutsParser().parser("struts.xml");
+    }
+
+}
\ No newline at end of file
diff --git a/group17/1204187480/code/homework/pom.xml b/group17/1204187480/code/homework/pom.xml
index df0626e528..c8b94c2bc2 100644
--- a/group17/1204187480/code/homework/pom.xml
+++ b/group17/1204187480/code/homework/pom.xml
@@ -9,6 +9,7 @@
     <modules>
         <module>parent</module>
         <module>basic</module>
+        <module>coderising</module>
     </modules>
 
 </project>
diff --git a/group17/1264835468/src/assignment/List.java b/group17/1264835468/src/assignment/List.java
index ba31dc333b..5ab03b0fdf 100644
--- a/group17/1264835468/src/assignment/List.java
+++ b/group17/1264835468/src/assignment/List.java
@@ -1,14 +1,14 @@
-package assignment;
-
-//
-public interface List<E> {
-	public void add(E o);
-
-	public void add(int index, E o);
-
-	public E get(int index);
-
-	public E remove(int index);
-
-	public int size();
-}
+package assignment;
+
+//
+public interface List<E> {
+	public void add(E o);
+
+	public void add(int index, E o);
+
+	public E get(int index);
+
+	public E remove(int index);
+
+	public int size();
+}
diff --git a/group17/1264835468/src/assignment2_26/ArrayUtil.java b/group17/1264835468/src/assignment2_26/ArrayUtil.java
index 826b76a677..89d2a0db29 100644
--- a/group17/1264835468/src/assignment2_26/ArrayUtil.java
+++ b/group17/1264835468/src/assignment2_26/ArrayUtil.java
@@ -14,7 +14,7 @@ public class ArrayUtil {
 	 * @param origin
 	 * @return
 	 */
-	public void reverseArray(int[] origin) {
+	public static void reverseArray(int[] origin) {
 		int mid = origin.length / 2;
 		for (int i = 0; i < mid; i++) {
 			int temp = origin[i];
@@ -32,7 +32,7 @@ public void reverseArray(int[] origin) {
 	 * @return
 	 */
 
-	public int[] removeZero(int[] oldArray) {
+	public static int[] removeZero(int[] oldArray) {
 		int count = 0;
 		for (int i : oldArray) {
 			if (i != 0)
@@ -56,7 +56,7 @@ public int[] removeZero(int[] oldArray) {
 	 * @return
 	 */
 
-	public int[] merge(int[] array1, int[] array2) {
+	public static int[] merge(int[] array1, int[] array2) {
 		TreeSet<Integer> set = new TreeSet<>();
 		for (Integer integer : array1) {
 			set.add(integer);
@@ -80,7 +80,7 @@ public int[] merge(int[] array1, int[] array2) {
 	 * @param size
 	 * @return
 	 */
-	public int[] grow(int[] oldArray, int size) {
+	public static int[] grow(int[] oldArray, int size) {
 		return Arrays.copyOf(oldArray, size);
 	}
 
@@ -91,7 +91,7 @@ public int[] grow(int[] oldArray, int size) {
 	 * @param max
 	 * @return
 	 */
-	public int[] fibonacci(int max) {
+	public static int[] fibonacci(int max) {
 		if (max <= 1)
 			return new int[0];
 		List<Integer> fList = new ArrayList<>();
@@ -115,7 +115,7 @@ public int[] fibonacci(int max) {
 	 * @param max
 	 * @return
 	 */
-	public int[] getPrimes(int max) {
+	public static int[] getPrimes(int max) {
 		boolean[] isPrime = new boolean[max];
 		List<Integer> primes = new ArrayList<>();
 		for (int i = 0; i < isPrime.length; i++) {
@@ -142,7 +142,7 @@ public int[] getPrimes(int max) {
 	 * @param max
 	 * @return
 	 */
-	public int[] getPerfectNumbers(int max) {
+	public static int[] getPerfectNumbers(int max) {
 		int sum = 0;
 		ArrayList<Integer> perfectNumbers = new ArrayList<>();
 		for (int i = 1; i < max; i++) {
@@ -170,7 +170,7 @@ public int[] getPerfectNumbers(int max) {
 	 * @param s
 	 * @return
 	 */
-	public String join(int[] array, String seperator) {
+	public static String join(int[] array, String seperator) {
 		StringBuilder stringBuilder = new StringBuilder();
 		for (int i : array) {
 			stringBuilder.append(i + seperator);
diff --git a/group17/1264835468/src/assignment2_26/ArrayUtilTest.java b/group17/1264835468/src/assignment2_26/ArrayUtilTest.java
index c5ff251592..753c026796 100644
--- a/group17/1264835468/src/assignment2_26/ArrayUtilTest.java
+++ b/group17/1264835468/src/assignment2_26/ArrayUtilTest.java
@@ -6,95 +6,95 @@
 import org.junit.Test;
 
 public class ArrayUtilTest {
-	ArrayUtil arrayUtil = new ArrayUtil();
 
 	@Test
 	public void testReverseArray() {
 		int[] array = new int[] {};
-		arrayUtil.reverseArray(array);
+		ArrayUtil.reverseArray(array);
 		assertArrayEquals(new int[] {}, array);
 
 		array = new int[] { 1 };
-		arrayUtil.reverseArray(array);
+		ArrayUtil.reverseArray(array);
 		assertArrayEquals(new int[] { 1 }, array);
 
 		array = new int[] { 1, 2, 3 };
-		arrayUtil.reverseArray(array);
+		ArrayUtil.reverseArray(array);
 		assertArrayEquals(new int[] { 3, 2, 1 }, array);
 	}
 
 	@Test
 	public void testRemoveZero() {
 		int[] array = new int[] {};
-		assertArrayEquals(new int[] {}, arrayUtil.removeZero(array));
+		assertArrayEquals(new int[] {}, ArrayUtil.removeZero(array));
 
 		array = new int[] { 0 };
-		assertArrayEquals(new int[] {}, arrayUtil.removeZero(array));
+		assertArrayEquals(new int[] {}, ArrayUtil.removeZero(array));
 
 		array = new int[] { 1 };
-		assertArrayEquals(new int[] { 1 }, arrayUtil.removeZero(array));
+		assertArrayEquals(new int[] { 1 }, ArrayUtil.removeZero(array));
 
 		array = new int[] { 1, 2, 0, 0, 3 };
-		assertArrayEquals(new int[] { 1, 2, 3 }, arrayUtil.removeZero(array));
+		assertArrayEquals(new int[] { 1, 2, 3 }, ArrayUtil.removeZero(array));
 
 		array = new int[] { 1, 2, 3 };
-		assertArrayEquals(new int[] { 1, 2, 3 }, arrayUtil.removeZero(array));
+		assertArrayEquals(new int[] { 1, 2, 3 }, ArrayUtil.removeZero(array));
 	}
 
 	@Test
 	public void testMerge() {
 		int[] array1 = { 3, 5, 7, 8 };
 		int[] array2 = { 4, 5, 6, 7 };
-		assertArrayEquals(new int[] { 3, 4, 5, 6, 7, 8 }, arrayUtil.merge(array1, array2));
+		assertArrayEquals(new int[] { 3, 4, 5, 6, 7, 8 }, ArrayUtil.merge(array1, array2));
 	}
 
 	@Test
 	public void testGrow() {
 		int[] array = { 3, 5, 7 };
-		assertArrayEquals(new int[] { 3, 5, 7, 0, 0 }, arrayUtil.grow(array, 5));
-		assertArrayEquals(new int[] { 3, 5, 7 }, arrayUtil.grow(array, 3));
+		assertArrayEquals(new int[] { 3, 5, 7, 0, 0 }, ArrayUtil.grow(array, 5));
+		assertArrayEquals(new int[] { 3, 5, 7 }, ArrayUtil.grow(array, 3));
 	}
 
 	@Test
 	public void testFibonacci() {
-		assertArrayEquals(new int[] {}, arrayUtil.fibonacci(1));
+		assertArrayEquals(new int[] {}, ArrayUtil.fibonacci(1));
 
-		assertArrayEquals(new int[] { 1, 1 }, arrayUtil.fibonacci(2));
+		assertArrayEquals(new int[] { 1, 1 }, ArrayUtil.fibonacci(2));
 
-		assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, arrayUtil.fibonacci(15));
+		assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, ArrayUtil.fibonacci(15));
 	}
 
 	@Test
 	public void testGetPrimes() {
-		assertArrayEquals(new int[] {}, arrayUtil.getPrimes(1));
+		assertArrayEquals(new int[] {}, ArrayUtil.getPrimes(1));
 
-		assertArrayEquals(new int[] {}, arrayUtil.getPrimes(2));
+		assertArrayEquals(new int[] {}, ArrayUtil.getPrimes(2));
 
-		assertArrayEquals(new int[] { 2 }, arrayUtil.getPrimes(3));
+		assertArrayEquals(new int[] { 2 }, ArrayUtil.getPrimes(3));
 
-		assertArrayEquals(new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }, arrayUtil.getPrimes(20));
+		assertArrayEquals(new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }, ArrayUtil.getPrimes(20));
 	}
 
 	@Test
 	public void testGetPerfectNumbers() {
-		assertArrayEquals(new int[] { 6 }, arrayUtil.getPerfectNumbers(10));
+		assertArrayEquals(new int[] { 6 }, ArrayUtil.getPerfectNumbers(10));
 
-		assertArrayEquals(new int[] { 6, 28 }, arrayUtil.getPerfectNumbers(100));
+		assertArrayEquals(new int[] { 6, 28 }, ArrayUtil.getPerfectNumbers(100));
 
-		assertArrayEquals(new int[] { 6, 28, 496 }, arrayUtil.getPerfectNumbers(1000));
+		assertArrayEquals(new int[] { 6, 28, 496 }, ArrayUtil.getPerfectNumbers(1000));
+
+		assertArrayEquals(new int[] { 6, 28, 496, 8128 }, ArrayUtil.getPerfectNumbers(10000));
 
-		assertArrayEquals(new int[] { 6, 28, 496, 8128 }, arrayUtil.getPerfectNumbers(10000));
 	}
 
 	@Test
 	public void testJoin() {
-		assertEquals("3-4-5", arrayUtil.join(new int[] { 3, 4, 5 }, "-"));
+		assertEquals("3-4-5", ArrayUtil.join(new int[] { 3, 4, 5 }, "-"));
 
-		assertEquals("345", arrayUtil.join(new int[] { 3, 4, 5 }, ""));
+		assertEquals("345", ArrayUtil.join(new int[] { 3, 4, 5 }, ""));
 
-		assertEquals("3", arrayUtil.join(new int[] { 3 }, ""));
+		assertEquals("3", ArrayUtil.join(new int[] { 3 }, ""));
 
-		assertEquals("3--4--5", arrayUtil.join(new int[] { 3, 4, 5 }, "--"));
+		assertEquals("3--4--5", ArrayUtil.join(new int[] { 3, 4, 5 }, "--"));
 	}
 
 }
diff --git a/group17/1264835468/src/assignment2_26/Struts.java b/group17/1264835468/src/assignment2_26/Struts.java
index a6b56ce26b..ad704e0433 100644
--- a/group17/1264835468/src/assignment2_26/Struts.java
+++ b/group17/1264835468/src/assignment2_26/Struts.java
@@ -33,7 +33,7 @@ public static View runAction(String actionName, Map<String, String> parameters)
 		
 		*/
 		// 0
-		XmlPhraser phraser = new XmlPhraser(configFile);
+		XmlParser phraser = new XmlParser(configFile);
 		String className = phraser.getClassNameByActionName(actionName);
 		View view = new View();
 		try {
diff --git a/group17/1264835468/src/assignment2_26/XmlParser.java b/group17/1264835468/src/assignment2_26/XmlParser.java
new file mode 100644
index 0000000000..aa34335cb6
--- /dev/null
+++ b/group17/1264835468/src/assignment2_26/XmlParser.java
@@ -0,0 +1,72 @@
+package assignment2_26;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class XmlParser {
+	private File file;
+	List<Element> actionElements;
+
+	public XmlParser(File file) {
+		this.file = file;
+		actionElements = new ArrayList<>();
+		getActionsFromFile();
+	}
+
+	public String getClassNameByActionName(String actionName) {
+		Element action = getElementByActionName(actionName);
+		return action.getAttribute("class");
+	}
+
+	public String getResultJsp(String actionName, String resultName) {
+		Element action = getElementByActionName(actionName);
+		NodeList results = action.getChildNodes();
+		for (int i = 0; i < results.getLength(); i++) {
+			Node child = results.item(i);
+			if (child instanceof Element) {
+				Element result = (Element) child;
+				if (result.getAttribute("name").equals(resultName))
+					return result.getTextContent();
+			}
+		}
+		throw new RuntimeException("not found result named:" + resultName);
+	}
+
+	private Element getElementByActionName(String actionName) {
+		for (Element element : actionElements) {
+			if (element.getAttribute("name").equals(actionName)) {
+				return element;
+			}
+		}
+		throw new RuntimeException("no such element named " + actionName);
+	}
+
+	private void getActionsFromFile() {
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+		try {
+			DocumentBuilder builder = factory.newDocumentBuilder();
+			Document document = builder.parse(file);
+			Element root = document.getDocumentElement();
+			NodeList children = root.getChildNodes();
+			for (int i = 0; i < children.getLength(); i++) {
+				Node child = children.item(i);
+				if (child instanceof Element)
+					actionElements.add((Element) child);
+			}
+		} catch (ParserConfigurationException | SAXException | IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/group17/1264835468/src/assignment2_26/XmlPhraser.java b/group17/1264835468/src/assignment2_26/XmlPhraser.java
deleted file mode 100644
index 198a9b573e..0000000000
--- a/group17/1264835468/src/assignment2_26/XmlPhraser.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package assignment2_26;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-public class XmlPhraser {
-	private File file;
-	List<Element> actionElements;
-
-	public XmlPhraser(File file) {
-		this.file = file;
-		actionElements = new ArrayList<>();
-		getActionsFromFile();
-	}
-
-	public String getClassNameByActionName(String actionName) {
-		Element action = getElementByActionName(actionName);
-		return action.getAttribute("class");
-	}
-
-	public String getResultJsp(String actionName, String resultName) {
-		Element action = getElementByActionName(actionName);
-		NodeList results = action.getChildNodes();
-		for (int i = 0; i < results.getLength(); i++) {
-			Node child = results.item(i);
-			if (child instanceof Element) {
-				Element result = (Element) child;
-				if (result.getAttribute("name").equals(resultName))
-					return result.getTextContent();
-			}
-		}
-		throw new RuntimeException("not found result named:" + resultName);
-	}
-
-	private Element getElementByActionName(String actionName) {
-		for (Element element : actionElements) {
-			if (element.getAttribute("name").equals(actionName)) {
-				return element;
-			}
-		}
-		throw new RuntimeException("no such element named " + actionName);
-	}
-
-	private void getActionsFromFile() {
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		try {
-			DocumentBuilder builder = factory.newDocumentBuilder();
-			Document document = builder.parse(file);
-			Element root = document.getDocumentElement();
-			NodeList children = root.getChildNodes();
-			for (int i = 0; i < children.getLength(); i++) {
-				Node child = children.item(i);
-				if (child instanceof Element)
-					actionElements.add((Element) child);
-			}
-		} catch (ParserConfigurationException | SAXException | IOException e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/group17/1282579502/.settings/org.eclipse.jdt.core.prefs b/group17/1282579502/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..a698e59674
--- /dev/null
+++ b/group17/1282579502/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group17/1282579502/src/com/coderising/array/ArrayUtil.java b/group17/1282579502/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..af9bde1136
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,229 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin == null) return;
+		int tmp;
+		for(int i = 0; i< origin.length; i++){
+			int end = origin.length - 1 -i;
+			if(end>i){
+				tmp = origin[i];
+				origin[i] = origin[end];
+				origin[end] = tmp;
+			}
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		LinkedList<Integer> newArray = new LinkedList<>();
+		
+		for(int i = 0; i< oldArray.length; i++){
+			if(oldArray[i] != 0){
+				newArray.add(oldArray[i]);
+			}
+		}
+		int[] ret = new int[newArray.size()];
+		for(int i = 0; i<newArray.size(); i++){
+			ret[i] = newArray.get(i);
+		}
+		return ret;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		if(array1.length == 0) return array2;
+		if(array2.length == 0) return array1;
+		int i = 0, j=0, index=0;
+		int[] merged = new int[array1.length + array2.length];
+		//o(n+m)
+		while(i < array1.length && j < array2.length){
+			if(array1[i] < array2[j]){
+				merged[index] = array1[i];
+				i++;
+			}else if(array1[i] >= array2[j]){
+				merged[index] = array2[j];
+				j++;}
+//			}else{
+//				merged[index] = array1[i];
+//				i++;
+//				j++;
+//			}
+			
+			index++;
+		}
+		//o(n)
+		while(i<array1.length){
+			merged[index] = array1[i];
+			i++;
+			index++;
+		}
+		//o(m)
+		while(j<array2.length){
+			merged[index] = array1[j];
+			j++;
+			index++;
+		}
+		//o(n+m)
+		int low=0, high = 1; ;
+		while(high < merged.length){
+			if(merged[high] != merged[low]){
+				low++;
+				merged[low] = merged[high];
+			}
+			high ++;
+		}
+
+		return  Arrays.copyOf(merged, low+1);
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max <= 1) return new int[0];
+		int[] memo = new int[max+2];
+		int n = 1;
+		while(fib(n, memo)<max){
+			n++;
+		}
+		//System.out.println(Arrays.toString(memo));
+		int[] ret = new int[n-1];
+		System.arraycopy(memo, 1, ret, 0, n-1);
+		//System.out.println(Arrays.toString(ret));
+		return ret;
+	}
+	
+	private int fib(int n, int[] memo){
+		if(n <= 0) return 0;
+		if(n == 1) {
+			if(memo[1] == 0){
+				memo[1] = 1;
+			}
+			return 1;
+		}
+		else{
+			if(memo[n] == 0){
+				memo[n] = fib(n-1, memo) + fib(n-2, memo);
+			}
+			return memo[n];
+		}
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] ret = new int[max];
+		int count =0;
+		for(int i = 1; i<= max; i++){
+			if(isPrime(i)){
+				ret[count++] = i;
+			}
+		}
+		
+		return Arrays.copyOf(ret, count);
+	}
+	private boolean isPrime(int n){
+		for(int i = 2; i*i <=n; i++){
+			if(n%i == 0) return false;
+		}
+		return true;
+	}
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max <2) return new int[0];
+		List<Integer> store = new LinkedList<>();
+		for(int candidate = 2; candidate< max; candidate++ ){
+			int sum = 0;
+			for(int i = 1; i<candidate; i++){
+				if(candidate%i == 0){
+					sum+=i;
+				}
+			}
+			if(sum == candidate){
+				store.add(sum);
+			}
+		}
+		int[] ret = new int[store.size()];
+		int index = 0;
+		for(Integer num : store){
+			ret[index++] = num.intValue();
+		}
+		return ret;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if(array.length<=0) return ""; 
+		StringBuilder sb = new StringBuilder();
+		for(int lo = 0; lo<array.length; lo++){
+			sb.append(array[lo]);
+			if(lo < array.length -1)
+			sb.append(seperator);
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group17/1282579502/src/com/coderising/array/ut/ArrayUtilTest.java b/group17/1282579502/src/com/coderising/array/ut/ArrayUtilTest.java
new file mode 100644
index 0000000000..293d5a189a
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/array/ut/ArrayUtilTest.java
@@ -0,0 +1,97 @@
+package com.coderising.array.ut;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.array.ArrayUtil;
+
+public class ArrayUtilTest {
+
+	ArrayUtil au= null;
+	
+	@Before
+	public void setUp() throws Exception {
+		au=new ArrayUtil();
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] target = null;
+		au.reverseArray(target);
+		assertArrayEquals(null, target);
+		
+		
+		target = new int[]{7, 9 , 30, 3};
+		au.reverseArray(target);
+		int[] result = new int[]{3, 30 , 9, 7};
+		Assert.assertArrayEquals(result, target);
+		
+		int[] target1 = new int[]{7, 9 ,100, 30, 3};
+		au.reverseArray(target1);
+		int[] result1 = new int[]{3, 30 ,100, 9, 7};
+		Assert.assertArrayEquals(result1, target1);
+		
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] result = {1,3,4,5,6,6,5,4,7,6,7,5};
+		int[] ret = au.removeZero(oldArr);
+		Assert.assertArrayEquals(result, ret);
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3, 5, 7,8}; int[] a2 = {4, 5, 6,7};
+		int[] ret = au.merge(a1, a2);
+		//System.out.println(Arrays.toString(ret));
+		int[] expected = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(expected, ret);
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = new int[]{2,3,6}; int size = 3;
+		int[] newArray = new int[]{2,3,6,0,0,0};
+		Assert.assertArrayEquals(newArray, au.grow(oldArray, size));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15; int[] expected = new int[]{1,1,2,3,5,8,13};
+		assertArrayEquals(expected, au.fibonacci(max));
+		assertArrayEquals(new int[0], au.fibonacci(1));
+		assertArrayEquals(new int[]{1,1,2}, au.fibonacci(3));
+		assertArrayEquals(new int[]{1,1}, au.fibonacci(2));
+	}
+
+	@Test
+	public void testGetPrimes() {
+		assertArrayEquals(new int[]{1,2,3,5,7,11}, au.getPrimes(11));
+		assertArrayEquals(new int[]{1}, au.getPrimes(1));
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		
+		assertArrayEquals(new int[]{6,28,496,8128}, au.getPerfectNumbers(9000));
+		assertArrayEquals(new int[]{}, au.getPerfectNumbers(1));
+		assertArrayEquals(new int[]{}, au.getPerfectNumbers(5));
+		assertArrayEquals(new int[]{}, au.getPerfectNumbers(-1));
+		assertArrayEquals(new int[]{}, au.getPerfectNumbers(0));
+	}
+
+	@Test
+	public void testJoin() {
+		String sep = "-";
+		int[] array = {1,3,6};
+		assertEquals("1-3-6", au.join(array, sep));
+	}
+
+}
diff --git a/group17/1282579502/src/com/coderising/litestruts/LoginAction.java b/group17/1282579502/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group17/1282579502/src/com/coderising/litestruts/Struts.java b/group17/1282579502/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..04bfb7ff68
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,219 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.coderising.parser.XmlParser;
+import com.coderising.parser.XmlParser.eNode;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	String path = "src/com/coderising/litestruts/struts.xml";
+    	File rootFile = new File("");
+    	File rootDir = new File(rootFile.getAbsolutePath());
+    	File configFile = findFile(rootDir, "struts.xml");
+    	if(configFile != null){
+    		//System.out.println("find: " + configFile.getAbsolutePath());
+    		path = configFile.getAbsolutePath();
+    	}
+    	View retView = new View();
+    	XmlParser parser = new XmlParser(path);
+    	//parser.dump();
+    	List<eNode> branchNodesList = parser.getActionNodeList();
+    	try {
+	    	for(eNode node : branchNodesList){
+	    		//System.out.println(node);
+	    		String classPath = node.attributeMap.get("class");
+	    		Class<?> actionObjectClass = getClassObj(classPath);
+	    		if(actionObjectClass != null){
+		    		Constructor<?> actionConstructorObject = createClass(actionObjectClass);
+		    		Object newInstance = null;
+					newInstance = actionConstructorObject.newInstance();
+
+		    		Method[] methods = actionObjectClass.getDeclaredMethods();
+//		    		for(Method m : methods){
+//		    			System.out.println("method: " + m.getName());
+//		    		}
+		    		Iterator<Entry<String, String>> itr = parameters.entrySet().iterator();
+		    		while(itr.hasNext()){
+		    			Entry<String, String> call = itr.next();
+		    			//System.out.println(call.getKey() + " " + call.getValue());
+		    			String key = call.getKey();
+		    			String val = call.getValue();
+		    			String setMethodName = "set" + Character.toUpperCase(key.charAt(0)) + key.substring(1);
+		    			Method setMethod = getMethod(actionObjectClass, setMethodName, String.class);
+		    			if(newInstance != null){
+		    				setMethod.invoke(newInstance, val);
+		    			}			
+		    		}
+		    		Method exeMethod = actionObjectClass.getDeclaredMethod("execute", null);
+		    		Class<?> returnType = exeMethod.getReturnType();
+		    		Object returnValue = exeMethod.invoke(newInstance, null);
+		    		HashMap<Object, Object> viewHashParam = new HashMap<>();
+		    		for(Method m:methods){
+		    			if(m.getName().startsWith("get")){
+		    				Object v = m.invoke(newInstance, null);
+		    				String getMethodName = m.getName().substring(3);
+		    				getMethodName = Character.toLowerCase(getMethodName.charAt(0)) + getMethodName.substring(1);
+		    				//System.out.println("get method: " + getMethodName); 
+		    				viewHashParam.put(getMethodName, v);
+		    			}
+		    		}
+		    		String viewStr = null;
+		    		for(eNode resultNode : node.subNodes){
+		    			String nameAttr = resultNode.attributeMap.get("name") ;
+		    			if(nameAttr.equals(returnValue)){
+		    				//System.out.println("node: " + resultNode.element_name + " " + resultNode.attributeMap.get("name") + " matches");
+		    				for(eNode jspNode : resultNode.subNodes){
+		    					if(jspNode.isLeaf){
+		    						viewStr = jspNode.element_raw_content;
+		    						//System.out.println("jsp str: " + viewStr);
+		    						break;
+		    					}
+		    				}
+		    			}
+		    		}
+		    		
+		    		retView.setJsp(viewStr);
+		    		retView.setParameters(viewHashParam);
+					
+	    		}
+	    	}
+    	} catch (IllegalAccessException | IllegalArgumentException
+				| InvocationTargetException | InstantiationException | NoSuchMethodException | SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return retView;
+    }    
+    
+    public static Class<?> getClassObj(String classPath){
+    	Class<?> classObject = null;
+    	try {
+			classObject = Class.forName(classPath);
+		} catch (ClassNotFoundException e) {
+			//System.err.println(e.getMessage());
+		}
+    	return classObject;
+    }
+    
+    public static Constructor<?> createClass(Class<?> classObject){
+    	Constructor<?> constructor = null;
+		try {
+			constructor = classObject.getConstructor();
+		} catch (NoSuchMethodException | SecurityException e) {
+			e.printStackTrace();
+		}
+    	return constructor;
+    }
+    
+    public static Method getMethod(Class<?> clazz, String methodName, Class<?> paramClass){
+    	Method ret = null;
+    	try {
+			ret = clazz.getMethod(methodName, paramClass);
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		}
+    	return ret;
+    }
+    
+    public static void main(String[] args){
+
+
+    	//System.out.println("absolute path: " + absPath);
+    	Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        String actionName = "login"; 
+        
+        View view  = Struts.runAction(actionName,params);
+    }
+    
+    public static File findFile(File targetDir, String targetFileName){
+    	//System.out.println("targetDir: " + targetDir.getAbsolutePath() + " " + targetDir.isDirectory());
+    	File configFile = null;
+    	File[] files = targetDir.listFiles();
+    	
+    	if(files != null){
+    		for(File f: files){
+    			//System.out.println("test: " + f.getName());
+    			if(f.isDirectory()){
+    				//System.out.println("Dir: " + f.getName());
+    				configFile = findFile(f, targetFileName);
+    				if(configFile != null){
+    					break;
+    				}
+    			}
+    			else{
+    				//System.out.println("File: " + f.getName());
+    				if(f.getAbsolutePath().endsWith(targetFileName)){
+    					configFile = f;
+    					break;
+    				}
+    			}
+    		}
+    	}
+    	return configFile;
+    }
+    
+    public static FilenameFilter createFilter(String targetName){
+    	return new FilenameFilter(){
+
+			@Override
+			public boolean accept(File dir, String name) {
+				// TODO Auto-generated method stub
+				System.out.println("testing: " + dir + " name: " + name);
+				return name.endsWith(targetName);
+			}
+    		
+    	};
+    }
+    
+    public static List<File> getDirectories(File targetFile){
+    	List<File> childDirs = new LinkedList<>();
+    	if(targetFile.isDirectory()){
+    		File[] files = targetFile.listFiles();
+    		for(File f: files){
+    			if(f.isDirectory()) childDirs.add(f);
+    		}
+    	}
+    	
+    	return childDirs;
+    }
+
+}
diff --git a/group17/1282579502/src/com/coderising/litestruts/StrutsTest.java b/group17/1282579502/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group17/1282579502/src/com/coderising/litestruts/View.java b/group17/1282579502/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group17/1282579502/src/com/coderising/litestruts/struts.xml b/group17/1282579502/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..246b3595ad
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name= "success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/1282579502/src/com/coderising/parser/TestDriver.java b/group17/1282579502/src/com/coderising/parser/TestDriver.java
new file mode 100644
index 0000000000..a4decf8986
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/parser/TestDriver.java
@@ -0,0 +1,22 @@
+package com.coderising.parser;
+
+import com.coderising.parser.XmlParser.eNode;
+
+public class TestDriver {
+
+	public static void main(String[] args) {
+		XmlParser testParser = new XmlParser("src/xml/input.xml");
+		String input = "<action name = \"login\" class=\"com.codersing.action.LoginAction\">";
+		System.out.println();
+		//eNode e = testParser.parseRawData(input);
+		//XmlParser.dumpNodePreOrder(e);
+//		try{
+//			testParser.loadFile(testParser.getFile());
+//		}catch(Exception e){
+//			e.printStackTrace();
+//		}
+	}
+	
+	
+
+}
diff --git a/group17/1282579502/src/com/coderising/parser/XmlParser.java b/group17/1282579502/src/com/coderising/parser/XmlParser.java
new file mode 100644
index 0000000000..f78be14555
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/parser/XmlParser.java
@@ -0,0 +1,277 @@
+package com.coderising.parser;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Stack;
+
+public class XmlParser {
+	
+	private File targetFile = null;
+	private eNode root = null;
+	
+	public XmlParser(String path){
+		setTargetFile(path);
+		try {
+			String content = loadFile(targetFile);
+			parseString(content);
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	public void setTargetFile(String path){
+		targetFile = new File(path);
+		if(! targetFile.isFile() || ! targetFile.exists()){
+			throw new IllegalArgumentException("Path:  " + path + " is NOT valid.");
+		}
+	}
+	
+	public File getFile(){
+		return targetFile;
+	}
+	
+	protected String loadFile(File f) throws FileNotFoundException{
+		StringBuilder sb = new StringBuilder();
+		FileReader fr = new FileReader(f);
+		BufferedReader br = new BufferedReader(fr);
+		String line = null;
+		try{
+		while((line = br.readLine()) != null){
+			line = line.trim();
+			if(!line.startsWith("#") && !line.startsWith("<?")){
+				sb.append(line);
+			}
+		}
+		}catch(IOException ioe){
+			ioe.printStackTrace();
+		}
+		
+		return sb.toString();
+	}
+	
+	protected eNode parseString(String str){
+		Queue<String> cache = new LinkedList<>();
+		int bracketStart=0;
+		int contentStart=0;
+		for(int i=0; i< str.length(); i++){
+			if(str.charAt(i) == '<'){
+				bracketStart = i;
+				if(i>contentStart){
+					String tagVal = str.substring(contentStart, i).trim();
+					if(tagVal.length() > 0){
+						//System.out.println("content: " + tagVal);
+						cache.add(tagVal);
+					}
+				}
+			}
+			else if(str.charAt(i) == '>'){
+				String elementTag = str.substring(bracketStart, i+1);
+				//System.out.println("pushing: " + elementTag);
+				cache.add(elementTag);
+				contentStart=i+1;
+				
+			}
+		}
+		
+		//debug information
+		//dumpStack(cache);
+
+		root = processElementStack(cache);
+		//System.out.println();
+		//System.out.println("Dump node tree");
+		//dumpNodePreOrder(root);
+		return root;
+	}
+	
+	private eNode processElementStack(Queue<String> stk){
+
+		if(!stk.isEmpty()){
+			String token = stk.remove();
+			if(token.startsWith("</")){
+				System.out.println("should not reach here");
+			}
+			else if(token.startsWith("<")){
+				eNode newNode = createBranchNode(token);
+				while(!stk.peek().startsWith("</")){
+					newNode.subNodes.add(processElementStack(stk));
+				}
+				stk.remove();
+				return newNode;
+			}
+			else{
+				return createLeafNode(token);
+			}
+		}
+		return null;
+	}
+	
+	private eNode createLeafNode(String str){
+		eNode newNode = new eNode();
+		newNode.element_raw_content = str;
+		newNode.isLeaf = true;
+		return newNode;
+	}
+	
+	private eNode createBranchNode(String str){
+		eNode newNode = parseRawData(str);
+		return newNode;
+	}
+	
+	private eNode parseRawData(String str){
+		boolean foundAttributeName = false;
+		String attr_name= null;
+		eNode branchNode = new eNode();
+		//boolean foundAttributeValue = false;
+		for(int i = 0; i<str.length(); i++){
+			char c = str.charAt(i);
+			if(c == '<'){
+				for(int j = i; j<str.length();j++){
+					if(str.charAt(j) == ' ' || str.charAt(j) == '>'){
+						String elementName = str.substring(i+1, j);
+						branchNode.element_name = elementName.trim();
+						//System.out.println("element name: "  + elementName);
+						i = j;
+						break;
+					}
+				}
+			}
+			else if(Character.isAlphabetic(c) || c == '"'){
+				
+				if(!foundAttributeName){
+					for(int j=i; j<str.length(); j++){
+						if(str.charAt(j) == '='){
+							attr_name = str.substring(i, j).trim();
+							//System.out.println("attribute name: "  + attr_name);
+							foundAttributeName = true;
+							i = j;
+							break;
+						}
+					}
+				}
+				else{
+					for(int k = i; k<str.length(); k++){
+						if(str.charAt(k) == ' ' || str.charAt(k) == '>'){
+							String attr_val = str.substring(i, k).trim();
+							if(attr_name != null && attr_val != null){
+								//System.out.println("Element: " + branchNode.element_name + " put in: "  + attr_name + " " + attr_val);
+								branchNode.attributeMap.put(attr_name, attr_val.replaceAll("\"", ""));
+							}
+							foundAttributeName = false;
+							i = k;
+							break;
+						}
+					}
+				}
+
+			}
+		}
+		//System.out.println();
+		return branchNode;
+	}
+
+	public List<eNode> getActionNodeList(){
+		return root.subNodes;
+	}
+
+	private void dumpNodeBFS(eNode root){
+		Stack<eNode> stk = new Stack<eNode>();
+		stk.push(root);
+		while(!stk.isEmpty()){
+			eNode cur = stk.pop();
+			dump(cur, stk);
+		}
+		
+	}
+	
+	public static void dumpNodePreOrder(eNode root){
+		if(root.isLeaf){
+			System.out.println("Leaf: "+root.element_raw_content);
+		}
+		else{
+			System.out.println("Branch: " + root.element_name);
+			Iterator<String> itr = root.attributeMap.keySet().iterator();
+			while(itr.hasNext()){
+				String key = itr.next();
+				System.out.println("["+ key + "]=[" + root.attributeMap.get(key)+"]");
+			}
+		}
+		for(eNode i : root.subNodes){
+			dumpNodePreOrder(i);
+		}
+	}
+	
+	private void dump(eNode node, Stack<eNode> stk){
+		System.out.println(node.element_raw_content);
+		for(int i = 0 ; i< node.subNodes.size(); i++){
+			stk.push(node.subNodes.get(i));
+		}
+	}
+	
+	private void dumpStack(Collection<String> cache){
+		Iterator<String> itr = cache.iterator();
+		while(itr.hasNext()){
+			String item = itr.next();
+			System.out.println(""+item+"");
+		}
+	}
+	
+	public void dump(){
+		dumpNodePreOrder(root);
+	}
+	
+//	private String parseOpenElement(String str){
+//		
+//	}
+//	
+//	private String parseCloseElment(String str){
+//		
+//	}
+	
+	
+	
+	public class eNode{
+		public boolean isLeaf = false;
+		public String element_raw_content = null;
+		public HashMap<String, String> attributeMap = null;
+		public String element_name = null;
+		public List<eNode> subNodes = null;
+		
+		public eNode(){
+			_init();
+		}
+		
+		private void _init(){
+			attributeMap = new HashMap<>();
+			subNodes = new LinkedList<>();
+		}
+		
+		public String toString(){
+			StringBuilder sb = new StringBuilder();
+			sb.append("element_name: ").append(element_name).append("\n");
+			sb.append("isLeaf: ").append(isLeaf).append("\n");
+			sb.append("name attr: ").append(attributeMap.get("name")).append("\n");
+			if(attributeMap.get("class") != null)
+			sb.append("class attr: ").append(attributeMap.get("class")).append("\n");
+			return sb.toString();
+		}
+	}
+	
+//	protected class eGraph{
+//		public eNode root = null;
+//		
+//		public eGraph(eNode root){
+//			this.root = root;
+//		}
+//	}
+
+}
diff --git a/group17/240094626/warm-up/src/com/array/ArrayUtil.java b/group17/240094626/warm-up/src/com/array/ArrayUtil.java
new file mode 100644
index 0000000000..214ecae3bb
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/array/ArrayUtil.java
@@ -0,0 +1,243 @@
+package com.coderising.array;
+
+import com.coding.basic.impl.ArrayList;
+import com.coding.basic.impl.LinkedList;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		for(int i=0; i < origin.length; i++){
+			if(i >= origin.length-1-i){
+				break;
+			}
+			int tmp = origin[i];
+			origin[i] = origin[origin.length-i-1];
+			origin[origin.length-i-1] = tmp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int size = 0,	// 记录非0数量
+			tmp = 0;	// 需要比较的下一个位置
+		for(int i=0; i < oldArray.length;){
+			if(oldArray[i] == 0){
+				int j=tmp==0?(i+1):tmp;
+				for(;j < oldArray.length; j++){
+					if(oldArray[j] == 0){
+						continue;
+					}else{
+						oldArray[i] = oldArray[j];
+						oldArray[j] = 0;
+						size++;
+						tmp = j+1;
+						i=j;
+						break;
+					}
+				}
+			}else{
+				i++;
+				size++;
+				continue;
+			}
+		}
+		int a[] = new int[size];
+		System.arraycopy(oldArray, 0, a, 0, size);
+		return a;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int[] a3 = new int[array1.length+array2.length];
+		int i = array1.length-1,
+			j = array2.length-1,
+			k = a3.length-1;
+		while(i >= 0 && j >= 0){
+			if(array1[i] > array2[j]){
+				a3[k--] = array1[i--]; 
+			}else{
+				a3[k--] = array2[j--];
+			}
+		}
+		while(j >= 0){
+			a3[k--] = array2[j--];
+		}
+		while(i >= 0){
+			a3[k--] = array1[i--];
+		}
+			
+		return  a3;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int a[] = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, a, 0, oldArray.length);
+		return a;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max == 1){
+			int[] a = {0};
+			return a;
+		}
+		if(max == 2){
+			int[] a = {0,1};
+			return a;
+		}
+		if(max == 3){
+			int[] a = {0,1,1,2};
+            return a;
+        }
+        ArrayList list  = new ArrayList();
+        list.add(0);
+        list.add(1);
+        list.add(1);
+        list.add(2);
+        int size = 4;
+        for(int i = 3; i < max ; i++){
+           if(i == ((int)list.get(size-1)+(int)list.get(size-2))){
+        	   list.add(i);
+        	   size++;
+           }
+        }
+        int[] a = new int[size];
+        for(int i = 0; i < size; i++){
+        	a[i] = (int) list.get(i);
+        }
+		return a;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max < 2){
+			int[] a ={};
+			return a;
+		}
+		if(max == 2){
+			int[] a ={2};
+			return a;
+		}
+		LinkedList list = new LinkedList();
+		list.add(2);
+		for(int n = 3; n < max; n=n+2){
+			int i=3;
+			boolean flag = true;
+			for(;i*i <= n;i=i+2){
+				// 先排除偶数
+				if(n%i == 0){
+					flag = false;
+					break;
+				}
+			}
+			if(flag){
+				list.add(n);
+			}
+		}
+		int[] a = new int[list.size()];
+		for(int i = 0; i < list.size(); i++){
+			a[i] = (int) list.get(i);
+		}
+		return a;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max <= 6){
+			int a[] = {};
+			return a;
+		}
+		LinkedList list = new LinkedList();
+		int p = 6,sum;
+		for(; p < max; p++){
+			sum = 0;
+			for(int i=1; i < p % 2; i++){
+				if(p % i == 0){
+					sum += i;
+				}
+			}
+			if(sum == p){
+				list.add(p);
+			}
+		}
+		int a[] = new int[list.size()];
+		for(int i = 0; i < list.size(); i++){
+			a[i] = (int) list.get(i);
+		}
+		return a;
+		
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		for(int i=0;i<array.length ; i++){
+			seperator += array[i];
+			if(i < array.length-1){
+				seperator +="-";
+			}
+		}
+		// StringBuider 实现
+		/*StringBuilder s = new StringBuilder();
+		for(int a: array){
+			if(s.length() > 0){
+				s.append("-");
+			}
+			s.append(a);
+		}
+		seperator = s.toString();*/
+		return seperator;
+	}
+	
+}
diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java b/group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..d3dd810e13
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,165 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+
+import com.coderising.litestruts.exception.StrutsException;
+import com.coderising.litestruts.util.FileUtils;
+import com.coding.basic.impl.ArrayList;
+import com.sun.org.apache.xml.internal.security.encryption.XMLEncryptionException;
+
+
+
+public class Struts {
+	
+	public static final String DETAULT_XML 		= "struts.xml";
+	public static final String ACTION_TAGNAME 	= "action";
+	public static final String RESULT_TAGNAME	= "result";
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }   
+    
+    
+    /**
+     * 获取struts中配置的所有action
+     * 通过dom4j实现读xml文件
+     * Struts action元素的是2层结构，故，这里只解析2层
+     * @param path
+     * @return
+     * @return:ArrayList
+     */
+    private static ArrayList getActionBeans(String dir,String fileName){
+    	if(!FileUtils.createDir(dir)){
+    		throw new IllegalArgumentException("文件路径不存在："+dir);
+    	}
+    	File f = new File(dir);
+    	if(null == fileName || "".endsWith(fileName)){
+    		fileName = DETAULT_XML;
+    	}
+    	SAXReader saxReader = new SAXReader();
+    	try {
+    		f = new File(f.getPath()+"\\"+fileName);
+			Document document = saxReader.read(f);
+			Element element = document.getRootElement();
+			ArrayList actions = new ArrayList();
+			Iterator iterator = element.elementIterator(ACTION_TAGNAME);
+			// 遍历每一个action
+			while(iterator.hasNext()){
+				Element actionEle =  (Element) iterator.next();
+				ActionBean bean = new ActionBean();
+				bean.setName(actionEle.attributeValue("name"));
+				bean.setClazz(actionEle.attributeValue("class"));
+				Iterator it = actionEle.elementIterator(RESULT_TAGNAME);
+				ArrayList results = new ArrayList();
+				// 遍历每一个result
+				while(it.hasNext()){
+					Element resultEle = (Element) it.next(); 
+					Result result = new Result();
+					result.setName(resultEle.attributeValue("name"));
+					result.setValue(resultEle.getText());
+					results.add(result);
+					System.out.println(result);
+				}
+				bean.setResults(results);
+				System.out.println(bean);
+				actions.add(bean);
+			}
+			System.out.println();
+		} catch (DocumentException e) {
+			e.printStackTrace();
+			throw new StrutsException("xml文件解析失败:,dir="+dir+",fileName="+fileName,e);
+		}
+    	
+    	return null;
+    }
+    
+    
+
+    private static class ActionBean{
+    	String name;
+    	String clazz;
+    	ArrayList results;
+		public String getName() {
+			return name;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public String getClazz() {
+			return clazz;
+		}
+		public void setClazz(String clazz) {
+			this.clazz = clazz;
+		}
+		public ArrayList getResults() {
+			return results;
+		}
+		public void setResults(ArrayList results) {
+			this.results = results;
+		}
+		@Override
+		public String toString() {
+			return "ActionBean [name=" + name + ", clazz=" + clazz
+					+ ", results=" + results + "]";
+		}
+		
+    	
+    }
+    
+    private static class Result{
+    	String name;
+    	String value;
+		public String getName() {
+			return name;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public String getValue() {
+			return value;
+		}
+		public void setValue(String value) {
+			this.value = value;
+		}
+		@Override
+		public String toString() {
+			return "Result [name=" + name + ", value=" + value + "]";
+		}
+		
+    	
+    }
+    
+    public static void main(String[] args) {
+		Struts.getActionBeans("src/com/coderising/litestruts/","");
+	}
+}
diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java b/group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java
new file mode 100644
index 0000000000..bd1fe8011c
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java
@@ -0,0 +1,61 @@
+package com.coderising.litestruts.exception;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class StrutsException extends RuntimeException {
+
+	private static final long serialVersionUID = 5481955299021871754L;
+
+	private String message;
+	private String stackTrace;
+	private Throwable t;
+	
+	public Throwable getCause() {
+		return this.t;
+	}
+
+	public String toString() {
+		return getMessage();
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	public void printStackTrace() {
+		System.err.print(this.stackTrace);
+	}
+
+	public void printStackTrace(PrintStream paramPrintStream) {
+		printStackTrace(new PrintWriter(paramPrintStream));
+	}
+
+	public void printStackTrace(PrintWriter paramPrintWriter) {
+		paramPrintWriter.print(this.stackTrace);
+	}
+	
+	public StrutsException(String paramString) {
+		super(paramString);
+		this.message = paramString;
+		this.stackTrace = paramString;
+	}
+	
+	public StrutsException(Throwable paramThrowable) {
+		super(paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+
+	public StrutsException(String paramString, Throwable paramThrowable) {
+		super(paramString + "; nested exception is "
+				+ paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+}
diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml b/group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..fadf460c49
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name= "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java b/group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java
new file mode 100644
index 0000000000..f369fc6cdb
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java
@@ -0,0 +1,25 @@
+package com.coderising.litestruts.util;
+
+import java.io.File;
+
+public class FileUtils {
+
+	public static  boolean createDir(String dir){
+		File f = null;
+		f = new File(dir);
+		boolean ok = true;
+		if(!f.exists()){
+			ok = f.mkdirs();
+		}
+		return ok;
+	}
+	
+	public static String getProjectPath(){
+		return System.getProperty("user.dir");
+	}
+	
+	public static void main(String[] args) {
+		System.out.println(createDir("src/com/coderising/litestruts/"));
+		System.out.println(getProjectPath());
+	}
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/LoginAction.java b/group17/240094626/warm-up/src/com/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/Struts.java b/group17/240094626/warm-up/src/com/litestruts/Struts.java
new file mode 100644
index 0000000000..44e6398b80
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/Struts.java
@@ -0,0 +1,194 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import com.coderising.litestruts.exception.StrutsRunActionException;
+import com.coderising.litestruts.exception.StrutsXMLLoaderException;
+
+
+
+/**
+ * 模拟Struts读取xml文件，解析ation，并执行exectue方法
+ * @author 240094626
+ *
+ */
+public class Struts {
+	/**单例对象*/
+	private static Struts instance = null;
+	/**默认配置文件目录*/
+	private static final String STRUTS_CONFIG_DIR = "src/com/coderising/litestruts/";
+	/**默认配置文件名*/
+	private static final String STRUTS_CONFIG_XML = "struts.xml";
+	/**默认编码字符集*/
+	private static final String ENCODE = "UTF-8";
+	/**action文档节点名称*/
+	private static final String DOC_ACTION = "action";
+	/**result文档节点名称*/
+	private static final String DOC_ACTION_RESULT = "result";
+	
+	/**
+	 * 单例实现，双check
+	 * @return
+	 */
+	public static Struts getInstance(){
+		if(instance == null){
+			synchronized (Struts.class) {
+				if(instance == null){
+					instance = new Struts();
+				}
+			}
+		}
+		return instance;
+	}
+
+    public View runAction(String actionName, Map<String,String> parameters) throws StrutsRunActionException  {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	View view = new View();
+		try {
+			// 0. 读取配置文件struts.xml
+			Map<String,Action> actions = getActionByDom4J();
+			
+			// 1. 找到LoginAction 反射实例化，setName 和setPassword
+			Action action  = actions.get(actionName);
+			Class<?> clz = Class.forName(action.clazz);
+			Object actionObj = clz.newInstance();
+			Method m1 = clz.getDeclaredMethod("setName", String.class);
+			m1.setAccessible(true);
+			m1.invoke(actionObj, parameters.get("name"));
+			Method m2 = clz.getDeclaredMethod("setPassword", String.class);
+			m2.setAccessible(true);
+			m2.invoke(actionObj, parameters.get("password"));
+			
+			// 2.通过反射调用对象的exectue 方法
+			Method mExectue = clz.getDeclaredMethod("execute", null);
+			String result = (String) mExectue.invoke(actionObj, null);
+			
+			// 3. 通过反射找到对象的所有getter方法,通过反射来调用， 把值和属性形成一个HashMap
+			Field[] fs = clz.getDeclaredFields();
+			Map<String,Object> pMap = new HashMap<String,Object>(10);
+			for(Field f : fs){
+				String methodName = "get"+toUpperCase(f.getName());
+				Method m = clz.getDeclaredMethod(methodName, null);
+				m.setAccessible(true);
+				pMap.put(f.getName(), m.invoke(actionObj, null));
+			}
+			view.setParameters(pMap);
+			// 4.根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp,
+			view.setJsp(action.results.get(result));
+			System.out.println(view);
+		} catch (StrutsXMLLoaderException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			throw new StrutsRunActionException("Action执行失败",e);
+		}
+    	
+    	
+    	return view;
+    }  
+    
+    
+    /**
+     * dom4j读xml
+     * @return
+     * @throws StrutsXMLLoaderException
+     */
+    private Map<String,Action> getActionByDom4J() throws StrutsXMLLoaderException{
+    	return getActionByDom4J(STRUTS_CONFIG_DIR,STRUTS_CONFIG_XML,ENCODE);
+    }
+    /**
+     * dom4j读xml
+     * @param dir
+     * @param fileName
+     * @param encode
+     * @return
+     * @throws StrutsXMLLoaderException
+     */
+    private Map<String,Action> getActionByDom4J(String dir,String fileName,String encode) throws StrutsXMLLoaderException {
+    	File f = new File(dir);
+    	if(!f.exists()){
+    		throw new StrutsXMLLoaderException("路径不存在："+dir);
+    	}
+    	f = new File(f.getPath()+"\\"+fileName);
+    	if(!f.exists()){
+    		throw new StrutsXMLLoaderException("路径："+dir+"中文件不存在："+fileName);
+    	}
+    	SAXReader saxReader = new SAXReader();
+    	saxReader.setEncoding(encode);
+    	Map<String,Action> actions = new HashMap<String,Action>(10);
+    	try {
+			Document document = saxReader.read(f);
+			Element root =document.getRootElement();
+			Iterator<Element> it = root.elementIterator(DOC_ACTION);
+			while(it.hasNext()){
+				Action action = new Action();
+				Element element = it.next();
+				action.name = element.attributeValue("name");
+				action.clazz = element.attributeValue("class");
+				Map<String,String> results = new HashMap<String,String>(10);
+				Iterator<Element> rIt = element.elementIterator(DOC_ACTION_RESULT);
+				while(rIt.hasNext()){
+					Element rElement = rIt.next();
+					results.put(rElement.attributeValue("name"), rElement.getText());
+				}
+				action.results = results;
+				actions.put(action.name, action);
+			}
+		} catch (Exception e) {
+			throw new StrutsXMLLoaderException("xml文件解析失败",e);
+		}
+    	
+    	return actions;
+    }
+    
+    /**
+     * 首个字符大写
+     * @param fieldName
+     * @return
+     */
+    private String toUpperCase(String fieldName){
+    	return  fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
+    }
+    
+    
+    
+    /**
+     * Action类
+     */
+    private static class Action{
+    	String name;
+    	String clazz;
+    	Map<String,String> results;
+    }
+    
+    
+
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/StrutsTest.java b/group17/240094626/warm-up/src/com/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..09b00c8c3b
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/StrutsTest.java
@@ -0,0 +1,57 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.coderising.litestruts.exception.StrutsRunActionException;
+
+
+
+
+
+public class StrutsTest {
+	Struts struts = Struts.getInstance();
+
+	
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view = null;
+		try {
+			view = struts.runAction(actionName,params);
+		} catch (StrutsRunActionException e) {
+			e.printStackTrace();
+		}        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view = null;
+		try {
+			view = struts.runAction(actionName,params);
+		} catch (StrutsRunActionException e) {
+			e.printStackTrace();
+		}        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/View.java b/group17/240094626/warm-up/src/com/litestruts/View.java
new file mode 100644
index 0000000000..880a7be260
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/View.java
@@ -0,0 +1,28 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+	@Override
+	public String toString() {
+		return "View [jsp=" + jsp + ", parameters=" + parameters + "]";
+	}
+	
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java
new file mode 100644
index 0000000000..5c5a7b9006
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java
@@ -0,0 +1,59 @@
+package com.coderising.litestruts.exception;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class StrutsRunActionException extends Exception {
+
+	private static final long serialVersionUID = -242506476923032524L;
+	private String message;
+	private String stackTrace;
+	private Throwable t;
+	public Throwable getCause() {
+		return this.t;
+	}
+
+	public String toString() {
+		return getMessage();
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	public void printStackTrace() {
+		System.err.print(this.stackTrace);
+	}
+
+	public void printStackTrace(PrintStream paramPrintStream) {
+		printStackTrace(new PrintWriter(paramPrintStream));
+	}
+
+	public void printStackTrace(PrintWriter paramPrintWriter) {
+		paramPrintWriter.print(this.stackTrace);
+	}
+
+	public StrutsRunActionException(String paramString) {
+		super(paramString);
+		this.message = paramString;
+		this.stackTrace = paramString;
+	}
+	
+	public StrutsRunActionException(Throwable paramThrowable) {
+		super(paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+
+	public StrutsRunActionException(String paramString, Throwable paramThrowable) {
+		super(paramString + "; nested exception is "
+				+ paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java
new file mode 100644
index 0000000000..4efb8b9152
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java
@@ -0,0 +1,59 @@
+package com.coderising.litestruts.exception;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class StrutsXMLLoaderException extends Exception {
+
+	private static final long serialVersionUID = 5481955299021871754L;
+	private String message;
+	private String stackTrace;
+	private Throwable t;
+	public Throwable getCause() {
+		return this.t;
+	}
+
+	public String toString() {
+		return getMessage();
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	public void printStackTrace() {
+		System.err.print(this.stackTrace);
+	}
+
+	public void printStackTrace(PrintStream paramPrintStream) {
+		printStackTrace(new PrintWriter(paramPrintStream));
+	}
+
+	public void printStackTrace(PrintWriter paramPrintWriter) {
+		paramPrintWriter.print(this.stackTrace);
+	}
+
+	public StrutsXMLLoaderException(String paramString) {
+		super(paramString);
+		this.message = paramString;
+		this.stackTrace = paramString;
+	}
+	
+	public StrutsXMLLoaderException(Throwable paramThrowable) {
+		super(paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+
+	public StrutsXMLLoaderException(String paramString, Throwable paramThrowable) {
+		super(paramString + "; nested exception is "
+				+ paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+}
diff --git a/group17/240094626/warm-up/src/com/litestruts/struts.xml b/group17/240094626/warm-up/src/com/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group17/240094626/warm-up/src/com/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java b/group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..214ecae3bb
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,243 @@
+package com.coderising.array;
+
+import com.coding.basic.impl.ArrayList;
+import com.coding.basic.impl.LinkedList;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		for(int i=0; i < origin.length; i++){
+			if(i >= origin.length-1-i){
+				break;
+			}
+			int tmp = origin[i];
+			origin[i] = origin[origin.length-i-1];
+			origin[origin.length-i-1] = tmp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int size = 0,	// 记录非0数量
+			tmp = 0;	// 需要比较的下一个位置
+		for(int i=0; i < oldArray.length;){
+			if(oldArray[i] == 0){
+				int j=tmp==0?(i+1):tmp;
+				for(;j < oldArray.length; j++){
+					if(oldArray[j] == 0){
+						continue;
+					}else{
+						oldArray[i] = oldArray[j];
+						oldArray[j] = 0;
+						size++;
+						tmp = j+1;
+						i=j;
+						break;
+					}
+				}
+			}else{
+				i++;
+				size++;
+				continue;
+			}
+		}
+		int a[] = new int[size];
+		System.arraycopy(oldArray, 0, a, 0, size);
+		return a;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){
+		int[] a3 = new int[array1.length+array2.length];
+		int i = array1.length-1,
+			j = array2.length-1,
+			k = a3.length-1;
+		while(i >= 0 && j >= 0){
+			if(array1[i] > array2[j]){
+				a3[k--] = array1[i--]; 
+			}else{
+				a3[k--] = array2[j--];
+			}
+		}
+		while(j >= 0){
+			a3[k--] = array2[j--];
+		}
+		while(i >= 0){
+			a3[k--] = array1[i--];
+		}
+			
+		return  a3;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int a[] = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, a, 0, oldArray.length);
+		return a;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max == 1){
+			int[] a = {0};
+			return a;
+		}
+		if(max == 2){
+			int[] a = {0,1};
+			return a;
+		}
+		if(max == 3){
+			int[] a = {0,1,1,2};
+            return a;
+        }
+        ArrayList list  = new ArrayList();
+        list.add(0);
+        list.add(1);
+        list.add(1);
+        list.add(2);
+        int size = 4;
+        for(int i = 3; i < max ; i++){
+           if(i == ((int)list.get(size-1)+(int)list.get(size-2))){
+        	   list.add(i);
+        	   size++;
+           }
+        }
+        int[] a = new int[size];
+        for(int i = 0; i < size; i++){
+        	a[i] = (int) list.get(i);
+        }
+		return a;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max < 2){
+			int[] a ={};
+			return a;
+		}
+		if(max == 2){
+			int[] a ={2};
+			return a;
+		}
+		LinkedList list = new LinkedList();
+		list.add(2);
+		for(int n = 3; n < max; n=n+2){
+			int i=3;
+			boolean flag = true;
+			for(;i*i <= n;i=i+2){
+				// 先排除偶数
+				if(n%i == 0){
+					flag = false;
+					break;
+				}
+			}
+			if(flag){
+				list.add(n);
+			}
+		}
+		int[] a = new int[list.size()];
+		for(int i = 0; i < list.size(); i++){
+			a[i] = (int) list.get(i);
+		}
+		return a;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		if(max <= 6){
+			int a[] = {};
+			return a;
+		}
+		LinkedList list = new LinkedList();
+		int p = 6,sum;
+		for(; p < max; p++){
+			sum = 0;
+			for(int i=1; i < p % 2; i++){
+				if(p % i == 0){
+					sum += i;
+				}
+			}
+			if(sum == p){
+				list.add(p);
+			}
+		}
+		int a[] = new int[list.size()];
+		for(int i = 0; i < list.size(); i++){
+			a[i] = (int) list.get(i);
+		}
+		return a;
+		
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		for(int i=0;i<array.length ; i++){
+			seperator += array[i];
+			if(i < array.length-1){
+				seperator +="-";
+			}
+		}
+		// StringBuider 实现
+		/*StringBuilder s = new StringBuilder();
+		for(int a: array){
+			if(s.length() > 0){
+				s.append("-");
+			}
+			s.append(a);
+		}
+		seperator = s.toString();*/
+		return seperator;
+	}
+	
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java b/group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java b/group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..44e6398b80
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,194 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import com.coderising.litestruts.exception.StrutsRunActionException;
+import com.coderising.litestruts.exception.StrutsXMLLoaderException;
+
+
+
+/**
+ * 模拟Struts读取xml文件，解析ation，并执行exectue方法
+ * @author 240094626
+ *
+ */
+public class Struts {
+	/**单例对象*/
+	private static Struts instance = null;
+	/**默认配置文件目录*/
+	private static final String STRUTS_CONFIG_DIR = "src/com/coderising/litestruts/";
+	/**默认配置文件名*/
+	private static final String STRUTS_CONFIG_XML = "struts.xml";
+	/**默认编码字符集*/
+	private static final String ENCODE = "UTF-8";
+	/**action文档节点名称*/
+	private static final String DOC_ACTION = "action";
+	/**result文档节点名称*/
+	private static final String DOC_ACTION_RESULT = "result";
+	
+	/**
+	 * 单例实现，双check
+	 * @return
+	 */
+	public static Struts getInstance(){
+		if(instance == null){
+			synchronized (Struts.class) {
+				if(instance == null){
+					instance = new Struts();
+				}
+			}
+		}
+		return instance;
+	}
+
+    public View runAction(String actionName, Map<String,String> parameters) throws StrutsRunActionException  {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	View view = new View();
+		try {
+			// 0. 读取配置文件struts.xml
+			Map<String,Action> actions = getActionByDom4J();
+			
+			// 1. 找到LoginAction 反射实例化，setName 和setPassword
+			Action action  = actions.get(actionName);
+			Class<?> clz = Class.forName(action.clazz);
+			Object actionObj = clz.newInstance();
+			Method m1 = clz.getDeclaredMethod("setName", String.class);
+			m1.setAccessible(true);
+			m1.invoke(actionObj, parameters.get("name"));
+			Method m2 = clz.getDeclaredMethod("setPassword", String.class);
+			m2.setAccessible(true);
+			m2.invoke(actionObj, parameters.get("password"));
+			
+			// 2.通过反射调用对象的exectue 方法
+			Method mExectue = clz.getDeclaredMethod("execute", null);
+			String result = (String) mExectue.invoke(actionObj, null);
+			
+			// 3. 通过反射找到对象的所有getter方法,通过反射来调用， 把值和属性形成一个HashMap
+			Field[] fs = clz.getDeclaredFields();
+			Map<String,Object> pMap = new HashMap<String,Object>(10);
+			for(Field f : fs){
+				String methodName = "get"+toUpperCase(f.getName());
+				Method m = clz.getDeclaredMethod(methodName, null);
+				m.setAccessible(true);
+				pMap.put(f.getName(), m.invoke(actionObj, null));
+			}
+			view.setParameters(pMap);
+			// 4.根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp,
+			view.setJsp(action.results.get(result));
+			System.out.println(view);
+		} catch (StrutsXMLLoaderException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			throw new StrutsRunActionException("Action执行失败",e);
+		}
+    	
+    	
+    	return view;
+    }  
+    
+    
+    /**
+     * dom4j读xml
+     * @return
+     * @throws StrutsXMLLoaderException
+     */
+    private Map<String,Action> getActionByDom4J() throws StrutsXMLLoaderException{
+    	return getActionByDom4J(STRUTS_CONFIG_DIR,STRUTS_CONFIG_XML,ENCODE);
+    }
+    /**
+     * dom4j读xml
+     * @param dir
+     * @param fileName
+     * @param encode
+     * @return
+     * @throws StrutsXMLLoaderException
+     */
+    private Map<String,Action> getActionByDom4J(String dir,String fileName,String encode) throws StrutsXMLLoaderException {
+    	File f = new File(dir);
+    	if(!f.exists()){
+    		throw new StrutsXMLLoaderException("路径不存在："+dir);
+    	}
+    	f = new File(f.getPath()+"\\"+fileName);
+    	if(!f.exists()){
+    		throw new StrutsXMLLoaderException("路径："+dir+"中文件不存在："+fileName);
+    	}
+    	SAXReader saxReader = new SAXReader();
+    	saxReader.setEncoding(encode);
+    	Map<String,Action> actions = new HashMap<String,Action>(10);
+    	try {
+			Document document = saxReader.read(f);
+			Element root =document.getRootElement();
+			Iterator<Element> it = root.elementIterator(DOC_ACTION);
+			while(it.hasNext()){
+				Action action = new Action();
+				Element element = it.next();
+				action.name = element.attributeValue("name");
+				action.clazz = element.attributeValue("class");
+				Map<String,String> results = new HashMap<String,String>(10);
+				Iterator<Element> rIt = element.elementIterator(DOC_ACTION_RESULT);
+				while(rIt.hasNext()){
+					Element rElement = rIt.next();
+					results.put(rElement.attributeValue("name"), rElement.getText());
+				}
+				action.results = results;
+				actions.put(action.name, action);
+			}
+		} catch (Exception e) {
+			throw new StrutsXMLLoaderException("xml文件解析失败",e);
+		}
+    	
+    	return actions;
+    }
+    
+    /**
+     * 首个字符大写
+     * @param fieldName
+     * @return
+     */
+    private String toUpperCase(String fieldName){
+    	return  fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
+    }
+    
+    
+    
+    /**
+     * Action类
+     */
+    private static class Action{
+    	String name;
+    	String clazz;
+    	Map<String,String> results;
+    }
+    
+    
+
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java b/group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..09b00c8c3b
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,57 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.coderising.litestruts.exception.StrutsRunActionException;
+
+
+
+
+
+public class StrutsTest {
+	Struts struts = Struts.getInstance();
+
+	
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view = null;
+		try {
+			view = struts.runAction(actionName,params);
+		} catch (StrutsRunActionException e) {
+			e.printStackTrace();
+		}        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view = null;
+		try {
+			view = struts.runAction(actionName,params);
+		} catch (StrutsRunActionException e) {
+			e.printStackTrace();
+		}        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/View.java b/group17/240094626/work_0226/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..880a7be260
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/View.java
@@ -0,0 +1,28 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+	@Override
+	public String toString() {
+		return "View [jsp=" + jsp + ", parameters=" + parameters + "]";
+	}
+	
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java
new file mode 100644
index 0000000000..5c5a7b9006
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java
@@ -0,0 +1,59 @@
+package com.coderising.litestruts.exception;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class StrutsRunActionException extends Exception {
+
+	private static final long serialVersionUID = -242506476923032524L;
+	private String message;
+	private String stackTrace;
+	private Throwable t;
+	public Throwable getCause() {
+		return this.t;
+	}
+
+	public String toString() {
+		return getMessage();
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	public void printStackTrace() {
+		System.err.print(this.stackTrace);
+	}
+
+	public void printStackTrace(PrintStream paramPrintStream) {
+		printStackTrace(new PrintWriter(paramPrintStream));
+	}
+
+	public void printStackTrace(PrintWriter paramPrintWriter) {
+		paramPrintWriter.print(this.stackTrace);
+	}
+
+	public StrutsRunActionException(String paramString) {
+		super(paramString);
+		this.message = paramString;
+		this.stackTrace = paramString;
+	}
+	
+	public StrutsRunActionException(Throwable paramThrowable) {
+		super(paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+
+	public StrutsRunActionException(String paramString, Throwable paramThrowable) {
+		super(paramString + "; nested exception is "
+				+ paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java
new file mode 100644
index 0000000000..4efb8b9152
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java
@@ -0,0 +1,59 @@
+package com.coderising.litestruts.exception;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class StrutsXMLLoaderException extends Exception {
+
+	private static final long serialVersionUID = 5481955299021871754L;
+	private String message;
+	private String stackTrace;
+	private Throwable t;
+	public Throwable getCause() {
+		return this.t;
+	}
+
+	public String toString() {
+		return getMessage();
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	public void printStackTrace() {
+		System.err.print(this.stackTrace);
+	}
+
+	public void printStackTrace(PrintStream paramPrintStream) {
+		printStackTrace(new PrintWriter(paramPrintStream));
+	}
+
+	public void printStackTrace(PrintWriter paramPrintWriter) {
+		paramPrintWriter.print(this.stackTrace);
+	}
+
+	public StrutsXMLLoaderException(String paramString) {
+		super(paramString);
+		this.message = paramString;
+		this.stackTrace = paramString;
+	}
+	
+	public StrutsXMLLoaderException(Throwable paramThrowable) {
+		super(paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+
+	public StrutsXMLLoaderException(String paramString, Throwable paramThrowable) {
+		super(paramString + "; nested exception is "
+				+ paramThrowable.getMessage());
+		this.t = paramThrowable;
+		StringWriter localStringWriter = new StringWriter();
+		paramThrowable.printStackTrace(new PrintWriter(localStringWriter));
+		this.stackTrace = localStringWriter.toString();
+	}
+}
diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml b/group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/516886559/ArrayList.java b/group17/516886559/ArrayList.java
new file mode 100644
index 0000000000..75222aecce
--- /dev/null
+++ b/group17/516886559/ArrayList.java
@@ -0,0 +1,103 @@
+package com.rd.p2p.common.util.liuxin;
+
+import java.util.Arrays;
+
+public class ArrayList<E> implements List<E> {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[10];
+	
+	public void add(E o){
+		if(size >= elementData.length){
+			elementData = Arrays.copyOf(elementData, elementData.length * 2);
+		}
+		elementData[size++] = o;
+		size++;
+	}
+	
+	public void add(int index, E o){
+		if(index > size){
+			throw new ArrayIndexOutOfBoundsException("插入索引数不能大于数列总长度   " + index + ">" + size);
+		}
+		if(size >= elementData.length){
+			elementData = Arrays.copyOf(elementData, elementData.length * 2);
+		}
+		Object[]  tempData = Arrays.copyOfRange(elementData, index, size);
+		elementData[index] = o;
+		for(int i = 1; i <= tempData.length; i++){
+			elementData[i+index] = tempData[i-1];
+		}
+		size++;
+		
+	}
+	
+	public Object get(int index){
+		if(index >= size){
+			throw new ArrayIndexOutOfBoundsException("取出数组索引不能大于等于数组总长度   " + index + ">=" + size);
+		}
+		return elementData[index];
+	}
+	
+	public Object remove(int index){
+		if(index >= size){
+			throw new ArrayIndexOutOfBoundsException("移除索引数不能大于等于数列总长度   " + index + ">=" + size);
+		}
+		Object data = get(index);
+		Object[]  tempData = Arrays.copyOfRange(elementData, index+1, size);
+		for(int i = 0; i < tempData.length; i++){
+			elementData[index+i] =  tempData[i];
+		}
+		elementData[size - 1] = null;
+		size--;
+		return data;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	@Override
+	public String toString() {
+		for (Object object : elementData) {
+			System.out.println(object);
+		}
+		return null;
+	}
+	
+	//迭代器
+	public Iterator iterator(){
+		return new Iterator() {
+			
+			private int index = 0;
+			
+			@Override
+			public Object next() {
+				if(index >= size){
+					throw new ArrayIndexOutOfBoundsException("取出数组索引不能大于等于数组总长度   " + index + ">=" + size);
+				}
+				return get(index++);
+			}
+			
+			@Override
+			public boolean hasNext() {
+				if(size > index){
+					return true;
+				}else{
+					return false;
+				}
+			}
+		};
+	}
+	
+	public static void main(String[] args) {
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		list.add(1);
+		list.add(2);
+		list.add(3,3);
+		Iterator in = list.iterator();
+		while(in.hasNext()){
+			System.out.println(in.next());
+		}
+	}
+}
\ No newline at end of file
diff --git a/group17/516886559/BinaryTreeNode.java b/group17/516886559/BinaryTreeNode.java
new file mode 100644
index 0000000000..75c17d1198
--- /dev/null
+++ b/group17/516886559/BinaryTreeNode.java
@@ -0,0 +1,68 @@
+package com.rd.p2p.common.util.liuxin;
+
+/**
+ * 用Integer易于比较和插入
+ * @author jhn
+ * time:2017年2月24日
+ */
+public class BinaryTreeNode {
+	
+	private Integer data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public BinaryTreeNode(){
+		
+	}
+	
+	public BinaryTreeNode(Integer integer){
+		this.data = integer;
+	}
+	
+	public Integer getData() {
+		return data;
+	}
+	public void setData(Integer data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Integer o){
+		if(data == null){
+			data = o;
+			return  this;
+		}
+		BinaryTreeNode node = new BinaryTreeNode(o);
+		BinaryTreeNode tempBinaryTreeNode = this;
+		boolean begin = true;
+		while(begin){
+			if(o < data){
+				tempBinaryTreeNode = tempBinaryTreeNode.getLeft();
+				if(tempBinaryTreeNode.getLeft() == null){
+					tempBinaryTreeNode.setLeft(node);
+					begin = false;;
+				}
+			}else{
+				tempBinaryTreeNode = tempBinaryTreeNode.getRight();
+				if(tempBinaryTreeNode.getRight() == null){
+					tempBinaryTreeNode.setRight(node);
+					begin = false;;
+				}
+			}
+			
+		}
+		return node;
+	}
+	
+}
diff --git a/group17/516886559/Iterator.java b/group17/516886559/Iterator.java
new file mode 100644
index 0000000000..d29475ed43
--- /dev/null
+++ b/group17/516886559/Iterator.java
@@ -0,0 +1,7 @@
+package com.rd.p2p.common.util.liuxin;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group17/516886559/LinkedList.java b/group17/516886559/LinkedList.java
new file mode 100644
index 0000000000..1b0345de7d
--- /dev/null
+++ b/group17/516886559/LinkedList.java
@@ -0,0 +1,150 @@
+package com.rd.p2p.common.util.liuxin;
+
+public class LinkedList<E> implements List<E> {
+	
+	private Node head;
+	
+	private int size;
+	
+	public void add(E o){
+		if(size == 0){
+			head = new Node();
+			head.data = o;
+		}else{
+			Node node = new Node();
+			node.data = o;
+			getNode(size-1).next = node;
+		}
+		size ++;
+	}
+	
+	public void add(int index , E o){
+		Node node = new Node();
+		node.data = o;
+		if(index == 0){
+			node.next = head;
+			head = node;
+		}else{
+			Node indexNode = getNode(index - 1);
+			indexNode.next = node;
+			if(index < size){
+				node.next = getNode(index);
+			}
+		}
+		size ++;
+	}
+	
+	public Object get(int index){
+		return getNode(index).data;
+	}
+	
+	public Object remove(int index){
+		if(index > size - 1){
+			throw new ArrayIndexOutOfBoundsException("移除索引超出数组索引边界   " + index + ">" + (size - 1));
+		}
+		if(index < 0){
+			throw new ArrayIndexOutOfBoundsException("索引不能为负数");
+		}
+		Node returnNode = null;
+		if(index == 0){
+			returnNode = head;
+			if(head.next != null){
+				head = head.next;
+			}else{
+				head = null;
+			}
+		}else{
+			returnNode = getNode(index);
+			if(returnNode.next != null){
+				Node preNode = getNode(index-1);
+				Node nextNode = getNode(index+1);
+				preNode.next = nextNode;
+			}
+		}
+		size--;
+		return returnNode.data;
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public void addFirst(E o){
+		add(0,o);
+	}
+	
+	public void addLast(E o){
+		add(size-1,o);
+	}
+	
+	public Object removeFirst(){
+		return remove(0);
+	}
+	
+	public Object removeLast(){
+		return remove(size - 1);
+	}
+	
+	private Node getNode(int index){
+		if(index > size - 1){
+			throw new ArrayIndexOutOfBoundsException("查询索引超出数组索引边界   " + index + ">" + (size - 1));
+		}
+		if(index < 0){
+			throw new ArrayIndexOutOfBoundsException("索引不能为负数");
+		}
+		Node tempNode = head;
+		if(index == 0){
+			tempNode =  head;
+		}else{
+			for(int i = 0; i < index; i++){
+				tempNode = tempNode.next;
+			}
+		}
+		return tempNode;
+	}
+	
+	private static class Node{
+		Object data;
+		Node next;
+	}
+
+	@Override
+	public String toString() {
+		for (int i = 0; i < size; i++) {
+			System.out.println(get(i));
+		}
+		return null;
+	}
+	
+	//迭代器
+	public Iterator iterator(){
+		return new Iterator() {
+			private int index = 0;
+			
+			@Override
+			public Object next() {
+				if(index >= size){
+					throw new ArrayIndexOutOfBoundsException("取出数组索引不能大于等于数组总长度   " + index + ">=" + size);
+				}
+				return get(index++);
+			}
+			
+			@Override
+			public boolean hasNext() {
+				if(size > index){
+					return true;
+				}else{
+					return false;
+				}
+			}
+		};
+	}
+	
+	public static void main(String[] args) {
+		LinkedList<Integer> list = new LinkedList<Integer>();
+		list.add(1);
+		list.add(2);
+		list.add(3);
+		list.toString();
+	}
+}
diff --git a/group17/516886559/List.java b/group17/516886559/List.java
new file mode 100644
index 0000000000..fd6e7883ba
--- /dev/null
+++ b/group17/516886559/List.java
@@ -0,0 +1,9 @@
+package com.rd.p2p.common.util.liuxin;
+
+public interface List<E> {
+	public void add(E o);
+	public void add(int index, E o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group17/516886559/Queue.java b/group17/516886559/Queue.java
new file mode 100644
index 0000000000..d077a71a32
--- /dev/null
+++ b/group17/516886559/Queue.java
@@ -0,0 +1,30 @@
+package com.rd.p2p.common.util.liuxin;
+
+public class Queue<T> {
+	
+	ArrayList<T> arrayList = new ArrayList<T>();
+	
+	public void enQueue(T o){	
+		arrayList.add(o);
+	}
+	
+	public T deQueue(){
+		if(arrayList.size() > 0){
+			@SuppressWarnings("unchecked")
+			T t = (T) arrayList.get(0);
+			arrayList.remove(0);
+			return t;
+		}else{
+			return null;
+		}
+	}
+	
+	public boolean isEmpty(){
+		return arrayList.size() == 0 ? true : false;
+	}
+	
+	public int size(){
+		return arrayList.size();
+	}
+}
+
diff --git a/group17/516886559/Stack.java b/group17/516886559/Stack.java
new file mode 100644
index 0000000000..53ffc21e09
--- /dev/null
+++ b/group17/516886559/Stack.java
@@ -0,0 +1,52 @@
+package com.rd.p2p.common.util.liuxin;
+
+public class Stack<T> {
+	
+	private ArrayList<T> elementData = new ArrayList<T>();
+	
+	public void push(T o){		
+		elementData.add(o);
+	}
+	
+	public T pop(){
+		if(elementData.size() > 0){
+			@SuppressWarnings("unchecked")
+			T obj = (T)elementData.get(elementData.size()-1);
+			elementData.remove(elementData.size()-1);
+			return obj;
+		}else{
+			return null;
+		}
+	}
+	
+	@SuppressWarnings("unchecked")
+	public T peek(){
+		if(elementData.size() > 0){
+			return (T)elementData.get(elementData.size()-1);
+		}else{
+			return null;
+		}
+	}
+	public boolean isEmpty(){
+		return elementData.size() == 0 ? true : false;
+	}
+	public int size(){
+		return elementData.size();
+	}
+	
+	public static void main(String[] args) {
+		Stack<Integer> stack = new Stack<Integer>();
+		stack.push(1);
+		stack.push(2);
+		stack.push(3);
+		
+		System.out.println(stack.pop());
+		System.out.println(stack.peek());
+		System.out.println(stack.peek());
+		System.out.println(stack.pop());
+		System.out.println(stack.pop());
+		System.out.println(stack.pop());
+		System.out.println(stack.peek());
+	}
+}
+
diff --git a/group17/785396327/2.26/binarytree/BinaryTree.java b/group17/785396327/2.26/binarytree/BinaryTree.java
new file mode 100644
index 0000000000..bf5a6b639c
--- /dev/null
+++ b/group17/785396327/2.26/binarytree/BinaryTree.java
@@ -0,0 +1,55 @@
+package binarytree;
+
+/**
+ * Created by william on 2017/2/16.
+ */
+public class BinaryTree {
+    private Node root;
+
+    class Node {
+        private Node left;
+        private Node right;
+        private Comparable data;
+
+        public Node(Node left, Node right, Comparable data) {
+            this.left = left;
+            this.right = right;
+            this.data = data;
+        }
+
+        private void add(Comparable data) {
+            if (this.data.compareTo(data) >= 0)
+                if (this.left == null)
+                    this.left = new Node(null, null, data);
+                else
+                    left.add(data);
+            else if (this.data.compareTo(data) < 0)
+                if (this.right == null)
+                    this.right = new Node(null, null, data);
+                else
+                    this.right.add(data);
+        }
+
+        public Comparable getData() {
+            return this.data;
+        }
+
+        public Node getLeft() {
+            return this.left;
+        }
+
+        public Node getRight() {
+            return this.right;
+        }
+    }
+
+    public void add(Comparable data) {
+        if (this.root == null)
+            root = new Node(null, null, data);
+        else this.root.add(data);
+    }
+
+    public void printByType(SearchType<Node> type) {
+        type.printByType(this.root);
+    }
+}
diff --git a/group17/785396327/binarytree/DLRSearchType.java b/group17/785396327/2.26/binarytree/DLRSearchType.java
similarity index 95%
rename from group17/785396327/binarytree/DLRSearchType.java
rename to group17/785396327/2.26/binarytree/DLRSearchType.java
index 7f9ba1c38d..3d1adbbdc7 100644
--- a/group17/785396327/binarytree/DLRSearchType.java
+++ b/group17/785396327/2.26/binarytree/DLRSearchType.java
@@ -1,16 +1,16 @@
-package binarytree;
-
-/**
- * Created by william on 2017/2/18.
- */
-public class DLRSearchType implements SearchType<BinaryTree.Node> {
-
-    @Override
-    public void printByType(BinaryTree.Node root) {
-        if (root != null) {
-            System.out.print(root.getData()+" ");
-            printByType(root.getLeft());
-            printByType(root.getRight());
-        }
-    }
-}
+package binarytree;
+
+/**
+ * Created by william on 2017/2/18.
+ */
+public class DLRSearchType implements SearchType<BinaryTree.Node> {
+
+    @Override
+    public void printByType(BinaryTree.Node root) {
+        if (root != null) {
+            System.out.print(root.getData()+" ");
+            printByType(root.getLeft());
+            printByType(root.getRight());
+        }
+    }
+}
diff --git a/group17/785396327/binarytree/LDRSearchType.java b/group17/785396327/2.26/binarytree/LDRSearchType.java
similarity index 96%
rename from group17/785396327/binarytree/LDRSearchType.java
rename to group17/785396327/2.26/binarytree/LDRSearchType.java
index f67b6dcb81..da18dbc1b9 100644
--- a/group17/785396327/binarytree/LDRSearchType.java
+++ b/group17/785396327/2.26/binarytree/LDRSearchType.java
@@ -1,15 +1,15 @@
-package binarytree;
-
-/**
- * Created by william on 2017/2/18.
- */
-public class LDRSearchType implements SearchType<BinaryTree.Node> {
-    @Override
-    public void printByType(BinaryTree.Node root) {
-        if (root != null) {
-            printByType(root.getLeft());
-            System.out.print(root.getData() + " ");
-            printByType(root.getRight());
-        }
-    }
-}
+package binarytree;
+
+/**
+ * Created by william on 2017/2/18.
+ */
+public class LDRSearchType implements SearchType<BinaryTree.Node> {
+    @Override
+    public void printByType(BinaryTree.Node root) {
+        if (root != null) {
+            printByType(root.getLeft());
+            System.out.print(root.getData() + " ");
+            printByType(root.getRight());
+        }
+    }
+}
diff --git a/group17/785396327/binarytree/LFSearchType.java b/group17/785396327/2.26/binarytree/LFSearchType.java
similarity index 87%
rename from group17/785396327/binarytree/LFSearchType.java
rename to group17/785396327/2.26/binarytree/LFSearchType.java
index e88e76b210..5f908664c9 100644
--- a/group17/785396327/binarytree/LFSearchType.java
+++ b/group17/785396327/2.26/binarytree/LFSearchType.java
@@ -1,27 +1,27 @@
-package binarytree;
-
-import java.util.LinkedList;
-
-/**
- * Created by william on 2017/2/18.
- */
-public class LFSearchType implements SearchType<BinaryTree.Node> {
-    private LinkedList<BinaryTree.Node> queue = new LinkedList<>();
-
-    @Override
-    public void printByType(BinaryTree.Node root) {
-        if (root == null)
-            return;
-        queue.offer(root);
-        while (!queue.isEmpty()) {
-            BinaryTree.Node curNode = queue.poll();
-            System.out.print(curNode.getData() + " ");
-            if (curNode.getLeft() != null)
-                queue.offer(curNode.getLeft());
-            if (curNode.getRight() != null)
-                queue.offer(curNode.getRight());
-        }
-
-    }
-
-}
+package binarytree;
+
+import java.util.LinkedList;
+
+/**
+ * Created by william on 2017/2/18.
+ */
+public class LFSearchType implements SearchType<BinaryTree.Node> {
+    private LinkedList<BinaryTree.Node> queue = new LinkedList<BinaryTree.Node>();
+
+    @Override
+    public void printByType(BinaryTree.Node root) {
+        if (root == null)
+            return;
+        queue.offer(root);
+        while (!queue.isEmpty()) {
+            BinaryTree.Node curNode = queue.poll();
+            System.out.print(curNode.getData() + " ");
+            if (curNode.getLeft() != null)
+                queue.offer(curNode.getLeft());
+            if (curNode.getRight() != null)
+                queue.offer(curNode.getRight());
+        }
+
+    }
+
+}
diff --git a/group17/785396327/binarytree/LRDSearchType.java b/group17/785396327/2.26/binarytree/LRDSearchType.java
similarity index 96%
rename from group17/785396327/binarytree/LRDSearchType.java
rename to group17/785396327/2.26/binarytree/LRDSearchType.java
index dbd5f1e820..250645e6df 100644
--- a/group17/785396327/binarytree/LRDSearchType.java
+++ b/group17/785396327/2.26/binarytree/LRDSearchType.java
@@ -1,15 +1,15 @@
-package binarytree;
-
-/**
- * Created by william on 2017/2/18.
- */
-public class LRDSearchType implements SearchType<BinaryTree.Node> {
-    @Override
-    public void printByType(BinaryTree.Node root) {
-        if (root != null) {
-            printByType(root.getLeft());
-            printByType(root.getRight());
-            System.out.print(root.getData() + " ");
-        }
-    }
-}
+package binarytree;
+
+/**
+ * Created by william on 2017/2/18.
+ */
+public class LRDSearchType implements SearchType<BinaryTree.Node> {
+    @Override
+    public void printByType(BinaryTree.Node root) {
+        if (root != null) {
+            printByType(root.getLeft());
+            printByType(root.getRight());
+            System.out.print(root.getData() + " ");
+        }
+    }
+}
diff --git a/group17/785396327/binarytree/SearchType.java b/group17/785396327/2.26/binarytree/SearchType.java
similarity index 93%
rename from group17/785396327/binarytree/SearchType.java
rename to group17/785396327/2.26/binarytree/SearchType.java
index 78f43d0c2d..606124a781 100644
--- a/group17/785396327/binarytree/SearchType.java
+++ b/group17/785396327/2.26/binarytree/SearchType.java
@@ -1,9 +1,9 @@
-package binarytree;
-
-/**
- * Created by william on 2017/2/18.
- */
-public interface SearchType<T> {
-
-    void printByType(T root);
-}
+package binarytree;
+
+/**
+ * Created by william on 2017/2/18.
+ */
+public interface SearchType<T> {
+
+    void printByType(T root);
+}
diff --git a/group17/785396327/2.26/list/ArrayList.java b/group17/785396327/2.26/list/ArrayList.java
new file mode 100644
index 0000000000..119079f7ce
--- /dev/null
+++ b/group17/785396327/2.26/list/ArrayList.java
@@ -0,0 +1,153 @@
+package list;
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+/**
+ * Created by william on 2017/2/25.
+ */
+public class ArrayList<T> implements List<T> {
+    private static final int DEFAULT_CAPACITY = 10;
+    private int size;
+    private Object[] elementData;
+
+    public ArrayList() {
+        elementData = new Object[DEFAULT_CAPACITY];
+    }
+
+    public ArrayList(int initialCapacity) {
+        if (initialCapacity < 0)
+            throw new RuntimeException("非法初始化大小参数!");
+        elementData = new Object[initialCapacity];
+    }
+
+    public ArrayList(T[] array) {
+        if (array == null)
+            throw new NullPointerException();
+        elementData = array;
+    }
+
+    public boolean add(T ele) {
+        grow(size);
+        elementData[size++] = ele;
+        return true;
+    }
+
+    public T get(int index) {
+        checkBounds(index);
+        return (T) elementData[index];
+    }
+
+    public T remove(int index) {
+        checkBounds(index);
+        T removeEle = (T) elementData[index];
+        System.arraycopy(elementData, index + 1, elementData, index, size - index);
+        size--;
+        return removeEle;
+    }
+
+    public boolean add(int index, T ele) {
+        checkBounds(index);
+        grow(size++);
+        //将原本数组从待插入的index截取，将原本index后的有效值，复制到原本数组index+1之后
+        System.arraycopy(elementData, index, elementData, index + 1, size - index);
+        elementData[index] = ele;
+        return true;
+    }
+
+
+    @Override
+    public boolean remove(T ele) {
+        int index;
+        if ((index = indexOf(ele)) == -1)
+            return false;
+        remove(index);
+        return true;
+    }
+
+    private void checkBounds(int index) {
+        if (index < 0 || index >= size)
+            throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
+    }
+
+    public int size() {
+        return size;
+    }
+
+    private void grow(int miniCapacity) {
+        if (miniCapacity >= elementData.length) {
+            int oldCapacity = elementData.length;
+            int newCapacity = oldCapacity + (oldCapacity >> 1) > Integer.MAX_VALUE ? Integer.MAX_VALUE : oldCapacity + (oldCapacity >> 1);
+            if (newCapacity - miniCapacity < 0)
+                newCapacity = miniCapacity > Integer.MAX_VALUE ? Integer.MAX_VALUE : miniCapacity;
+            elementData = Arrays.copyOf(elementData, newCapacity);
+        }
+    }
+
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    @Override
+    public boolean contains(T ele) {
+        return indexOf(ele) != -1;
+    }
+
+    public int indexOf(T ele) {
+        for (int i = 0; i < size; i++) {
+            if ((ele == null && elementData[i] == null) || (ele.equals(elementData[i])))
+                return i;
+        }
+        return -1;
+    }
+
+    @Override
+    public boolean addAll(List<T> l) {
+        Object[] eles = l.toArray();
+        grow(eles.length + size);
+        System.arraycopy(eles, 0, elementData, size, eles.length);
+        return true;
+    }
+
+    @Override
+    public Object[] toArray() {
+        return Arrays.copyOf(elementData, size);
+    }
+
+
+    public Iterator<T> iterator() {
+        return new Itr<T>();
+    }
+
+    private class Itr<T> implements Iterator<T> {
+        int cursor;//待遍历元素的下标
+
+        @Override
+        public boolean hasNext() {
+            return cursor != size;
+        }
+
+        @Override
+        public T next() {
+            if (cursor >= size)
+                throw new NoSuchElementException();
+            return (T) elementData[cursor++];
+        }
+
+        @Override
+        public void remove() {
+            if (cursor >= size)
+                throw new NoSuchElementException();
+            ArrayList.this.remove(cursor--);
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("[ ");
+        for (Object ele : elementData) {
+            sb.append(ele).append(" ");
+        }
+        return sb.append("]").toString();
+    }
+}
diff --git a/group17/785396327/2.26/list/Iterator.java b/group17/785396327/2.26/list/Iterator.java
new file mode 100644
index 0000000000..0df87c6cf1
--- /dev/null
+++ b/group17/785396327/2.26/list/Iterator.java
@@ -0,0 +1,13 @@
+package list;
+
+/**
+ * Created by IBM on 2017/2/25.
+ */
+public interface Iterator<T> {
+
+    boolean hasNext();
+
+    T next();
+
+    void remove();
+}
diff --git a/group17/785396327/2.26/list/LinkedList.java b/group17/785396327/2.26/list/LinkedList.java
new file mode 100644
index 0000000000..a55f723ecb
--- /dev/null
+++ b/group17/785396327/2.26/list/LinkedList.java
@@ -0,0 +1,173 @@
+package list;
+
+/**
+ * Created by william on 2017/2/25.
+ */
+public class LinkedList<T> implements List<T> {
+    private int size;
+    private Node<T> first;
+    private Node<T> last;
+
+    private static class Node<T> {
+        Node next;
+        Node prev;
+        T data;
+
+        Node(Node<T> prev, Node next, T data) {
+            this.prev = prev;
+            this.next = next;
+            this.data = data;
+        }
+    }
+
+    @Override
+    public int size() {
+        return this.size;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    @Override
+    public boolean contains(T ele) {
+        Node head = first;
+        while (head != null) {
+            if ((ele == null && head.data == null) || (ele.equals(head.data)))
+                return true;
+            head = head.next;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean add(T ele) {
+        if (first == null)
+            first = last = new Node<T>(null, null, ele);
+        else {
+            //新添加节点的上一个节点是原来链表的最后一个节点
+            Node addNode = new Node(last, null, ele);
+            //原来链表的最后一个节点的下一个节点需要指向新添加的节点
+            last.next = addNode;
+            //更新最后一个节点为新添加的节点
+            last = addNode;
+        }
+        size++;
+        return true;
+    }
+
+    @Override
+    public boolean add(int index, T ele) {
+        checkBounds(index, true);
+        if (index == size) add(ele);
+        else {
+            Node head = first;
+            for (int i = 0; i < size; i++) {
+                if (i == index - 1)//得到要插入位置的前一个节点
+                    head.next = new Node(head, head.next, ele);
+                else
+                    head = head.next;
+            }
+        }
+        size++;
+        return true;
+    }
+
+    @Override
+    public boolean remove(T ele) {
+        if (!contains(ele))
+            return false;
+        Node head = first;
+        Node prev = head.prev;
+        while (head != null) {
+            if ((ele == null && ele == head.data) || ele.equals(head.data)) {
+                prev.next = head.next;
+                size--;
+                return true;
+            }
+            prev = head;
+            head = head.next;
+        }
+        return false;
+    }
+
+    @Override
+    public T remove(int index) {
+        checkBounds(index, false);
+        T removeEle = get(index);
+        remove(removeEle);
+        return removeEle;
+    }
+
+    @Override
+    public T get(int index) {
+        checkBounds(index, false);
+        if (index > (size >> 1)) {
+            //索引位置大于1/2size，从后往前
+            Node tail = last;
+            for (int i = size - 1; i >= 0; i--) {
+                if (i == index)
+                    return (T) tail.data;
+                else
+                    tail = tail.prev;
+            }
+        } else {
+            //从前往后
+            Node head = first;
+            for (int i = 0; i < size; i++) {
+                if (i == index)
+                    return (T) head.data;
+                else
+                    head = head.next;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public int indexOf(T ele) {
+        if (first == null) return -1;
+        Node head = first;
+        for (int i = 0; i < size; i++) {
+            if ((ele == null && ele == head.data) || ele.equals(head.data))
+                return i;
+            head = head.next;
+        }
+        return -1;
+    }
+
+    @Override
+    public boolean addAll(List<T> l) {
+        return false;
+    }
+
+    @Override
+    public Object[] toArray() {
+        return new Object[0];
+    }
+
+    /**
+     * 指定位置查找元素和插入元素到指定位置IndexOutofBounds的判断标准不一样
+     *
+     * @param index
+     * @param isInsert
+     */
+    private void checkBounds(int index, boolean isInsert) {
+        if (isInsert && (index < 0 || index > size))//允许插入到最后一个元素之后，不能排除=
+            throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
+        if (index < 0 || index >= size)//查询从0 --- size-1
+            throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("[ ");
+        Node head = first;
+        while (head != null) {
+            sb.append(head.data + " ");
+            head = head.next;
+        }
+        return sb.append("]").toString();
+    }
+}
diff --git a/group17/785396327/2.26/list/List.java b/group17/785396327/2.26/list/List.java
new file mode 100644
index 0000000000..e03b4cfa7c
--- /dev/null
+++ b/group17/785396327/2.26/list/List.java
@@ -0,0 +1,30 @@
+package list;
+
+/**
+ * Created by william on 2017/2/25.
+ */
+public interface List<T> {
+
+    int size();
+
+    boolean isEmpty();
+
+    boolean contains(T ele);
+
+    boolean add(T ele);
+
+    boolean add(int index, T ele);
+
+    boolean remove(T ele);
+
+    T remove(int index);
+
+    T get(int index);
+
+    int indexOf(T ele);
+
+    boolean addAll(List<T> l);
+
+    Object[] toArray();
+
+}
diff --git a/group17/785396327/2.26/queue/Queue.java b/group17/785396327/2.26/queue/Queue.java
new file mode 100644
index 0000000000..62404a951e
--- /dev/null
+++ b/group17/785396327/2.26/queue/Queue.java
@@ -0,0 +1,43 @@
+package queue;
+
+import list.LinkedList;
+
+import java.util.NoSuchElementException;
+
+/**
+ * Created by william on 2017/2/25.
+ */
+public class Queue<T> extends LinkedList<T> {
+
+    public boolean add(T ele) {
+        return add(ele);
+    }
+
+    public T element() {
+        if (size() == 0)
+            throw new NoSuchElementException("队列中没有元素！");
+        return get(0);
+    }
+
+    public boolean offer(T ele) {
+        return add(ele);
+    }
+
+    public T peek() {
+        if (size() == 0)
+            return null;
+        return get(0);
+    }
+
+    public T poll() {
+        if (size() == 0)
+            return null;
+        return remove(0);
+    }
+
+    public T remove() {
+        if (size() == 0)
+            throw new NoSuchElementException("队列中没有元素！");
+        return remove(0);
+    }
+}
diff --git a/group17/785396327/2.26/stack/Stack.java b/group17/785396327/2.26/stack/Stack.java
new file mode 100644
index 0000000000..58efd9c0c3
--- /dev/null
+++ b/group17/785396327/2.26/stack/Stack.java
@@ -0,0 +1,31 @@
+package stack;
+
+import list.ArrayList;
+
+import java.util.EmptyStackException;
+
+/**
+ * Created by william on 2017/2/25.
+ */
+public class Stack<T> extends ArrayList {
+
+    public boolean empty() {
+        return isEmpty();
+    }
+
+    public T peek() {
+        if (size() == 0)
+            throw new EmptyStackException();
+        return (T) get(0);
+    }
+
+    public T pop() {
+        if (size() == 0)
+            throw new EmptyStackException();
+        return (T) remove(0);
+    }
+
+    public void push(T ele) {
+        add(0, ele);
+    }
+}
diff --git a/group17/785396327/3.5/array/ArrayUtils.java b/group17/785396327/3.5/array/ArrayUtils.java
new file mode 100644
index 0000000000..c98aec55dd
--- /dev/null
+++ b/group17/785396327/3.5/array/ArrayUtils.java
@@ -0,0 +1,112 @@
+package array;
+
+import list.ArrayList;
+import list.List;
+
+import java.util.Arrays;
+import java.util.InputMismatchException;
+import java.util.NoSuchElementException;
+
+
+/**
+ * Created by william on 2017/2/27.
+ */
+public class ArrayUtils {
+
+    public static void reserveArray(int[] src) {
+        int begin = 0;
+        int end = src.length - 1;
+        while (begin < end) {
+            swap(src, begin++, end--);
+        }
+    }
+
+    public static int[] removeZero(int[] oldArray) {
+        List<Integer> newResult = new ArrayList<Integer>();
+        for (int i = 0; i < oldArray.length; i++) {
+            if (oldArray[i] != 0)
+                newResult.add(oldArray[i]);
+        }
+
+        return toIntArray(newResult);
+    }
+
+    public static int[] merge(int[] array1, int[] array2) {
+        int[] temp = new int[array1.length + array2.length];
+        System.arraycopy(array1, 0, temp, 0, array1.length);
+        System.arraycopy(array2, 0, temp, array1.length, array2.length);
+        Arrays.sort(temp);
+        List<Integer> result = new ArrayList<Integer>();
+        for (int ele : temp) {
+            if (!result.contains(ele))
+                result.add(ele);
+        }
+        return toIntArray(result);
+    }
+
+    public static int[] grow(int[] oldArray, int size) {
+        if (size <= 0)
+            throw new NoSuchElementException();
+        int[] result = new int[oldArray.length + size];
+        System.arraycopy(oldArray, 0, result, 0, oldArray.length);
+        return result;
+    }
+
+    public static int[] fibonacci(int max) {
+        if (max <= 1)
+            return new int[0];
+        List<Integer> fList = new ArrayList<Integer>();
+        fList.add(1);
+        fList.add(1);
+        int last = fList.size() - 1;
+        while (fList.get(last) < max) {
+            fList.add(fList.get(last) + fList.get(last - 1));
+            last++;
+        }
+        return toIntArray(fList);
+    }
+
+    public static int[] getPrimes(int max) {
+        List<Integer> result = new ArrayList<Integer>();
+        for (int i = 0; i < max; i++) {
+            if (i % 2 == 1)
+                result.add(i);
+        }
+        return toIntArray(result);
+    }
+
+    public static int[] getPerfectNumbers(int max) {
+        List<Integer> result = new ArrayList<Integer>();
+        for (int i = 1; i <= max; i++) {
+            int sum = 0;
+            for (int j = 1; j < i / 2 + 1; j++) {
+                if (i % j == 0)
+                    sum += j;
+            }
+            if (i == sum)
+                result.add(i);
+        }
+        return toIntArray(result);
+    }
+
+    private static int[] toIntArray(List<Integer> src) {
+        int[] result = new int[src.size()];
+        for (int i = 0; i < src.size(); i++) {
+            result[i] = src.get(i);
+        }
+        return result;
+    }
+
+    public static String join(int[] array, String seperator) {
+        String value = Arrays.toString(array).replaceAll(", ", seperator == null ? "-" : seperator);
+        return value.substring(1, value.length() - 1);
+    }
+
+
+    private static void swap(int[] array, int i, int j) {
+        array[i] ^= array[j];
+        array[j] ^= array[i];
+        array[i] ^= array[j];
+    }
+
+}
diff --git a/group17/785396327/3.5/array/ArrayUtilsTest.java b/group17/785396327/3.5/array/ArrayUtilsTest.java
new file mode 100644
index 0000000000..276e840b44
--- /dev/null
+++ b/group17/785396327/3.5/array/ArrayUtilsTest.java
@@ -0,0 +1,86 @@
+package array;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Created by william on 2017/2/27.
+ */
+public class ArrayUtilsTest {
+    int[] array;
+    private static final int RANGE = 9;
+    private static final int BOUNDS = 10;
+    private static Random random = new Random();
+
+
+    @Before
+    public void setUp() {
+        array = randomArray(RANGE);
+    }
+
+    private int[] randomArray(int range) {
+        int[] array = new int[range];
+        for (int i = 0; i < range; i++) {
+            array[i] = random.nextInt(BOUNDS);
+        }
+        return array;
+    }
+
+    @Test
+    public void reverseArrayTest() {
+        System.out.println(Arrays.toString(array));
+        ArrayUtils.reserveArray(array);
+        System.out.println(Arrays.toString(array));
+    }
+
+    @Test
+    public void removeZeroTest() {
+        System.out.println(Arrays.toString(array));
+        int[] newArray = ArrayUtils.removeZero(array);
+        System.out.println(Arrays.toString(newArray));
+    }
+
+    @Test
+    public void mergeTest() {
+        System.out.println(Arrays.toString(array));
+        int[] array2 = {2, 5, 1, 6, 8};
+        int[] merge = ArrayUtils.merge(array, array2);
+        System.out.println(Arrays.toString(merge));
+    }
+
+    @Test
+    public void growTest() {
+        System.out.println(Arrays.toString(array));
+        int[] result = ArrayUtils.grow(array, 4);
+        System.out.println(Arrays.toString(result));
+    }
+
+    @Test
+    public void getPrimesTest() {
+        int[] primes = ArrayUtils.getPrimes(54);
+        System.out.println(Arrays.toString(primes));
+    }
+
+    @Test
+    public void getPerfectNumbersTest() {
+        int[] perfectNumbers = ArrayUtils.getPerfectNumbers(100000);
+        System.out.println(Arrays.toString(perfectNumbers));
+    }
+
+    @Test
+    public void joinTest() {
+        String value = ArrayUtils.join(array, "-");
+        System.out.println(value);
+    }
+
+    @Test
+    public void fibonacciTest() {
+        System.out.println(Arrays.toString(ArrayUtils.fibonacci(34)));
+    }
+
+}
diff --git a/group17/785396327/3.5/struts/LoginAction.java b/group17/785396327/3.5/struts/LoginAction.java
new file mode 100644
index 0000000000..3fc624ff90
--- /dev/null
+++ b/group17/785396327/3.5/struts/LoginAction.java
@@ -0,0 +1,39 @@
+package struts;
+
+/**
+ * Created by IBM on 2017/3/4.
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group17/785396327/3.5/struts/LoginActionTest.java b/group17/785396327/3.5/struts/LoginActionTest.java
new file mode 100644
index 0000000000..a2ce2379a5
--- /dev/null
+++ b/group17/785396327/3.5/struts/LoginActionTest.java
@@ -0,0 +1,36 @@
+package struts;
+
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by IBM on 2017/3/4.
+ */
+public class LoginActionTest {
+
+    @Test
+    public void fun1() throws DocumentException {
+        InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("struts/struts.xml");
+        SAXReader reader = new SAXReader();
+        Element rootElement = reader.read(resourceAsStream).getRootElement();
+        Element selectedElement = (Element) rootElement.selectSingleNode("//action[@name='login']");
+        System.out.println(selectedElement.attributeValue("class"));
+
+    }
+
+    @Test
+    public void fun2() {
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("name", "test");
+        parameters.put("password", "1234");
+        View view = Struts.runAction("login", parameters);
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+    }
+}
diff --git a/group17/785396327/3.5/struts/Struts.java b/group17/785396327/3.5/struts/Struts.java
new file mode 100644
index 0000000000..609c493852
--- /dev/null
+++ b/group17/785396327/3.5/struts/Struts.java
@@ -0,0 +1,88 @@
+package struts;
+
+import org.dom4j.Element;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by william on 2017/3/4.
+ */
+public class Struts {
+
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        Element root = StrutsUtils.getRoot("struts/struts.xml");
+        View view = new View();
+        if (root != null) {
+            Element selectedEle = (Element) root.selectSingleNode("//action[@name='" + actionName + "']");
+            if (selectedEle != null) {
+
+                Class clazz = genClass(selectedEle.attributeValue("class"));
+                Object target = setValue(parameters, clazz);
+
+                String result;
+                try {
+                    result = (String) clazz.getMethod("execute").invoke(target);
+                } catch (Exception e) {
+                    throw new RuntimeException("invoke execute have some error", e);
+                }
+
+                Map<String, Object> response = getValue(clazz, target);
+                view.setParameters(response);
+                Element selectedResult = (Element) root.selectSingleNode("//action[@name='" + actionName + "']//result[@name='" + result + "']");
+                view.setJsp(selectedResult == null ? null : selectedResult.getText());
+            }
+        }
+        return view;
+    }
+
+
+    private static Class genClass(String className) {
+        Class clazz = null;
+        try {
+            clazz = Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return clazz;
+    }
+
+    private static Object setValue(Map<String, String> parameters, Class clazz) {
+        try {
+            Object target = clazz.newInstance();
+            if (!StrutsUtils.isEmpty(parameters)) {
+                for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                    String key = entry.getKey();
+                    if (!StrutsUtils.isEmpty(key)) {
+                        String setterName = new StringBuilder("set").append(key.substring(0, 1).toUpperCase()).append(key.substring(1)).toString();
+                        clazz.getMethod(setterName, String.class).invoke(target, entry.getValue());
+                    }
+                }
+            }
+            return target;
+        } catch (Exception e) {
+            throw new RuntimeException("create class instance have some error ", e);
+        }
+    }
+
+    private static Map<String, Object> getValue(Class clazz, Object target) {
+        Map<String, Object> resultsMap = new HashMap<String, Object>();
+        Method[] methods = clazz.getMethods();
+        for (Method method : methods) {
+            String fieldName = method.getName();
+            if (fieldName.startsWith("get") && !fieldName.equals("getClass")) {
+                try {
+                    Object value = method.invoke(target);
+                    resultsMap.put(new StringBuilder(fieldName.substring(3, 4)).append(fieldName.substring(4)).toString(), value);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return resultsMap;
+    }
+
+
+}
diff --git a/group17/785396327/3.5/struts/StrutsUtils.java b/group17/785396327/3.5/struts/StrutsUtils.java
new file mode 100644
index 0000000000..dfe5fe614f
--- /dev/null
+++ b/group17/785396327/3.5/struts/StrutsUtils.java
@@ -0,0 +1,30 @@
+package struts;
+
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.InputStream;
+
+/**
+ * Created by IBM on 2017/3/4.
+ */
+public class StrutsUtils {
+
+    public static Element getRoot(String filePath) {
+        try {
+            InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
+            SAXReader saxReader = new SAXReader();
+            return saxReader.read(resourceAsStream).getRootElement();
+        } catch (DocumentException e) {
+            throw new RuntimeException("初始化文件异常", e);
+        }
+    }
+
+    public static boolean isEmpty(Object obj) {
+        if (obj instanceof String)
+            return obj == null || obj.equals("");
+        else
+            return obj == null;
+    }
+}
diff --git a/group17/785396327/3.5/struts/View.java b/group17/785396327/3.5/struts/View.java
new file mode 100644
index 0000000000..a02a5d1216
--- /dev/null
+++ b/group17/785396327/3.5/struts/View.java
@@ -0,0 +1,26 @@
+package struts;
+
+import java.util.Map;
+
+/**
+ * Created by IBM on 2017/3/4.
+ */
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+    public Map getParameters() {
+        return parameters;
+    }
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
diff --git a/group17/785396327/3.5/struts/struts.xml b/group17/785396327/3.5/struts/struts.xml
new file mode 100644
index 0000000000..0c69b730f3
--- /dev/null
+++ b/group17/785396327/3.5/struts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="struts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="struts.LoginAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/785396327/binarytree/BinaryTree.java b/group17/785396327/binarytree/BinaryTree.java
deleted file mode 100644
index d55c65f8e4..0000000000
--- a/group17/785396327/binarytree/BinaryTree.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package binarytree;
-
-/**
- * Created by william on 2017/2/16.
- */
-public class BinaryTree {
-    private Node root;
-
-    class Node {
-        private Node left;
-        private Node right;
-        private Comparable data;
-
-        public Node(Node left, Node right, Comparable data) {
-            this.left = left;
-            this.right = right;
-            this.data = data;
-        }
-
-        private void add(Comparable data) {
-            if (this.data.compareTo(data) >= 0)
-                if (this.left == null)
-                    this.left = new Node(null, null, data);
-                else
-                    left.add(data);
-            else if (this.data.compareTo(data) < 0)
-                if (this.right == null)
-                    this.right = new Node(null, null, data);
-                else
-                    this.right.add(data);
-        }
-
-        public Comparable getData() {
-            return this.data;
-        }
-
-        public Node getLeft() {
-            return this.left;
-        }
-
-        public Node getRight() {
-            return this.right;
-        }
-    }
-
-    public void add(Comparable data) {
-        if (this.root == null)
-            root = new Node(null, null, data);
-        else this.root.add(data);
-    }
-
-    public void printByType(SearchType<Node> type) {
-        type.printByType(this.root);
-    }
-}
diff --git a/group17/785396327/list/ArrayList.java b/group17/785396327/list/ArrayList.java
deleted file mode 100644
index f4e5f26f40..0000000000
--- a/group17/785396327/list/ArrayList.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package list;
-
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-/**
- * Created by william on 2017/2/25.
- */
-public class ArrayList<T> implements List<T> {
-    private static final int DEFAULT_CAPACITY = 10;
-    private int size;
-    private Object[] elementData;
-
-    public ArrayList() {
-        elementData = new Object[DEFAULT_CAPACITY];
-    }
-
-    public ArrayList(int initialCapacity) {
-        if (initialCapacity < 0)
-            throw new RuntimeException("非法初始化大小参数!");
-        elementData = new Object[initialCapacity];
-    }
-
-    public boolean add(T ele) {
-        grow();
-        elementData[size] = ele;
-        size++;
-        return true;
-    }
-
-    public T get(int index) {
-        checkBounds(index);
-        return (T) elementData[index];
-    }
-
-    public T remove(int index) {
-        checkBounds(index);
-        T removeEle = (T) elementData[index];
-        System.arraycopy(elementData, index + 1, elementData, index, size - index);
-        size--;
-        return removeEle;
-    }
-
-    public boolean add(int index, T ele) {
-        checkBounds(index);
-        size++;//有效元素内容先加，保证长度极限情况grow在添加前生效
-        grow();
-        //将原本数组从待插入的index截取，将原本index后的有效值，复制到原本数组index+1之后
-        System.arraycopy(elementData, index, elementData, index + 1, size - index);
-        elementData[index] = ele;
-        return true;
-    }
-
-    @Override
-    public boolean remove(T ele) {
-        int index;
-        if ((index = indexOf(ele)) == -1)
-            return false;
-        remove(index);
-        return true;
-    }
-
-    private void checkBounds(int index) {
-        if (index < 0 || index >= size)
-            throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
-    }
-
-    public int size() {
-        return size;
-    }
-
-    private void grow() {
-        if (size >= elementData.length) {
-            int curLen = elementData.length;
-            int newLen = curLen + (curLen >> 1) > Integer.MAX_VALUE ? Integer.MAX_VALUE : curLen + (curLen >> 1);
-            elementData = Arrays.copyOf(elementData, newLen);
-        }
-    }
-
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    @Override
-    public boolean contains(T ele) {
-        return indexOf(ele) != -1;
-    }
-
-    public int indexOf(T ele) {
-        for (int i = 0; i < size; i++) {
-            if (ele == null)
-                if (null == elementData[i])
-                    return i;
-                else if (ele.equals(elementData[i]))
-                    return i;
-        }
-        return -1;
-    }
-
-    public Iterator<T> iterator() {
-        return new Itr<T>();
-    }
-
-    private class Itr<T> implements Iterator<T> {
-        int cursor;//待遍历元素的下标
-
-        @Override
-        public boolean hasNext() {
-            return cursor != size;
-        }
-
-        @Override
-        public T next() {
-            if (cursor >= size)
-                throw new NoSuchElementException();
-            return (T) elementData[cursor++];
-        }
-
-        @Override
-        public void remove() {
-            if (cursor >= size)
-                throw new NoSuchElementException();
-            ArrayList.this.remove(cursor--);
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("[ ");
-        for (Object ele : elementData) {
-            sb.append(ele).append(" ");
-        }
-        return sb.append("]").toString();
-    }
-}
diff --git a/group17/785396327/list/Iterator.java b/group17/785396327/list/Iterator.java
deleted file mode 100644
index 382dbf0c84..0000000000
--- a/group17/785396327/list/Iterator.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package list;
-
-/**
- * Created by IBM on 2017/2/25.
- */
-public interface Iterator<T> {
-
-    boolean hasNext();
-
-    T next();
-
-    void remove();
-}
diff --git a/group17/785396327/list/LinkedList.java b/group17/785396327/list/LinkedList.java
deleted file mode 100644
index c0cbaf7670..0000000000
--- a/group17/785396327/list/LinkedList.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package list;
-
-/**
- * Created by william on 2017/2/25.
- */
-public class LinkedList<T> implements List<T> {
-    private int size;
-    private Node<T> first;
-    private Node<T> last;
-
-    private static class Node<T> {
-        Node next;
-        Node prev;
-        T data;
-
-        Node(Node<T> prev, Node next, T data) {
-            this.prev = prev;
-            this.next = next;
-            this.data = data;
-        }
-    }
-
-    @Override
-    public int size() {
-        return this.size;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    @Override
-    public boolean contains(T ele) {
-        Node head = first;
-        while (head != null) {
-            if ((ele == null && head.data == null) || (ele.equals(head.data)))
-                return true;
-            head = head.next;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean add(T ele) {
-        if (first == null)
-            first = last = new Node<T>(null, null, ele);
-        else {
-            //新添加节点的上一个节点是原来链表的最后一个节点
-            Node addNode = new Node(last, null, ele);
-            //原来链表的最后一个节点的下一个节点需要指向新添加的节点
-            last.next = addNode;
-            //更新最后一个节点为新添加的节点
-            last = addNode;
-        }
-        size++;
-        return true;
-    }
-
-    @Override
-    public boolean add(int index, T ele) {
-        checkBounds(index, true);
-        if (index == size) add(ele);
-        else {
-            Node head = first;
-            for (int i = 0; i < size; i++) {
-                if (i == index - 1)//得到要插入位置的前一个节点
-                    head.next = new Node(head, head.next, ele);
-                else
-                    head = head.next;
-            }
-        }
-        size++;
-        return true;
-    }
-
-    @Override
-    public boolean remove(T ele) {
-        if (!contains(ele))
-            return false;
-        Node head = first;
-        Node prev = head.prev;
-        while (head != null) {
-            if ((ele == null && ele == head.data) || ele.equals(head.data)) {
-                prev.next = head.next;
-                size--;
-                return true;
-            }
-            prev = head;
-            head = head.next;
-        }
-        return false;
-    }
-
-    @Override
-    public T remove(int index) {
-        checkBounds(index, false);
-        T removeEle = get(index);
-        remove(removeEle);
-        return removeEle;
-    }
-
-    @Override
-    public T get(int index) {
-        checkBounds(index, false);
-        if (index > (size >> 1)) {
-            //索引位置大于1/2size，从后往前
-            Node tail = last;
-            for (int i = size - 1; i >= 0; i--) {
-                if (i == index)
-                    return (T) tail.data;
-                else
-                    tail = tail.prev;
-            }
-        } else {
-            //从前往后
-            Node head = first;
-            for (int i = 0; i < size; i++) {
-                if (i == index)
-                    return (T) head.data;
-                else
-                    head = head.next;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public int indexOf(T ele) {
-        if (first == null) return -1;
-        Node head = first;
-        for (int i = 0; i < size; i++) {
-            if ((ele == null && ele == head.data) || ele.equals(head.data))
-                return i;
-            head = head.next;
-        }
-        return -1;
-    }
-
-    /**
-     * 指定位置查找元素和插入元素到指定位置IndexOutofBounds的判断标准不一样
-     *
-     * @param index
-     * @param isInsert
-     */
-    private void checkBounds(int index, boolean isInsert) {
-        if (isInsert && (index < 0 || index > size))//允许插入到最后一个元素之后，不能排除=
-            throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
-        if (index < 0 || index >= size)//查询从0 --- size-1
-            throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("[ ");
-        Node head = first;
-        while (head != null) {
-            sb.append(head.data + " ");
-            head = head.next;
-        }
-        return sb.append("]").toString();
-    }
-}
diff --git a/group17/785396327/list/List.java b/group17/785396327/list/List.java
deleted file mode 100644
index 54fb72108d..0000000000
--- a/group17/785396327/list/List.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package list;
-
-/**
- * Created by william on 2017/2/25.
- */
-public interface List<T> {
-
-    int size();
-
-    boolean isEmpty();
-
-    boolean contains(T ele);
-
-    boolean add(T ele);
-
-    boolean add(int index, T ele);
-
-    boolean remove(T ele);
-
-    T remove(int index);
-
-    T get(int index);
-
-    int indexOf(T ele);
-}
diff --git a/group17/785396327/queue/Queue.java b/group17/785396327/queue/Queue.java
deleted file mode 100644
index 7e399961ed..0000000000
--- a/group17/785396327/queue/Queue.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package queue;
-
-import java.util.NoSuchElementException;
-
-/**
- * Created by william on 2017/2/25.
- */
-public class Queue<T> extends LinkedList<T> {
-
-    public boolean add(T ele) {
-        return add(ele);
-    }
-
-    public T element() {
-        if (size() == 0)
-            throw new NoSuchElementException("队列中没有元素！");
-        return get(0);
-    }
-
-    public boolean offer(T ele) {
-        return add(ele);
-    }
-
-    public T peek() {
-        if (size() == 0)
-            return null;
-        return get(0);
-    }
-
-    public T poll() {
-        if (size() == 0)
-            return null;
-        return remove(0);
-    }
-
-    public T remove() {
-        if (size() == 0)
-            throw new NoSuchElementException("队列中没有元素！");
-        return remove(0);
-    }
-}
diff --git a/group17/785396327/stack/Stack.java b/group17/785396327/stack/Stack.java
deleted file mode 100644
index 980ca2c0e6..0000000000
--- a/group17/785396327/stack/Stack.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package stack;
-
-import java.util.EmptyStackException;
-
-/**
- * Created by william on 2017/2/25.
- */
-public class Stack<T> extends ArrayList {
-
-    public boolean empty() {
-        return isEmpty();
-    }
-
-    public T peek() {
-        if (size() == 0)
-            throw new EmptyStackException();
-        return (T) get(0);
-    }
-
-    public T pop() {
-        if (size() == 0)
-            throw new EmptyStackException();
-        return (T) remove(0);
-    }
-
-    public void push(T ele) {
-        add(0, ele);
-    }
-}
diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore
index ccfa635638..2d0da18be3 100644
--- a/group17/82427129/.gitignore
+++ b/group17/82427129/.gitignore
@@ -1,7 +1,16 @@
+
 /.metadata/
-/RemoteSystemsTempFiles/
+
+/RemoteSystemsTempFiles/
+
+
+
+/JavaUtil/.settings/
+
+/JavaUtil/target/
+
 
-/JavaUtil/.settings/
 
 .classpath
+
 .project
diff --git a/group17/82427129/JavaUtil/.gitignore b/group17/82427129/JavaUtil/.gitignore
deleted file mode 100644
index 24d64373c4..0000000000
--- a/group17/82427129/JavaUtil/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/group17/82427129/JavaUtil/pom.xml b/group17/82427129/JavaUtil/pom.xml
index 6c95dbb077..fb857bcd00 100644
--- a/group17/82427129/JavaUtil/pom.xml
+++ b/group17/82427129/JavaUtil/pom.xml
@@ -23,5 +23,10 @@
 			<version>4.7</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>1.6.1</version>
+		</dependency>
 	</dependencies>
 </project>
\ No newline at end of file
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..00ec1757ba
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,343 @@
+package com.coderising.array;
+
+import java.util.Arrays;
+
+import com.coding.basic.ArrayList;
+import com.coding.basic.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray(int[] origin){
+		int length = origin.length;
+		if(length <= 1)
+			return origin;
+		
+		int[] newArray = new int[length];
+		for (int i = 0; i < length; i++) {
+			newArray[i] = origin[length-i-1];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		int length = oldArray.length;
+		if(length == 0)
+			return oldArray;
+		
+		int[] newArray = new int[length];
+		int oi = 0;
+		int ni = 0;
+		while(oi < length){
+			if(oldArray[oi] == 0){
+				oi++;
+			}else{
+				newArray[ni++] = oldArray[oi++];
+			}
+		}
+		if(ni == 0)
+			return null;//输入的数组全部都是0时
+		if(ni == length)
+			return newArray;//输入的数组不含0时，不需要截取
+		
+		return Arrays.copyOf(newArray, ni);
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public static int[] merge(int[] array1, int[] array2){//时间复杂度O(n)
+		int length1 = array1.length;
+		int length2 = array2.length;
+		if(length1 == 0 ||(length1 == 0 && length2 ==0)){
+			return array2;
+		}
+		if(length2 == 0){
+			return array1;
+		}
+		
+		int i1 = 0;//始终指向array1中剩余的最小元素
+		int i2 = 0;//始终指向array2中剩余的最小元素
+		ArrayList stack = new ArrayList();//“过去的”最小值放入栈中
+		
+		while (i1 < length1 || i2 < length2){//判定，只要还有一个数组中有未入栈元素
+			if(i1 == length1){//判定，array1元素都已经入栈
+				stack.add(array2[i2++]);
+				continue;
+			}
+			if(i2 == length2){//判定，array2元素都已经入栈
+				stack.add(array1[i1++]);
+				continue;
+			}
+			
+			int comRes = compare(array1[i1], array2[i2]);
+			if(comRes > 0){
+				stack.add(array2[i2++]);
+			}else if(comRes <0){
+				stack.add(array1[i1++]);
+			}else{
+				stack.add(array1[i1]);
+				i1++;
+				i2++;
+			}
+		}
+		
+		int[] result = new int[stack.size()];
+		for (int i = 0; i < stack.size(); i++) {
+			result[i] = (int) stack.get(i);
+		}
+		return result;
+	}
+	/**
+	 * when i < j returns -1;
+	 * when i = j returns 0;
+	 * when i > j returns 1;
+	 * @param i
+	 * @param j
+	 * @return
+	 */
+	private static int compare(int i, int j){
+		if(i < j){
+			return -1;
+		}else if(i == j){
+			return 0;
+		}else{
+			return 1;
+		}
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if(max <= 1)
+			return new int[0];
+		
+		ArrayList l = new ArrayList();
+		for (int i = 0; max>fibonacciNum(i); i++) {
+			l.add(fibonacciNum(i));
+		}
+		
+		int[] result = new int[l.size()];
+		for (int i = 0; i < l.size(); i++) {
+			result[i] = (int) l.get(i);
+		}
+		return result;
+	}
+	/**
+	 * 私有方法
+	 * 根据 斐波那契数列 
+	 * 通过下标获取数列元素
+	 * 
+	 * 例如 [1，1，2，3，5，8，13，...]  fibonacciNum(1) = 1,fibonacciNum(4) = 3
+	 * @param index 下标
+	 * @return 斐波那契数列元素
+	 */
+	private static int fibonacciNum(int index){
+		if(index < 0 )
+			throw new IndexOutOfBoundsException("下标越界，index>=0");
+		
+		if(index == 0||index == 1)
+			return 1;
+		return fibonacciNum(index-1)+fibonacciNum(index-2);
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		if(max<2)
+			return new int[0];
+		
+		ArrayList list = new ArrayList();
+		for (int i = 0; i < max; i++) {
+			if(isPrimeNum(i))
+				list.add(i);
+		}
+		
+		int[] result = new int[list.size()];
+		for (int i = 0; i < result.length; i++) {
+			result[i] = (int) list.get(i);
+		}
+		return result;
+	}
+	/**
+	 * 判断一个整数是否是质数
+	 * @param num
+	 * @return
+	 */
+	private static boolean isPrimeNum(int num){
+		if(num < 2)//质数都是正数，并且大于等于2
+			return false;
+		
+		for (int i = 2; i <= Math.sqrt(num); i++) {
+			if(num % i ==0){
+				return false;
+			}
+		}
+		return true;
+		
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max){
+		ArrayList list = new ArrayList();
+		for (int i = 6; i < max; i++) {
+			if(isPerfectNumber(i))
+				list.add(i);
+		}
+		
+		int[] result = new int[list.size()];
+		for (int i = 0; i < result.length; i++) {
+			result[i] = (int) list.get(i);
+		}
+		return result;
+	}
+	/**
+	 * 判断一个整数是否是完数
+	 *  
+	 * 因为所有的完数都是三角形数，所有我们通过遍历三角形数判断，如果是三角形数，再判断是否所有因子的积为这个整数
+	 * @param num
+	 * @return
+	 */
+	private static boolean isPerfectNumber(int num){
+		if(num < 6)// the first perfect number is 6
+			return false;
+		if(!isEndWith6or8(num))//perfect number is only end with 6 or 8
+			return false;
+		
+		/*if(!isTriangularNumber(num))
+			return false;*/
+		
+		List list = new ArrayList();
+		
+		double sqr = Math.sqrt(num);
+		list.add(1);
+		for (int i = 2; i <= sqr; i++) {
+			if(num % i == 0){
+				list.add(num/i);
+				list.add(i);
+			}
+			if(i == sqr){
+				list.add(i);
+				break;
+			}
+		}
+		int sum = 0;
+		for (int i = 0; i < list.size(); i++) {
+			Integer in = (Integer) list.get(i);
+			sum += in;
+		}
+		if(sum == num)
+			return true;
+		else
+			return false;
+	}
+	
+	private static boolean isEndWith6or8(int num){
+		if(num == 6)
+			return true;
+		
+		Integer integer = new Integer(num);
+		String string = integer.toString();
+		String lastIndex = string.substring(string.length()-1);
+		if(lastIndex.equals("6") || lastIndex.equals("8"))
+			return true;
+		else
+			return false;
+	}
+	private static boolean isTriangularNumber(int num){
+		if(num < 1 )
+			return false;
+		
+		int i = 0;
+		while(triangularNumber(i)<=num){
+			if(triangularNumber(i)==num)
+				return true;
+			i++;
+		}
+		
+		return false;
+	}
+	/**
+	 * 获取三角形数，从数列中获取。
+	 * [1,3,6,10,...] 下标从0开始，例如triangularNumber(0) = 1,triangularNumber(1) = 3,triangularNumber(2)=6
+	 * @param index
+	 * @return
+	 */
+	private static int triangularNumber(int index){
+		if(index < 0)
+			throw new IndexOutOfBoundsException("下标越界，index>=0");
+		if(index == 0)
+			return 1;
+		return triangularNumber(index-1)+index+1;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		if(array == null)
+			return null;
+		if(array.length == 0)
+			return "";
+		
+		String result = String.valueOf(array[0]);
+		for (int i = 1; i < array.length; i++) {
+			result += seperator + array[i];
+		}
+		return result;
+	}
+	
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..1005f35a29
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..b63cca0b77
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,149 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+	private static SAXReader reader = new SAXReader();
+	private static Document document;
+	private static Element root;
+	private static List<Element> actionList;
+	static{
+		try {
+			document = reader.read(new File("src/main/resources/liteStruts.xml"));
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+		root = document.getRootElement();
+		actionList = root.elements("action");
+	}
+	
+	/*
+	0. 读取配置文件struts.xml
+	
+	1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+	据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+	("name"="test" ,  "password"="1234") ,     	
+	那就应该调用 setName和setPassword方法
+	
+	2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+	
+	3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+	通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+	放到View对象的parameters
+	
+	4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+	放到View对象的jsp字段中。
+	 */
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+    	if(actionName == null || actionName.equals("")){
+    		System.out.println("请求名为空，错误！");
+    		return null;
+    	}
+    	
+    	View view = new View();
+    	
+    	String className = null;
+		try {
+			Map<String, String> actionInfo = getActionInfo(actionName);
+			
+			className = actionInfo.get("className");
+			Class<?> actionClass = Class.forName(className);
+			Object obj =actionClass.newInstance();
+			for(Map.Entry<String, String> entry : parameters.entrySet()){
+				Method setMethod = actionClass.getDeclaredMethod(("set"+toUpperCaseFirstLetter(entry.getKey())), String.class);
+				setMethod.invoke(obj, entry.getValue());
+			}
+			Method execute = actionClass.getDeclaredMethod("execute");
+			String msg = (String) execute.invoke(obj);
+			view.setJsp(actionInfo.get(msg));
+			
+			Method[] m = actionClass.getMethods();
+			Map<String,Object> map = new HashMap<String, Object>();
+			for (Method method : m) {
+				String methodName = method.getName();
+				if(methodName.startsWith("get")
+						&& !methodName.endsWith("Class")
+						&& method.getParameterTypes().length == 0){
+					map.put(toSubString_LowerCaseFirstLetter(methodName), method.invoke(obj));
+				}
+			}
+			view.setParameters(map);
+			
+			return view;
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		}
+    	
+    	return null;
+    }
+    private static Map<String,String> getActionInfo(String actionName){
+    	
+    	HashMap<String, String> hashMap = new HashMap<String,String>();
+    	
+		for (Element action : actionList) {
+			Attribute attr = action.attribute("name");
+			if(actionName.equals(attr.getStringValue())){
+				Attribute attrClass = action.attribute("class");
+				String className = attrClass.getStringValue();
+				hashMap.put("className", className);
+				
+				@SuppressWarnings("unchecked")
+				List<Element> resultList = action.elements("result");
+				for (Element result : resultList) {
+					Attribute attrResult = result.attribute("name");
+					hashMap.put(attrResult.getStringValue(), result.getText());
+				}
+				break;
+			}
+		}
+		return hashMap;
+    }
+    
+    /**
+     * return a String upcased the first letter
+     * @param param
+     * @return
+     */
+    private static String toUpperCaseFirstLetter(String param){
+    	if(param == null || param.length() == 0)
+    		return "";
+    	if(param.length() == 1)
+    		return param.substring(0, 1).toUpperCase();
+    	
+    	return param.substring(0, 1).toUpperCase()+param.substring(1);
+    }
+    private static String toSubString_LowerCaseFirstLetter(String param){
+    	if(!param.startsWith("get"))
+    		return null;
+    	int length = param.length();
+    	if(length < 4)
+    		return "";
+    	
+    	param = param.substring(3);
+    	return param.substring(0, 1).toLowerCase()+param.substring(1);
+    }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..41b10d8a68
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<String,Object> parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map<String,Object> getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map<String,Object> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java
index d9f3d217f5..2a1a99bc9d 100644
--- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java
+++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java
@@ -2,7 +2,7 @@
 
 import java.util.Arrays;
 
-public class ArrayList implements List {
+public class ArrayList<E> implements List<E> {
 	
 	private int size = 0;
 	
@@ -35,34 +35,48 @@ public void add(int index, Object o){
 	}
 	
 	public Object set(int index, Object o){
-		rangeCheck(index);
+		elementIndexCheck(index);
 		
 		Object oldValue = elementData[index];
 		elementData[index] = o;
 		return oldValue;
 	}
 	
-	public Object get(int index){
-		rangeCheck(index);
-		return elementData[index];
+	public E get(int index){
+		elementIndexCheck(index);
+		return elementData(index);
 	}
 	
-	public Object remove(int index){
-		rangeCheck(index);
-		Object oldValue = elementData[index];
+	@SuppressWarnings("unchecked")
+	E elementData(int index){
+		return (E) elementData[index];
+	}
+	
+	public E remove(int index){
+		elementIndexCheck(index);
+		E oldValue = elementData(index);
 		int movedLength = size - index - 1;
-		if(movedLength > 0)//��Ҫɾ�����һ��Ԫ��ʱ������Ҫ�ƶ����飬ֻ��Ҫ�����һ��Ԫ����null
+		if(movedLength > 0)//当要删除最后一个元素时，不需要移动数组，只需要把最后一个元素置null
 			System.arraycopy(elementData, index+1, elementData, index, size-index-1);
 		elementData[--size] = null;
 		return oldValue;
 	}
-	
+	/**
+	 * range check,
+	 * permit the range [0,size]
+	 * @param index
+	 */
 	private void rangeCheckForAdd(int index){
 		if( index > size || index<0 ){
 			throw new IndexOutOfBoundsException(outofIndex(index));
 		}
 	}
-	private void rangeCheck(int index){
+	/**
+	 * element's index check,
+	 * permit the index [0,size)
+	 * @param index
+	 */
+	private void elementIndexCheck(int index){
 		if( index >= size || index < 0){
 			throw new IndexOutOfBoundsException(outofIndex(index));
 		}
@@ -78,7 +92,7 @@ public Iterator iterator(){
 	
 	private void ensureCapacity(int minCapacity){
 		if(elementData == EMPTY_ELEMENTDATA){
-			minCapacity = Math.max(minCapacity, INITIALCAPACITY);//���addall�״����ӵ������ͱ�INITIALCAPACITY��
+			minCapacity = Math.max(minCapacity, INITIALCAPACITY);//针对addall首次增加的数量就比INITIALCAPACITY多
 		}
 		if(minCapacity - elementData.length > 0){
 			grow(minCapacity);
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java
index 06ef6311b2..dbe8b9afb2 100644
--- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java
+++ b/group17/82427129/JavaUtil/src/main/java/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/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java
index 2a63eee0fc..f9934963e7 100644
--- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java
+++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java
@@ -2,17 +2,17 @@
 
 import java.util.NoSuchElementException;
 
-public class LinkedList implements List {
+public class LinkedList<E> implements List<E> {
 	private int size = 0;
 	
-	private Node first;
+	private Node<E> first;
 	
-	private Node last;
+	private Node<E> last;
 	
-	public void add(Object o){
+	public void add(E o){
 		add(size,o);
 	}
-	public void add(int index , Object o){
+	public void add(int index , E o){
 		rangeCheck(index);
 		
 		if(index == size){
@@ -21,9 +21,9 @@ public void add(int index , Object o){
 			linkBefore(o, indexOf(index));
 		}
 	}
-	private void linkBefore(Object o ,Node succ){
-		final Node prev = succ.prev;
-		final Node newNode = new Node(prev, o, succ);
+	private void linkBefore(E o ,Node<E> succ){
+		final Node<E> prev = succ.prev;
+		final Node<E> newNode = new Node<E>(prev, o, succ);
 		succ.prev = newNode;
 		if(prev == null){
 			first = newNode;
@@ -32,9 +32,9 @@ private void linkBefore(Object o ,Node succ){
 		}
 		size++;
 	}
-	private void linkLast(Object o){
-		final Node succ = last;
-		final Node newNode = new Node(succ, o, null);
+	private void linkLast(E o){
+		final Node<E> succ = last;
+		final Node<E> newNode = new Node<E>(succ, o, null);
 		last = newNode;
 		if(succ == null){
 			first = newNode;
@@ -43,29 +43,38 @@ private void linkLast(Object o){
 		}
 		size++;
 	}
+	/**
+	 * range check,
+	 * permit the range [0,size]
+	 * @param index
+	 */
 	private void rangeCheck(int index) {
 		if(index > size|| index < 0 )
 			throw new IndexOutOfBoundsException("Size"+size+":index"+index);
 	}
+	/**
+	 * element's index check,
+	 * permit the index [0,size)
+	 * @param index
+	 */
 	private void elementIndexCheck(int index){
 		if(index >=size||index < 0)
 			throw new IndexOutOfBoundsException("Size"+size+":index"+index);
 	}
 	/**
-	 * ��ȡ���±ꡱΪindex��ֵ,
-	 * indexΪsizeʱ����null
+	 * 
 	 * @param index
 	 * @return
 	 */
-	private Node indexOf(int index){
+	private Node<E> indexOf(int index){
 		if(index < (this.size>>1) ){
-			Node x = first;
+			Node<E> x = first;
 			for (int i = 0; i < index; i++) {
 				x = x.next;
 			}
 			return x;
 		}else{
-			Node x = last;
+			Node<E> x = last;
 			for (int i = this.size-1; i > index; i--) {
 				x = x.prev;
 			}
@@ -73,12 +82,12 @@ private Node indexOf(int index){
 		}
 	}
 
-	public Object get(int index){
+	public E get(int index){
 		elementIndexCheck(index);
 		
-		return indexOf(index);
+		return indexOf(index).data;
 	}
-	public Object remove(int index){
+	public E remove(int index){
 		elementIndexCheck(index);
 		
 		if(index == 0){
@@ -90,10 +99,10 @@ public Object remove(int index){
 		}
 	}
 	
-	private Object unlinkNode(Node node) {
-		final Node next = node.next;
-		final Node prev = node.prev;
-		final Object element = node.data;
+	private E unlinkNode(Node<E> node) {
+		final Node<E> next = node.next;
+		final Node<E> prev = node.prev;
+		final E element = node.data;
 		if(next == null){
 			last = node;
 		}else{
@@ -115,20 +124,20 @@ public int size(){
 		return size;
 	}
 	
-	public void addFirst(Object o){
+	public void addFirst(E o){
 		linkBefore(o, first);
 	}
 	
-	public void addLast(Object o){
+	public void addLast(E o){
 		linkLast(o);
 	}
 	
-	public Object removeFirst(){
+	public E removeFirst(){
 		if(first == null)
 			throw new NoSuchElementException("first is null");
 		
-		Object oldData = first.data;
-		final Node next = first.next;
+		E oldData = first.data;
+		final Node<E> next = first.next;
 		first.data = null;
 		first.next = null;//GC
 		first = next;
@@ -143,12 +152,12 @@ public Object removeFirst(){
 		return oldData;
 	}
 	
-	public Object removeLast(){
+	public E removeLast(){
 		if(last == null)
 			throw new NoSuchElementException("last is null");
 		
-		Object oldData = last.data;
-		final Node prev = last.prev;
+		E oldData = last.data;
+		final Node<E> prev = last.prev;
 		last.prev = null;
 		last.data = null;//GC
 		last = prev;
@@ -167,11 +176,11 @@ public Iterator iterator(){
 		return null;
 	}
 	
-	private static class Node{
-		Object data;
-		Node next;
-		Node prev;
-		Node(Node prev,Object data,Node next){
+	private static class Node<E>{
+		E data;
+		Node<E> next;
+		Node<E> prev;
+		Node(Node<E> prev,E data,Node<E> next){
 			this.data = data;
 			this.next = next;
 			this.prev = prev;
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java
index 10d13b5832..e79d164654 100644
--- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java
+++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java
@@ -1,9 +1,25 @@
-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;
+
+/**
+ * 代码进行了多次重构，按照JDK源码的思路进行编写，<br/>
+ * <br/>
+ * 重点1：rangeCheck和elementIndexCheck 完全管理了所有的Index的检测工作，这一点就 省去了其他地方关于下标是否越界的检测<br/>
+ * <br/>
+ * 重点2：arrayList的elementData(int i)以及LinkedList的node(int i)方法通过重构统一了通过下标获取元素的操作<br/>
+ * 
+ * @author Walker
+ *
+ * @param <E>
+ */
+public interface List<E> {
+	
+	void add(E o);
+	
+	void add(int index, E o);
+	
+	Object get(int index);
+	
+	Object remove(int index);
+	
+	int size();
+}
diff --git a/group17/82427129/JavaUtil/src/main/resources/liteStruts.xml b/group17/82427129/JavaUtil/src/main/resources/liteStruts.xml
new file mode 100644
index 0000000000..a4ca47c733
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/resources/liteStruts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..4401629b5d
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,80 @@
+package com.coderising.array;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] a = {7, 9 , 30, 3};
+		int[] ra = {3, 30, 9,7};
+		int[] reverseArray = ArrayUtil.reverseArray(a);
+		Assert.assertArrayEquals(ra, reverseArray);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5};
+		Assert.assertArrayEquals(newArr, ArrayUtil.removeZero(oldArr));
+	}
+
+	@Test
+	public void testMerge() {
+		int[] a1 = {3,5,7,8};
+		int[] a2 = {4,5,6,7};
+		int[] a3 = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(a3, ArrayUtil.merge(a1, a2));
+	}
+
+	@Test
+	public void testGrow() {
+		int[] oldArray = {2,3,6};
+		int[] newArray = {2,3,6,0,0,0,0};
+		Assert.assertArrayEquals(newArray, ArrayUtil.grow(oldArray, 4));
+	}
+
+	@Test
+	public void testFibonacci() {
+		int max = 15;
+		int[] fibonacci = ArrayUtil.fibonacci(max);
+		int[] f = {1,1,2,3,5,8,13};
+		Assert.assertArrayEquals(f, fibonacci);
+	}
+
+	@Test
+	public void testGetPrimes() {
+		int max = 23;
+		int[] primes = ArrayUtil.getPrimes(max);
+		int[] expecteds = {2,3,5,7,11,13,17,19};
+		Assert.assertArrayEquals(expecteds, primes);
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		int max = 8129;
+		int[] perfectNumbers = ArrayUtil.getPerfectNumbers(max);
+		int[] expected = {6,28,496,8128};
+		Assert.assertArrayEquals(expected, perfectNumbers);
+	}
+
+	@Test
+	public void testJoin() {
+		int[] array = {3,8,9};
+		String sep = "-";
+		String join = ArrayUtil.join(array, sep);
+		Assert.assertEquals("3-8-9", join);
+	}
+
+}
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..a44c1878ac
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java
new file mode 100644
index 0000000000..19ce5fbbd8
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java
@@ -0,0 +1,64 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayListTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testArrayList() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testArrayListInt() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testAddObject() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testAddIntObject() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testSet() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testGet() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testRemove() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testSize() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testIterator() {
+		fail("Not yet implemented");
+	}
+
+}
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java
new file mode 100644
index 0000000000..6020e772c9
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java
@@ -0,0 +1,81 @@
+package com.coding.basic;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LinkedListTest {
+	private LinkedList<Integer> list;
+
+	@Before
+	public void setUp() throws Exception {
+		list = new LinkedList<Integer>();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		list = null;
+	}
+
+	@Test
+	public void testAddObject() {
+		list.add(100);
+		Assert.assertEquals(1, list.size());
+		list.add(100);
+		Assert.assertEquals(2, list.size());
+		list.add(100);
+		Assert.assertEquals(3, list.size());
+	}
+
+	@Test
+	public void testAddIntObject() {
+		for (int i = 0; i < 5; i++) {
+			list.add(i, i);
+		}
+		Assert.assertEquals(5, list.size());
+	}
+
+	@Test
+	public void testGet() {
+		
+	}
+
+	@Test
+	public void testRemove() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testSize() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testAddFirst() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testAddLast() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testRemoveFirst() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testRemoveLast() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testIterator() {
+		fail("Not yet implemented");
+	}
+
+}
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java
new file mode 100644
index 0000000000..572907fd34
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java
@@ -0,0 +1,14 @@
+package com.coding.basic;
+
+public class Test {
+	public static void main(String[] args) {
+		System.out.println(new A().e == new A().e);
+	}
+}
+class A{
+	public A() {
+		e = E;
+	}
+	Object[] e;
+	static Object[] E = {};
+}
diff --git a/group17/article/20170226-20170305.md b/group17/article/20170226-20170305.md
new file mode 100644
index 0000000000..77e9b85142
--- /dev/null
+++ b/group17/article/20170226-20170305.md
@@ -0,0 +1,56 @@
+# 自由写作
+
+## 须知
+---
+
+交作业时请在QQ 号后面填上各自的文章链接, 比如:
+
+51075907 http://m.blog.csdn.net/article/details?id=57083764
+
+## 文章
+---
+
+1204187480
+
+102228177  
+
+876385982 
+
+785396327
+
+1059107701
+
+240094626
+
+82427129 
+
+296910598
+
+1264835468 http://www.jianshu.com/p/634ca8cdd6e3
+
+516886559
+
+1282579502 https://www.evernote.com/shard/s413/sh/142601dd-edc3-4e37-871e-37a7489d7634/a092bf080e1aefbaeab96d34edac8cf0
+
+614982500
+
+865797761
+
+1540186032  
+
+176653813
+
+116665530
+
+51075907 
+
+1158154002
+
+345450234
+
+919764878
+
+1368331120
+
+517970312
+
diff --git a/group17/article/template.md b/group17/article/template.md
new file mode 100644
index 0000000000..d92ffef426
--- /dev/null
+++ b/group17/article/template.md
@@ -0,0 +1,56 @@
+# XXXX
+
+## 须知
+---
+
+交作业时请在QQ 号后面填上各自的文章链接, 比如:
+
+51075907 http://m.blog.csdn.net/article/details?id=57083764
+
+## 文章
+---
+
+1204187480
+
+102228177  
+
+876385982 
+
+785396327
+
+1059107701
+
+240094626
+
+82427129 
+
+296910598
+
+1264835468 
+
+516886559
+
+1282579502
+
+614982500
+
+865797761
+
+1540186032  
+
+176653813
+
+116665530
+
+51075907 
+
+1158154002
+
+345450234
+
+919764878
+
+1368331120
+
+517970312
+
diff --git "a/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" "b/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md"
index 4e6e0b6b1b..df34ed9d6d 100644
--- "a/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md"	
+++ "b/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md"	
@@ -13,6 +13,7 @@
 1204187480
 
 102228177  http://note.youdao.com/noteshare?id=74a51e7f93461dfb77c69a1cf4755624&sub=004F10FA5D2046ABAA060F19C0D2A18F
+           http://note.youdao.com/noteshare?id=6d117ad0ead79eafee2a5308c00d6a3a
 
 876385982 http://www.totoro-fly.com/?p=59
 
@@ -20,9 +21,9 @@
 
 1059107701
 
-240094626
+240094626  http://note.youdao.com/noteshare?id=d129c169ed611f6099b96e8e0f3f5c51
 
-82427129 http://blog.csdn.net/walk_er/article/details/57406278
+82427129 http://blog.csdn.net/walk_er/article/details/57406278 ;http://blog.csdn.net/walk_er/article/details/60475450
 
 296910598
 
@@ -30,7 +31,7 @@
 
 516886559
 
-1282579502 https://www.evernote.com/shard/s413/sh/3af5f6a4-a580-4a49-b63c-90f5b178aca4/7cf052e3789c862e38d6d6b3cce1ceed  
+1282579502 (文章1）https://www.evernote.com/shard/s413/sh/3af5f6a4-a580-4a49-b63c-90f5b178aca4/7cf052e3789c862e38d6d6b3cce1ceed （文章2）https://www.evernote.com/shard/s413/sh/142601dd-edc3-4e37-871e-37a7489d7634/a092bf080e1aefbaeab96d34edac8cf0
 
 614982500
 
@@ -53,4 +54,3 @@
 1368331120
 
 517970312
-
diff --git a/group17/count/homework.md b/group17/count/homework.md
new file mode 100644
index 0000000000..c37e964c5e
--- /dev/null
+++ b/group17/count/homework.md
@@ -0,0 +1,21 @@
+# 作业统计
+
+## 须知
+---
+
+日期下面的链接是每次作业的统计, 大家作业完成后点击链接即可进入文档页面填写.
+
+## 文档
+---
+
+### 20170219-20170226
+
+[文章统计](https://github.com/luoziyihao/coding2017/blob/master/group17/article/%E5%86%99%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E4%BB%8B%E7%BB%8Dcpu%2C%20%E5%86%85%E5%AD%98%2C%20%E7%A3%81%E7%9B%98%2C%20%E6%8C%87%E4%BB%A4%E4%BB%A5%E5%8F%8A%E4%BB%96%E4%BB%AC%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB_20170226.md) 
+
+[作业统计](https://shimo.im/sheet/LQaZ3eVFgZYh8c1X/「第17组作业完成情况_2017...0226」) 
+
+### 20170226-20170205
+
+[文章统计](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170226-20170305.md) 
+
+[作业统计](https://shimo.im/sheet/8T7YWAlIJpg6apn6/「第17组作业完成情况_2017...0305」) 
diff --git a/group19/1294642551/src/arrayTests/ArrayUtil.java b/group19/1294642551/src/arrayTests/ArrayUtil.java
new file mode 100644
index 0000000000..a9f23394e9
--- /dev/null
+++ b/group19/1294642551/src/arrayTests/ArrayUtil.java
@@ -0,0 +1,270 @@
+package arrayTests;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.TreeSet;
+
+public class ArrayUtil {
+	
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û�
+		���磺 a = [7, 9 , 30, 3]  ,   �û���Ϊ [3, 30, 9,7]
+		���     a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public int[] reverseArray(int[] origin){
+		
+		int len = origin.length;
+		int[] arr = new int[len];
+		
+		for(int i = 0; i < len; i++)
+		{
+			arr[i] = origin[ len -1 - i];
+		}
+		
+		return arr;
+	}
+	
+	/**
+	 * ���������µ�һ�����飺   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ��   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		
+		ArrayList<Integer> al = new ArrayList<Integer>();
+		
+		int len = oldArray.length;
+		for(int i = 0; i < len; i++)
+		{
+			if(oldArray[i] != 0)
+			{
+				al.add(oldArray[i]);
+			}
+		}
+		
+		int arrLen = al.size();
+		int[] arr = new int[arrLen];
+		for(int i = 0; i < arrLen; i++)
+		{
+			arr[i] = al.get(i);
+		}
+		
+		return arr;
+		
+
+	}
+
+	/**
+	 * ���������Ѿ�����õ��������飬 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){
+		TreeSet<Integer> tr = new TreeSet<Integer>();
+		for(int i = 0; i < array1.length; i++)
+		{
+			tr.add(array1[i]);
+		}
+		for(int j = 0; j < array2.length; j++)
+		{
+			tr.add(array2[j]);
+		}
+		
+		int arrLen = tr.size();
+		int[] arr = new int[arrLen];
+		int index = 0;
+		
+		Iterator it = tr.iterator();
+		while(it.hasNext())
+		{
+			arr[index] = (int) it.next();
+			index++;
+		}
+		
+		return  arr;
+	}
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ����
+	 * ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		
+		int len = oldArray.length;
+		int arrLen = len + size;
+		int[] arr = new int[arrLen];
+		
+		for(int i = 0; i < arrLen; i++)
+		{
+			if (i < len)
+				arr[i] = oldArray[i];
+			else
+				arr[i] = 0;
+		}
+		
+		return arr;
+		
+	}
+	
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21......  ������һ�����ֵ�� ����С�ڸ�ֵ������
+	 * ���磬 max = 15 , �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13]
+	 * max = 1, �򷵻ؿ����� []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		
+		ArrayList<Integer> al = new ArrayList<Integer>();
+		int first = 1;
+		int second = 1;
+		int value = 0;
+		if(max >= 2)
+		{
+			al.add(first);
+			al.add(second);
+		}
+		do
+		{
+			value = first + second;
+			if(value < max)
+			{
+				al.add(value);
+				first = second;
+				second = value;
+			}
+		}while(value < max);
+		
+		int arrLen = al.size();
+		int[] arr = new int[arrLen];
+		for(int i = 0; i < arrLen; i++)
+		{
+			arr[i] = al.get(i);
+		}
+		
+		return arr;
+		
+	}
+	
+	/**
+	 * ����С�ڸ������ֵmax��������������
+	 * ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		
+		ArrayList<Integer> al = new ArrayList<Integer>();
+		if(max > 2)
+			al.add(2);
+		
+		int value = 3;
+		while(value < max)
+		{
+			int flag = 1;
+			for(int i = 2; i < value; i++)
+			{
+				if(value % i == 0)
+				{
+					flag = 0;
+					break;
+				}
+			}
+			
+			if (flag == 1)
+				al.add(value);
+			
+			value++;
+		}
+		
+		int arrLen = al.size();
+		int[] arr = new int[arrLen];
+		for(int i = 0; i < arrLen; i++)
+		{
+			arr[i] = al.get(i);
+		}
+		
+		return arr;
+		
+	}
+	
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3
+	 * ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		
+		ArrayList<Integer> al = new ArrayList<Integer>();
+		for(int i = 1; i < max; i++)
+		{
+			if (isPerfectNumber(i))
+				al.add(i);
+		}
+		
+		int arrLen = al.size();
+		int[] arr = new int[arrLen];
+		for(int i = 0; i < arrLen; i++)
+		{
+			arr[i] = al.get(i);
+		}
+		
+		return arr;
+	}
+	
+	public boolean isPerfectNumber(int number)
+	{
+		ArrayList<Integer> al = new ArrayList<Integer>();
+		
+		for(int i = 1; i < number; i++)
+		{
+			if(number % i == 0)
+				al.add(i);
+		}
+		
+		int value = 0;
+		for(int j = 0; j < al.size(); j++)
+		{
+			value = value + al.get(j);
+		}
+		
+		return value == number;
+	}
+	
+	/**
+	 * ��seperator ������ array����������
+	 * ����array= [3,8,9], seperator = "-"
+	 * �򷵻�ֵΪ"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		
+		String str = "";
+		int len = array.length;
+		for(int i = 0; i < len-1; i++)
+		{
+			str = str + array[i] + seperator;
+		}
+		str = str + array[len-1];
+		
+		return str;
+	}
+	
+	
+
+}
diff --git a/group19/1294642551/src/struts_Reflect/Struts.java b/group19/1294642551/src/struts_Reflect/Struts.java
new file mode 100644
index 0000000000..1694cf369c
--- /dev/null
+++ b/group19/1294642551/src/struts_Reflect/Struts.java
@@ -0,0 +1,142 @@
+package struts_Reflect;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws Exception {
+
+        /*
+         
+		0. ��ȡ�����ļ�struts.xml
+ 		
+ 		1. ����actionName�ҵ����Ӧ��class �� ����LoginAction,   ͨ������ʵ��������������
+		��parameters�е����ݣ����ö����setter������ ����parameters�е������� 
+		("name"="test" ,  "password"="1234") ,     	
+		�Ǿ�Ӧ�õ��� setName��setPassword����
+		
+		2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+		
+		3. ͨ�������ҵ����������getter���������� getMessage��,  
+		ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ���� {"message":  "��¼�ɹ�"} ,  
+		�ŵ�View�����parameters
+		
+		4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+		�ŵ�View�����jsp�ֶ��С�
+        
+        *
+        */
+    	
+    	//�������������������className���ַ���
+    	String className = null;
+    	
+    	//---------����XML�ļ�---------------------------------------------------------------------------
+    	
+    	 // ����saxReader����  
+        SAXReader reader = new SAXReader();  
+        // ͨ��read������ȡһ���ļ� ת����Document����  
+        Document document = reader.read(new File("src/struts_Reflect/Struts.xml"));  
+        //��ȡ���ڵ�Ԫ�ض���  
+        Element root = document.getRootElement();  
+        //System.out.println("Root: " + root.getName());
+           
+        // ����������ȡԪ��name����ֵΪ��login����class���Ե�ֵ�����浽����className�С�
+        for (Iterator iter = root.elementIterator(); iter.hasNext();)
+        {
+            Element e = (Element) iter.next();
+            String name = e.attributeValue("name");
+            
+            if(name.equals("login"))
+            {
+            	className = e.attributeValue("class");
+            }
+                        
+        }
+        
+        //-----------�����ȡLoginAction���ʵ���������䷽��---------------------------------------------------------
+        
+        //��ȡʵ��
+        Class clazz = Class.forName("struts_Reflect.LoginAction");
+        Object obj = clazz.newInstance();
+        
+        //����setName �� setPassword����
+        Method mSetName = clazz.getMethod("setName", String.class);
+        Method mSetPassWord = clazz.getMethod("setPassword", String.class);
+        mSetName.invoke(obj, parameters.get("name"));
+        mSetPassWord.invoke(obj, parameters.get("password"));
+        
+        //����excute����
+        Method mExecute = clazz.getMethod("execute", null);
+        String result = (String) mExecute.invoke(obj, null);      
+        System.out.println(result);
+        
+        //�ҵ�����getter���������Ժ�ֵ�ŵ�parameterMap�С�
+        Method[] methods = clazz.getDeclaredMethods();
+//        HashMap<String, String> paraMap = new HashMap<String, String>();
+        
+    	ArrayList<String> al = new ArrayList<String>();
+    	al.add("name");
+    	al.add("password");
+    	al.add("message");
+    	String key = null;
+    	String value = null;
+    	Field field = null;
+    	
+    	for(int i = 0; i < al.size(); i++)
+    	{
+    		key = al.get(i);
+    		field = clazz.getDeclaredField(key);
+    		field.setAccessible(true);
+    		value = (String) field.get(obj);
+    		parameters.put(key, value);
+    		System.out.println(key+"---"+value);
+    	}
+    	
+    	
+    	
+    	View view = new View();
+    	view.setParameters(parameters);
+    	
+    	//----------��JSP�ֶηŵ�View������-------------------------------------
+    	
+    	//��ȡ����Ϊaction��Ԫ�ؽڵ�
+    	Element actionE = root.element("action");
+    	
+    	// ����������ȡԪ��result�е�����
+    	String rValue = null;
+    	
+        for (Iterator iter = actionE.elementIterator(); iter.hasNext();)
+        {
+            Element e = (Element) iter.next();
+            String name = e.attributeValue("name");
+            
+            if(name.equals(result))
+            {
+            	rValue = e.getText();
+            	view.setJsp(rValue);
+            	System.out.println(rValue);
+            }
+                        
+        }
+   
+    	return view;
+ 
+    }  
+
+}
\ No newline at end of file
diff --git a/group19/1294642551/test/arrayTests/ArrayUtilTest.java b/group19/1294642551/test/arrayTests/ArrayUtilTest.java
new file mode 100644
index 0000000000..d20c9a6c46
--- /dev/null
+++ b/group19/1294642551/test/arrayTests/ArrayUtilTest.java
@@ -0,0 +1,101 @@
+package arrayTests;
+
+import static org.junit.Assert.*;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		ArrayUtil au = new ArrayUtil();
+		int[] origin = {7, 9, 30, 3, 4};
+		int[] expecteds ={4, 3, 30, 9, 7};
+		int[] actuals = au.reverseArray(origin);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testRemoveZero() {
+		ArrayUtil au = new ArrayUtil();
+		int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] expecteds = {1,3,4,5,6,6,5,4,7,6,7,5};
+		int[] actuals = au.removeZero(oldArray);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testMerge() {
+		
+		ArrayUtil au = new ArrayUtil();
+		int[] a1 = {3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] expecteds = {3,4,5,6,7,8};
+		int[] actuals = au.merge(a1, a2);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testGrow() {
+		
+		ArrayUtil au = new ArrayUtil();
+		int[] oldArray = {2,3,6};
+		int size = 3;
+		int[] expecteds = {2,3,6,0,0,0};
+		int[] actuals = au.grow(oldArray, size);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testFibonacci() {
+		
+		ArrayUtil au = new ArrayUtil();
+		int max = 15;
+		int[] expecteds = {1, 1, 2, 3, 5, 8, 13};
+		int[] actuals = au.fibonacci(max);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+		
+		
+
+	@Test
+	public void testGetPrimes() {
+		ArrayUtil au = new ArrayUtil();
+		int max = 23;
+		int[] expecteds = {2,3,5,7,11,13,17,19};
+		int[] actuals = au.getPrimes(max);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+		
+	}
+
+	@Test
+	public void testGetPerfectNumbers() {
+		
+		ArrayUtil au = new ArrayUtil();
+		int max = 30;
+		int[] expecteds = {6, 28};
+		int[] actuals = au.getPerfectNumbers(max);
+		
+		Assert.assertArrayEquals(expecteds, actuals);
+	}
+
+	@Test
+	public void testJoin() {
+		
+		ArrayUtil au = new ArrayUtil();
+		int[] array = {3, 8, 9};
+		String seperator = "-";
+		String expecteds = "3-8-9";
+		String actuals = au.join(array, seperator);
+		
+		Assert.assertEquals(expecteds, actuals);
+	}
+
+}
diff --git a/group19/1592562638/src/com/coderising/action/LoginAction.java b/group19/1592562638/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..01af400247
--- /dev/null
+++ b/group19/1592562638/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+/**
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+ * @author liuxin
+ *
+ */
+
+public class LoginAction {
+	private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group19/1592562638/src/com/coderising/action/LogoutAction.java b/group19/1592562638/src/com/coderising/action/LogoutAction.java
new file mode 100644
index 0000000000..569a109dad
--- /dev/null
+++ b/group19/1592562638/src/com/coderising/action/LogoutAction.java
@@ -0,0 +1,6 @@
+package com.coderising.action;
+
+public class LogoutAction {
+	LogoutAction(){
+	}
+}
diff --git a/group19/1592562638/src/com/coderising/action/TestMain.java b/group19/1592562638/src/com/coderising/action/TestMain.java
new file mode 100644
index 0000000000..f6f2e60ef2
--- /dev/null
+++ b/group19/1592562638/src/com/coderising/action/TestMain.java
@@ -0,0 +1,112 @@
+package com.coderising.action;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jdom2.Document;
+import org.jdom2.Element;
+import org.jdom2.JDOMException;
+import org.jdom2.filter.Filters;
+import org.jdom2.input.SAXBuilder;
+import org.jdom2.xpath.XPathExpression;
+import org.jdom2.xpath.XPathFactory;
+
+/*
+0. ��ȡ�����ļ�struts.xml
+
+1. ����actionName�ҵ����Ӧ��class �� ����LoginAction,   ͨ������ʵ��������������
+��parameters�е����ݣ����ö����setter������ ����parameters�е������� 
+("name"="test" ,  "password"="1234") ,     	
+�Ǿ�Ӧ�õ��� setName��setPassword����
+
+2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+
+3. ͨ�������ҵ����������getter���������� getMessage��,  
+ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ���� {"message":  "��¼�ɹ�"} ,  
+�ŵ�View�����parameters
+
+4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+�ŵ�View�����jsp�ֶ��С�
+
+*/
+//ͨ��JDOM����ȡxml�ļ�
+public class TestMain {
+	
+	private static String xmlSource=System.getProperty("user.dir")+"\\src\\com\\coderising\\action\\struts.xml";
+	private static Map<String, Object> container = new HashMap<String, Object>();//��ȡxml��name�ַ�����class��
+	private static Map<String, String> containerStr = new HashMap<String, String>();//��ȡxml��name��class�ַ���
+	private static Map<String, String> containerBak = new HashMap<String, String>();//��ȡgetter��������
+	
+	private static View view;
+	private static String resultStr;
+	private static LoginAction lAction;
+	
+	public static void main(String[] args) throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, InvocationTargetException {
+		// TODO Auto-generated method stub
+		
+		//������
+		SAXBuilder builder=new SAXBuilder();
+		//StringReader reader=new StringReader(System.getProperty("user.dir")+"\\src\\com\\second\\xml/struts.xml");
+		
+		Document document=builder.build(xmlSource);
+		
+		XPathFactory xFactory=XPathFactory.instance();
+		XPathExpression<Element> expr=xFactory.compile("//struts//action",Filters.element());
+		
+		List<Element> links=expr.evaluate(document);
+		for(Element linkElement:links){
+			String name=linkElement.getAttributeValue("name");
+			String clazz=linkElement.getAttributeValue("class");
+			//���÷�������ʵ�� Ȼ��װ������
+			Object o=Class.forName(clazz).newInstance();
+			container.put(name,o);
+			containerStr.put(name, clazz);
+			
+			System.out.println("name: "+name+", class: "+clazz);
+		}
+		
+		/**************
+		 3.ͨ�������ҵ����������getter���������� getMessage��,  
+		ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ���� {"message":  "��¼�ɹ�"} ,  
+		�ŵ�View�����parameters
+		 */
+		if(container.containsKey("login")){
+			lAction=(LoginAction)container.get("login");
+			lAction.setName("test");
+			lAction.setPassword("1234");
+			
+			resultStr=lAction.execute();//ִ��execute����
+			System.out.println("name="+lAction.getName()+" password="+lAction.getPassword()+"->��¼�����"+resultStr);
+			
+			Class clazz=Class.forName(containerStr.get("login"));
+			Method[] methods=clazz.getMethods();
+			for(Method method:methods){
+				String methodName=method.getName();
+				//int indexTmp=methodName.indexOf("get");
+				//if(indexTmp!=-1){
+				if(methodName.startsWith("get")){
+					//����get�ķ�����
+					//String methodStr=methodName.substring(indexTmp+3);
+					String methodStr=methodName.substring(3);
+					System.out.println(methodStr);
+					
+					//System.out.println(method.invoke(lAction));
+					
+					containerBak.put(methodName, (String)method.invoke(lAction));
+				}
+			}
+			view.setParameters(containerBak);//���浽view��
+		}
+		
+		/**************
+		 4.����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ��  ȷ����һ��jsp��  
+		�ŵ�View�����jsp�ֶ���
+		 */
+		
+	}
+}
diff --git a/group19/1592562638/src/com/coderising/action/View.java b/group19/1592562638/src/com/coderising/action/View.java
new file mode 100644
index 0000000000..8a80428d33
--- /dev/null
+++ b/group19/1592562638/src/com/coderising/action/View.java
@@ -0,0 +1,22 @@
+package com.coderising.action;
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group19/1592562638/src/com/coderising/action/struts.xml b/group19/1592562638/src/com/coderising/action/struts.xml
new file mode 100644
index 0000000000..fb0c2be3de
--- /dev/null
+++ b/group19/1592562638/src/com/coderising/action/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git "a/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/2\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237[\350\275\254]/\350\257\273\344\271\246\347\254\224\350\256\260_\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237.pdf" "b/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/2\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237[\350\275\254]/\350\257\273\344\271\246\347\254\224\350\256\260_\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237.pdf"
new file mode 100644
index 0000000000..065c59f54f
Binary files /dev/null and "b/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/2\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237[\350\275\254]/\350\257\273\344\271\246\347\254\224\350\256\260_\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237.pdf" differ
diff --git a/group19/2558178127/src/com/coderising/action/LoginAction.java b/group19/2558178127/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..72e00894bb
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group19/2558178127/src/com/coderising/array/ArrayUtil.java b/group19/2558178127/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..fb6a84f255
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,189 @@
+package com.coderising.array;
+
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		if (origin == null || origin.length <= 1) {
+			return;
+		}
+		int tem = 0;
+		for (int i = 0, len = origin.length; i < len / 2; i++) {
+			tem = origin[i];
+			origin[i] = origin[len - i + 1];
+			origin[len - i + 1] = tem;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public static int[] removeZero(int[] oldArray){
+		if(oldArray == null){
+			return null;
+		}
+		int [] ret = new int[oldArray.length];
+		int cou = 0; 
+		for(int i=0;i<oldArray.length;i++){
+			if(0==oldArray[i]){
+				cou++;
+				continue;
+			}
+			for(int j =0;j<ret.length;j++){
+				if(ret[j]==0){
+					ret[j]=oldArray[i];
+					break;
+				}
+			}
+			
+		}
+		int[] retarr = new int[oldArray.length-cou];
+		System.arraycopy(ret, 0,retarr,0,retarr.length);
+		return retarr;
+	}
+	
+	public static void main(String[]args){
+		fibonacci(15);
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int[] temint = new int[array1.length + array2.length];
+		System.arraycopy(array1, 0,temint,0,array1.length);
+		System.arraycopy(array2, 0,temint,array1.length-1,array2.length);
+		int index[] = new int[temint.length];
+		for (int i = 0; i < index.length; i++) {
+			index[i] = i;
+		}
+		for (int i = 0; i < temint.length-1; i++) {
+			for (int j = i+1; j < temint.length; j++) {
+				if(temint[i]>temint[j]){
+					int temp = temint[i];
+					int p = index[i];
+					temint[i] = temint[j];
+					index[i] = index[j];
+					temint[j] = temp;
+					index[j] = p; 
+				}
+			}
+		}
+		
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] res = new int[oldArray.length+size];
+		System.arraycopy(oldArray, 0,res,0,oldArray.length);
+		return res;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		 int[] a = new int[max];
+		 int[] retf = null;
+	        if (max < 3) {
+	        	retf =new int[]{1,1};
+	        } else if (max >= 3) {
+	            a[0] = a[1] = 1;
+	            for (int i = 2; i <  max; i++) {
+	                a[i] = a[i - 1] + a[i - 2];
+	                if(a[i]>max){
+	                	break;
+	                }
+	            }
+	            retf = removeZero(a);
+	        }	       
+	        return retf;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		int[] prime = new int[max];
+		int sum = 0;
+		for (int i = 2; i <= max; i++) {// 从2开始是因为，1既不是素数也不是合数
+			boolean sign = true;
+			for (int j = 2; j < i; j++) {
+				if (i % j == 0) {// 能被除了1和自己整除的数肯定不是素数，因此只要有一个就可以跳过循环
+					sign = false;
+					continue;
+				}
+			}
+			if (sign) {
+				prime[i] = i;
+			}
+		}
+		int[] retf = null;
+		retf = removeZero(prime);
+		return retf;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer sbf = new StringBuffer("");
+		for(int i=0;i<array.length;i++){
+			int maa = array[i];
+			if(i == array.length-1){
+				break;
+			}
+			sbf.append(maa).append(seperator);
+		}
+		return sbf.toString();
+	}
+	
+
+}
diff --git a/group19/2558178127/src/com/coderising/litestruts/Struts.java b/group19/2558178127/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..4c12e8c9c9
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,71 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.Map;
+
+import com.coderising.litestruts.xml.read.XmlService;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) throws Exception{
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	new XmlService().readDocument();  //读取xml。把xml信息存入map
+    	
+    	String clsName = readxml(actionName,"class");//获取action对应class对象
+    	Class c1 = Class.forName(clsName);
+		Object obj = c1.newInstance();
+		//action属性赋值
+		Iterator<String> iter = parameters.keySet().iterator();
+		while (iter.hasNext()) {
+			String key = iter.next();
+			String namval = parameters.get((String) key);
+			Method m = c1.getMethod("set" + key.substring(0, 1).toUpperCase()
+					+ key.substring(1), String.class);
+			m.invoke(obj, namval);
+		}
+		
+		String result = "";
+		Method mt=c1.getMethod("execute");//调用执行方法
+		result = (String) mt.invoke(obj);
+		View view = new View();
+		view.setJsp(readxml(actionName,result));
+    	return view;
+    }   
+    /**
+     * 读取Map中xml信息
+     * @param name
+     * @param attr
+     * @return
+     */
+    public static String readxml(String name,String attr){
+    	
+    	Map xmlMap = XmlService.map;
+
+    	return (String) xmlMap.get(name+attr);
+    }
+    
+
+}
diff --git a/group19/2558178127/src/com/coderising/litestruts/StrutsTest.java b/group19/2558178127/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..3fedbec428
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,53 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() throws Exception{
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+	public static void main(String [] args)throws Exception{
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        System.out.println(view.getJsp());
+	}
+	@Test
+	public void testLoginActionFailed() throws Exception{
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group19/2558178127/src/com/coderising/litestruts/View.java b/group19/2558178127/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..0194c681f6
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group19/2558178127/src/com/coderising/litestruts/struts.xml b/group19/2558178127/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..fb0c2be3de
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java b/group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java
new file mode 100644
index 0000000000..fc4ad6c23e
--- /dev/null
+++ b/group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java
@@ -0,0 +1,88 @@
+package com.coderising.litestruts.xml.read;
+
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class XmlService {
+	
+	 private File file;  
+	
+	 public static Map map = new HashMap();
+	 
+	 public XmlService() {  
+	        file = new File("E:/2017learn/coding2017/group19/2558178127/src/com/coderising/litestruts/struts.xml");
+	  
+	    }  
+	 
+	    public Document getDocument() {  
+	        SAXReader reader = new SAXReader();  
+	  
+	        Document document = null;  
+	  
+	        try {  
+	            document = reader.read(file);  
+	        } catch (Exception e) {  
+	  
+	            e.printStackTrace();  
+	        }  
+	        return document;  
+	    }  
+	  
+	        //读取xml  
+	    public void readDocument() {  
+	  
+	        List<Element> sonElementList = getDocument().getRootElement().elements();  
+	  
+	        Element root = getDocument().getRootElement();
+	        getElement(sonElementList);  
+	  System.out.println(map);
+	    }  
+	  
+	    private List list = new ArrayList();
+	    
+	    private void getElement(List<Element> sonElemetList) {  
+	        for (Element sonElement : sonElemetList) {  
+	                if (sonElement.elements().size() != 0) {  
+	                    	getNodes(sonElement,list);
+	                    getElement(sonElement.elements());  
+	                }else{
+	                	getNodes(sonElement,list);
+	                    System.out.println(sonElement.getName() + ":"+ sonElement.getText());  
+	                }  
+	                
+	  
+	        }  
+	    }  
+	  
+	    public void getNodes(Element node,List pname){  
+	        //当前节点的名称、文本内容和属性  
+	        System.out.println("当前节点名称："+node.getName());//当前节点名称  
+	        System.out.println("当前节点的内容："+node.getTextTrim());//当前节点内容  
+	        List<Attribute> listAttr=node.attributes();//当前节点的所有属性的list
+	        String classValue="";
+	        for(Attribute attr:listAttr){//遍历当前节点的所有属性  
+	            String name=attr.getName();//属性名称  
+	            String value=attr.getValue();//属性的值  
+	            System.out.println("属性名称："+name+"属性值："+value);
+	           if("login".equals(value) || "logout".equals(value)){
+	            pname.add(0,value);
+	           }else{
+	        	  map.put(pname.get(0)+value, node.getTextTrim());
+	           }
+	           if("class".equals(name)&&pname!=null){
+	        	   classValue=value;
+	        	   map.put(pname.get(0)+"class", value);
+	           }
+//	           
+	        }  
+	    }
+}
diff --git a/group19/376248270/0-20170215-20170226/README.md b/group19/376248270/0-20170215-20170226/README.md
new file mode 100644
index 0000000000..6a92672f18
--- /dev/null
+++ b/group19/376248270/0-20170215-20170226/README.md
@@ -0,0 +1,11 @@
+### 0x00 (Deadline: 2017-02-26)
+#### 1. 实现基本的数据结构
+- [x] ArrayList
+- [] LinkedList
+- [] Queue
+- [] Stack
+- [] BinaryTree(可选)
+- [] Interor(可选)
+
+#### 2. 文章
+- [x] [建议写一篇有关CPU、内存、硬盘、指令的文章](http://bosschow.github.io/2017/02/24/recursion-and-tail-recursion/)
diff --git a/group19/376248270/0-20170215-20170226/arraylist/ArrayList.java b/group19/376248270/0-20170215-20170226/arraylist/ArrayList.java
new file mode 100644
index 0000000000..8b4a30c5ff
--- /dev/null
+++ b/group19/376248270/0-20170215-20170226/arraylist/ArrayList.java
@@ -0,0 +1,97 @@
+package arraylist;
+import java.util.Arrays;
+
+import base.List;
+
+public class ArrayList implements List {
+    public static void main(String[] args) {
+        ArrayList arr = new ArrayList();
+        System.out.println(arr.size());
+        arr.add("ele1");
+        arr.add("ele2");
+        
+        for (int i = 0; i < arr.size(); i++) {
+        	System.out.println((String)arr.get(i));
+        }
+        
+        System.out.println("============");
+        arr.remove(0);
+        
+        for (int i = 0; i < arr.size(); i++) {
+        	System.out.println((String)arr.get(i));
+        }
+    }
+
+    // 初始容量
+    static final int DEFAULT_INITIAL_CAPACITY = 10;
+
+    // 数组扩展速度
+    static final int INCRE_SPEED = 2;
+
+    // 元素数组
+    private Object[] elementData = new Object[DEFAULT_INITIAL_CAPACITY];
+
+    // 元素数量
+    private int size = 0;
+    
+    /**
+     * 添加元素到指定位置
+     */
+    public void add(int index, Object obj) {
+    	add(elementData[size-1]);
+    	for (int i = size - 1; i > index; i--) {
+    		elementData[i] = elementData[i - 1];
+    	}
+    	elementData[index] = obj;
+    }
+    
+    /**
+     * 删除指定位置的元素
+     */
+    public Object remove(int index) {
+    	Object result = elementData[index];
+    	
+    	while (index < size) {
+    		elementData[index] = elementData[index + 1];
+    		index++;
+    	}
+    	size--;
+    	return result;
+    }
+    
+    /**
+     * 获取指定位置的元素
+     */
+    public Object get(int index) {
+    	if (index < 0 || index >= size) {
+    		throw new IndexOutOfBoundsException("Index: "+index);
+    	}
+    	return elementData[index];
+    }
+
+    /**
+     * 获取当前元素数量
+     */
+    public int size() {
+        return size;
+    }
+
+    /**
+     * 添加元素到尾部
+     */
+    public void add(Object obj) {
+        elementData[size++] = obj;
+        if (size == elementData.length) {
+            resize();
+        }
+
+    }
+
+    /**
+     * 元素数组自动扩展
+     */
+    private void resize() {
+        elementData = Arrays.copyOf(elementData, elementData.length * INCRE_SPEED);
+    }
+    
+}
diff --git a/group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java b/group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java
new file mode 100644
index 0000000000..c48142416e
--- /dev/null
+++ b/group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java
@@ -0,0 +1,57 @@
+package arraylist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayListTest {
+	ArrayList arr = null;
+
+	@Before
+	public void setup() {
+		arr = new ArrayList();
+	}
+
+	@Test
+	public void testAdd() {
+		arr.add("ele-1");
+		arr.add("ele-2");
+		printArrayList();
+		arr.add(0, "ele-0");
+		printArrayList();
+	}
+
+    @Test
+	public void testGet() {
+		arr.add("ele-1");
+		arr.add("ele-2");
+		printArrayList();
+		arr.remove(0);
+		printArrayList();
+		System.out.println((String)arr.get(1));
+	}
+
+    @Test
+	public void testRemove() {
+
+		for (int i = 0; i < 10; i++) {
+			arr.add("ele-"+i);
+		}
+
+		printArrayList();
+		arr.remove(1);
+		System.out.println("After Remove");
+		printArrayList();
+	}
+
+	/**
+	 * 打印ArrayList
+	 * @param arr
+	 */
+	private void printArrayList() {
+		System.out.print("[");
+		for (int i = 0; i < arr.size(); i++) {
+			System.out.print((String)arr.get(i) + ", ");
+		}
+		System.out.println("]");
+	}
+}
diff --git a/group19/376248270/0-20170215-20170226/base/List.java b/group19/376248270/0-20170215-20170226/base/List.java
new file mode 100644
index 0000000000..8ca593dec2
--- /dev/null
+++ b/group19/376248270/0-20170215-20170226/base/List.java
@@ -0,0 +1,8 @@
+package base;
+public interface List {
+    public void add(Object obj);
+    public int size();
+    public Object get(int index);
+    public Object remove(int index);
+    public void add(int index, Object obj);
+}
diff --git a/group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java b/group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java
new file mode 100644
index 0000000000..da357f7164
--- /dev/null
+++ b/group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java
@@ -0,0 +1,25 @@
+package linkedlist;
+
+public class LinkedList implements List {
+    private Node head;
+
+    private int size;
+
+    public void add(Object obj) {
+        Node current = new
+    }
+
+    /**
+     * 获取元素数量
+     */
+    public int size() {
+        return size;
+    }
+
+    private static class Node {
+
+        Object data;
+        Node next;
+
+    }
+}
diff --git a/group19/376248270/1-20170226-20170305/README.md b/group19/376248270/1-20170226-20170305/README.md
new file mode 100644
index 0000000000..1bbe089b52
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/README.md
@@ -0,0 +1,8 @@
+### 0x01 (Deadline: 2017-03-05)
+
+#### 1. coding
+- [x] 实现简单的类似与Struts的操作，需要通过Junit测试。
+- [x] 实现ArrayUtil
+
+#### 2. 文章
+- [x] [写一篇文章，自主定题目](http://bosschow.github.io/2017/03/05/get-prime-number-1/)
diff --git a/group19/376248270/1-20170226-20170305/array/ArrayUtil.java b/group19/376248270/1-20170226-20170305/array/ArrayUtil.java
new file mode 100644
index 0000000000..a64eb8da05
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/array/ArrayUtil.java
@@ -0,0 +1,231 @@
+package array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Stack;
+
+public class ArrayUtil {
+
+    public static void main(String[] args) {
+        int[] origin = new int[]{1, 2, 3, 4};
+        System.out.println(Arrays.toString(getPrimes(23)));
+    }
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果： a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+    /**
+     * 1. 通过双指针实现反转
+     * @param origin
+     * @return
+     */
+	public static int[] reverseArray_1(int[] origin){
+        int i = 0;
+        int j = origin.length - 1;
+        for (;i < j;) {
+            int swap = origin[i];
+            origin[i] = origin[j];
+            origin[j] = swap;
+            i++;
+            j--;
+        }
+
+        return origin;
+	}
+	
+	/**
+	 * 2. 通过栈后进先出的特点实现反转
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray_2(int[] origin) {
+		Stack<Integer> stack = new Stack<>();
+		
+		for (int num : origin) {
+			stack.push(num);
+		}	
+		for (int i = 0; i < origin.length; i++) {
+			origin[i] = stack.pop();
+		}
+		return origin;
+	}
+	
+	/**
+	 * 3. 通过反序遍历实现反转
+	 * @param origin
+	 * @return
+	 */
+	public static int[] reverseArray_3(int[] origin) {
+		int[] result = new int[origin.length];
+		for (int i = origin.length - 1; i >= 0; i--) {
+			result[origin.length - i - 1] = origin[i];
+		}
+		return result;
+	}
+
+	/**
+	 * 现在有如下的一个数组：int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero_1(int[] oldArray){
+		List<Integer> list = new ArrayList<>();
+		for (int num : oldArray) {
+			if (num != 0) {
+				list.add(num);
+			}
+		}
+		
+		int[] result = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			result[i] = list.get(i);
+		}
+		return result;
+	}
+	
+	/**
+	 * 通过双指针实现
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero_2(int[] oldArray) {
+		int j = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				oldArray[j++] = oldArray[i];
+			}
+		}
+		
+		return Arrays.copyOf(oldArray, j);
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int [] oldArray,  int size){
+		return Arrays.copyOf(oldArray, oldArray.length + size);
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		
+		List<Integer> list = new ArrayList<>();
+		int current = 0;
+		for (int i = 0; i < max; i++) {
+			if (i <= 1) {
+				current = 1;
+			} else {
+				current = list.get(i - 1) + list.get(i - 2);
+			}
+			if (current >= max) break;
+			list.add(current);
+		}
+		
+		int[] result = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			result[i] = list.get(i);
+		}
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * 写了一篇文章：http://bosschow.github.io/2017/03/05/get-prime-number-1/
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max){
+		List<Integer> list = new ArrayList<>();
+		
+		for (int i = 2; i < max; i++) {
+			boolean isPrime = true;
+			for (Integer primeNum : list) {
+				if (primeNum <= Math.sqrt(i)) {
+					if (i % primeNum == 0) {
+						isPrime = false;
+						break;
+					}
+				} else {
+					break;
+				}	
+			}
+			
+			if (isPrime) {
+				list.add(i);
+			}
+		}
+		
+		int[] result = new int[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			result[i] = list.get(i);
+		}
+		
+		return result;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator){
+		StringBuilder stringBuilder = new StringBuilder();
+		
+		for (int i = 0; i < array.length; i++) {
+			if (i == array.length - 1) {
+				stringBuilder.append(array[i]);
+			} else {
+				stringBuilder.append(array[i] + seperator);
+			}
+		}
+		
+		return stringBuilder.toString();
+	}
+
+
+}
diff --git a/group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java b/group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..5496d8084d
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.action;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group19/376248270/1-20170226-20170305/struts/Struts.java b/group19/376248270/1-20170226-20170305/struts/Struts.java
new file mode 100644
index 0000000000..c431672037
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/struts/Struts.java
@@ -0,0 +1,245 @@
+package struts;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class Struts {
+	
+	private static final String CONFIG_FILE = "struts/struts.xml";
+	private static final String SETTER_METHOD_PREFIX = "set";
+	private static final String GETTER_METHOD_PREFIX = "get";
+	
+	private static  Map<String, Action> actionList;
+	
+	static {
+		System.out.println("Loading struts config file: " + CONFIG_FILE);
+		actionList = parseConfigFile(CONFIG_FILE);
+		System.out.println("Load struts config success!");
+	}
+
+	/**
+	 * 自测
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		Map<String, String> map = new HashMap<>();
+		map.put("name", "test");
+		map.put("password", "1234");
+		runAction("login", map);
+	}
+	
+	/**
+	 * 运行指定action
+	 * @param actionName
+	 */
+	public static View runAction(String actionName, Map<String,String> parameters) {
+		Action action = getActionByName(actionName);
+		View view = new View();
+		
+		try {
+			Class cls = Class.forName(action.getClassName());
+			Object actionInstance = cls.newInstance();
+			
+			// 设置参数
+			setParameters(cls, actionInstance, parameters);
+			
+			// 执行execute方法
+			String executeResult = execute(cls, actionInstance);
+			
+			// 获取属性
+			String[] attributes = new String[]{"message"};
+			Map<String, String> results = getAttributes(cls, actionInstance, attributes);
+			
+			// 获取JSP
+			String resultJsp = getResultJSP(action, executeResult);
+			
+			// 组装视图
+			view.setJsp(resultJsp);
+			view.setParameters(results);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		return view;
+	}
+	
+	/**
+	 * 获取需要返回的JSP名称
+	 * @param action
+	 * @param executeResult
+	 * @return
+	 */
+	private static String getResultJSP(Action action, String executeResult) {
+		Map<String, String> resultMap = action.getResultMap();
+		String resultJSP = "";
+		
+		if (resultMap.containsKey(executeResult)) {
+			resultJSP = resultMap.get(executeResult);
+		}
+		return resultJSP;
+	}
+	
+	/**
+	 * 执行action的execute方法
+	 * @param cls
+	 * @param instance
+	 * @return
+	 */
+	private static String execute(Class cls, Object instance) {
+		String result = null;
+		try {
+			Method method = cls.getMethod("execute");
+			result = (String) method.invoke(instance);
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	
+	/**
+	 * 通过getter方法获取实例属性
+	 * @param cls
+	 * @param instance
+	 * @param parameterName
+	 * @return
+	 */
+	private static Map<String, String> getAttributes(Class cls, Object instance, String[] attributes) {
+		Map<String, String> result = new HashMap<>();
+		
+		try {
+			for (String attr : attributes) {
+				String methodName = GETTER_METHOD_PREFIX + capitalizeFirstLetter(attr);
+				Method method = cls.getMethod(methodName);
+				String returnValue = (String)method.invoke(instance);
+				result.put(attr, returnValue);
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	
+	/**
+	 * 为action实例设置属性
+	 * @param cls
+	 * @param instance
+	 * @param parameters
+	 */
+	private static void setParameters(Class cls, Object instance, Map<String, String> parameters) {
+		for (String name : parameters.keySet()) {
+			String methodName = SETTER_METHOD_PREFIX + capitalizeFirstLetter(name);
+			try {
+				Method method = cls.getMethod(methodName, String.class);
+				method.invoke(instance, parameters.get(name));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	/**
+	 * 将传入的字符串首字母大写
+	 * @param inputString
+	 * @return
+	 */
+	private static String capitalizeFirstLetter(String inputString) {
+		if (inputString == null || inputString.length() == 0) {
+			return inputString;
+		}
+		
+		return inputString.substring(0, 1).toUpperCase() + inputString.substring(1);
+	}
+	
+	/**
+	 * 解析struts配置文件
+	 * @param configFile
+	 * @return
+	 */
+	private static Map<String, Action> parseConfigFile(String configFile) {
+		Map<String, Action> parseResult = new HashMap<>();
+		
+		try {
+			File inputFile = new File(configFile);
+			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+			Document doc = dBuilder.parse(inputFile);
+			NodeList nList = doc.getElementsByTagName("action");
+			
+			for (int i = 0; i < nList.getLength(); i++) {
+				Action action = new Action();
+				Map<String, String> resultList = new HashMap<>();
+				String actionName = "";
+				
+				Node nNode = nList.item(i);
+				
+				if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+					Element eElement = (Element)nNode;
+					actionName = eElement.getAttribute("name");
+					String className = eElement.getAttribute("class");
+					
+					action.setName(actionName);
+					action.setClassName(className);
+					
+					NodeList nodeList = eElement.getElementsByTagName("result");
+					for (int j = 0; j < nodeList.getLength(); j++) {
+						String resultName = ((Element)nodeList.item(j)).getAttribute("name");
+						String resultValue = ((Element)nodeList.item(j)).getTextContent();
+						resultList.put(resultName, resultValue);
+					}
+					action.setResultMap(resultList);
+				}
+				
+				parseResult.put(actionName, action);
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		
+		return parseResult;
+	}
+	
+	/**
+	 * 返回指定的action
+	 * @param actionName
+	 * @return
+	 */
+	private static Action getActionByName(String actionName) {
+		return actionList.get(actionName);
+	}
+	
+	private static class Action {
+		String name;
+		String className;
+		Map<String, String> resultMap;
+		
+		public String getName() {
+			return name;
+		}
+		public String getClassName() {
+			return className;
+		}
+		public Map<String, String> getResultMap() {
+			return resultMap;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public void setClassName(String className) {
+			this.className = className;
+		}
+		public void setResultMap(Map<String, String> resultList) {
+			this.resultMap = resultList;
+		}
+	}
+
+}
diff --git a/group19/376248270/1-20170226-20170305/struts/StrutsTest.java b/group19/376248270/1-20170226-20170305/struts/StrutsTest.java
new file mode 100644
index 0000000000..3a4d69ee20
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/struts/StrutsTest.java
@@ -0,0 +1,43 @@
+package struts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group19/376248270/1-20170226-20170305/struts/View.java b/group19/376248270/1-20170226-20170305/struts/View.java
new file mode 100644
index 0000000000..4e006ba71e
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/struts/View.java
@@ -0,0 +1,23 @@
+package struts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group19/376248270/1-20170226-20170305/struts/struts.xml b/group19/376248270/1-20170226-20170305/struts/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group19/376248270/1-20170226-20170305/struts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group19/376248270/README.md b/group19/376248270/README.md
new file mode 100644
index 0000000000..e7b15ad6f0
--- /dev/null
+++ b/group19/376248270/README.md
@@ -0,0 +1,3 @@
+### Profile
+- nickname: kian
+- QQ: 376248270
diff --git a/group19/527220084/xukai_coding/.gitignore b/group19/527220084/xukai_coding/.gitignore
index ba13ec60db..a269ef720f 100644
--- a/group19/527220084/xukai_coding/.gitignore
+++ b/group19/527220084/xukai_coding/.gitignore
@@ -5,4 +5,15 @@
 *iml
 .idea
 *gen-*
-rebel.xml
\ No newline at end of file
+
+*.class
+
+.metadata
+.recommenders
+
+#macOS
+.DS_Store
+
+rebel.*
+.rebel.*
+
diff --git a/group19/527220084/xukai_coding/coding-common/pom.xml b/group19/527220084/xukai_coding/coding-common/pom.xml
index ab70ddd636..023093e4d7 100644
--- a/group19/527220084/xukai_coding/coding-common/pom.xml
+++ b/group19/527220084/xukai_coding/coding-common/pom.xml
@@ -16,10 +16,6 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.freemarker</groupId>
-            <artifactId>freemarker</artifactId>
-        </dependency>
         <dependency>
             <groupId>commons-beanutils</groupId>
             <artifactId>commons-beanutils</artifactId>
@@ -82,8 +78,14 @@
             <groupId>joda-time</groupId>
             <artifactId>joda-time</artifactId>
         </dependency>
-
-
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jaxen</groupId>
+            <artifactId>jaxen</artifactId>
+        </dependency>
 
         <!--<dependency>-->
         <!--<groupId>org.slf4j</groupId>-->
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..3edaebe9ef
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java
@@ -0,0 +1,306 @@
+package org.xukai.coderising.array;
+
+import org.junit.Test;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		for (int i = 0; i < origin.length; i++) {
+			if (i == origin.length/2) {
+				break;
+			}
+			swap(origin,i,origin.length - 1 -i);
+		}
+	}
+	private void swap(int[] array,int a,int b){
+		array[a] = array[a] + array[b];
+		array[b] = array[a] - array[b];
+		array[a] = array[a] - array[b];
+	}
+
+	@Test
+	public void testReverseArray() {
+		int[] test = new int[]{7, 9, 30,-11, 3, 4};
+		reverseArray(test);
+		for (int i = 0; i < test.length; i++) {
+			System.out.println(test[i]);
+		}
+	}
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int nullIndex = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				nullIndex ++;
+			}
+		}
+		int[] newArray = new int[nullIndex];
+		nullIndex = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[nullIndex] = oldArray[i];
+				nullIndex++;
+			}
+		}
+		return newArray;
+	}
+	@Test
+	public void removeZero() {
+		int[] test = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newArray = removeZero(test);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int index_a = 0;
+		int index_b = 0;
+		int[] array = new int[array1.length + array2.length];
+		int i = 0 ;
+		while(index_a < array1.length && index_b < array2.length){
+			if (array1[index_a] < array2[index_b]) {
+				array[i] = array1[index_a];
+				index_a++;
+				i++;
+			} else if(array1[index_a] > array2[index_b]) {
+				array[i] = array2[index_b];
+				index_b++;
+				i++;
+			} else {
+				array[i] = array1[index_a];
+				i++;
+				index_a++;
+				index_b++;
+			}
+		}
+		if (index_a == array1.length) {
+			for (int j = index_b; j < array2.length; j++) {
+				array[i] = array2[j];
+				i++;
+			}
+		} else {
+			for (int j = index_a; j < array1.length; j++) {
+				array[i] = array1[j];
+				i++;
+			}
+		}
+		int[] result = new int[i];
+		System.arraycopy(array,0,result,0,i);
+		return  result;
+	}
+
+	@Test
+	public void testMerge() {
+		int[] test1 = new int[]{2,3, 5, 7,8};
+		int[] test2 = new int[]{4, 5, 6,7,8,21,33};
+		int[] newArray = merge(test1,test2);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray,0,newArray,0,oldArray.length);
+
+
+		return newArray;
+	}
+
+	@Test
+	public void testGrow() {
+		int[] test1 = new int[]{2,3, 5, 7,8};
+		int[] newArray = grow(test1, 5);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if (max <= 1) {
+			return new int[0];
+		}
+		int index_a = 1;
+		int index_b = 1;
+		int temp = 0;
+		int count = 2;
+		while ((temp = index_a + index_b) < max) {
+			index_a = index_b;
+			index_b = temp;
+			count++;
+		}
+		int[] newArray = new int[count];
+		for (int i = count-1; i > -1 ; i--) {
+			newArray[i] = index_b;
+			temp = index_b - index_a;
+			index_b = index_a;
+			index_a = temp;
+		}
+		return newArray;
+	}
+
+	@Test
+	public void testfibonacci() {
+		int[] newArray = fibonacci(15);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+	}
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] container = new int[5];
+		int count = 0;
+		for (int i = 3; i < max; i++) {
+			if (isShusu(i)) {
+				if (count == container.length) {
+					container = grow(container,container.length << 1);
+				}
+				container[count] = i;
+				count++;
+			}
+
+		}
+		int[] array = new int[count];
+		System.arraycopy(container,0,array,0,count);
+		return array;
+	}
+	@Test
+	public void testGetPrimes() {
+		int[] newArray = getPrimes(4);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+	}
+	private boolean isShusu(int num){
+		int sqrt = 1;
+		while (sqrt * sqrt < num){
+			sqrt++;
+		}
+		for (int i = 2; i < sqrt; i++) {
+			if (num % i == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] container = new int[5];
+		int count = 0;
+		for (int i = 1; i < max; i++) {
+			if (isWanshu(i)) {
+				if (count == container.length) {
+					container = grow(container,container.length << 1);
+				}
+				container[count] = i;
+				count++;
+			}
+
+		}
+		int[] array = new int[count];
+		System.arraycopy(container,0,array,0,count);
+		return array;
+	}
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] newArray = getPerfectNumbers(29);
+		for (int i = 0; i < newArray.length; i++) {
+			System.out.println(newArray[i]);
+		}
+//		isWanshu(6);
+	}
+	private boolean isWanshu(int num){
+		int sqrt = 1;
+		while (sqrt * sqrt < num){
+			sqrt++;
+		}
+		int sum = 1;
+		for (int i = 2; i < sqrt; i++) {
+			if (num % i == 0 ) {
+				sum = sum + i + (num/i);
+			}
+		}
+		if (sum == num) {
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		String result = "";
+
+		for (int i = 0; i < array.length; i++) {
+			if (i != 0) {
+				result = result + seperator;
+			}
+			result = result + array[i];
+		}
+
+		return result;
+	}
+	@Test
+	public void testJoin() {
+		int[] test = {1, 5, 8, 4};
+		String seperator = "-";
+		String join = join(test, seperator);
+		System.out.println(join);
+	}
+
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java
new file mode 100644
index 0000000000..3a354754a4
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java
@@ -0,0 +1,41 @@
+package org.xukai.coderising.litestruts;
+
+import java.util.Map;
+
+/**
+ * @author xukai
+ * @desc
+ * @date 2017-02-27-下午 2:59
+ */
+public class Action {
+
+    private String name;
+
+    private Class<?> aClass;
+
+    private Map<String,String> resultMapping;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Class<?> getaClass() {
+        return aClass;
+    }
+
+    public void setaClass(Class<?> aClass) {
+        this.aClass = aClass;
+    }
+
+    public Map<String, String> getResultMapping() {
+        return resultMapping;
+    }
+
+    public void setResultMapping(Map<String, String> resultMapping) {
+        this.resultMapping = resultMapping;
+    }
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java
new file mode 100644
index 0000000000..29a74ec3be
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java
@@ -0,0 +1,29 @@
+package org.xukai.coderising.litestruts;
+
+/**
+ * 业务逻辑异常
+ */
+public class BusinessException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    public BusinessException() {
+
+    }
+
+    public BusinessException(String message) {
+        super(message);
+
+    }
+
+    public BusinessException(Throwable cause) {
+        super(cause);
+
+    }
+
+    public BusinessException(String message, Throwable cause) {
+        super(message, cause);
+
+    }
+
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..2681d32a1c
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package org.xukai.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java
new file mode 100644
index 0000000000..a40fe43dc4
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java
@@ -0,0 +1,39 @@
+package org.xukai.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LogoutAction {
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..524b0634e8
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java
@@ -0,0 +1,133 @@
+package org.xukai.coderising.litestruts;
+
+import org.apache.commons.lang.StringUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.xukai.coderising.util.ReflectUtil;
+import org.xukai.coderising.util.XmlParseHelper;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+public class Struts {
+
+    private static final ConcurrentHashMap<String,Object> action= new ConcurrentHashMap<String,Object>();
+
+    private static String strutsPath = Thread.currentThread().getContextClassLoader().getResource("struts.xml").getPath().substring(1);
+
+    private static List<Action> actions;
+
+    static {
+        try {
+            actions = initalStruts();
+            System.out.println(actions.size());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+        if (actionName != null && !actionName.equals("")) {
+            for(Action action : actions){
+                //根据请求参数定位到需要执行的action
+                if (action.getName().equals(actionName)) {
+                    Class<?> cls = action.getaClass();
+                    View view = new View();
+                    try {
+                        //创建action实例
+                        Object obj = ReflectUtil.newInstance(cls);
+                        for(Map.Entry<String,String> entry : parameters.entrySet()){
+                            ReflectUtil.setValue(obj,entry.getKey(),entry.getValue());
+                        }
+                        Method method = ReflectUtil.getMethod(cls,"execute");
+                        if (method != null) {
+                            //执行execute方法
+                            Object result = ReflectUtil.invokeMethod(obj, method);
+                            if (result instanceof String) {
+                                Map<String, String> mapping = action.getResultMapping();
+                                //根据映射关系将值放入
+                                view.setJsp(mapping.get(result));
+                                List<Method> gets = ReflectUtil.getMethodBeginWith(cls, "get");
+                                HashMap<String, String> models = new HashMap<>();
+                                for(Method getMethod : gets){
+                                    //调用所有getter方法
+                                    Object getFieldResult = ReflectUtil.invokeMethod(obj, getMethod);
+                                    if (result instanceof String) {
+                                        String getFieldName = StringUtils.lowerCase((String) getMethod.getName()).substring(3);
+                                        models.put(getFieldName,(String) getFieldResult);
+                                    }
+                                }
+                                view.setParameters(models);
+                            }
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        view.setJsp("500");
+                    }
+                    return view;
+                }
+            }
+        }
+        //请求的参数不正确或者没有对应实例返回404
+        View view = new View();
+        view.setJsp("404");
+        return view;
+    }
+
+    private static List<Action> initalStruts() throws ClassNotFoundException, DocumentException {
+        SAXReader sr = new SAXReader();//获取读取方式
+
+        Document doc = sr.read(strutsPath);
+        XmlParseHelper helper = new XmlParseHelper(doc);
+        List<Element> actions = helper.getNodeByPath("//action");
+        ArrayList<Action> actionsList = new ArrayList<>();
+        for (Element action : actions){
+            Action obj = new Action();
+            String nameAttr = helper.getNodeAttrValue(action, "name");
+            String classAttr = helper.getNodeAttrValue(action, "class");
+            obj.setName(nameAttr);
+            obj.setaClass(Class.forName(classAttr));
+            List<Element> results = helper.getChildNodeByName(action, "result");
+            HashMap<String, String> map = new HashMap<>();
+            for (Element result : results){
+                String resultNameAttr = helper.getNodeAttrValue(result, "name");
+                String resultValue = helper.getNodeValue(result);
+                map.put(resultNameAttr,resultValue);
+            }
+            obj.setResultMapping(map);
+            actionsList.add(obj);
+        }
+
+        return actionsList;
+    }
+
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+
+
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..53bf155c33
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,81 @@
+package org.xukai.coderising.litestruts;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.Assert;
+import org.junit.Test;
+import org.xukai.coderising.util.XmlParseHelper;
+
+
+public class StrutsTest {
+
+    private String strutsPath = Thread.currentThread().getContextClassLoader().getResource("struts.xml").getPath()
+            .substring(1);
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+    @Test
+    public void testInital() throws ClassNotFoundException {
+        SAXReader sr = new SAXReader();//获取读取方式
+        try {
+            Document doc = sr.read(strutsPath);
+            XmlParseHelper helper = new XmlParseHelper(doc);
+            List<Element> actions = helper.getNodeByPath("//action");
+            ArrayList<Action> actionsList = new ArrayList<>();
+            for (Element action : actions){
+                Action obj = new Action();
+                String nameAttr = helper.getNodeAttrValue(action, "name");
+                String classAttr = helper.getNodeAttrValue(action, "class");
+                obj.setName(nameAttr);
+                obj.setaClass(Class.forName(classAttr));
+                List<Element> results = helper.getChildNodeByName(action, "result");
+                for (Element result : results){
+                    String resultNameAttr = helper.getNodeAttrValue(result, "name");
+                    String resultValue = helper.getNodeValue(result);
+                    HashMap<String, String> map = new HashMap<>();
+                    map.put("name",resultNameAttr);
+                    map.put("viewPath",resultValue);
+                    obj.setResultMapping(map);
+                }
+                actionsList.add(obj);
+            }
+
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java
new file mode 100644
index 0000000000..4ce909e87c
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package org.xukai.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java
new file mode 100644
index 0000000000..7bca0d6506
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java
@@ -0,0 +1,148 @@
+package org.xukai.coderising.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xukai
+ * @desc
+ * @date 2017-02-27-下午 4:19
+ */
+public class ReflectUtil {
+
+    private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class);
+
+    public static Object newInstance(Class<?> cls){
+        Object instance = null;
+        try {
+            instance = cls.newInstance();
+        } catch (Exception e) {
+            logger.error("new instance failure",e);
+            throw new RuntimeException(e);
+        }
+        return instance;
+    }
+
+
+    public static Object invokeMethod(Object obj, Method method,Object... args){
+        Object result = null;
+        try {
+            method.setAccessible(true);
+            result = method.invoke(obj, args);
+        } catch (Exception e) {
+            logger.error("invoke method failure",e);
+            throw new RuntimeException(e);
+        }
+        return result;
+    }
+
+    public static Method getMethod(Class<?> cls, String methodName){
+        Method result = null;
+        try {
+            Method[] methods = cls.getDeclaredMethods();
+            for(Method method : methods){
+                if (method.getName().equals(methodName)) {
+                    result = method;
+                }
+            }
+        } catch (Exception e) {
+            logger.error("get method failure",e);
+            throw new RuntimeException(e);
+        }
+        return result;
+    }
+
+    public static List<Method> getMethodBeginWith(Class<?> cls, String methodName){
+        ArrayList<Method> methodsList = new ArrayList<>();
+        try {
+            Method[] methods = cls.getDeclaredMethods();
+            for(Method method : methods){
+                if (method.getName().startsWith(methodName)) {
+                    methodsList.add(method);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("get methods failure",e);
+            throw new RuntimeException(e);
+        }
+        return methodsList;
+    }
+
+    public static void setField(Object obj, Field field, Object values){
+        try {
+            field.setAccessible(true);
+            field.set(obj,values);
+        } catch (Exception e) {
+            logger.error("set field failure",e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 通过反射取对象指定字段(属性)的值
+     * @param target 目标对象
+     * @param fieldName 字段的名字
+     * @throws RuntimeException 如果取不到对象指定字段的值则抛出异常
+     * @return 字段的值
+     */
+    public static Object getValue(Object target, String fieldName) {
+        Class<?> clazz = target.getClass();
+        String[] fs = fieldName.split("\\.");
+
+        try {
+            for(int i = 0; i < fs.length - 1; i++) {
+                Field f = clazz.getDeclaredField(fs[i]);
+                f.setAccessible(true);
+                target = f.get(target);
+                clazz = target.getClass();
+            }
+
+            Field f = clazz.getDeclaredField(fs[fs.length - 1]);
+            f.setAccessible(true);
+            return f.get(target);
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 通过反射给对象的指定字段赋值
+     * @param target 目标对象
+     * @param fieldName 字段的名称
+     * @param value 值
+     */
+    public static void setValue(Object target, String fieldName, Object value) {
+        Class<?> clazz = target.getClass();
+        String[] fs = fieldName.split("\\.");
+        try {
+            for(int i = 0; i < fs.length - 1; i++) {
+                Field f = clazz.getDeclaredField(fs[i]);
+                f.setAccessible(true);
+                Object val = f.get(target);
+                if(val == null) {
+                    Constructor<?> c = f.getType().getDeclaredConstructor();
+                    c.setAccessible(true);
+                    val = c.newInstance();
+                    f.set(target, val);
+                }
+                target = val;
+                clazz = target.getClass();
+            }
+
+            Field f = clazz.getDeclaredField(fs[fs.length - 1]);
+            f.setAccessible(true);
+            f.set(target, value);
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java
new file mode 100644
index 0000000000..71b200aff8
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java
@@ -0,0 +1,44 @@
+package org.xukai.coderising.util;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.xpath.DefaultXPath;
+
+import java.util.List;
+
+/**
+ * @author xukai
+ * @desc
+ * @date 2017-02-27-下午 2:28
+ */
+public class XmlParseHelper {
+
+    private Document doc;
+
+    private DefaultXPath xPath;
+
+    public XmlParseHelper(Document doc) {
+        if (doc == null) {
+            throw new RuntimeException("构造xml解析器出错");
+        }
+        this.doc = doc;
+    }
+
+    public List<Element> getNodeByPath(String path){
+        xPath = new DefaultXPath(path);
+        return xPath.selectNodes(doc);
+    }
+
+    public List<Element> getChildNodeByName(Element parentNode,String childNodeName){
+        xPath = new DefaultXPath("./" + childNodeName);
+        return xPath.selectNodes(parentNode);
+    }
+
+    public String getNodeAttrValue(Element node,String attrName){
+        return node.attributeValue(attrName);
+    }
+
+    public String getNodeValue(Element node){
+        return node.getTextTrim();
+    }
+}
diff --git a/group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml b/group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml
new file mode 100644
index 0000000000..248d8bf7a5
--- /dev/null
+++ b/group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.xukai.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.xukai.coderising.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp></result>
+    	<result name = "error">/jsp/error.jsp></result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group19/527220084/xukai_coding/pom.xml b/group19/527220084/xukai_coding/pom.xml
index f8e396ae46..fc66b7c29c 100644
--- a/group19/527220084/xukai_coding/pom.xml
+++ b/group19/527220084/xukai_coding/pom.xml
@@ -50,6 +50,8 @@
         <v.p.mvn.compiler>3.1</v.p.mvn.compiler>
         <commons-collections4.version>4.0</commons-collections4.version>
         <jedis.version>2.8.0</jedis.version>
+        <jaxen.version>1.1.1</jaxen.version>
+        <dom4j.version>1.6.1</dom4j.version>
     </properties>
 
     <dependencyManagement>
@@ -281,7 +283,7 @@
             <dependency>
                 <groupId>dom4j</groupId>
                 <artifactId>dom4j</artifactId>
-                <version>1.6.1</version>
+                <version>${dom4j.version}</version>
             </dependency>
             <dependency>
                 <groupId>javax.servlet</groupId>
@@ -345,6 +347,11 @@
                 <artifactId>jedis</artifactId>
                 <version>${jedis.version}}</version>
             </dependency>
+            <dependency>
+                <groupId>jaxen</groupId>
+                <artifactId>jaxen</artifactId>
+                <version>${jaxen.version}</version>
+            </dependency>
 
         </dependencies>
     </dependencyManagement>
diff --git a/group19/709960951/CodeLearning/lib/dom4j-1.6.1.jar b/group19/709960951/CodeLearning/lib/dom4j-1.6.1.jar
new file mode 100644
index 0000000000..c8c4dbb92d
Binary files /dev/null and b/group19/709960951/CodeLearning/lib/dom4j-1.6.1.jar differ
diff --git a/group19/709960951/CodeLearning/src/com/coderising/array/ArrayUtil.java b/group19/709960951/CodeLearning/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..afd98cbfeb
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,218 @@
+package com.coderising.array;
+
+import java.util.LinkedList;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin==null)
+		{
+			return ;
+		}
+		int from=0;
+		int to=origin.length-1;
+		while(from<to)
+		{
+			int temp=origin[from];
+			origin[from]=origin[to];
+			origin[to]=temp;
+			from++;
+			to--;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if(oldArray==null)
+		{
+			return new int[0];
+		}
+		int zeroCount=0;
+		for(int value:oldArray)
+		{
+			if(value==0)
+				zeroCount++;
+		}
+		int[] newArray=new int[oldArray.length-zeroCount];
+		int index=0;
+		for(int value:oldArray)
+		{
+			if(value!=0)
+			{
+				newArray[index++]=value;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		
+		if(array1==null)
+		{
+			return array2;
+		}
+		if(array2==null)
+		{
+			return array1;
+		}
+		int[] allArray=new int[array1.length+array2.length];
+		int index1=0,index2=0,index=0;
+		while(index1<array1.length&&index2<array2.length)
+		{
+			if(array1[index1]<array2[index2])
+			{
+				allArray[index++]=array1[index1++];
+			}else{
+				allArray[index++]=array2[index2++];
+			}
+		}
+		if(index1<array1.length)
+		{
+			for(int i=index1;i<array1.length;i++)
+			{
+				allArray[index++]=array1[i];
+			}
+		}
+		if(index2<array2.length)
+		{
+			for(int i=index2;i<array2.length;i++)
+			{
+				allArray[index++]=array2[i];
+			}
+		}
+		return  allArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		if(oldArray==null)
+		{
+			return new int[size];
+		}
+		int[] newArray=new int[oldArray.length+size];
+		for(int i=0;i<oldArray.length;i++)
+		{
+			newArray[i]=oldArray[i];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		if(max<2)
+		{
+			return new int[0];
+		}
+		int first=1,second=1;
+		int count=2;
+		while(true)
+		{
+			int sum=first+second;
+			if(sum<max)
+			{
+				count++;
+				first=second;
+				second=sum;
+			}else{
+				break;
+			}
+		}
+		int[] array=new int[count];
+		array[0]=1;
+		array[1]=1;
+		int index=2;
+		while(index<count)
+		{
+			array[index]=array[index-1]+array[index-2];
+			index++;
+		}
+		return array;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		if(max<3)
+			return new int[0];
+		//素数筛法
+		return null;
+	}
+	
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		//逐个进行质因数分解
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		if(array==null || array.length<1)
+		{
+			return "";
+		}
+		StringBuilder sb=new StringBuilder();
+		for(int i=0;i<array.length;i++)
+		{
+			sb.append(Integer.toString(i));
+			if(i<array.length-1)
+			{
+				sb.append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/LoginAction.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group19/709960951/CodeLearning/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/group19/709960951/CodeLearning/src/com/coderising/litestruts/StructsAction.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StructsAction.java
new file mode 100644
index 0000000000..2f9a874717
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StructsAction.java
@@ -0,0 +1,29 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class StructsAction {
+	private String name;
+	private String actionClass;
+	private Map<String, String> results;
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getActionClass() {
+		return actionClass;
+	}
+	public void setActionClass(String actionClass) {
+		this.actionClass = actionClass;
+	}
+	public Map<String, String> getResults() {
+		return results;
+	}
+	public void setResults(Map<String, String> results) {
+		this.results = results;
+	}
+	
+}
diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..536a6be705
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,91 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	StrutsManager sm=StrutsManager.getInstance();
+    	StructsAction actionConfig=sm.getAction(actionName);
+    	Class<?> actionClz;
+		try {
+			actionClz = Class.forName(actionConfig.getActionClass());
+			Object actionObj=actionClz.newInstance();
+			//设置参数值
+			for(String key:parameters.keySet())
+			{
+				if(key!=null && key.length()>0)
+				{
+					String value=parameters.get(key);
+					String methodName="set"+key.substring(0, 1).toUpperCase()+key.substring(1);
+					Method method=actionClz.getMethod(methodName, String.class);
+					method.invoke(actionObj, value);
+				}
+			}
+			//执行
+			Method executeMethod=actionClz.getMethod("execute");
+			String result=(String)executeMethod.invoke(actionObj);
+			
+			//生成View对象
+			View view=new View();
+			String jsp=actionConfig.getResults().get(result);
+			view.setJsp(jsp);
+			//设置View的parameters
+			Map<String, Object> vParams=new HashMap<>();
+			for(Method method:actionClz.getMethods())
+			{
+				String methodName=method.getName();
+				if(methodName.startsWith("get"))
+				{
+					Object paramValue=method.invoke(actionObj);
+					String paramKey=methodName.substring(3, 4).toLowerCase()+methodName.substring(4);
+					vParams.put(paramKey, paramValue);
+				}
+			}
+			view.setParameters(vParams);
+			return view;
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+    	return new View();
+    }    
+
+}
diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java
new file mode 100644
index 0000000000..1af4b38bdc
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java
@@ -0,0 +1,93 @@
+package com.coderising.litestruts;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+public class StrutsManager {
+	private static StrutsManager instance;
+	private Map<String,StructsAction> actions;
+	private StrutsManager(){}
+	public static StrutsManager getInstance()
+	{
+		if(instance==null)
+		{
+			synchronized (StrutsManager.class) {
+				if(instance==null)
+				{
+					instance=new StrutsManager();
+					instance.readStrutsXml();
+				}
+				
+			}
+		}
+		return instance;
+	}
+	
+	/**
+	 * 读取struts配置文件
+	 */
+	private void readStrutsXml() {
+		actions = new HashMap<>();
+		String path = StrutsManager.class.getResource("struts.xml").getFile();
+		SAXReader reader = new SAXReader();
+		Document doc;
+		try {
+			doc = reader.read(new File(path));
+			Element root = doc.getRootElement();
+			//遍历action节点
+			for(Iterator<?> childIter=root.elementIterator("action");childIter.hasNext();)
+			{
+				StructsAction action=new StructsAction();
+				Element ele=(Element)childIter.next();
+				String name=ele.attributeValue("name");
+				String className=ele.attributeValue("class");
+				//System.out.println(name+":"+className);
+				action.setName(name);
+				action.setActionClass(className);
+				Map<String,String> results=new HashMap<>();
+				//遍历result节点
+				for(Iterator<?> resultIter=ele.elementIterator("result");resultIter.hasNext();)
+				{
+					Element resultEle=(Element)resultIter.next();
+					String resultName=resultEle.attributeValue("name");
+					String resultUrl=resultEle.getText();
+					results.put(resultName, resultUrl);
+					//System.out.println(resultName+":"+resultUrl);
+				}
+				action.setResults(results);
+				actions.put(action.getName(), action);
+			} 
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public StructsAction getAction(String name)
+	{
+		return actions.get(name);
+	}
+	
+	public static void main(String[] argv) {
+
+		StrutsManager instance=StrutsManager.getInstance();
+		StructsAction actionObj=instance.getAction("login");
+		System.out.println(actionObj.getName());
+		System.out.println(actionObj.getActionClass());
+		System.out.println(actionObj.getResults().get("success"));
+		System.out.println(actionObj.getResults().get("fail"));
+		try {
+			Class.forName("com.coderising.litestruts.LoginAction");
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml b/group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group19/972815123/.classpath b/group19/972815123/.classpath
new file mode 100644
index 0000000000..fceb4801b5
--- /dev/null
+++ b/group19/972815123/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/group19/972815123/.project b/group19/972815123/.project
new file mode 100644
index 0000000000..aec36208a6
--- /dev/null
+++ b/group19/972815123/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Homework</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group19/972815123/.settings/org.eclipse.jdt.core.prefs b/group19/972815123/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/group19/972815123/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group19/972815123/src/com/coderising/array/ArrayUtil.java b/group19/972815123/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..fca1de56e4
--- /dev/null
+++ b/group19/972815123/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,221 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if(origin == null || origin.length <= 1){
+			return;
+		}
+		int tem = 0;
+		for(int i = 0, len = origin.length; i < len/2; i ++){
+			tem = origin[i];
+			origin[i] = origin[len - i + 1];
+			origin[len - i + 1] = tem;
+		}
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		int withoutZeroSize = 0;
+		for(int i = 0, len = oldArray.length; i < len; i ++ ){
+			if( oldArray[i] == 0){
+				withoutZeroSize ++;
+			}
+		}
+		int[] newArray = new int[withoutZeroSize];
+		int point = 1;
+		for(int i = 0 ,len = oldArray.length; i < len; i ++ ){
+			if( oldArray[i] != 0){
+				newArray[point] = oldArray[i];
+				point ++;
+			}
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int point2 = 0;
+		int[] result = new int[array1.length + array2.length];
+		int point1 = 0, len1 = array1.length;
+		while(point1 < len1){
+			if(array1[point1] < array2[point2]){
+				result[point1 + point2] = array1[point1];
+				point1 ++;
+			}else{
+				result[point1 + point2] = array2[point2];
+				point2 ++;
+			}
+		}
+		
+		return  result;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		int[] newArray = new int[oldArray.length + size];
+		for(int i = 0, len = oldArray.length; i < len; i ++){
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		int[] result = {1,1,2};
+		int a1 = 1, a2 = 2;
+		if(max <= 1){
+			return null;
+		}else if(max == 2){
+			return result;
+		}else{
+			result = grow(result, 10);
+			int index = 2;
+			while(result[index] > max){
+				if(result.length < index + 2){
+					result = grow(result, 10);
+				}
+				result[index + 1] = result[index -1] + result[index];
+				index ++;
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		int[] temArr = null;
+		if(max < 2){
+			return null;
+		}else if (max == 2){
+			int[] re = {2};
+			return re;
+		}else{
+			temArr = new int[max/2];
+			temArr[0] = 2;
+			int index = 1;
+			for(int i = 3; i < max ; i= i+2){
+				boolean flag = true;
+				int isql = (int) Math.sqrt(i);
+				for(int j = 3; j < isql; j++){
+					if(i % j == 0){
+						flag = false;
+					}
+				}
+				if(flag){
+					temArr[index] = i;
+					index ++;
+				}
+			}
+		}
+		temArr = this.removeZero(temArr);
+		return temArr;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		int[] result = new int[10];
+		int index = 0;
+		if(max < 6){
+			return null;
+		}else{
+					}
+		for (int n = 6; n <= max ; n ++){
+			int[] allPrimeFactore = getPrimeFactors(n);
+			int sum = 0;
+			for(int i = 0, len = allPrimeFactore.length; i < len; i ++){
+				sum += allPrimeFactore[i];
+			}
+			if(sum == n){
+				if(result.length < index + 1){
+					result = this.grow(result, 1);
+				}
+				result[index] = n;
+				index ++;
+			}
+
+		}
+		return removeZero(result);
+	}
+	
+	private int[] getPrimeFactors(int n){
+		int[] allPrimes = getPrimes(n);
+		int[] result = new int[allPrimes.length];
+		int index = 0;
+		for(int i = 0, len = allPrimes.length; i < len; i ++){
+			int devide = n;
+			while(devide % allPrimes[i] == 0){
+				devide = devide / allPrimes[i];
+				result[index] = allPrimes[i];
+				index ++;
+			}
+		}
+		return this.removeZero(result);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		StringBuffer sb = new StringBuffer();
+		for(int i = 0, len = array.length; i < len; i ++){
+			if(i != 0){
+				sb.append(seperator);
+			}
+			sb.append(array[i]);
+		}
+		return sb.toString();
+	}
+	
+
+}
diff --git a/group19/972815123/src/com/coderising/litestruts/LoginAction.java b/group19/972815123/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..22f70d59e8
--- /dev/null
+++ b/group19/972815123/src/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,45 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+    		System.out.println("execute");
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                System.out.println("successful");
+                
+                return "success";
+            }
+            System.out.println("failed");
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+        System.out.println("***name***");
+    }
+    public void setPassword(String password){
+    	System.out.println("***pswd***");
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group19/972815123/src/com/coderising/litestruts/Main.java b/group19/972815123/src/com/coderising/litestruts/Main.java
new file mode 100644
index 0000000000..66f3e67edd
--- /dev/null
+++ b/group19/972815123/src/com/coderising/litestruts/Main.java
@@ -0,0 +1,9 @@
+package com.coderising.litestruts;
+
+public class Main {
+
+	public static void main(String[] args) {
+		Struts.runAction(null, null);
+	}
+
+}
diff --git a/group19/972815123/src/com/coderising/litestruts/Struts.java b/group19/972815123/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..7d908282b6
--- /dev/null
+++ b/group19/972815123/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,155 @@
+package com.coderising.litestruts;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.coding.basic.Iterator;
+
+
+
+public class Struts {
+	private static String url = "C:\\Users\\alioc\\workspace\\Homework\\src\\com\\coderising\\litestruts\\struts.xml";
+	private static int SET = 1;
+	private static int GET = -1;
+	/*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+	 */
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+    	HashMap<String, HashMap<String, String>> xml = parseStrutsXml(url);
+    	HashMap<String, String> login = xml.get("login");
+    	String loginClassName = login.get("class");
+    	System.out.println(loginClassName);
+    	
+    	ClassLoader loader = ClassLoader.getSystemClassLoader();
+    	try {
+			Class<?> clazz =  Class.forName(loginClassName);
+			Object obj = clazz.newInstance();
+			java.util.Iterator<String> iter = parameters.keySet().iterator();
+			while(iter.hasNext()){
+				String key = iter.next();
+				String val = parameters.get(key);
+				Method method = clazz.getDeclaredMethod(getEncapsulateMethodName(SET, key), String.class);
+				method.invoke(obj, val);
+			}
+			Method executeMethod = clazz.getDeclaredMethod("execute");
+			String logResult = (String) executeMethod.invoke(obj);
+			if("success".equals(logResult)){
+				View view = new View();
+				view.setJsp(login.get("success"));
+				
+				Method getMessageMethod = clazz.getDeclaredMethod(getEncapsulateMethodName(GET, "message"));
+				String message = (String) getMessageMethod.invoke(obj);
+				
+//				Field messageField = clazz.getDeclaredField("message");
+//				messageField.setAccessible(true);
+//				String message = (String) messageField.get(clazz);
+				Map map = new HashMap<>();
+				map.put("message", message);
+				view.setParameters(map);
+				
+				return view;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+    	
+    	
+    	
+    	
+    	
+    	
+    	return null;
+    }    
+    
+    private static HashMap<String, HashMap<String, String>> parseStrutsXml(String url){
+    	
+    	HashMap<String, HashMap<String, String>> result = new HashMap<String, HashMap<String, String>>();
+    	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
+    	try {
+			DocumentBuilder builder = dbf.newDocumentBuilder();
+			InputStream is = new FileInputStream(url);
+			Document doc = builder.parse(is);
+			Element root = doc.getDocumentElement(); 
+			
+			NodeList actionNodes = root.getChildNodes(); 
+			for(int i = 0; i < actionNodes.getLength(); i ++){
+				Node actionNode = actionNodes.item(i);
+				if(actionNode.getNodeType() == Node.ELEMENT_NODE){
+					if(actionNode.getAttributes() != null){
+						HashMap<String, String> action = new HashMap<>();
+						String name = actionNode.getAttributes().getNamedItem("name").getNodeValue();
+						String clazz = actionNode.getAttributes().getNamedItem("class").getNodeValue();
+						result.put(name, action);
+						action.put("class", clazz);
+						
+						
+						NodeList resultNodes = actionNode.getChildNodes();
+						
+						for(int j = 0; j < resultNodes.getLength(); j ++){
+							Node resultNode = resultNodes.item(j);
+							if(resultNode.getNodeType() == Node.ELEMENT_NODE){
+								String fieldName = resultNode.getAttributes().getNamedItem("name").getNodeValue();
+								String fieldValue = resultNode.getTextContent();
+								action.put(fieldName, fieldValue);
+							}
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} 
+    	
+    	System.out.println("--------------------");
+    	System.out.println(result);
+    	return result;
+    }
+
+    private static String getEncapsulateMethodName(int type, String methodName){
+    	StringBuffer sb = new StringBuffer();       
+    	if(type < 0){
+    		sb.append("get");       
+    	}else{
+    		sb.append("set");       
+    	}
+    	sb.append(methodName.substring(0, 1).toUpperCase());       
+    	sb.append(methodName.substring(1)); 
+    	return sb.toString();
+    }
+}
diff --git a/group19/972815123/src/com/coderising/litestruts/StrutsTest.java b/group19/972815123/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..561885ccaf
--- /dev/null
+++ b/group19/972815123/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,44 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        System.out.println(view.getJsp());
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group19/972815123/src/com/coderising/litestruts/View.java b/group19/972815123/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group19/972815123/src/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group19/972815123/src/com/coderising/litestruts/struts.xml b/group19/972815123/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/group19/972815123/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/1040154728/1040154728Learning/src/ArrayList.java b/group20/1040154728/1040154728Learning/src/ArrayList.java
new file mode 100644
index 0000000000..77fed2b0f4
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/ArrayList.java
@@ -0,0 +1,46 @@
+public class ArrayList<T> implements List<T> {
+    //private fields
+	private int size = 0;
+    private Object[] elementData = new Object[100];
+    //check if list is empty
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+	public void add(Object o){
+		elementData[size++] = o;
+	}
+	public void add(int index, T o){
+	    /* Not familiar with array copy, copied from GitMori  */
+        System.arraycopy(elementData, index, elementData,
+                index + 1, size-index);
+        elementData[index] = o;
+        size++;
+	}
+	
+	public T get(int index){
+		return (T) elementData[index];
+	}
+	
+	public T remove(int index){
+		T t = this.get(index);
+		int position = size - index - 1; //why ?
+        if (position > 0){
+            System.arraycopy(elementData, index+1, elementData,
+                    index, position);
+        }
+        elementData[--size] = null;
+        return t;
+	}
+	
+	public int size(){
+		return size;
+	}
+
+	//??
+	public Iterator iterator(){
+		return null;
+	}
+
+
+}
diff --git a/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java b/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java
new file mode 100644
index 0000000000..425894819d
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java
@@ -0,0 +1,28 @@
+public class BinaryTreeNode <T extends Comparable> {
+	private T data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	private int size;
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+	
+
+}
diff --git a/group20/1040154728/1040154728Learning/src/Iterator.java b/group20/1040154728/1040154728Learning/src/Iterator.java
new file mode 100644
index 0000000000..0e1a09433b
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/Iterator.java
@@ -0,0 +1,5 @@
+public interface Iterator<T> {
+	public boolean hasNext();
+	public T next();
+
+}
diff --git a/group20/1040154728/1040154728Learning/src/LinkedList.java b/group20/1040154728/1040154728Learning/src/LinkedList.java
new file mode 100644
index 0000000000..18f6fddf37
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/LinkedList.java
@@ -0,0 +1,110 @@
+public class LinkedList<T> implements List<T> {
+	
+	private Node head;
+	private Node tail;
+	private int size;
+	
+	public void add(T o){
+        Node node = new Node(o);
+        if(head == null)
+        {
+            head = node;
+        }
+        else
+        {
+            tail.next = node;
+        }
+        tail = node;
+        tail.next = null;
+        size++;
+
+	}
+	public void add(int index , T o){
+		Node node = new Node(o);
+		Node temp = head;
+		Node tempTemp = null;
+		for(int i = 0; i <= index; i++)
+        {
+            temp = temp.next;
+        }
+        tempTemp = temp.next;
+		temp.next = node;
+		node.next = tempTemp;
+		size++;
+	}
+	public T get(int index){
+	    Node temp = head;
+	    for(int i = 0; i <= index; i++)
+        {
+            temp = temp.next;
+        }
+		return (T)temp.data;
+	}
+	public T remove(int index){
+		if(index == 0){
+		    T o = (T) removeFirst();
+		    return o;
+        }
+        Node temp = head;
+		Node tempTemp = null;
+		for(int i = 0; i <= index; i++)
+        {
+            temp = temp.next;
+        }
+        T o = (T) temp.next.data;
+		tempTemp = temp.next.next;
+		temp.next = null;
+		temp.next = tempTemp;
+		size--;
+		return o;
+	}
+	
+	public int size(){
+		return size;
+	}
+
+    @Override
+    public boolean isEmpty() {
+        return false;
+    }
+
+    public void addFirst(T o){
+		Node node = new Node(o);
+		node.next = head;
+		head = node;
+		size++;
+	}
+	public void addLast(T o){
+		this.add(o);
+	}
+	public T removeFirst(){
+		T o = (T) head.data;
+		head = head.next;
+		size--;
+		return o;
+	}
+	public Object removeLast(){
+		Node temp = head;
+		for(int i = 0; i <= size; i++)
+        {
+            temp = temp.next;
+        }
+        temp.next = null;
+		T o = (T) tail.data;
+		tail = temp;
+		size--;
+		return o;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private class Node{
+		T data;
+		Node next;
+
+        public Node(T o) {
+        }
+    }
+}
diff --git a/group20/1040154728/1040154728Learning/src/List.java b/group20/1040154728/1040154728Learning/src/List.java
new file mode 100644
index 0000000000..eb27d39f6b
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/List.java
@@ -0,0 +1,8 @@
+public interface List<T> {
+	public void add(T object);
+	public void add(int index, T object);
+	public T get(int index);
+	public T remove(int index);
+	public int size();
+	boolean isEmpty();
+}
diff --git a/group20/1040154728/1040154728Learning/src/Queue.java b/group20/1040154728/1040154728Learning/src/Queue.java
new file mode 100644
index 0000000000..b7e03881fe
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/Queue.java
@@ -0,0 +1,22 @@
+public class Queue<T> {
+
+    private LinkedList<T> element = new LinkedList<T>();
+
+
+
+	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/SinglyLinkedList/LinkedList0.java b/group20/1040154728/1040154728Learning/src/SinglyLinkedList/LinkedList0.java
deleted file mode 100644
index 7cdf1e7f26..0000000000
--- a/group20/1040154728/1040154728Learning/src/SinglyLinkedList/LinkedList0.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package SinglyLinkedList;
-
-/**
- * Created by Honoka on 2/16/2017.
- */
-public class LinkedList0 {
-    //Node class represents a list node
-    private class Node
-    {
-        String value;
-        Node next;
-        /**
-         * Constructor
-         * @param val The element to store in this node.
-         * @param n The reference to the next node.
-         */
-        Node (String val, Node n)
-        {
-            value = val;
-            next = n;
-        }
-
-        /**
-         * Constructor
-         * @param val The element to store in this node.
-         */
-        Node(String val)
-        {
-            value = val;
-            next = null;
-        }
-    }
-    //Reference to the first node in the list
-    private Node first = null;
-    /**
-     * Constructor
-     * Builds a linked list
-     */
-    public LinkedList0()
-    {
-        //test
-        first = new Node("Apple");
-        first.next = new Node("Peach");
-        first.next.next = new Node("Kiwi");
-        first = new Node("Blueberry",first);
-
-        //Using an array to add elements into list
-        String[] fruits = {"Banana", "Cherry"};
-        for (String f : fruits)
-        {
-            first = new Node(f, first);
-        }
-    }
-    /**
-     * print method
-     * traverses the list and prints all elements
-     */
-    public void print()
-    {
-        Node reference = first;
-        while(reference != null)
-        {
-            System.out.println(reference.value + " ");
-            reference = reference.next;
-        }
-    }
-
-    //Main test method
-    public static void main(String [] args)
-    {
-        LinkedList0 list = new LinkedList0();
-        System.out.println("The elements inside this list are ");
-        list.print();
-    }
-}
diff --git a/group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java b/group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java
deleted file mode 100644
index 8c93bbc640..0000000000
--- a/group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java
+++ /dev/null
@@ -1,242 +0,0 @@
-package SinglyLinkedList2;
-/**
- * Created by Honoka on 2/16/2017.
- */
-public class LinkedList1 {
-    private class Node
-    {
-        String value;
-        Node next;
-
-        Node(String val, Node n)
-        {
-            value = val;
-            next = n;
-        }
-        Node(String val)
-        {
-            //Call the other(daddy(or sister(whatever))) constructor.
-            this(val, null);
-        }
-    }
-
-    private Node first; // head
-    private Node last;  //the last element in list
-
-    public LinkedList1()
-    {
-        first = null;
-        last = null;
-    }
-
-    /**This method checks to see
-     * if the list is empty
-     * @return true if list is empty
-     */
-    public boolean isEmpty()
-    {
-        return first == null;
-    }
-
-    /**
-     * size method returns the length of the list
-     * @return The number of the elements in the list
-     */
-    public int size()
-    {
-        int counter = 0;
-        Node p = first;
-        while (p != null)
-        {
-            counter ++;
-            p = p.next;
-        }
-        return counter;
-    }
-
-    /**
-     * add method add an element to the end of the list
-     * @param element the value to add
-     */
-    public void add(String element)
-    {
-        if (isEmpty())
-        {
-            //Obviously, add the element to the first position in the list
-            first = new Node(element);
-            last = first;
-        }
-        else
-        {
-            //add to the end of existing list
-            last.next = new Node(element);
-            last = last.next;
-        }
-    }
-
-    /**
-     * add method, or you might call it insert method since it can
-     * add element to a specific position
-     * @param index The position at which to add the element
-     * @param element you should know what is this
-     */
-    public void add (int index, String element)
-    {
-        if (index < 0 || index > size())
-        {
-            String message = String.valueOf(index);
-            throw new IndexOutOfBoundsException(message);
-        }
-
-        //index is at least 0
-        if(index == 0)
-        {
-            //new element add to the head
-            first = new Node(element, first);
-            if (last == null)
-            {
-                last = first;
-            }
-            return;
-        }
-        //set a reference predecessor to point to the node that
-        //will be the predecessor of the new node
-        Node predecessor = first;
-        for (int k = 1; k <= index - 1; k++)
-        {
-            predecessor = predecessor.next;
-        }
-        //Splice in a node containing the new element
-        predecessor.next = new Node(element, predecessor.next);
-
-        //if there is a new last element
-        if(predecessor.next.next == null)
-            last = predecessor.next;
-    }
-
-    /**
-     * toString method, like print method, hopefully it will display the contents of the list
-     * @return say something I'm giving up on you(
-     */
-    public String toString()
-    {
-        StringBuffer strBuilder = new StringBuffer();
-        //Use p to walk down the list
-        Node p = first;
-        while (p != null)
-        {
-            strBuilder.append(p.value + "\n");
-            p = p.next;
-        }
-        return strBuilder.toString();
-    }
-
-    /**
-     * remove method removes the element with the position you want
-     * @param index the position of the element that you want to remove
-     * @return the removed element
-     */
-    public String remove (int index)
-    {
-        /* Index out of bounds */
-        if (index < 0 || index >= size())
-        {
-            String message = String.valueOf(index);
-            throw new IndexOutOfBoundsException(message);
-        }
-        String element = null;
-        if(index == 0)
-        {
-            //Removal of first item in the list
-            element = first.value;
-            first = first.next;
-            if (first == null)
-            {
-                last = null;
-            }
-        }
-        else
-        {
-            /* find the predecessor of the element to be removed */
-            Node predecessor = first;
-
-            /* Move predecessor forward index - 1 times */
-            for (int k = 1; k <= index - 1; k++)
-            {
-                predecessor = predecessor.next;
-                /* Store the value to return */
-                element = predecessor.next.value;
-                /* Route link around the node to be removed */
-                predecessor.next = predecessor.next.next;
-                /* Check if predecessor is now last */
-                if(predecessor.next == null)
-                {
-                    last = predecessor;
-                }
-            }
-        }
-        return element;
-    }
-
-    /**
-     * The remove method removes an element
-     * @param element the element to remove
-     * @return true if the remove succeeded
-     */
-    public boolean remove(String element)
-    {
-        if (isEmpty())
-        {
-            return false;
-        }
-
-        if (element.equals(first.value))
-        {
-            //Removal of first element in the list
-            first = first.next;
-            if(first == null)
-            {
-                last = null;
-            }
-            return true;
-        }
-
-        /* Find the predecessor of the element to remove */
-        Node predecessor = first;
-        while (predecessor.next != null &&
-                !predecessor.next.value.equals(element))
-        {
-            predecessor = predecessor.next;
-        }
-        /* predecessor.next == null OR predecessor.next.value is element */
-        if(predecessor.next == null)
-        {
-            return false;
-        }
-        /* predecessor.next.value is element */
-        predecessor.next = predecessor.next.next;
-
-        /* check if predecessor is now last */
-        if (predecessor.next == null)
-        {
-            last = predecessor;
-        }
-        return true;
-    }
-
-    public static void main (String [] args)
-    {
-        LinkedList1 testList = new LinkedList1();
-        testList.add("Apple");
-        testList.add("Banana");
-        testList.add(0,"Blueberry");
-        testList.add(2,"Cherry");
-        testList.add(4,"Peach");
-        System.out.println("The list has : ");
-        System.out.println(testList);
-        testList.remove("Cherry");
-        testList.remove(2);
-        System.out.println("The list has : ");
-        System.out.println(testList);
-    }
-}
diff --git a/group20/1040154728/1040154728Learning/src/Stack.java b/group20/1040154728/1040154728Learning/src/Stack.java
new file mode 100644
index 0000000000..959b081239
--- /dev/null
+++ b/group20/1040154728/1040154728Learning/src/Stack.java
@@ -0,0 +1,21 @@
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		return elementData.remove(elementData.size() -1);
+	}
+	
+	public Object peek(){
+		return elementData.get(elementData.size()-1);
+	}
+	public boolean isEmpty(){
+		return elementData.isEmpty();
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group20/1107837739/1107837739Learning/lib/dom4j-1.6.1.jar b/group20/1107837739/1107837739Learning/lib/dom4j-1.6.1.jar
new file mode 100644
index 0000000000..c8c4dbb92d
Binary files /dev/null and b/group20/1107837739/1107837739Learning/lib/dom4j-1.6.1.jar differ
diff --git a/group20/1107837739/1107837739Learning/lib/fastjson-1.2.7.jar b/group20/1107837739/1107837739Learning/lib/fastjson-1.2.7.jar
new file mode 100644
index 0000000000..ce431a92c3
Binary files /dev/null and b/group20/1107837739/1107837739Learning/lib/fastjson-1.2.7.jar differ
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..87ea998621
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java
@@ -0,0 +1,258 @@
+package org.korben.coderising.array;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ArrayUtil
+ *
+ * Created by Korben on 26/02/2017.
+ */
+public class ArrayUtil {
+
+    /**
+     * 给定一个整形数组a , 对该数组的值进行置换
+     * 例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+     * 如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+     */
+    public static void reverseArray(int[] origin) {
+        ensureNotNull(origin);
+
+        int length = origin.length;
+        for (int i = 0; i < length / 2; i++) {
+            int tmp = origin[i];
+            origin[i] = origin[length - i - 1];
+            origin[length - i - 1] = tmp;
+        }
+    }
+
+    /**
+     * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+     * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：
+     * {1,3,4,5,6,6,5,4,7,6,7,5}
+     */
+    public static int[] removeZero(int[] oldArray) {
+        ensureNotNull(oldArray);
+
+        int nonZeroCount = 0;
+        for (int i : oldArray) {
+            if (i != 0) {
+                nonZeroCount++;
+            }
+        }
+
+        int newArr[] = new int[nonZeroCount];
+        int newArrIndex = 0;
+        for (int i : oldArray) {
+            if (i != 0) {
+                newArr[newArrIndex++] = i;
+            }
+        }
+
+        return newArr;
+    }
+
+    /**
+     * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+     * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     */
+    public static int[] merge(int[] array1, int[] array2) {
+        ensureNotNull(array1);
+        ensureNotNull(array2);
+
+        int maxArraySize = array1.length + array2.length;
+        int[] mergedArray = new int[maxArraySize];
+
+        int index1 = 0;
+        int index2 = 0;
+        int mergedIndex = -1;
+        for (int i = 0; i < maxArraySize; i++) {
+            if (index1 == array1.length) {
+                System.arraycopy(array2, index2, mergedArray, mergedIndex + 1, array2.length - index2);
+                mergedIndex += array2.length - index2;
+                break;
+            } else if (index2 == array2.length) {
+                System.arraycopy(array1, index1, mergedArray, mergedIndex + 1, array1.length - index1);
+                mergedIndex += array1.length - index1;
+                break;
+            } else {
+                int compare = Integer.compare(array1[index1], array2[index2]);
+                if (compare < 0) {
+                    mergedArray[++mergedIndex] = array1[index1++];
+                } else if (compare > 0) {
+                    mergedArray[++mergedIndex] = array2[index2++];
+                } else {
+                    mergedArray[++mergedIndex] = array1[index1++];
+                    index2++;
+                }
+            }
+        }
+
+        // 清除数组多余部分
+        if (mergedIndex + 1 < maxArraySize) {
+            int[] resultArray = new int[mergedIndex + 1];
+            System.arraycopy(mergedArray, 0, resultArray, 0, mergedIndex + 1);
+            return resultArray;
+        }
+
+        return mergedArray;
+    }
+
+    /**
+     * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+     * 注意，老数组的元素在新数组中需要保持
+     * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+     * [2,3,6,0,0,0]
+     */
+    public static int[] grow(int[] oldArray, int size) {
+        ensureNotNull(oldArray);
+
+        if (size < 0) {
+            throw new IllegalArgumentException("size must > 0");
+        }
+
+        int[] newArray = new int[oldArray.length + size];
+
+        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+        for (int i = oldArray.length; i < newArray.length; i++) {
+            newArray[i] = 0;
+        }
+
+        return newArray;
+    }
+
+    /**
+     * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+     * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+     * max = 1, 则返回空数组 []
+     */
+    public static int[] fibonacci(int max) {
+        if (max == 1) {
+            int[] array = new int[1];
+            array[1] = 1;
+            return array;
+        }
+
+        List<Integer> list = new ArrayList<>();
+
+        for (int i = 1; ; i++) {
+            int fibonacciNumber = getFibonacciNumber(i);
+            if (fibonacciNumber <= max) {
+                list.add(fibonacciNumber);
+            } else {
+                break;
+            }
+        }
+
+        return list2Array(list);
+    }
+
+    private static int getFibonacciNumber(int index) {
+        if (index == 1) {
+            return 1;
+        }
+        if (index == 2) {
+            return 1;
+        }
+        return getFibonacciNumber(index - 2) + getFibonacciNumber(index - 1);
+    }
+
+    /**
+     * 返回小于给定最大值max的所有素数数组
+     * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     */
+    public static int[] getPrimes(int max) {
+        List<Integer> primeList = new ArrayList<>();
+        if (max <= 1) {
+            return new int[0];
+        }
+
+        if (max >= 2) {
+            primeList.add(2);
+        }
+
+        // 所有偶数都不是素数, 所以这里采用 i += 2
+        for (int i = 3; i < max; i += 2) {
+            if (isPrimeNumber(i, primeList)) {
+                primeList.add(i);
+            }
+        }
+
+        return list2Array(primeList);
+    }
+
+    private static boolean isPrimeNumber(int number, List<Integer> primeList) {
+        for (Integer prime : primeList) {
+            if (number % prime == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+     * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+     */
+    public static int[] getPerfectNumbers(int max) {
+        if (max <= 1) {
+            return new int[0];
+        }
+
+        List<Integer> perfectNumberList = new ArrayList<>();
+        for (int i = 2; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                perfectNumberList.add(i);
+            }
+        }
+        return list2Array(perfectNumberList);
+    }
+
+    private static boolean isPerfectNumber(int number) {
+        int sum = 1;
+        for (int i = 2; i <= number / 2; i++) {
+            if (number % i == 0) {
+                sum += i;
+            }
+        }
+
+        return sum == number;
+    }
+
+    /**
+     * 用separator 把数组 array给连接起来
+     * 例如array= [3,8,9], separator = "-"
+     * 则返回值为"3-8-9"
+     */
+    public static String join(int[] array, String separator) {
+        ensureNotNull(array);
+
+        if (separator == null) {
+            throw new NullPointerException();
+        }
+
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            stringBuilder.append(array[i]);
+            if (i != array.length - 1) {
+                stringBuilder.append(separator);
+            }
+        }
+
+        return stringBuilder.toString();
+    }
+
+    private static int[] list2Array(List<Integer> list) {
+        int[] result = new int[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            result[i] = list.get(i);
+        }
+        return result;
+    }
+
+    private static void ensureNotNull(int[] array) {
+        if (array == null) {
+            throw new NullPointerException();
+        }
+    }
+}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..9f23e2c341
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java
@@ -0,0 +1,185 @@
+package org.korben.coderising.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * ArrayUtil test
+ *
+ * Created by Korben on 26/02/2017.
+ */
+public class ArrayUtilTest {
+
+    @Test
+    public void reverseArray() throws Exception {
+        // test reverse even number
+        {
+            int[] testArray = new int[5];
+            for (int i = 0; i < 5; i++) {
+                testArray[i] = i;
+            }
+            ArrayUtil.reverseArray(testArray);
+            for (int i = 0; i < 5; i++) {
+                Assert.assertEquals(5 - 1 - i, testArray[i]);
+            }
+        }
+
+        // test reverse odd number
+        {
+            int[] testArray = new int[4];
+            for (int i = 0; i < 4; i++) {
+                testArray[i] = i;
+            }
+            ArrayUtil.reverseArray(testArray);
+            for (int i = 0; i < 4; i++) {
+                Assert.assertEquals(4 - 1 - i, testArray[i]);
+            }
+        }
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        // 测试非空数组
+        {
+            int[] testArray = new int[20];
+            for (int i = 0; i < 20; i++) {
+                if (i % 5 == 0) {
+                    testArray[i] = 0;
+                } else {
+                    testArray[i] = i;
+                }
+            }
+
+            int[] newArray = ArrayUtil.removeZero(testArray);
+            Assert.assertNotNull(newArray);
+            for (int i = 0; i < 20; i++) {
+                if (i % 5 == 0) {
+                    continue;
+                }
+
+                Assert.assertEquals(testArray[i], i);
+            }
+        }
+
+        // 测试空数组
+        {
+            int[] testArray = new int[5];
+            for (int i = 0; i < 5; i++) {
+                testArray[i] = 0;
+            }
+
+            int[] newArray = ArrayUtil.removeZero(testArray);
+            Assert.assertNotNull(newArray);
+            Assert.assertEquals(newArray.length, 0);
+        }
+    }
+
+    @Test
+    public void merge() throws Exception {
+        // 构建数组
+        int[] array1 = new int[10];
+        int[] array2 = new int[11];
+        array2[10] = 100;
+        for (int i = 0; i < 10; i++) {
+            if (i % 2 == 0) {
+                array1[i / 2] = i; // 0, 2, 4, 6, 8
+            } else {
+                array2[i / 2] = i; // 1, 3, 5, 7, 9
+            }
+        }
+
+        for (int i = 10; i < 15; i++) {
+            array1[i - 5] = i; // 10, 11, 12, 13, 14, 15
+            array2[i - 5] = i; // 10, 11, 12, 13, 14, 15
+        }
+
+        // 测试merge
+        {
+            int[] merge = ArrayUtil.merge(array1, array2);
+            Assert.assertNotNull(merge);
+            Assert.assertEquals(merge.length, 16);
+            for (int i = 0; i < 15; i++) {
+                Assert.assertEquals(merge[i], i);
+            }
+            Assert.assertEquals(merge[15], 100);
+        }
+        // 调换数组顺序
+        {
+            int[] merge = ArrayUtil.merge(array2, array1);
+            Assert.assertNotNull(merge);
+            Assert.assertEquals(merge.length, 16);
+            for (int i = 0; i < 15; i++) {
+                Assert.assertEquals(merge[i], i);
+            }
+            Assert.assertEquals(merge[15], 100);
+        }
+        // 测试空数组
+        {
+            int[] array3 = new int[0];
+            int[] merge1 = ArrayUtil.merge(array1, array3);
+            Assert.assertArrayEquals(merge1, array1);
+
+            int[] merge2 = ArrayUtil.merge(array3, array1);
+            Assert.assertArrayEquals(merge2, array1);
+        }
+        // 测试相同数组
+        {
+            int[] merge = ArrayUtil.merge(array1, array1);
+            Assert.assertArrayEquals(merge, array1);
+        }
+    }
+
+    @Test
+    public void grow() throws Exception {
+        int[] oldArray = new int[5];
+        for (int i = 0; i < 5; i++) {
+            oldArray[i] = i;
+        }
+
+        int[] newArray = ArrayUtil.grow(oldArray, 5);
+        for (int i = 0; i < 10; i++) {
+            if (i < 5) {
+                Assert.assertEquals(newArray[i], i);
+            } else {
+                Assert.assertEquals(newArray[i], 0);
+            }
+        }
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        int[] fibonacciArray = {1, 1, 2, 3, 5, 8, 13, 21};
+
+        int[] calculatedFibonacci = ArrayUtil.fibonacci(22);
+        Assert.assertArrayEquals(fibonacciArray, calculatedFibonacci);
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int[] expected = {2, 3, 5, 7, 11, 13, 17, 19};
+        int[] primes = ArrayUtil.getPrimes(23);
+        Assert.assertArrayEquals(primes, expected);
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int[] perfectNumbers = {6, 28, 496, 8128};
+        int[] calculatedPerfectNumbers = ArrayUtil.getPerfectNumbers(8220);
+        Assert.assertArrayEquals(perfectNumbers, calculatedPerfectNumbers);
+    }
+
+    @Test
+    public void join() throws Exception {
+        {
+            int[] array = {1};
+            String joinStr = ArrayUtil.join(array, "-");
+            Assert.assertEquals("1", joinStr);
+        }
+
+        {
+            int[] array = {1, 2, 3};
+            String joinStr = ArrayUtil.join(array, "-");
+            Assert.assertEquals("1-2-3", joinStr);
+        }
+    }
+}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..20fa9e766b
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java
@@ -0,0 +1,41 @@
+package org.korben.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ *
+ * @author liuxin
+ */
+public class LoginAction {
+    private String name;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String execute() {
+        if ("test".equals(name) && "1234".equals(password)) {
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..7ac88522bf
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java
@@ -0,0 +1,111 @@
+package org.korben.coderising.litestruts;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import org.korben.coderising.litestruts.dom.StrutsAction;
+import org.korben.coderising.litestruts.util.StrutsParser;
+
+public class Struts {
+
+    /**
+     * 0. 读取配置文件struts.xml
+     *
+     * 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+     * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+     * ("name"="test" ,  "password"="1234") ,
+     * 那就应该调用 setName和setPassword方法
+     *
+     * 2. 通过反射调用对象的execute 方法， 并获得返回值，例如"success"
+     *
+     * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+     * 通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+     * 放到View对象的parameters
+     *
+     * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+     * 放到View对象的jsp字段中。
+     */
+    public static View runAction(String actionName, Map<String, String> parameters) {
+        Map<String, StrutsAction> actionMap = StrutsParser.doParse();
+        StrutsAction action = actionMap.get(actionName);
+
+        if (action == null) {
+            System.out.println("couldn't get action: " + actionName + ", return");
+            return null;
+        }
+
+        try {
+            // 通过反射, 创建实例对象
+            Class<?> actionClass = Class.forName(action.getActionClassName());
+            Object actionObj = actionClass.newInstance();
+
+            // 调用 parameters 中的 set 方法
+            for (Map.Entry<String, String> parameterEntry : parameters.entrySet()) {
+                Method[] methods = actionClass.getMethods();
+                for (Method method : methods) {
+                    if (method.getName().equalsIgnoreCase("set" + parameterEntry.getKey())) {
+                        method.invoke(actionObj, parameterEntry.getValue());
+                    }
+                }
+            }
+            //for (Map.Entry<String, String> parameterEntry : parameters.entrySet()) {
+            //    for (PropertyDescriptor propertyDescriptor :
+            //            Introspector.getBeanInfo(actionClass).getPropertyDescriptors()) {
+            //        if (propertyDescriptor.getDisplayName().equals(parameterEntry.getKey())) {
+            //            Method writeMethod = propertyDescriptor.getWriteMethod();
+            //            writeMethod.invoke(actionObj, parameterEntry.getValue());
+            //        }
+            //    }
+            //}
+
+            // 调用 execute 方法
+            Method executeMethod = actionClass.getMethod("execute");
+            Object executeResult = executeMethod.invoke(actionObj);
+
+            // 根据 execute 方法的结果, 获取 xml 配置的 jsp 页面
+            String jsp = action.getAttributes().get(Objects.toString(executeResult));
+
+            // 调用 get 方法
+            Map<String, String> actionFieldMap = new HashMap<>();
+            Field[] actionFields = actionClass.getDeclaredFields();
+            for (Field actionFiled : actionFields) {
+                Method[] methods = actionClass.getMethods();
+                for (Method method : methods) {
+                    if (method.getName().equalsIgnoreCase("get" + actionFiled.getName())) {
+                        method.invoke(actionObj);
+                        actionFieldMap.put(actionFiled.getName(), Objects.toString(method.invoke(actionObj)));
+                    }
+                }
+            }
+            //for (PropertyDescriptor propertyDescriptor :
+            //        Introspector.getBeanInfo(actionClass).getPropertyDescriptors()) {
+            //    Method readMethod = propertyDescriptor.getReadMethod();
+            //    Object readMethodResult = readMethod.invoke(actionObj);
+            //    actionFieldMap.put(propertyDescriptor.getDisplayName(), Objects.toString(readMethodResult));
+            //}
+
+            // 返回 View 对象
+            View view = new View();
+            view.setParameters(actionFieldMap);
+            view.setJsp(jsp);
+            return view;
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        }/* catch (IntrospectionException e) {
+            e.printStackTrace();
+        }*/
+
+        return null;
+    }
+}
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..024f678100
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,37 @@
+package org.korben.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+    @Test
+    public void testLoginActionSuccess() {
+
+        String actionName = "login";
+
+        Map<String, String> params = new HashMap<String, String>();
+        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<String, String> params = new HashMap<String, String>();
+        params.put("name", "test");
+        params.put("password", "123456"); //密码和预设的不一致
+
+        View view = Struts.runAction(actionName, params);
+
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+    }
+}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f4af03febc
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java
@@ -0,0 +1,26 @@
+package org.korben.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+    private String jsp;
+    private Map parameters;
+
+    public String getJsp() {
+        return jsp;
+    }
+
+    public View setJsp(String jsp) {
+        this.jsp = jsp;
+        return this;
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    public View setParameters(Map parameters) {
+        this.parameters = parameters;
+        return this;
+    }
+}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java
new file mode 100644
index 0000000000..c16de22c44
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java
@@ -0,0 +1,27 @@
+package org.korben.coderising.litestruts.dom;
+
+import java.util.Map;
+
+/**
+ * Created by Korben on 03/03/2017.
+ */
+public class StrutsAction {
+    private String actionClassName;
+    private Map<String, String> attributes;
+
+    public String getActionClassName() {
+        return actionClassName;
+    }
+
+    public void setActionClassName(String actionClassName) {
+        this.actionClassName = actionClassName;
+    }
+
+    public Map<String, String> getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(Map<String, String> attributes) {
+        this.attributes = attributes;
+    }
+}
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java
new file mode 100644
index 0000000000..239ac2e4cd
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java
@@ -0,0 +1,82 @@
+package org.korben.coderising.litestruts.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.korben.coderising.litestruts.dom.StrutsAction;
+
+/**
+ * 解析struts.xml
+ *
+ * Created by Korben on 03/03/2017.
+ */
+public class StrutsParser {
+
+    private static final String STRUTS_XML = "struts.xml";
+
+    public static void main(String[] args) {
+        Map<String, StrutsAction> strutsActions = doParse();
+        System.out.println(strutsActions.size());
+    }
+
+    public static Map<String, StrutsAction> doParse() {
+        Map<String, StrutsAction> resultMap = new HashMap<>();
+
+        SAXReader reader = new SAXReader();
+        InputStream in = getStrutsInputStream();
+        try {
+            Document document = reader.read(in);
+            Element rootElement = document.getRootElement();
+
+            // parse action element
+            List<Element> elementActions = rootElement.elements();
+            for (Element elementAction : elementActions) {
+                StrutsAction action = new StrutsAction();
+
+                // parse "name" attribute from action element
+                resultMap.put(elementAction.attribute("name").getValue(), action);
+
+                // parse "class" attribute from action element
+                action.setActionClassName(elementAction.attribute("class").getValue());
+
+                // parse sub elements in action element
+                List<Element> elements = elementAction.elements();
+                Map<String, String> map = new HashMap<>();
+                for (Element element : elements) {
+                    map.put(element.attribute("name").getValue(), element.getStringValue());
+                }
+                action.setAttributes(map);
+            }
+
+            return resultMap;
+        } catch (DocumentException e) {
+            throw new IllegalStateException("failed to parse " + STRUTS_XML, e);
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    private static InputStream getStrutsInputStream() {
+        StrutsParser.class.getPackage().getName();
+        InputStream in = StrutsParser.class.getClassLoader()
+                .getResourceAsStream("org/korben/coderising/litestruts/util/" + STRUTS_XML);
+        if (in == null) {
+            throw new IllegalStateException(STRUTS_XML + " doesn't exist");
+        }
+
+        return in;
+    }
+}
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml
new file mode 100644
index 0000000000..1cb3f4a5df
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.korben.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.korben.coderising.litestruts.LogoutAction">
+        <result name="success">/jsp/welcome.jsp</result>
+        <result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java
similarity index 99%
rename from group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java
index 4d6236b537..0f443462ed 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java
@@ -1,4 +1,4 @@
-package org.korben.list;
+package org.korben.coding.basic.list;
 
 import java.util.Objects;
 
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java
similarity index 75%
rename from group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java
index c29e566178..b5245ecca0 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java
@@ -1,4 +1,4 @@
-package org.korben.list;
+package org.korben.coding.basic.list;
 
 /**
  * Created by Korben on 24/02/2017.
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java
similarity index 98%
rename from group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java
index e14efad19c..2ca4452981 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java
@@ -1,4 +1,4 @@
-package org.korben.list;
+package org.korben.coding.basic.list;
 
 import java.util.Objects;
 
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java
similarity index 91%
rename from group20/1107837739/1107837739Learning/src/org/korben/list/KList.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java
index e5d33b984b..e5b166094e 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/list/KList.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java
@@ -1,4 +1,4 @@
-package org.korben.list;
+package org.korben.coding.basic.list;
 
 /**
  * Korben's List
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java
similarity index 94%
rename from group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java
index 994538732f..7017e0ed2c 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java
@@ -1,4 +1,4 @@
-package org.korben.list;
+package org.korben.coding.basic.list;
 
 import org.junit.Assert;
 import org.junit.Before;
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java
similarity index 99%
rename from group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java
index ed3055b74e..2c6febecc3 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java
@@ -1,4 +1,4 @@
-package org.korben.list;
+package org.korben.coding.basic.list;
 
 import java.util.Objects;
 import org.junit.Assert;
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java
similarity index 98%
rename from group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java
index 3e975058f4..eea57cf035 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java
@@ -1,4 +1,4 @@
-package org.korben.queue;
+package org.korben.coding.basic.queue;
 
 import java.util.NoSuchElementException;
 
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java
similarity index 84%
rename from group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java
index 14763efd99..9d8146d50d 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java
@@ -1,4 +1,4 @@
-package org.korben.queue;
+package org.korben.coding.basic.queue;
 
 /**
  * Korben's Queue Interface
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java
similarity index 97%
rename from group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java
index 3d9557748f..17c3703a64 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java
@@ -1,4 +1,4 @@
-package org.korben.queue;
+package org.korben.coding.basic.queue;
 
 import java.util.NoSuchElementException;
 import org.junit.Assert;
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java
similarity index 97%
rename from group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java
index 8dc39e4efd..eb83eb47cd 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java
@@ -1,4 +1,4 @@
-package org.korben.stack;
+package org.korben.coding.basic.stack;
 
 import java.util.EmptyStackException;
 import java.util.Objects;
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java
similarity index 97%
rename from group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java
rename to group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java
index e3f173eb3f..20b451a7ef 100644
--- a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java
@@ -1,4 +1,4 @@
-package org.korben.stack;
+package org.korben.coding.basic.stack;
 
 import java.util.EmptyStackException;
 import org.junit.Assert;
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..3cfcacc37c
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,127 @@
+package org.korben.coding.basic.tree;
+
+/**
+ * Korben's BinaryTreeNode
+ *
+ * Created by Korben on 21/02/2017.
+ */
+public class BinaryTreeNode<T extends Comparable> {
+
+    private T data;
+    private BinaryTreeNode left;
+    private BinaryTreeNode right;
+    private int size;
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public BinaryTreeNode getLeft() {
+        return left;
+    }
+
+    public void setLeft(BinaryTreeNode left) {
+        this.left = left;
+    }
+
+    public BinaryTreeNode getRight() {
+        return right;
+    }
+
+    public void setRight(BinaryTreeNode right) {
+        this.right = right;
+    }
+
+    @SuppressWarnings("unchecked")
+    public BinaryTreeNode insert(T data) {
+        if (this.data == null) {
+            this.data = data;
+            return this;
+        }
+        int compareResult = this.data.compareTo(data);
+        if (compareResult > 0) {
+            if (this.left == null) {
+                this.left = new BinaryTreeNode();
+                this.left.data = data;
+                return this.left;
+            } else {
+                return this.left.insert(data);
+            }
+        } else if (compareResult < 0) {
+            if (this.right == null) {
+                this.right = new BinaryTreeNode();
+                this.right.data = data;
+                return this.right;
+            } else {
+                return this.right.insert(data);
+            }
+        } else {
+            return this;
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public BinaryTreeNode delete(T data) {
+        BinaryTreeNode treeNode = search(data);
+        if (treeNode == null) {
+            return null;
+        }
+        int compareResult = this.data.compareTo(data);
+        if (compareResult > 0) {
+            return this.left.delete(data);
+        } else if (compareResult < 0) {
+            return this.right.delete(data);
+        } else {
+            if (treeNode.right == null) {
+                if (this.left == null) {
+                    this.data = null;
+                } else {
+                    this.left = this;
+                }
+            } else {
+                this.data = (T) this.right.findMin().data;
+
+                this.right.delete(this.data);
+            }
+        }
+
+        return this;
+    }
+
+    private BinaryTreeNode findMin() {
+        if (this.data == null) {
+            return null;
+        }
+        if (this.left == null) {
+            return this;
+        }
+        return this.left.findMin();
+    }
+
+    @SuppressWarnings("unchecked")
+    public BinaryTreeNode search(T data) {
+        if (this.data == null) {
+            return null;
+        }
+        int compareResult = this.data.compareTo(data);
+        if (compareResult > 0) {
+            if (this.left == null) {
+                return null;
+            } else {
+                return this.left.search(data);
+            }
+        } else if (compareResult < 0) {
+            if (this.right == null) {
+                return null;
+            } else {
+                return this.right.search(data);
+            }
+        } else {
+            return this;
+        }
+    }
+}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..05873872a7
--- /dev/null
+++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java
@@ -0,0 +1,59 @@
+package org.korben.coding.basic.tree;
+
+import org.junit.Assert;
+
+/**
+ * Korben's BinaryTreeNode Test
+ *
+ * Created by Korben on 21/02/2017.
+ */
+public class BinaryTreeNodeTest {
+
+    private BinaryTreeNode<Integer> treeNode;
+
+    @org.junit.Before
+    public void setUp() throws Exception {
+        treeNode = new BinaryTreeNode<>();
+        treeNode.insert(5);
+        treeNode.insert(3);
+        treeNode.insert(7);
+        treeNode.insert(1);
+        treeNode.insert(4);
+        treeNode.insert(2);
+        treeNode.insert(8);
+        treeNode.insert(6);
+    }
+
+    @org.junit.Test
+    public void insert() {
+        Assert.assertEquals(treeNode.getData().intValue(), 5);
+        Assert.assertEquals(treeNode.getLeft().getData(), 3);
+        Assert.assertEquals(treeNode.getRight().getData(), 7);
+        Assert.assertEquals(treeNode.getLeft().getLeft().getData(), 1);
+        Assert.assertEquals(treeNode.getLeft().getRight().getData(), 4);
+        Assert.assertEquals(treeNode.getLeft().getLeft().getRight().getData(), 2);
+        Assert.assertEquals(treeNode.getRight().getRight().getData(), 8);
+        Assert.assertEquals(treeNode.getRight().getLeft().getData(), 6);
+    }
+
+    @org.junit.Test
+    public void delete() throws Exception {
+        treeNode.delete(3);
+        for (int i = 1; i < 9; i++) {
+            if (i != 3) {
+                Assert.assertNotNull(treeNode.search(i));
+            } else {
+                Assert.assertNull(treeNode.search(i));
+            }
+        }
+    }
+
+    @org.junit.Test
+    public void search() throws Exception {
+        for (int i = 1; i < 9; i++) {
+            Assert.assertNotNull(treeNode.search(i));
+        }
+        Assert.assertNull(treeNode.search(0));
+        Assert.assertNull(treeNode.search(9));
+    }
+}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java b/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java
deleted file mode 100644
index 30c613edd0..0000000000
--- a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.korben.tree;
-
-/**
- * Korben's BinaryTreeNode
- *
- * Created by Korben on 21/02/2017.
- */
-public class BinaryTreeNode<T extends Comparable> {
-
-    private T data;
-    private BinaryTreeNode left;
-    private BinaryTreeNode right;
-    private int size;
-
-    public T getData() {
-        return data;
-    }
-
-    public void setData(T data) {
-        this.data = data;
-    }
-
-    public BinaryTreeNode getLeft() {
-        return left;
-    }
-
-    public void setLeft(BinaryTreeNode left) {
-        this.left = left;
-    }
-
-    public BinaryTreeNode getRight() {
-        return right;
-    }
-
-    public void setRight(BinaryTreeNode right) {
-        this.right = right;
-    }
-
-    @SuppressWarnings("unchecked")
-    public BinaryTreeNode insert(T data) {
-        if (this.data == null) {
-            this.data = data;
-            return this;
-        }
-        int compareResult = this.data.compareTo(data);
-        if (compareResult > 0) {
-            if (this.left == null) {
-                this.left = new BinaryTreeNode();
-                this.left.data = data;
-                return this.left;
-            } else {
-                return this.left.insert(data);
-            }
-        } else if (compareResult < 0) {
-            if (this.right == null) {
-                this.right = new BinaryTreeNode();
-                this.right.data = data;
-                return this.right;
-            } else {
-                return this.right.insert(data);
-            }
-        } else {
-            return this;
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public BinaryTreeNode delete(T data) {
-        BinaryTreeNode treeNode = search(data);
-        if (treeNode == null) {
-            return null;
-        }
-        int compareResult = this.data.compareTo(data);
-        if (compareResult > 0) {
-            return this.left.delete(data);
-        } else if (compareResult < 0) {
-            return this.right.delete(data);
-        } else {
-            if (treeNode.right == null) {
-                if (this.left == null) {
-                    this.data = null;
-                } else {
-                    this.left = this;
-                }
-            } else {
-                this.data = (T) this.right.findMin().data;
-
-                this.right.delete(this.data);
-            }
-        }
-
-        return this;
-    }
-
-    private BinaryTreeNode findMin() {
-        if (this.data == null) {
-            return null;
-        }
-        if (this.left == null) {
-            return this;
-        }
-        return this.left.findMin();
-    }
-
-    @SuppressWarnings("unchecked")
-    public BinaryTreeNode search(T data) {
-        if (this.data == null) {
-            return null;
-        }
-        int compareResult = this.data.compareTo(data);
-        if (compareResult > 0) {
-            if (this.left == null) {
-                return null;
-            } else {
-                return this.left.search(data);
-            }
-        } else if (compareResult < 0) {
-            if (this.right == null) {
-                return null;
-            } else {
-                return this.right.search(data);
-            }
-        } else {
-            return this;
-        }
-    }
-}
\ No newline at end of file
diff --git a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java b/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java
deleted file mode 100644
index a6fb4ed4e9..0000000000
--- a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.korben.tree;
-
-import org.junit.Assert;
-
-/**
- * Korben's BinaryTreeNode Test
- *
- * Created by Korben on 21/02/2017.
- */
-public class BinaryTreeNodeTest {
-
-    private BinaryTreeNode<Integer> treeNode;
-
-    @org.junit.Before
-    public void setUp() throws Exception {
-        treeNode = new BinaryTreeNode<>();
-        treeNode.insert(5);
-        treeNode.insert(3);
-        treeNode.insert(7);
-        treeNode.insert(1);
-        treeNode.insert(4);
-        treeNode.insert(2);
-        treeNode.insert(8);
-        treeNode.insert(6);
-    }
-
-    @org.junit.Test
-    public void insert() {
-        Assert.assertEquals(treeNode.getData().intValue(), 5);
-        Assert.assertEquals(treeNode.getLeft().getData(), 3);
-        Assert.assertEquals(treeNode.getRight().getData(), 7);
-        Assert.assertEquals(treeNode.getLeft().getLeft().getData(), 1);
-        Assert.assertEquals(treeNode.getLeft().getRight().getData(), 4);
-        Assert.assertEquals(treeNode.getLeft().getLeft().getRight().getData(), 2);
-        Assert.assertEquals(treeNode.getRight().getRight().getData(), 8);
-        Assert.assertEquals(treeNode.getRight().getLeft().getData(), 6);
-    }
-
-    @org.junit.Test
-    public void delete() throws Exception {
-        treeNode.delete(3);
-        for (int i = 1; i < 9; i++) {
-            if (i != 3) {
-                Assert.assertNotNull(treeNode.search(i));
-            } else {
-                Assert.assertNull(treeNode.search(i));
-            }
-        }
-    }
-
-    @org.junit.Test
-    public void search() throws Exception {
-        for (int i = 1; i < 9; i++) {
-            Assert.assertNotNull(treeNode.search(i));
-        }
-        Assert.assertNull(treeNode.search(0));
-        Assert.assertNull(treeNode.search(9));
-    }
-}
\ No newline at end of file
diff --git a/group20/1107837739/korben.md b/group20/1107837739/korben.md
index 983f6f47b6..91ee50808b 100644
--- a/group20/1107837739/korben.md
+++ b/group20/1107837739/korben.md
@@ -5,3 +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 |
diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java b/group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java
new file mode 100644
index 0000000000..f74501b5ba
--- /dev/null
+++ b/group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java
@@ -0,0 +1,73 @@
+package GithubWork;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+	private int size = 0;
+	private Object[] elementdata = new Object[100];
+
+	public void add(Object o) {
+		if (elementdata.length <= size) {
+			ensureCapacity(size + 1);
+		}
+		elementdata[size++] = o;
+	}
+
+	private void ensureCapacity(int minCapacity) {
+		int oldCapacity = elementdata.length;
+		if (oldCapacity < minCapacity) {
+			
+			int newCapacity = (int) (oldCapacity * 1.5);
+			if (newCapacity < minCapacity)
+				newCapacity = minCapacity;
+			elementdata = Arrays.copyOf(elementdata, newCapacity);
+		}
+	}
+
+	public void add(int index, Object o) {
+		if (index > size || index < 0) {
+			throw new IndexOutOfBoundsException();
+
+		}
+
+		ensureCapacity(size + 1);
+		System.arraycopy(elementdata, index, elementdata, index, size - index);
+		elementdata[index] = o;
+		size++;
+	}
+
+	public Object get(int index) {
+		RangeCheck(index);
+
+		return elementdata[index];
+	}
+
+	public Object remove(int index) {
+		RangeCheck(index);
+		Object oldvalue = elementdata[index];
+		int numMoved = size - index - 1;
+		if (numMoved > 0)
+			System.arraycopy(elementdata, index + 1, elementdata, index, numMoved);
+		elementdata[--size] = null;
+		return oldvalue;
+	}
+
+	private void RangeCheck(int index) {
+		if (index >= size)
+			throw new IndexOutOfBoundsException();
+	}
+
+	public int size() {
+		int i;
+		for (i = 0; i < elementdata.length; i++) {
+			size++;
+			if (null == elementdata[i]) {
+				break;
+			}
+
+		}
+		return size;
+
+	}
+
+}
diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java b/group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java
new file mode 100644
index 0000000000..b011de10f0
--- /dev/null
+++ b/group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java
@@ -0,0 +1,47 @@
+package GithubWork;
+
+import org.junit.Test;
+
+public class JunitTest {
+     @Test
+     public void ArrayList(){
+       ArrayList a=new ArrayList();
+        a.add(1);
+        a.add(2);
+        a.add(3);
+        a.add(4);
+        a.get(2);
+       
+        System.out.println(a);
+        
+     
+     }
+     @Test
+     public void Queue(){
+    	 Queue q=new Queue(4);
+    	 q.enQueue(1);
+    	 q.enQueue(2);
+    	 q.enQueue(3);
+    	 q.enQueue(4);
+    	 
+    	 while(!q.isEmpty()){
+    		 int i=(int) q.deQueue();
+    		 System.out.println(i);
+    	 }
+    	 System.out.println(q.size());
+     }
+     @Test
+     public void LinkedList(){
+    	 LinkedList ls=new LinkedList();
+    	 ls.add(1);
+    	 ls.add(7);
+    	 ls.add(3);
+    	 ls.add(4, 5);
+    	 ls.get(2);
+    	 ls.addFirst(0);
+    	 
+    	 ls.remove(3);
+    	System.out.println(ls);
+    	 
+     }
+}
diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java b/group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java
new file mode 100644
index 0000000000..657ca117dc
--- /dev/null
+++ b/group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java
@@ -0,0 +1,136 @@
+package GithubWork;
+
+import java.util.Iterator;
+
+public class LinkedList implements List {
+
+	private Node head = null;// ͷ�ڵ�
+	private int size = 0;
+	private Node last = null;
+
+	/*
+	 * �������в������� (non-Javadoc)
+	 * 
+	 * @see GithubWork.List#add(java.lang.Object)
+	 */
+	public void add(Object o) {
+		Node newNode = new Node(0);// ʵ����һ���ڵ�
+		if (head == null) {
+			head = newNode;
+			return;
+		}
+		Node tmp = head;
+		while (tmp.next != null) {
+			tmp = tmp.next;
+		}
+		tmp.next = newNode;
+		size++;
+	}
+
+	public void add(int index, Object o) {
+		Node newNode = new Node(0);
+		Node indexNode = head;
+		int i = 0;
+		while (i == index) {
+			indexNode = indexNode.next;
+			i++;
+		}
+		Node indexNextNode = indexNode.next;
+		indexNode.next = newNode;
+		newNode.pre = indexNode;
+		newNode.next = indexNextNode;
+		indexNextNode.pre = newNode;
+		size++;
+	}
+
+	public Object get(int index) {
+		Node indexNode = head;
+		int i = 0;
+		while (i == index) {
+			indexNode = indexNode.next;
+			i++;
+		}
+		return indexNode;
+	}
+
+	public Object remove(int index) {
+		if (index < 1 || index > size()) {
+			throw new IndexOutOfBoundsException();
+		}
+		if (index == 1) {
+			head = head.next;
+			return head;
+		}
+		int i = 1;
+		Node preNode = head;
+		Node curNode = preNode.next;
+		while (curNode != null) {
+			if (i == index) {
+				preNode.next = curNode.next;
+
+			}
+			preNode = curNode;
+			curNode = curNode.next;
+			i++;
+		}
+		return curNode;
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public void addFirst(Object o) {
+		Node newNode = new Node(o);
+		newNode.data = o;
+		newNode.next = head;
+		head.pre = newNode;
+		head = newNode;
+		size++;
+	}
+
+	public void addLast(Object o) {
+		Node newNode = new Node(o);
+		newNode.data = o;
+
+		newNode.pre = last;
+		last.next = newNode;
+		last = newNode;
+		size++;
+
+	}
+
+	public Object removeFirst() {
+		Node ref = head;
+		head = head.next;
+		head.pre = null;
+		size--;
+		return ref;
+	}
+
+	public Object removeLast() {
+		Node rel = last;
+		last = last.pre;
+		last.next = null;
+		size--;
+		return rel;
+
+	}
+
+	public Iterator iterator() {
+		
+		return null;
+	}
+
+	private static class Node {
+		Object data;// �ڵ�����
+		Node next = null;// ͷ�ڵ�
+		Node pre = null;
+
+		public Node(Object data) {
+			this.data = data;
+		}
+       
+	}
+
+}
diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/List.java b/group20/1430208241/1430208241leaning/src/GithubWork/List.java
new file mode 100644
index 0000000000..169fc14fd1
--- /dev/null
+++ b/group20/1430208241/1430208241leaning/src/GithubWork/List.java
@@ -0,0 +1,10 @@
+package GithubWork;
+
+public interface List {
+    public void add(Object o);
+    public void add(int index,Object o);
+    public Object get(int index);
+    public Object remove(int index);
+    public int size();
+    
+}
diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/Queue.java b/group20/1430208241/1430208241leaning/src/GithubWork/Queue.java
new file mode 100644
index 0000000000..792ca233f5
--- /dev/null
+++ b/group20/1430208241/1430208241leaning/src/GithubWork/Queue.java
@@ -0,0 +1,43 @@
+package GithubWork;
+
+public class Queue {
+     private int maxSize;
+     private Object[] array;//���Ԫ������
+     private int front;//ǰһ��Ԫ������
+     private int rear;//��һ��Ԫ������
+     private int items=0;//Ԫ�ظ���
+	//������󲢳�ʼ��
+     public Queue(int s){
+       	maxSize=s;
+       	array=new Object[maxSize];
+       	front=0;
+       	rear=-1;
+       	
+	}
+     public void enQueue(Object o){
+		  if(rear==maxSize-1){
+			  rear=-1;
+			}
+		  array[++rear]=o;
+		  items++;
+				 
+	}
+	
+	public Object deQueue(){
+		Object temp =array[front++];
+		if(front==maxSize){
+			front=0;
+		}
+		items--;
+		return temp;
+	}
+	
+	public boolean isEmpty(){
+		
+		return items==0;
+	}
+	
+	public int size(){
+		return array.length;
+	}
+}
diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/Stack.java b/group20/1430208241/1430208241leaning/src/GithubWork/Stack.java
new file mode 100644
index 0000000000..43f138021c
--- /dev/null
+++ b/group20/1430208241/1430208241leaning/src/GithubWork/Stack.java
@@ -0,0 +1,22 @@
+package GithubWork;
+
+public class Stack {
+private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git "a/group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200" "b/group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200"
new file mode 100644
index 0000000000..472bb524e9
--- /dev/null
+++ "b/group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200"
@@ -0,0 +1 @@
+http://blog.csdn.net/wifi619/article/details/57510982
\ No newline at end of file
diff --git a/group20/2421586846/.project b/group20/2421586846/.project
new file mode 100644
index 0000000000..b0d9d8a3f0
--- /dev/null
+++ b/group20/2421586846/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>2421586846</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/group20/2421586846/DS/.project b/group20/2421586846/DS/.project
new file mode 100644
index 0000000000..ca3bc54b4a
--- /dev/null
+++ b/group20/2421586846/DS/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>DS</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/group20/2421586846/DS/src/basic/ArrayList.java b/group20/2421586846/DS/src/basic/ArrayList.java
new file mode 100644
index 0000000000..7e9f70169d
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/ArrayList.java
@@ -0,0 +1,77 @@
+package basic;
+ 
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[2];
+	
+	public void EnsureEnoughSize(){
+		if (size == elementData.length )
+		{
+			elementData = Arrays.copyOf(elementData, elementData.length +10);
+			
+		}
+	}
+	
+	public void add(Object o){
+		EnsureEnoughSize();
+		 
+		//	elementData = Arrays.copyOf(elementData, elementData.length +1);
+			//Object[] NewelementData = new Object[size+1];
+			//System.arraycopy( elementData,0, NewelementData, 0, elementData.length );
+			
+		
+		elementData[size]=o;
+		size++;	
+	}
+	public void add(int index, Object o){
+		if (index >= size || index < 0){
+			return;	
+		}
+
+		EnsureEnoughSize();
+		
+		for (int i =  elementData.length-1; i>index;i --){
+			elementData[i]=elementData[i-1];
+		}
+		elementData[index]=o;
+		size++;
+	}
+	
+	public Object get(int index){
+		if (index >= size || index < 0){
+			return null;
+		}
+		else {
+			return elementData[index];
+		}
+		
+	}
+	
+	public Object remove(int index){
+		if (index >= size || index < 0){
+			return null;
+		}
+		else {
+			Object o = elementData[index];
+			for (int i =index; i< size-1; i++){
+				elementData[i]= elementData[i+1];
+			}
+			size--;
+			return o;
+		}
+	}
+	
+	public int size(){
+		return size;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/group20/2421586846/DS/src/basic/BinaryTreeNode.java b/group20/2421586846/DS/src/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..e8e37a9a41
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/BinaryTreeNode.java
@@ -0,0 +1,33 @@
+package basic;
+
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group20/2421586846/DS/src/basic/Iterator.java b/group20/2421586846/DS/src/basic/Iterator.java
new file mode 100644
index 0000000000..9154df57bf
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/Iterator.java
@@ -0,0 +1,7 @@
+package basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group20/2421586846/DS/src/basic/LinkedList.java b/group20/2421586846/DS/src/basic/LinkedList.java
new file mode 100644
index 0000000000..8bdc7ec661
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/LinkedList.java
@@ -0,0 +1,177 @@
+package basic;
+
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	private int size;
+	//加到最后 
+	public void add(Object o){
+		Node newNode= new Node();
+		newNode.data = o;
+		newNode.next = null;
+		
+		if (head == null ){
+			head= newNode;
+			size++;
+			return;
+		}
+		
+		Node currentNode = head;
+	
+		while (currentNode.next != null ){
+			currentNode = currentNode.next ; 
+		} 
+		/*
+		for (int i=0;i< size;i++){
+			currentNode = currentNode.next ; 
+		}
+	 */
+		currentNode.next =newNode;	
+		size++;
+	}
+	
+	public void add(int index , Object o){
+		if (index >= size ||index < 0) {
+			return;
+		}
+		
+		Node newNode= new Node();
+		newNode.data = o;
+		Node PrevNode =null; 
+		
+			if (index ==0 ){
+
+				Node tempNode = head  ; 
+				head = newNode;
+				newNode.next = tempNode;
+				
+			}
+			else {
+				Node currentNode = head;
+				for (int i=0; i <index; i++){
+					PrevNode = currentNode;
+					currentNode =currentNode.next;					
+				}
+				
+				PrevNode.next = newNode;
+				newNode.next = currentNode;
+			}	
+			size++;
+	}
+	
+	public Object get(int index){
+		
+		if (index >= size ||index < 0) {
+			return null;
+		}
+		Node currentNode = head;
+		for (int i=0; i <index; i++){
+			currentNode =currentNode.next;
+		}
+		return currentNode.data;
+		
+	}
+	public Object remove(int index){
+ 
+		if (index >= size ||index < 0) {
+			return null;
+		}
+
+		Node currentNode = head;
+		if (index ==0 ){
+			head =head.next;
+			size--;
+			return currentNode.data;
+		}
+		Node PrevNode = null;
+		for (int i=0; i <index; i++){
+			PrevNode= currentNode;
+			currentNode =currentNode.next;
+		}
+		PrevNode.next = currentNode.next;
+		size--;
+		return currentNode.data;
+	}
+	
+	public int size(){
+		
+		return size;
+	}
+	
+	public void addFirst(Object o){
+		Node newNode = new Node();
+		newNode.data =o;
+		newNode.next = head;
+		
+		head = newNode;
+		size++;
+	}
+	public void addLast(Object o){
+		if (head == null){
+			head = new Node();
+			head.data= o;
+			size ++;
+			return;
+		}
+		Node currentNode = head;
+		while (currentNode.next != null){
+			currentNode=currentNode.next;
+			
+		}
+		
+		Node newNode = new Node();
+		newNode.data= o;
+		newNode.next =null;
+		
+		currentNode.next = newNode;
+		size++;
+	}
+	public Object removeFirst(){
+
+		size--;
+		if (head ==null){
+			return null;
+		}
+		else {
+			Node firstNode = head;
+			head = firstNode.next;	
+			return firstNode.data ;
+		} 
+	}
+	public Object removeLast(){
+		
+		if (head ==null ){
+			return null;
+		}
+		if (size ==1){
+			Node tempnode = head;
+			head = null;
+			size--;
+			return tempnode.data;
+		}
+		Node currentNode = head.next;
+		Node PrevNode= head;
+		
+		while (currentNode.next != null){
+			PrevNode = currentNode;
+			currentNode=currentNode.next;
+		}
+		PrevNode.next= null;
+		 
+		size--;
+		return currentNode.data ;
+		
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+}
diff --git a/group20/2421586846/DS/src/basic/List.java b/group20/2421586846/DS/src/basic/List.java
new file mode 100644
index 0000000000..e0f01d31bb
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/List.java
@@ -0,0 +1,8 @@
+package basic;
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group20/2421586846/DS/src/basic/Queue.java b/group20/2421586846/DS/src/basic/Queue.java
new file mode 100644
index 0000000000..35e0a5340b
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/Queue.java
@@ -0,0 +1,28 @@
+package basic;
+
+public class Queue {
+	private LinkedList elementData = new LinkedList();
+	
+	public void enQueue(Object o){		
+		elementData.addLast(o);
+	}
+	
+	
+	public Object deQueue(){
+		return elementData.removeFirst(); 
+	}
+	
+	public boolean isEmpty(){
+		if (elementData.size()==0){
+
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group20/2421586846/DS/src/basic/Stack.java b/group20/2421586846/DS/src/basic/Stack.java
new file mode 100644
index 0000000000..142a2c92f5
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/Stack.java
@@ -0,0 +1,41 @@
+package basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		if (elementData.size()==0 )
+		{
+			return null;
+		}
+		Object tempObj = elementData.remove(elementData.size()-1);		
+			
+		return tempObj;
+	}
+	
+	public Object peek(){
+		if (elementData.size()==0 )
+		{
+			return null;
+		}
+		Object tempObj = elementData.get(elementData.size()-1);		
+		return tempObj;
+	}
+	public boolean isEmpty(){
+		if (elementData.size()==0 )
+		{
+			return true;
+		}
+		else {
+
+			return false;
+		}
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group20/2421586846/DS/src/basic/Test.java b/group20/2421586846/DS/src/basic/Test.java
new file mode 100644
index 0000000000..3abd4a1811
--- /dev/null
+++ b/group20/2421586846/DS/src/basic/Test.java
@@ -0,0 +1,108 @@
+package basic;
+
+
+import java.util.Arrays;
+
+public class Test {
+
+	public static void main(String[] args) {
+		LinkedList ll = new LinkedList();
+		ll.add(0);
+		ll.add(1);
+		ll.add(2);
+		ll.add(3);
+		ll.add(4);
+		
+		LinkedList aa=ll;
+		ll.add(0,10);
+		System.out.println(aa.get(0));
+	
+	}
+	public static void TestQueue(){
+		Queue qu= new Queue();
+		qu.enQueue(1);
+		qu.enQueue(2);
+		qu.enQueue(3);
+		qu.enQueue(4);
+		qu.enQueue(5);
+		qu.enQueue(6);
+		
+		qu.enQueue(7);
+		qu.enQueue(8);
+
+		System.out.println(qu.deQueue());
+		System.out.println(qu.deQueue());
+		System.out.println(qu.deQueue());
+	}
+	public static void TestStack(){
+		Stack s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		System.out.println(s.pop());
+
+		System.out.println(s.pop());
+		System.out.println(s.pop());
+
+		System.out.println(s.pop());
+		System.out.println(s.pop());
+		
+	}
+	public static void TestLinkedList(){
+		LinkedList ll = new LinkedList();
+		ll.add(0);
+		ll.add(1);
+		ll.add(2);
+		ll.add(3);
+		ll.add(4);
+
+		//ll.add(0,5);
+		//ll.add(0,7);
+		ll.removeLast();
+		ll.removeLast();
+		ll.removeLast();
+		int size = ll.size();
+		for (int i=0;i< size;i++){
+
+			System.out.println(ll.get(i));
+		}
+	}
+	
+	public static void TestArrayList(){
+		// TODO Auto-generated method stub
+		ArrayList arraylist1= new ArrayList();
+		arraylist1.add(3);
+
+		arraylist1.add(2);
+
+		arraylist1.add(0,7);
+
+		arraylist1.add(2,8);
+
+		arraylist1.add(0,10);
+
+		arraylist1.add(0,13);
+		
+		for (int i = 0 ;i <  arraylist1.size();i++){
+			System.out.println(arraylist1.get(i));
+		}
+		System.out.println("ok");
+		arraylist1.remove(0);
+
+		arraylist1.remove(1);
+		
+		for (int i = 0 ;i <  arraylist1.size();i++){
+			System.out.println(arraylist1.get(i));
+		}
+		/*
+	    int[] arr = {1,2,3,4,5};  
+	       
+	    int[] copied = new int[10];  
+	    System.arraycopy(arr, 0, copied, 1, 5);//5 is the length to copy  
+	       
+	    System.out.println(Arrays.toString(copied));  
+		*/
+	}
+
+}
diff --git a/group20/286166752/.gitignore b/group20/286166752/.gitignore
deleted file mode 100644
index d120d1749d..0000000000
--- a/group20/286166752/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.idea/
-286166752.iml
-out/
-
diff --git a/group20/286166752/src/tests/wiki/liven/code/dataStructures/ArrayListTest.java b/group20/286166752/src/tests/wiki/liven/code/dataStructures/ArrayListTest.java
new file mode 100644
index 0000000000..05df91c901
--- /dev/null
+++ b/group20/286166752/src/tests/wiki/liven/code/dataStructures/ArrayListTest.java
@@ -0,0 +1,89 @@
+package wiki.liven.code.dataStructures;
+
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ * Created by leven on 2017/2/26.
+ */
+public class ArrayListTest {
+
+    private ArrayList arrayList;
+
+
+    @Before
+    public void init(){
+        arrayList = new ArrayList();
+    }
+
+
+    @Test
+    public void add() throws Exception {
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        System.out.println(arrayList.toString());
+    }
+
+    @Test
+    public void add1() throws Exception {
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        System.out.println(arrayList.size());
+        arrayList.add(1,"星际游侠");
+        System.out.println(arrayList.toString());
+    }
+
+    @Test
+    public void get() throws Exception {
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        System.out.println(arrayList.get(1));
+    }
+
+    @Test
+    public void remove() throws Exception {
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        System.out.println(arrayList.remove(1));
+        System.out.println(arrayList.toString());
+    }
+
+    @Test
+    public void size() throws Exception {
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        arrayList.add("梅子黄时雨");
+        arrayList.add("行下一首歌");
+        arrayList.add("AmberTseng");
+        System.out.println(arrayList.size());
+    }
+
+}
\ No newline at end of file
diff --git a/group20/286166752/src/tests/wiki/liven/code/dataStructures/LinkedListTest.java b/group20/286166752/src/tests/wiki/liven/code/dataStructures/LinkedListTest.java
new file mode 100644
index 0000000000..546929b64c
--- /dev/null
+++ b/group20/286166752/src/tests/wiki/liven/code/dataStructures/LinkedListTest.java
@@ -0,0 +1,35 @@
+package wiki.liven.code.dataStructures;
+
+import org.junit.Test;
+
+
+/**
+ * Created by leven on 2017/2/26.
+ */
+public class LinkedListTest {
+    @Test
+    public void add() throws Exception {
+
+    }
+
+    @Test
+    public void add1() throws Exception {
+
+    }
+
+    @Test
+    public void get() throws Exception {
+
+    }
+
+    @Test
+    public void remove() throws Exception {
+
+    }
+
+    @Test
+    public void size() throws Exception {
+
+    }
+
+}
\ No newline at end of file
diff --git a/group20/286166752/src/tests/wiki/liven/code/dataStructures/QueueTest.java b/group20/286166752/src/tests/wiki/liven/code/dataStructures/QueueTest.java
new file mode 100644
index 0000000000..464cd87205
--- /dev/null
+++ b/group20/286166752/src/tests/wiki/liven/code/dataStructures/QueueTest.java
@@ -0,0 +1,24 @@
+package wiki.liven.code.dataStructures;
+
+import org.junit.Test;
+
+/**
+ * Created by leven on 2017/2/26.
+ */
+public class QueueTest {
+    @Test
+    public void queueEmpty() throws Exception {
+
+    }
+
+    @Test
+    public void enQueue() throws Exception {
+
+    }
+
+    @Test
+    public void deQueue() throws Exception {
+
+    }
+
+}
\ No newline at end of file
diff --git a/group20/286166752/src/tests/wiki/liven/code/dataStructures/StackTest.java b/group20/286166752/src/tests/wiki/liven/code/dataStructures/StackTest.java
new file mode 100644
index 0000000000..ce4eb6e94f
--- /dev/null
+++ b/group20/286166752/src/tests/wiki/liven/code/dataStructures/StackTest.java
@@ -0,0 +1,29 @@
+package wiki.liven.code.dataStructures;
+
+import org.junit.Test;
+
+/**
+ * Created by leven on 2017/2/26.
+ */
+public class StackTest {
+    @Test
+    public void push() throws Exception {
+
+    }
+
+    @Test
+    public void pop() throws Exception {
+
+    }
+
+    @Test
+    public void getTop() throws Exception {
+
+    }
+
+    @Test
+    public void stackEmpty() throws Exception {
+
+    }
+
+}
\ No newline at end of file
diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java b/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java
index 68444b87a9..c98c5b43a2 100644
--- a/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java
+++ b/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java
@@ -1,5 +1,7 @@
 package wiki.liven.code.dataStructures;
 
+import java.util.Arrays;
+
 /**
  * Created by leven on 2017/2/21.
  */
@@ -9,7 +11,7 @@ public class ArrayList implements List{
      * 列表中元素的个数
      */
     private int size = 0;
-    private int maxSize = 100;
+    private int maxSize = 10;
     /**
      * 初始数组
      */
@@ -27,17 +29,20 @@ public class ArrayList implements List{
      */
     @Override
     public void add(int index, Object o) {
-        if (size>=maxSize){
+        if(index<0||index>size-1)
+            throw new IndexOutOfBoundsException("数组下标越界异常。");
+        if (size==maxSize){
             Object[] targt = new Object[++maxSize];
-            System.arraycopy(elementData,0,targt,0,maxSize);
-            for (int j = targt.length;j>=index;j--){
-                targt[j-1] = targt[j-2];
+            System.arraycopy(elementData,0,targt,0,elementData.length);
+            for (int j = targt.length-2;j>=index;j--){
+                targt[j+1] = targt[j];
             }
             targt[index] = o;
             size++;
+            elementData = targt;
         }else if(size<maxSize){
-            for (int j = elementData.length;j>=index;j--){
-                elementData[j-1] = elementData[j-2];
+            for (int j = size-1;j>=index;j--){
+                elementData[j+1] = elementData[j];
             }
             elementData[index] = o;
             size++;
@@ -50,28 +55,35 @@ public void add(int index, Object o) {
      */
     @Override
     public void add(Object o) {
-        if (size>=maxSize){
+        if (size==maxSize){
             Object[] targt = new Object[++maxSize];
-            System.arraycopy(elementData,0,targt,0,maxSize);
+            System.arraycopy(elementData,0,targt,0,elementData.length);
             targt[maxSize-1] = o;
             size++;
+            elementData = targt;
         }else if(size<maxSize){
-            elementData[size-1] = o;
+            elementData[size] = o;
             size++;
         }
     }
 
     @Override
     public Object get(int index) {
-        return elementData[index];
+        if(index<0||index>size-1)
+            throw new IndexOutOfBoundsException("数组下标越界异常");
+        Object o= elementData[index];
+        return o;
     }
 
     @Override
     public Object remove(int index) {
+        if (index<0||index>size-1)
+            throw new IndexOutOfBoundsException("数组下表越界异常");
         Object temp = elementData[index];
-        for (int i = index;i>size-1;i++){
+        for (int i = index;i<=size-1;i++){
             elementData[i] = elementData[i+1];
         }
+        size--;
         return temp;
     }
 
@@ -81,6 +93,10 @@ public int size() {
     }
 
 
-
-
+    @Override
+    public String toString() {
+        return "ArrayList{" +
+                "elementData=" + Arrays.toString(elementData) +
+                '}';
+    }
 }
diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java b/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java
index b2cc5f8668..52695305fb 100644
--- a/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java
+++ b/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java
@@ -5,36 +5,119 @@
  */
 public class LinkedList implements List{
 
-    private Node head;
+    private Node head;//链表的头节点
+    private Node tail;//链接的尾节点
+    private int size;//定义了链表中的元素的个数
 
+    /**
+     * 定义了NODE节点的数据结构
+     */
     private static class Node{
         Object data;
         Node next;
-    }
+        private Node(){
 
+        }
+        private Node(Object o,Node node){
+            this.data = o;
+            this.next = node;
+        }
+    }
 
+    /**
+     * 在指定的索引写入新的节点
+     * 1.找到给位置上的节点node0
+     * 2.修改node0的next指向新的节点node
+     * 3.新节点node指向原先node0的后继节点node1
+     * 4.长度++
+     * 5.完结
+     * @param index 索引 从0开始
+     * @param o
+     */
     @Override
     public void add(int index, Object o) {
-        
+        if (index<0||index>size-1)
+            throw new IndexOutOfBoundsException("单链表越界异常。");
+        Node node = new Node();
+        node.data = o;
+        Node nodeIndex = findNodeByIndex(index);
+        if(node==null)
+            throw new NullPointerException("空指针异常。");
+        Node temp = nodeIndex.next;
+        nodeIndex.next = node;
+        node.next = temp;
+        size++;
+    }
+
+    /**
+     * 根据索引号查询节点
+     * @param index 索引
+     * @return
+     */
+    private Node findNodeByIndex(int index) {
+        if (index<0||index>size-1)
+            throw new IndexOutOfBoundsException("单链表越界异常。");
+        Node current = head;
+        if (1<=index&&index<=size-1){//索引检查
+            for (int i = 0;i>=size-1&&current!=null;i++,current = current.next)
+                if (i==index){
+                    return current;
+                }
+        }
+        return null;
     }
 
     @Override
     public void add(Object o) {
-
+        Node node = new Node();
+        node.data = o;
+        if(head==null){
+            head = node;
+            node.next = tail;
+            size++;
+        }else{
+            Node temp = tail;
+            node.next = temp;
+            temp.next = node;
+            size++;
+        }
     }
 
     @Override
     public Object get(int index) {
-        return null;
+        if(index<0||index>size-1)
+            throw new IndexOutOfBoundsException("单链表越界。");
+        Node node = findNodeByIndex(index);
+        if(node==null)
+            throw new NullPointerException("空指针异常。");
+        return node.data;
     }
 
+    /**
+     * 删除指定索引的元素
+     * @param index
+     * @return
+     */
     @Override
     public Object remove(int index) {
-        return null;
+        if(index<0||index>size-1)
+            throw new IndexOutOfBoundsException("单链表越界。");
+        Node node = findNodeByIndex(index);
+        if(node==null)
+            throw new NullPointerException("空指针异常。");
+        Node prvNode = findNodeByIndex(index-1);
+        if(prvNode==null)
+            throw new NullPointerException("空指针异常。");
+        Node nextNode = node.next;
+        node.next = null;
+        prvNode.next = nextNode;
+        size--;
+        return node.data;
+
     }
 
     @Override
     public int size() {
-        return 0;
+        return size;
     }
 }
diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/List.java b/group20/286166752/src/wiki/liven/code/dataStructures/List.java
index 2d1840ef0f..57d5c217ce 100644
--- a/group20/286166752/src/wiki/liven/code/dataStructures/List.java
+++ b/group20/286166752/src/wiki/liven/code/dataStructures/List.java
@@ -1,7 +1,7 @@
 package wiki.liven.code.dataStructures;
 
 /**
- * Created by leven on 2017/2/21.
+ * Created by leven on 2017/2/26.
  */
 public interface List {
 
@@ -11,4 +11,5 @@ public interface List {
     public Object remove(int index);
     public int size();
 
+
 }
diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java b/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java
index b8c8430daa..d52c0de6f5 100644
--- a/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java
+++ b/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java
@@ -2,6 +2,63 @@
 
 /**
  * Created by leven on 2017/2/21.
+ * 队列
+ * 只允许一端进行出队操作,另一端进行入队操作。
+ * 特性是:先进先出
+ * 本质上是一种操作受限制的线性表
+ * 本实现线性表采用自己实现的ArrayList,
+ * ArrayList理论上会受到JVM分配的内存大小,从而其空间会有上限。
+ * 但是,该错误,将有JVM抛出。
+ * 所以,本实现,队列忽略执行判断满队操作。
  */
 public class Queue {
+
+    private ArrayList list;
+    private int head;//队头指针
+    private int foot;//队尾指针
+
+
+    public Queue(){
+        head = foot = 0;
+    }
+
+    /**
+     * 判空
+     * @return
+     */
+    public boolean queueEmpty(){
+        if (head==0&&foot==0){
+            return true;
+        }else {
+            return false;
+        }
+    }
+
+    /**
+     * 入队列
+     * 1.先把元素放置到队列中
+     * 2.将队尾指针加1
+     * @param o
+     */
+    public void enQueue(Object o){
+        list.add(foot,o);
+        foot++;
+    }
+
+    /**
+     * 删除队头元素
+     * 0.先判断队列是否为空
+     * 1.先取出队头的元素
+     * 2.然后将队头的指针加1
+     * @return
+     */
+    public int deQueue(){
+        if (queueEmpty()==true)
+            throw new IndexOutOfBoundsException("队列为空,无法执行该操作。");
+        list.remove(head);
+        return head++;
+    }
+
+
+
 }
diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java b/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java
index 59cb18c416..cc33ed2985 100644
--- a/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java
+++ b/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java
@@ -2,6 +2,61 @@
 
 /**
  * Created by leven on 2017/2/21.
+ * 栈:只允许在一端进行删除或者增加操作的线性表。
+ * 本实现,采用ArrayList。
  */
 public class Stack {
+
+
+    private ArrayList list;//线性表
+    private int top = -1;//栈顶指针,默认指向栈低
+
+
+    /**
+     * 元素进栈
+     * @param o
+     * 1.指针先加1
+     * 2.将元素放入栈中
+     *
+     */
+    public void push(Object o){
+        top++;
+        list.add(o);
+    }
+
+    /**
+     * 栈顶元素出栈,返回栈顶指针的值
+     * @return
+     */
+    public int pop(){
+        if (top==-1)
+            throw new IndexOutOfBoundsException("栈为空,无法执行出栈操作。");
+        list.remove(top);
+        top--;
+        return top;
+    }
+
+    /**
+     * 获取栈顶元素的值
+     * @return
+     */
+    public Object getTop() {
+        if (top==-1)
+            throw new IndexOutOfBoundsException("栈为空,无法执行出栈操作。");
+        Object o = list.get(top);
+        return o;
+    }
+
+    /**
+     * 判空
+     * @return
+     */
+    public boolean stackEmpty(){
+        if (top==-1){
+            return true;
+        }else {
+            return false;
+        }
+    }
+
 }
diff --git a/group20/286166752/src/wiki/liven/code/test/SomeDemos.java b/group20/286166752/src/wiki/liven/code/test/SomeDemos.java
deleted file mode 100644
index 90a74edc35..0000000000
--- a/group20/286166752/src/wiki/liven/code/test/SomeDemos.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package wiki.liven.code.test;
-
-/**
- * Created by leven on 2017/2/21.
- */
-public class SomeDemos {
-
-    public static void main(String[] args){
-        int[] a = new int[10];
-        a[0] = 4;
-        System.out.println(a.length);
-
-    }
-
-}
diff --git a/group20/331798361/assignment2/src/array/ArrayUtil.java b/group20/331798361/assignment2/src/array/ArrayUtil.java
new file mode 100644
index 0000000000..3fc1eabfa8
--- /dev/null
+++ b/group20/331798361/assignment2/src/array/ArrayUtil.java
@@ -0,0 +1,150 @@
+package array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if (origin.length == 0) {
+			return;
+		}
+		int n = origin.length - 1;
+		int temp;
+		for (int i = 0; i < n/2; i++) {
+			temp = origin[i];
+			origin[i] = origin[n - i];
+			origin[n - i] = temp;
+		}
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		if (oldArray.length == 0) {
+			return null;
+		}
+		int n = oldArray.length;
+		int zeros = 0;
+		for (int i = 0; i < n - 1; i++) {
+			if (oldArray[i] == 0) {
+				zeros++;
+			}
+		}
+		int[] result = new int[n - zeros];
+		int j = 0;
+		for (int i = 0; i < n - zeros - 1; i++) {
+			while (oldArray[j] == 0) {
+				j++;
+			}
+			result[i] = oldArray[j];
+			j++;
+		}
+		return result;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max){
+		if (max <= 1) {
+			return new int[0];
+		}
+		int n = 1;
+		int init = helpFibonacci(n);
+		while (init < max) {
+			n++;
+			init = helpFibonacci(n);
+		}
+		int[] result = new int[n - 1];
+		for (int i = 0; i < n - 1; i++) {
+			result[i] = helpFibonacci(i + 1);
+		}
+		return result;
+	}
+
+	public static int helpFibonacci(int n) {
+		if(n == 0)
+			return 0;
+		else if(n == 1)
+			return 1;
+		else
+			return helpFibonacci(n -1 ) + helpFibonacci(n - 2);
+	}
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+	public static void main(String[] args) {
+		int[] a = fibonacci(15);
+		for (int i = 0; i < a.length; i++) {
+			System.out.println(a[i]);
+		}
+	}
+}
diff --git a/group20/331798361/assignment2/src/litestruts/LoginAction.java b/group20/331798361/assignment2/src/litestruts/LoginAction.java
new file mode 100644
index 0000000000..bba4c11c9f
--- /dev/null
+++ b/group20/331798361/assignment2/src/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group20/331798361/assignment2/src/litestruts/Struts.java b/group20/331798361/assignment2/src/litestruts/Struts.java
new file mode 100644
index 0000000000..e6b77ef929
--- /dev/null
+++ b/group20/331798361/assignment2/src/litestruts/Struts.java
@@ -0,0 +1,76 @@
+package litestruts;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        try {
+            // parse xml file
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            Document doc = dBuilder.parse("src/litestruts/struts.xml");
+            doc.getDocumentElement().normalize();
+
+            // get action items
+            NodeList list = doc.getElementsByTagName("action");
+            for (int i = 0; i < list.getLength(); i++) {
+                Node node = list.item(i);
+                Element element = (Element) node;
+                // look for action-related class
+                if  (element.getAttribute("name").equals(actionName)){
+
+                    Class<?> c = Class.forName(element.getAttribute("class"));
+                    Object o = c.newInstance();
+
+                    //set name
+                    Method setName = c.getDeclaredMethod("setName", String.class);
+                    setName.invoke(o, parameters.get("name"));
+
+                    //set password
+                    Method setPassword = c.getDeclaredMethod("setPassword", String.class);
+                    setPassword.invoke(o, parameters.get("password"));
+
+                    //execute
+                    Method execute = c.getDeclaredMethod("execute", null);
+                    // login result
+                    String result = execute.invoke(o).toString();
+
+                    //get login messsage
+                    Method getMessage = c.getDeclaredMethod("getMessage", null);
+                    HashMap<String, String> map = new HashMap<>();
+                    map.put("message", getMessage.invoke(o).toString());
+
+                    // new view with parameter map
+                    View view = new View();
+                    view.setParameters(map);
+                    NodeList list1 = element.getElementsByTagName("result");
+                    for (int j = 0; j < list1.getLength(); j++) {
+                        Node node1 = list1.item(j);
+                        Element element1 = (Element) node1;
+                        if (element1.getAttribute("name").equals(result)) {
+                            view.setJsp(node1.getTextContent());
+                        }
+                    }
+                    return view;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("parse error");
+        }
+    	return null;
+    }
+}
diff --git a/group20/331798361/assignment2/src/litestruts/StrutsTest.java b/group20/331798361/assignment2/src/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..f227801865
--- /dev/null
+++ b/group20/331798361/assignment2/src/litestruts/StrutsTest.java
@@ -0,0 +1,44 @@
+package litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name", "test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+
+}
diff --git a/group20/331798361/assignment2/src/litestruts/View.java b/group20/331798361/assignment2/src/litestruts/View.java
new file mode 100644
index 0000000000..1eed614744
--- /dev/null
+++ b/group20/331798361/assignment2/src/litestruts/View.java
@@ -0,0 +1,23 @@
+package litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group20/331798361/assignment2/src/litestruts/struts.xml b/group20/331798361/assignment2/src/litestruts/struts.xml
new file mode 100644
index 0000000000..d6da22a638
--- /dev/null
+++ b/group20/331798361/assignment2/src/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/404130810/src/com/coderising/array/ArrayUtil.java b/group20/404130810/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..22017ef9d0
--- /dev/null
+++ b/group20/404130810/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,155 @@
+package com.coderising.array;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtil {
+
+	/**
+	 * ����һ����������a , �Ը������ֵ�����û� ���磺 a = [7, 9 , 30, 3] , �û���Ϊ [3, 30, 9,7] ��� a =
+	 * [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int[] reversedArray = new int[origin.length];
+		for (int i = origin.length - 1, j = 0; i >= 0 && j < origin.length; i--, j++) {
+			reversedArray[j] = origin[i];
+		}
+		origin = reversedArray;
+	}
+
+	/**
+	 * ���������µ�һ�����飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ�� {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		int zeroCount = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				zeroCount++;
+			}
+		}
+		int[] removedZeroArray = new int[oldArray.length - zeroCount];
+
+		for (int i = 0, j = 0; i < oldArray.length; i++, j++) {
+			if (oldArray[i] == 0) {
+				j--;
+				continue;
+			}
+			removedZeroArray[j] = oldArray[i];
+		}
+		return removedZeroArray;
+	}
+
+	/**
+	 * ���������Ѿ�����õ��������飬 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) {
+		List<Integer> mergedArrayList = new ArrayList<>();
+		return null;
+	}
+
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ���� ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		int[] resultArray = new int[oldArray.length + size];
+		System.arraycopy(oldArray, 0, resultArray, 0, oldArray.length);
+		return resultArray;
+	}
+
+	/**
+	 * 쳲���������Ϊ��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;
+	}
+
+	private static int fibonacciNum(int n) {
+		if (n <= 2) {
+			return 1;
+		} else {
+			return fibonacciNum(n - 1) + fibonacciNum(n - 2);
+		}
+	}
+
+	/**
+	 * ����С�ڸ������ֵmax�������������� ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		return null;
+	}
+
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3 ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		return null;
+	}
+
+	/**
+	 * ��seperator ������ array���������� ����array= [3,8,9], seperator = "-" �򷵻�ֵΪ"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			sb.append(array[i]);
+			if (i != array.length - 1) {
+				sb.append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+
+	public static void main(String[] args) {
+		/*
+		 * int[] origin = { 0, 1, 2, 0, 12 }; new
+		 * ArrayUtil().removeZero(origin);
+		 */
+		/*
+		 * int[] array1 = { 3, 5, 7, 8 }; int[] array2 = { 4, 5, 6, 7 }; new
+		 * ArrayUtil().merge(array1, array2);
+		 */
+		/*
+		 * int[] array = { 3, 8, 9, 10, 12 }; new ArrayUtil().grow(array, 9);
+		 */
+		/*
+		 * int[] array = { 3, 8, 9, 10, 12 }; String seperator = "-";
+		 * System.out.println(new ArrayUtil().join(array, seperator));
+		 */
+	}
+
+}
\ No newline at end of file
diff --git a/group20/404130810/src/com/coderising/litestruts/Struts.java b/group20/404130810/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..6e1e1bab9f
--- /dev/null
+++ b/group20/404130810/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,87 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.litestruts.utils.StrutsUtil;
+import com.coderising.litestruts.view.View;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> params) {
+
+		/*
+		 * 
+		 * 0. ��ȡ�����ļ�struts.xml
+		 * 
+		 * 1. ����actionName�ҵ����Ӧ��class �� ����LoginAction, ͨ������ʵ��������������
+		 * ��parameters�е����ݣ����ö����setter������ ����parameters�е������� ("name"="test" ,
+		 * "password"="1234") , �Ǿ�Ӧ�õ��� setName��setPassword����
+		 * 
+		 * 2. ͨ��������ö����exectue ������ ����÷���ֵ������"success"
+		 * 
+		 * 3. ͨ�������ҵ����������getter���������� getMessage��, ͨ�����������ã� ��ֵ�������γ�һ��HashMap , ����
+		 * {"message": "��¼�ɹ�"} , �ŵ�View�����parameters
+		 * 
+		 * 4. ����struts.xml�е� <result> ����,�Լ�execute�ķ���ֵ�� ȷ����һ��jsp��
+		 * �ŵ�View�����jsp�ֶ��С�
+		 * 
+		 */
+		View view = new View();
+		String className = readActionInConfig(actionName);
+		List<String> rtnList = invokeMethod(className, params);
+		String result = rtnList.get(0);
+		String msg = rtnList.get(1);
+		view.setParameters(buildViewParams(msg));
+		view.setJsp(buildViewJsp(result,actionName));
+		return view;
+	}
+
+
+
+	private static String readActionInConfig(String actionName) {
+		StrutsUtil util = new StrutsUtil();
+		return util.invokedAction(actionName);
+	}
+
+	private static List<String> invokeMethod(String className, Map<String, String> params) {
+
+		List<String> rtnList = new ArrayList<String>();
+		try {
+			String name = params.get("name");
+			String password = params.get("password");
+			// Invoke set method
+			Class<?> actionClass = Class.forName(className);
+			Method setNameMethod = actionClass.getMethod("setName", String.class);
+			Method setPasswordMethod = actionClass.getMethod("setPassword", String.class);
+			Object action = actionClass.newInstance();
+			setNameMethod.invoke(action, name);
+			setPasswordMethod.invoke(action, password);
+			// Invoke execute method and add to the return List as first element
+			Method executeMethod = actionClass.getMethod("execute");
+			rtnList.add(executeMethod.invoke(action).toString());
+			// Invoke getMessage method and add to the return List as second element
+			Method getMessageMethod = actionClass.getMethod("getMessage");
+			rtnList.add(getMessageMethod.invoke(action).toString());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return rtnList;
+	}
+	
+	private static Map buildViewParams(String msg) {
+		Map viewParams = new HashMap();
+		viewParams.put("message", msg);
+		return viewParams;
+	}
+	
+	private static String buildViewJsp(String result, String actionName) {
+		StrutsUtil util = new StrutsUtil();
+		return util.invokeResult(actionName,result); 
+	}
+
+}
\ No newline at end of file
diff --git a/group20/404130810/src/com/coderising/litestruts/action/LoginAction.java b/group20/404130810/src/com/coderising/litestruts/action/LoginAction.java
new file mode 100644
index 0000000000..3e252d26ee
--- /dev/null
+++ b/group20/404130810/src/com/coderising/litestruts/action/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coderising.litestruts.action;
+
+/**
+ * ����һ������չʾ��¼��ҵ���࣬ ���е��û��������붼��Ӳ����ġ�
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}
\ No newline at end of file
diff --git a/group20/404130810/src/com/coderising/litestruts/struts.xml b/group20/404130810/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e05b09a433
--- /dev/null
+++ b/group20/404130810/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java b/group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java
new file mode 100644
index 0000000000..300b6efe6a
--- /dev/null
+++ b/group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts.test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.coderising.litestruts.Struts;
+import com.coderising.litestruts.view.View;
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //�����Ԥ��Ĳ�һ��
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
\ No newline at end of file
diff --git a/group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java b/group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java
new file mode 100644
index 0000000000..3d26041ef4
--- /dev/null
+++ b/group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java
@@ -0,0 +1,76 @@
+package com.coderising.litestruts.utils;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class StrutsUtil {
+	
+	public final static String CONFIG_PATH = "../struts.xml";
+	
+	public final static String CONFIG_NODE_ACTION = "action";
+	
+	public final static String CONFIG_ATTR_NAME = "name";
+	
+	public final static String CONFIG_ATTR_CLASS = "class";
+	
+	public String invokedAction(String actionName){
+		if(null != actionName && !"".equals(actionName)){
+			Document doc = generateDoc();
+			NodeList nodeList = doc.getElementsByTagName(CONFIG_NODE_ACTION);
+			for (int i = 0; i < nodeList.getLength(); i++) {
+				String actionNameConfiged = nodeList.item(i).getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue();
+				if(actionName.equals(actionNameConfiged)){
+					return nodeList.item(i).getAttributes().getNamedItem(CONFIG_ATTR_CLASS).getNodeValue();
+				}
+			}
+		}
+		throw new RuntimeException("actionName can't be found");
+	}
+	
+	private Document generateDoc(){
+		DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
+		Document doc = null;
+		try {
+			DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+			doc = docBuilder.parse (lookupConfigFile());
+		} catch (Exception e) {
+			e.printStackTrace();
+		} 
+		return doc;
+	}
+	
+	private File lookupConfigFile(){
+		URL url = getClass().getResource(CONFIG_PATH);
+		return new File(url.getPath());
+	}
+
+
+	public String invokeResult(String actionName, String result) {
+		Document doc = generateDoc();
+		NodeList nodeList = doc.getElementsByTagName("result");
+		List<Node> subNodeList = new ArrayList<Node>();
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			Node parentNode = nodeList.item(i).getParentNode();
+			if(parentNode.getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue().equals(actionName)){
+				subNodeList.add(nodeList.item(i));
+			}
+		}
+		for (int i = 0; i < subNodeList.size(); i++) {
+			Node node = subNodeList.get(i);
+			if(node.getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue().equals(result)){
+				return node.getTextContent();
+			}
+		}
+		throw new RuntimeException("result can't be found");
+	}
+
+}
diff --git a/group20/404130810/src/com/coderising/litestruts/view/View.java b/group20/404130810/src/com/coderising/litestruts/view/View.java
new file mode 100644
index 0000000000..ff1a735948
--- /dev/null
+++ b/group20/404130810/src/com/coderising/litestruts/view/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts.view;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
\ No newline at end of file
diff --git "a/group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200" "b/group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200"
new file mode 100644
index 0000000000..b5457af5b6
--- /dev/null
+++ "b/group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200"
@@ -0,0 +1 @@
+http://www.cnblogs.com/yyssyh213/p/6442285.html
\ No newline at end of file
diff --git a/group20/423184723/src/basic/ArrayList.java b/group20/423184723/src/basic/ArrayList.java
new file mode 100644
index 0000000000..64a19bea8e
--- /dev/null
+++ b/group20/423184723/src/basic/ArrayList.java
@@ -0,0 +1,78 @@
+package com.coding.basic;
+
+import com.sun.media.sound.EmergencySoundbank;
+
+public class ArrayList implements List {
+	/**
+	 * 列表中元素的个数
+	 */
+	private int size = 0;
+	
+	/**
+	 * 初始化数组大小
+	 */
+	private int arraySize = 100;
+	/**
+	 * 初始化数组
+	 */
+	private Object[] elementData = new Object[arraySize];
+	
+	/**
+	 * 添加方法
+	 */
+	public void add(Object o){
+		if(size>=(arraySize*0.75)){
+			Object [] target = new Object[(int) (arraySize*1.5)];
+			System.arraycopy(elementData,0,target,0,arraySize);
+			target[size-1] = o;
+			size++;
+		}else if(size<(arraySize*0.75)){
+			elementData[size-1]=o;
+			size++;
+		}
+	}
+	/**
+	 * 根据索引添加方法
+	 */
+	public void add(int index, Object o){
+		if(size >= arraySize*0.75){
+			Object [] target = new Object[(int) (arraySize*1.5)];
+			System.arraycopy(elementData,0,target,0,arraySize);
+			 for (int j = target.length;j>=index;j--){
+	                target[j-1] = target[j-2];
+	            }
+	            target[index] = o;
+	            size++;
+		}else if(size < arraySize*0.75){
+			 for (int j = elementData.length;j>=index;j--){
+	                elementData[j-1] = elementData[j-2];
+	            }
+	            elementData[index] = o;
+	            size++;
+		}
+	}
+	/**
+	 * 根据索引获取对象
+	 */
+	public Object get(int index){
+		return elementData[index];
+	}
+	/**
+	 * 根据索引移除对象
+	 */
+	public Object remove(int index){
+		for (int i = index; i < elementData.length; i++) {
+			elementData[i]=elementData[i+1];
+			size++;
+		}
+		return elementData[index];
+	}
+	/**
+	 * 获取数组大小
+	 */
+	public int size(){
+		return this.size;
+	}
+	
+	
+}
diff --git a/group20/423184723/src/basic/BinaryTreeNode.java b/group20/423184723/src/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group20/423184723/src/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group20/423184723/src/basic/Iterator.java b/group20/423184723/src/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group20/423184723/src/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group20/423184723/src/basic/LinkedList.java b/group20/423184723/src/basic/LinkedList.java
new file mode 100644
index 0000000000..9caf065304
--- /dev/null
+++ b/group20/423184723/src/basic/LinkedList.java
@@ -0,0 +1,146 @@
+package com.coding.basic;
+
+import com.coding.basic.LinkedList.Node;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	private int size;
+	
+	public void add(Object o){
+		if (head.data == null) {
+			head.data = o;
+			head.next = null;
+			size++;
+			return;
+		}
+		Node node = new Node(o);
+		Node curr = head;
+		while (curr.next != null) {
+			curr = curr.next;
+		}
+		curr.next = node;
+		size++;
+	}
+	public void add(int index , Object o){
+		if (index < 0 || index > size) {
+			System.out.println(index + "无效指数");
+			return;
+		}
+		if (head.data == null) {
+			if (index == 0) {
+				head.data = o;
+				head.next = null;
+				size++;
+				return;
+			} else {
+				System.out.println("无效指数");
+				return;
+			}
+		}
+		Node node = new Node(o);
+		Node curr = head;
+		for (int i = 0; i < index - 1; i++) {
+			curr = curr.next;
+		}
+		Node temp = curr.next;
+		curr.next = node;
+		node.next = temp;
+		size++;
+	}
+	public Object get(int index){
+		if (index < 0 || index > size) {
+			System.out.println(index + " is invalid index!");
+			return null;
+		}
+		Node result = head;
+		for (int i = 0; i < index; i++) {
+			result = result.next;
+		}
+		return result;
+	}
+	public Object remove(int index){
+		if (index < 0 || index > size) {
+			System.out.println(index + " is invalid index!");
+			return null;
+		}
+		Node curr = head;
+		for (int i = 0; i < index - 1; i++) {
+			curr = curr.next;
+		}
+		Node result = curr.next;
+		curr.next = curr.next.next;
+		size--;
+		return result;
+	}
+	
+	public int size(){
+		return this.size;
+	}
+	
+	public void addFirst(Object o){
+		if (head.data == null) {
+			head.data = o;
+			head.next = null;
+			size++;
+			return;
+		}
+		Node temp = head;
+		head = new Node(o);
+		head.next = temp;
+		size++;
+	}
+	public void addLast(Object o){
+		if (head.data == null) {
+			head.data = o;
+			head.next = null;
+			size++;
+			return;
+		}
+		Node node = new Node(o);
+		Node curr = head;
+		while (curr.next != null) {
+			curr = curr.next;
+		}
+		curr.next = node;
+		size++;
+	}
+	public Object removeFirst(){
+		if (head.data == null) {
+			return null;
+		}
+		Node result = head;
+		head = head.next;
+		size--;
+		return result;
+	}
+	public Object removeLast(){
+		if (head.data == null) {
+			return null;
+		}
+		Node curr = head;
+		for (int i = 0; i < size - 1; i++) {
+			curr = curr.next;
+		}
+		Node result = curr.next;
+		curr.next = null;
+		size--;
+		return result;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		public Node(Object o) {
+			data = o;
+			next = null;
+		}
+	
+		
+		
+	}
+}
diff --git a/group20/423184723/src/basic/List.java b/group20/423184723/src/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group20/423184723/src/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group20/423184723/src/basic/Queue.java b/group20/423184723/src/basic/Queue.java
new file mode 100644
index 0000000000..bb4e6bef5c
--- /dev/null
+++ b/group20/423184723/src/basic/Queue.java
@@ -0,0 +1,29 @@
+package com.coding.basic;
+
+public class Queue {
+	
+	private LinkedList list = new LinkedList();
+	public void enQueue(Object o){	
+		list.add(o);
+	}
+	
+	public Object deQueue(){
+		int length = list.size();
+		if (length == 0) {
+			return null;
+		}
+		return list.removeFirst();
+	}
+	
+	public boolean isEmpty(){
+		if (list.size() == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	public int size(){
+		return list.size;
+	}
+}
diff --git a/group20/423184723/src/basic/Stack.java b/group20/423184723/src/basic/Stack.java
new file mode 100644
index 0000000000..6f3def6f0f
--- /dev/null
+++ b/group20/423184723/src/basic/Stack.java
@@ -0,0 +1,35 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		int length = elementData.size();
+		if (length == 0) {
+			return null;
+		}
+		return elementData.remove(length - 1);
+	}
+	
+	public Object peek(){
+		int length = elementData.size();
+		if (length == 0) {
+			return null;
+		}
+		return elementData.get(length - 1);
+	}
+	public boolean isEmpty(){
+		if (elementData.size() != 0) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/group20/452472201/src/com/coding/basic/ArrayList.java b/group20/452472201/src/com/coding/basic/ArrayList.java
index 1af26ce934..80746f1675 100644
--- a/group20/452472201/src/com/coding/basic/ArrayList.java
+++ b/group20/452472201/src/com/coding/basic/ArrayList.java
@@ -4,10 +4,9 @@ public class ArrayList implements List {
 
 	private  int size=0;
 
-	private  Object[] elementData =new Object[10];
+	private  Object[] elementData =new Object[5];
 
 
-	//数组扩容
 	private void  ensureCapacityInternal(){
 		if(size==elementData.length){
 			Object[] newArray = new Object[size*2];
@@ -33,8 +32,8 @@ public void add(int index, Object o){
 		}
 
 		System.arraycopy(elementData, index, elementData, index+1,size-index );
-        elementData[index]=o;
-        size++;
+		elementData[index]=o;
+		size++;
 	}
 
 	public Object get(int index){
@@ -75,24 +74,41 @@ public int size(){
 
 
 	private class Iter implements Iterator {
-		//计数器 
+
 		private int coursor=-1;
-		//判断是否存在下一个
+
 		public boolean hasNext(){
 			return coursor+1<size;
 		}
-		//获取下一个
+
 		public String next(){
 			coursor++;
 			return (String) elementData[coursor];
 		}
 	}
-		public Iterator iterator(){
 
-			return new Iter();
+	public Iterator iterator(){
+
+		return new Iter();
 
+	}
+
+	public static void main(String[] args){
+		ArrayList alist = new ArrayList();
+		alist.add("1");
+		alist.add("2");
+		alist.add("3");
+		alist.add("4");
+		alist.add(2, "五");
+		System.out.println(alist.size());
+		Iterator i = alist.iterator();
+		while(i.hasNext()){
+		System.out.print(i.next());
 		}
+
+	}
 }
 
 
 
+
diff --git a/group20/452472201/src/com/coding/basic/LinkedList.java b/group20/452472201/src/com/coding/basic/LinkedList.java
index e2c4e5e795..2383bf60e3 100644
--- a/group20/452472201/src/com/coding/basic/LinkedList.java
+++ b/group20/452472201/src/com/coding/basic/LinkedList.java
@@ -1,46 +1,60 @@
 package com.coding.basic;
 
 public class LinkedList implements List {
-	
 	private Node head;
 	
+
 	public void add(Object o){
 		
 	}
+
+
+
+
 	public void add(int index , Object o){
-		
+
 	}
+
 	public Object get(int index){
 		return null;
 	}
+
 	public Object remove(int index){
 		return null;
 	}
-	
+
 	public int size(){
 		return -1;
 	}
-	
+
 	public void addFirst(Object o){
-		
+
 	}
+
 	public void addLast(Object o){
-		
+
 	}
 	public Object removeFirst(){
 		return null;
 	}
+
 	public Object removeLast(){
 		return null;
 	}
+
 	public Iterator iterator(){
 		return null;
 	}
-	
-	
+
+
 	private static  class Node{
+		
 		Object data;
 		Node next;
-		
+
+
+
 	}
+	
+	
 }
diff --git a/group20/452472201/src/com/coding/basic/Queue.java b/group20/452472201/src/com/coding/basic/Queue.java
index 36e516e266..06df15ce4e 100644
--- a/group20/452472201/src/com/coding/basic/Queue.java
+++ b/group20/452472201/src/com/coding/basic/Queue.java
@@ -2,7 +2,8 @@
 
 public class Queue {
 	
-	public void enQueue(Object o){		
+	public void enQueue(Object o){	
+		
 	}
 	
 	public Object deQueue(){
diff --git a/group20/452472201/src/com/coding/basic/Stack.java b/group20/452472201/src/com/coding/basic/Stack.java
index a5a04de76d..54c2b8f358 100644
--- a/group20/452472201/src/com/coding/basic/Stack.java
+++ b/group20/452472201/src/com/coding/basic/Stack.java
@@ -2,21 +2,32 @@
 
 public class Stack {
 	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){		
+	private int size;
+	public void push(Object o){	
+		elementData.add(o);
+		size++;
 	}
-	
+
 	public Object pop(){
-		return null;
+		if(elementData==null){
+			try {
+				throw new Exception();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return elementData.remove(size-1);
+
 	}
-	
+
 	public Object peek(){
-		return null;
+		return elementData.get(size() - 1);
 	}
+
 	public boolean isEmpty(){
-		return false;
+		return size==0;
 	}
 	public int size(){
-		return -1;
+		return size;
 	}
 }
diff --git "a/group20/452472201/src/com/coding/basic/\345\215\232\345\256\242\351\223\276\346\216\245.txt" "b/group20/452472201/src/com/coding/basic/\345\215\232\345\256\242\351\223\276\346\216\245.txt"
new file mode 100644
index 0000000000..f883410ad7
--- /dev/null
+++ "b/group20/452472201/src/com/coding/basic/\345\215\232\345\256\242\351\223\276\346\216\245.txt"
@@ -0,0 +1 @@
+http://www.cnblogs.com/spp330/p/6443322.html
\ No newline at end of file
diff --git a/group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java b/group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java
new file mode 100644
index 0000000000..7bba1bb77b
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java
@@ -0,0 +1,232 @@
+package org.wsc.array;
+
+public class ArrayUtil {
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin) {
+		// 折半
+		for (int i = 0; i < (origin.length >> 1); i++) {
+			int num = origin[i];
+			origin[i] = origin[origin.length - 1 - i];
+			origin[origin.length - 1 - i] = num;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero(int[] oldArray) {
+		int count = 0;// 计数器
+		/*
+		 * 利用冒泡，将0元素向后排 {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+		 * {1,3,4,5,0,6,6,0,5,4,7,6,7,0,5,0} {1,3,4,5,6,6,0,5,4,7,6,7,0,5,0,0}
+		 * ....
+		 */
+		for (int i = 0; i < oldArray.length - count; i++) {
+			// 索引为i的元素为0，则依次将索引i的元素与i+1的元素对换
+			if (oldArray[i] == 0) {
+				for (int j = i; j < oldArray.length - 1 - count; j++) {
+					int num = oldArray[j];
+					oldArray[j] = oldArray[j + 1];
+					oldArray[j + 1] = num;
+				}
+				count++;// 计数器+1
+				i--;// 防止原索引i+1位置的元素为0,
+			}
+		}
+		// 创建新数组
+		int[] newArray = new int[oldArray.length - count];
+		System.arraycopy(oldArray, 0, newArray, 0, newArray.length);
+		return newArray;
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+	public static int[] removeZero2(int[] oldArray) {
+		int count = 0;// 计数器
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0)
+				count++;// 计数器+1
+		}
+		// 创建新数组
+		int[] newArray = new int[oldArray.length - count];
+		for (int i = 0, j = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[j] = oldArray[i];
+				j++;
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+		int[] newArray = new int[array1.length + array2.length];
+		int i = 0, j = 0, k = 0;
+		while (i < array1.length && j < array2.length) {
+			// <= 都取 array1
+			if (array1[i] <= array2[j]) {
+				// 等于时，将array2下标++
+				if (array1[i] == array2[j])
+					j++;
+				newArray[k++] = array1[i++];
+			} else
+				newArray[k++] = array2[j++];
+
+		}
+		// 将没有循环完毕的元素插入
+		while (i < array1.length)
+			newArray[k++] = array1[i++];
+		while (j < array2.length)
+			newArray[k++] = array2[j++];
+		int[] result = newArray;
+		// 长度缩短则新建数组
+		if (k < newArray.length) {
+			result = new int[k];
+			for (int l = 0; l < result.length; l++)
+				result[l] = newArray[l];
+		}
+		return result;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+		if (max <= 1)
+			return new int[] {};
+		int[] nums = new int[max];
+		nums[0] = nums[1] = 1;
+		int flag;
+		for (flag = 0; (flag < max - 2 && nums[flag] + nums[flag + 1] < max); flag++) {
+			nums[flag + 2] = nums[flag] + nums[flag + 1];
+		}
+		// 创建新数组
+		int[] newArray = nums;
+		if (newArray.length != flag + 2) {
+			newArray = new int[flag + 2];
+			for (int i = 0; i < newArray.length; i++) {
+				newArray[i] = nums[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		int[] array = new int[max>>1];
+		int flag = 0;
+		for (int i = 2; i < max; i++) {
+			int j;
+			for (j = 2; j <= (i >> 1); j++) {
+				if (i % j == 0)
+					break;
+ 
+			} 
+			//如果大于，则证明j++有运行，已经完整对比
+			if(j > i>>1)
+				array[flag++] = i;
+
+		}
+		int[] newArray = array;
+		if(flag < array.length){
+			newArray = new int[flag];
+			for (int i = 0; i < newArray.length; i++) {
+				newArray[i] = array[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) {
+		int[] array = new int[max];
+		int flag = 0;
+		for (int i = 1; i < max; i++) {
+			int sum = 0;
+			for (int j = 1; j < i; j++) {
+				if (i % j == 0)
+					sum+=j;
+			} 
+			//如果大于，则证明j++有运行，已经完整对比
+			if(sum == i)
+				array[flag++] = i;
+
+		}
+		int[] newArray = array;
+		if(flag < array.length){
+			newArray = new int[flag];
+			for (int i = 0; i < newArray.length; i++) {
+				newArray[i] = array[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		String str = "";
+		for (int i = 0; i < array.length; i++)
+			str += i != array.length - 1 ? array[i] + seperator : array[i];
+		return str;
+	}
+}
diff --git a/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java b/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..009dec2938
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java
@@ -0,0 +1,98 @@
+package org.wsc.array;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void testReverseArray() {
+		int[] nums = new int[]{7, 9 , 30, 3, 5};
+		ArrayUtil.reverseArray(nums);
+		assertArrayEquals(nums, new int[]{5, 3 ,30, 9, 7});
+	}
+	
+	/**
+	 * 删除0
+	 */
+	@Test
+	public void testRemoveZero() {
+		int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5,0};
+		nums = ArrayUtil.removeZero(nums);
+		assertArrayEquals(nums, new int[]{7, 9 ,30, 3, 5});
+	}
+	
+	/**
+	 * 删除0
+	 */
+	@Test
+	public void testRemoveZero2() {
+		int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5,0};
+		nums = ArrayUtil.removeZero2(nums);
+		assertArrayEquals(nums, new int[]{7, 9 ,30, 3, 5});
+	}
+	
+	/**
+	 * 拼接
+	 */
+	@Test
+	public void testJoin() {
+		int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5,0};
+		String str = ArrayUtil.join(nums,"-");
+		assertEquals(str, "0-7-9-0-0-30-0-3-5-0");
+	}
+	
+	/**
+	 * 扩容
+	 */
+	@Test
+	public void testGrow() {
+		int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5};
+		nums = ArrayUtil.grow(nums,3);
+		assertTrue(nums.length==12);
+	}
+
+	/**
+	 * 合并
+	 */
+	@Test
+	public void testMerge() {
+		int[] nums = new int[]{3, 5, 7,8};
+		int[] nums2 = new int[]{4, 5, 6,7,8};
+		nums = ArrayUtil.merge(nums,nums2);
+		assertTrue(nums.length==6);
+		assertArrayEquals(nums, new int[]{3, 4 ,5, 6, 7,8});
+	}
+	
+	/**
+	 *斐波那契数列
+	 */
+	@Test
+	public void testFibonacci() {
+		int[] nums = ArrayUtil.fibonacci(15);
+		assertTrue(nums.length==7);
+		assertArrayEquals(nums, new int[]{1,1,2,3,5,8,13});
+	}
+	
+	/**
+	 * 素数
+	 */
+	@Test
+	public void testGetPrimes() {
+		int[] nums = ArrayUtil.getPrimes(23);
+		assertTrue(nums.length==8);
+		assertArrayEquals(nums, new int[]{2,3,5,7,11,13,17,19});
+	}
+	
+	/**
+	 * 完数
+	 */
+	@Test
+	public void testGetPerfectNumbers() {
+		int[] nums = ArrayUtil.getPerfectNumbers(10000);
+		assertTrue(nums.length==4);
+		assertArrayEquals(nums, new int[]{6,28,496,8128});
+	}
+	
+}
diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/Action.java b/group20/592146505/coderising/src/org/wsc/litestruts/Action.java
new file mode 100644
index 0000000000..083519bac6
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/litestruts/Action.java
@@ -0,0 +1,21 @@
+package org.wsc.litestruts;
+
+import java.util.Set;
+
+public class Action {
+
+	/** 标签名 */
+	private String tag;
+	/** 属性 */
+	private String name;
+	
+	/** 类名 */
+	private String className;
+	
+	/** 子标签 */
+	private Set<Action> statusElement;
+
+	/** 文本内容 */
+	private String textContent;
+
+}
diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java b/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java
new file mode 100644
index 0000000000..bb23f5eebb
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package org.wsc.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java b/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java
new file mode 100644
index 0000000000..30a418979f
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java
@@ -0,0 +1,124 @@
+package org.wsc.litestruts;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.wsc.litestruts.util.DocumentUtil;
+import org.xml.sax.SAXException;
+
+public class Struts {
+	private static final DocumentUtil DOCUMENT_UTIL;
+	private static Document document;
+	static{
+		/* 0. 读取配置文件struts.xml */
+		DOCUMENT_UTIL = DocumentUtil.newInstance();
+		try {
+			document = DOCUMENT_UTIL.getDocument("src/struts.xml");
+		} catch (ParserConfigurationException | SAXException | IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 *
+	 * @param actionName
+	 * @param parameters
+	 * @return
+	 */
+	public static View runAction(String actionName, Map<String, String> parameters) {
+		String className = null;
+		String jsp = null;
+		Map<String, String> results = new HashMap<String, String>();
+		Node struts = document.getDocumentElement();// 获取根节点
+		NodeList actions = struts.getChildNodes();// 获取子节点
+		for (int i = 0; i < actions.getLength(); i++) {
+			// 过滤空节点
+			if (actions.item(i).getNodeType() != Node.ELEMENT_NODE)
+				continue;
+			Element action = (Element) actions.item(i);
+			if (!action.getAttribute("name").equals(actionName))
+				continue;
+			className = action.getAttribute("class");
+			/*
+			 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+			 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+			 * "password"="1234") , 那就应该调用 setName和setPassword方法
+			 */
+			Class clazz = null;
+			Object instance = null;
+			try {
+				clazz = Class.forName(className);
+				instance = clazz.getConstructor().newInstance();
+				Set<String> keySet = parameters.keySet();
+				for (String key : keySet) {
+					Object parameter = parameters.get(key);
+					Method method = instance.getClass().getMethod(
+							"set" + (key.substring(0, 1).toUpperCase() + key.substring(1)), parameter.getClass());
+					method.invoke(instance, parameter);
+				}
+			} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+				e.printStackTrace();
+			}
+
+			/* 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success" */
+			String rt = null;
+			try {
+				Method method = clazz.getMethod("execute"); 
+				rt = (String) method.invoke(instance);
+			} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} 
+			/*
+			 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap
+			 * , 例如 {"message": "登录成功"} , 放到View对象的parameters
+			 */
+			Field[] fields = instance.getClass().getDeclaredFields();
+			Method[] methods = instance.getClass().getMethods();
+			for (Field field : fields) {
+				String fieldName = field.getName();
+				for (Method method : methods) {
+					if (method.getName()
+							.equals(("get" + (fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1))))) {
+						try {
+							results.put(fieldName, (String) method.invoke(instance));
+							break;
+						} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+							e.printStackTrace();
+						}
+					}
+				}
+			}
+			NodeList resultNodes = action.getChildNodes();
+			for (int j = 0; j < resultNodes.getLength(); j++) {
+				if (resultNodes.item(j).getNodeType() != Node.ELEMENT_NODE)
+					continue;
+				Element result = (Element) resultNodes.item(j);
+				if (!result.getAttribute("name").equals(rt))
+					continue;
+				jsp = result.getTextContent();
+			}
+
+		}
+		/*
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 */
+		View view = new View();
+		view.setJsp(jsp);
+		view.setParameters(results);
+		return view;
+	}
+	
+}
diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java b/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..8101e95fe3
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package org.wsc.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/View.java b/group20/592146505/coderising/src/org/wsc/litestruts/View.java
new file mode 100644
index 0000000000..f21906d1a5
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/litestruts/View.java
@@ -0,0 +1,26 @@
+package org.wsc.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<String, String> parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map<String, String> getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map<String, String> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java b/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java
new file mode 100644
index 0000000000..9125b244cd
--- /dev/null
+++ b/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java
@@ -0,0 +1,69 @@
+package org.wsc.litestruts.util;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * DOM解析工具类
+ * 懒汉单例模式
+ * @author Administrator
+ * @date 2017年2月28日下午9:45:39
+ * @version v1.0
+ *
+ */
+public class DocumentUtil {
+	private static DocumentUtil documentUtil;
+
+	private DocumentUtil() {
+		super();
+	}
+	
+	/**
+	 * 获取实例
+	 * @return
+	 */
+	public static DocumentUtil newInstance(){
+		if(documentUtil == null)
+			synchronized (DocumentUtil.class) {
+				if(documentUtil == null)
+					documentUtil = new DocumentUtil();
+			}
+		return documentUtil;
+	}
+	
+	
+	/**
+	 * 解析XML文件获取DOM树
+	 * @param fileUrl
+	 * XML文件路径
+	 * @return
+	 * @throws IOException 
+	 * @throws SAXException 
+	 * @throws ParserConfigurationException 
+	 */
+	public Document getDocument(String fileUrl) throws ParserConfigurationException, SAXException, IOException{
+		return getDocument(new File(fileUrl));
+	}
+	/**
+	 * 解析XML文件获取DOM树
+	 * @param file
+	 * XML文件实例
+	 * @return
+	 * @throws ParserConfigurationException 
+	 * @throws IOException 
+	 * @throws SAXException 
+	 */
+	public Document getDocument(File xmlFile) throws ParserConfigurationException, SAXException, IOException{
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//解析器工厂
+    	DocumentBuilder db =  dbf.newDocumentBuilder();//解析器
+    	return db.parse(xmlFile);//DOM树
+	}
+	
+}
diff --git a/group20/592146505/coderising/src/struts.xml b/group20/592146505/coderising/src/struts.xml
new file mode 100644
index 0000000000..b709ec6636
--- /dev/null
+++ b/group20/592146505/coderising/src/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="org.wsc.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="org.wsc.litestruts.LogoutAction">
+    	<result name = "success">/jsp/welcome.jsp</result>
+    	<result name = "error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/592146505/data _structure/src/cn/wsc/util/ArrayList.java b/group20/592146505/data _structure/src/cn/wsc/util/ArrayList.java
deleted file mode 100644
index 94bb1f3217..0000000000
--- a/group20/592146505/data _structure/src/cn/wsc/util/ArrayList.java	
+++ /dev/null
@@ -1,233 +0,0 @@
-package cn.wsc.util;
-
-import java.util.Arrays;
-import java.util.ConcurrentModificationException;
-import java.util.NoSuchElementException;
-
-/**
- * ArrayList类
- * 
- * @author c_malina007
- * @param <E>
- */
-public class ArrayList<E> implements List<E> {
-
-	/** 元素个数 */
-	private int size;
-
-	/** 默认容量 */
-	private static final int DEFAULT_CAPACITY = 10;
-
-	/** 默认最大容量 */
-	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
-
-	/** 默认数组 */
-	private static final Object[] EMPTY_ELEMENTDATA = {};
-
-	/** 用于存放元素 */
-	private Object[] elementData;
-
-	/**
-	 * 无参构造将使用默认数组
-	 */
-	public ArrayList() {
-		elementData = EMPTY_ELEMENTDATA;
-	}
-
-	@Override
-	public int size() {
-		return size;
-	}
-
-	@Override
-	public boolean isEmpty() {
-		return size == 0;
-	}
-
-	// @Override
-	// public boolean contains(Object o) {
-	// // TODO Auto-generated method stub
-	// return false;
-	// }
-
-	@Override
-	public Iterator<E> iterator() {
-		return new Itr();
-	}
-
-	private class Itr implements Iterator<E> {
-		int cursor; // 当前索引
-		int lastRet = -1;//
-
-		@Override
-		public boolean hasNext() {
-			return cursor != size;
-		}
-
-		@SuppressWarnings("unchecked")
-		@Override
-		public E next() {
-			if (cursor > size) {
-				throw new NoSuchElementException();
-			}
-			Object[] elementData = ArrayList.this.elementData;
-			if (cursor >= elementData.length) {
-				throw new ConcurrentModificationException();
-			}
-			return (E) elementData[lastRet = cursor++];
-		}
-
-		@Override
-		public void remove() {
-			if (lastRet < 0)
-				throw new IllegalStateException();
-			try {
-				ArrayList.this.remove(lastRet);
-				cursor = lastRet;
-				lastRet = -1;
-				size--;
-			} catch (IndexOutOfBoundsException ex) {
-				throw new ConcurrentModificationException();
-			}
-		}
-
-	}
-
-	// @Override
-	// public Object[] toArray() {
-	// // TODO Auto-generated method stub
-	// return null;
-	// }
-	//
-	// @Override
-	// public <T> T[] toArray(T[] a) {
-	// // TODO Auto-generated method stub
-	// return null;
-	// }
-
-	@Override
-	public boolean add(E element) {
-		// 保证数组长度正确
-		ensureCapacityInternal(size + 1);
-		// 使用后缀自操作符
-		elementData[size++] = element;
-		return true;
-	}
-
-	@Override
-	public boolean add(int index, E element) {
-		rangeCheckForAdd(index);// 进行添加操作的索引范围检查
-		// 保证数组长度正确
-		ensureCapacityInternal(size + 1);
-		// 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到
-		// destPos+length-1 位置
-		System.arraycopy(elementData, index, elementData, index + 1, size - index);
-		elementData[index] = element;
-		size++;
-		return true;
-	}
-
-	private void ensureCapacityInternal(int minCapacity) {
-		if (elementData == EMPTY_ELEMENTDATA)
-			minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY);
-		// 传入最小容量大于当前数组长度，则扩容
-		if (minCapacity > elementData.length)
-			grow(minCapacity);
-	}
-
-	/**
-	 * 扩容
-	 * 
-	 * @param minCapacity
-	 */
-	private void grow(int minCapacity) {
-		int oldCapacity = elementData.length;// 获取原数组长度
-		// 计算新容量
-		int newCapacity = oldCapacity + (oldCapacity >> 1);// 原容量+(原容量/2)，使用位移符提高运行速度
-		newCapacity = newCapacity < minCapacity ? minCapacity : newCapacity;
-		if (newCapacity > MAX_ARRAY_SIZE)
-			newCapacity = hugeCapacity(newCapacity);
-		// 将原数组数据复制到一个长度为newCapacity的新数组中
-		elementData = Arrays.copyOf(elementData, newCapacity);
-	}
-
-	/**
-	 * 传入容量是否大于最大容量常量，如大于最大容量，则返回int类型所能表示的最大值 ArrayList最大容量为int类型所能表示的最大值
-	 * 
-	 * @param minCapacity
-	 * @return
-	 */
-	private int hugeCapacity(int minCapacity) {
-		if (minCapacity < 0) {
-			throw new OutOfMemoryError("The index cannot be negative");
-		}
-		return minCapacity > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E get(int index) {
-		rangeCheck(index);// 进行索引的范围检查
-		return (E) elementData[index];
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E set(int index, E element) {
-		rangeCheck(index);// 进行索引的范围检查
-		// 取到指定索引元素，将新元素置入该索引位，并返回原元素
-		E oldValue = (E) elementData[index];
-		elementData[index] = element;
-		return oldValue;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E remove(int index) {
-		rangeCheck(index);// 进行索引的范围检查
-		// 获取指定索引处元素
-		E rmValue = (E) elementData[index];
-		// 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到
-		// destPos+length-1 位置
-		System.arraycopy(elementData, index + 1, elementData, index, size - (index - 1));
-		size--;
-		return rmValue;
-	}
-
-	// @Override
-	// public int indexOf(Object o) {
-	// // TODO Auto-generated method stub
-	// return 0;
-	// }
-
-	/**
-	 * 添加时的索引范围检查
-	 * 
-	 * @param index
-	 */
-	private void rangeCheckForAdd(int index) {
-		if (index > this.size || index < 0)// 添加可以往末位插入，所以这里索引等于元素个数也可以
-			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-	}
-
-	/**
-	 * 索引范围检查
-	 * 
-	 * @param index
-	 */
-	private void rangeCheck(int index) {
-		if (index < 0 || index >= this.size)
-			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-	}
-
-	/**
-	 * 以字符串形式返回索引和元素个数信息
-	 * 
-	 * @param index
-	 * @return
-	 */
-	private String outOfBoundsMsg(int index) {
-		return "Index: " + index + ", Size: " + this.size;
-	}
-
-}
diff --git a/group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java b/group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java
deleted file mode 100644
index ccb9ff2783..0000000000
--- a/group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java	
+++ /dev/null
@@ -1,284 +0,0 @@
-package cn.wsc.util;
-
-import java.util.ConcurrentModificationException;
-import java.util.NoSuchElementException;
-
-/**
- * LinkedList类
- *
- * @author Administrator
- * @date 2017年2月25日上午10:52:41
- * @version v1.0
- *
- * @param <E>
- */
-public class LinkedList<E> implements List<E> {
-
-	private int size;
-	Node<E> first; // 链表的头节点
-	Node<E> last; // 链表的尾节点
-
-	private static class Node<E> {
-		E item; // 存储数据
-		Node<E> prev; // 上一个节点
-		Node<E> next; // 下一个节点
-
-		Node(Node<E> prev, E element, Node<E> next) {
-			this.item = element;
-			this.next = next;
-			this.prev = prev;
-		}
-	}
-
-	@Override
-	public int size() {
-		return size;
-	}
-
-	@Override
-	public boolean isEmpty() {
-		return size == 0;
-	}
-
-	@Override
-	public Iterator<E> iterator() {
-		return new Itr();
-	}
-
-	private class Itr implements Iterator<E> {
-		int cursor; // 当前索引
-		int lastRet = -1;// 上一次索引
-
-		@Override
-		public boolean hasNext() {
-			return cursor != size;
-		}
-
-		@Override
-		public E next() {
-			if (cursor > size) {
-				throw new NoSuchElementException();
-			}
-			return get(lastRet = cursor++);
-		}
-
-		@Override
-		public void remove() {
-			if (lastRet < 0)
-				throw new IllegalStateException();
-			try {
-				LinkedList.this.remove(lastRet);
-				cursor = lastRet;
-				lastRet = -1;
-				size--;
-			} catch (IndexOutOfBoundsException ex) {
-				throw new ConcurrentModificationException();
-			}
-		}
-
-	}
-
-	@Override
-	public boolean add(E e) {
-		linkLast(e);
-		return true;
-	}
-
-	@Override
-	public boolean add(int index, E element) {
-		checkPositionIndex(index);// 位置范围检查
-		// 如果索引等于元素个数，则直接插入尾部
-		if (index == size) {
-			linkLast(element);
-		} else {
-			linkBefore(element, node(index));
-		}
-		return true;
-	}
-
-	@Override
-	public E get(int index) {
-		return node(index).item;
-	}
-
-	/**
-	 * 维护头节点
-	 * 
-	 * @param e
-	 */
-	void linkFirst(E e) {
-		Node<E> f = first;
-		// 创建新节点，将原头节点作为新节点的下一个节点
-		Node<E> newNode = new Node<E>(null, e, f);
-		// 将新节点设置为头节点
-		first = newNode;
-		// 如原头节点为null，则尾节点也为newNode
-		if (f == null) {
-			last = newNode;
-		} else {// 否则将新节点作为原头节点的上一个节点
-			f.prev = newNode;
-		}
-		size++;
-
-	}
-
-	/**
-	 * 维护尾节点
-	 * 
-	 * @param e
-	 */
-	void linkLast(E e) {
-		Node<E> l = last;
-		// 创建新节点，将尾节点作为新节点的上一个节点
-		Node<E> newNode = new Node<E>(l, e, null);
-		// 将新节点设置为尾节点
-		last = newNode;
-		// 如原尾节点为null，则头节点也为newNode
-		if (l == null) {
-			first = newNode;
-		} else {// 否则将新节点作为原尾节点的下一个节点
-			l.next = newNode;
-		}
-		size++;
-	}
-
-	/**
-	 * 在指定节点前插入新节点
-	 * 
-	 * @param e
-	 * @param node
-	 */
-	void linkBefore(E e, Node<E> node) {
-		// 获取node的上一个节点，并创建新节点，将pred做为新节点的上一个节点，将node作为新节点的下一个节点
-		final Node<E> pred = node.prev;
-		final Node<E> newNode = new Node<>(pred, e, node);
-		// 将node的上一个节点指向newNode
-		node.prev = newNode;
-		// 如prev为null，则说明node为first，那么将新节点设为first
-		if (pred == null) {
-			first = newNode;
-		} else {// 否则，将新节点设为pred的下一个节点
-			pred.next = newNode;
-		}
-		size++;
-	}
-
-	/**
-	 * 获取节点
-	 * 
-	 * @param index
-	 * @return
-	 */
-	Node<E> node(int index) {
-		// 索引小于长度的2分之一则从前向后遍历，否则从后向前遍历，减少遍历次数
-		if (index < (size >> 1)) {
-			Node<E> x = first;
-			for (int i = 0; i < index; i++)
-				x = x.next;
-			return x;
-		} else {
-			Node<E> x = last;
-			for (int i = size - 1; i > index; i--)
-				x = x.prev;
-			return x;
-		}
-	}
-
-	/**
-	 * 获取头节点
-	 * 
-	 * @return
-	 */
-	public E getFirst() {
-		Node<E> f = first;
-		if (f == null)
-			throw new NoSuchElementException();
-		return f.item;
-	}
-
-	/**
-	 * 获取尾节点
-	 * 
-	 * @return
-	 */
-	public E getLast() {
-		Node<E> l = last;
-		if (l == null)
-			throw new NoSuchElementException();
-		return l.item;
-	}
-
-	@Override
-	public E set(int index, E e) {
-		checkElementIndex(index);// 索引范围检查
-		// 获取索引处节点，填入新值，返回原值
-		Node<E> x = node(index);
-		E oldVal = x.item;
-		x.item = e;
-		return oldVal;
-	}
-
-	@Override
-	public E remove(int index) {
-		checkElementIndex(index);// 索引范围检查
-		return unlink(node(index));
-	}
-
-	/**
-	 * 删除节点
-	 * 
-	 * @param x
-	 * @return
-	 */
-	E unlink(Node<E> x) {
-		// 获取此节点的上一个节点和下一个节点
-		E element = x.item;
-		Node<E> prev = x.prev;
-		Node<E> next = x.next;
-		// 如prev节点为null，则说明x节点为first，那么将next节点设为first
-		if (prev == null) {
-			first = next;
-		} else {// 否则，将prev节点的下一个节点设为next
-			prev.next = next;
-		}
-		// 如next节点为null，则说明x节点为last，那么将prev节点设为last
-		if (next == null) {
-			last = prev;
-		} else {// 否则，将next节点的上一个节点设为prev
-			next.prev = prev;
-		}
-		x.item = null;
-		size--;
-		return element;
-	}
-
-	/**
-	 * 位置范围检查 >0 && <=size
-	 * 
-	 * @param index
-	 */
-	private void checkPositionIndex(int index) {
-		if (index > this.size || index < 0)// 添加可以往末位插入，所以这里索引等于元素个数也可以
-			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-	}
-
-	/**
-	 * 索引范围检查 >0 && <size
-	 * 
-	 * @param index
-	 */
-	private void checkElementIndex(int index) {
-		if (index < 0 || index >= this.size)
-			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
-	}
-
-	/**
-	 * 以字符串形式返回索引和元素个数信息
-	 * 
-	 * @param index
-	 * @return
-	 */
-	private String outOfBoundsMsg(int index) {
-		return "Index: " + index + ", Size: " + this.size;
-	}
-}
diff --git a/group20/592146505/data _structure/src/cn/wsc/util/List.java b/group20/592146505/data _structure/src/cn/wsc/util/List.java
deleted file mode 100644
index 9b61278fc7..0000000000
--- a/group20/592146505/data _structure/src/cn/wsc/util/List.java	
+++ /dev/null
@@ -1,105 +0,0 @@
-package cn.wsc.util;
-
-/**
- * List接口
- *
- * @author Administrator
- * @date 2017年2月20日下午9:15:32
- * @version v1.0
- *
- * @param <T>
- */
-public interface List<E> {
-
-	/**
-	 * 获取集合元素个数
-	 * 
-	 * @return
-	 */
-	int size();
-
-	/**
-	 * 集合是否为空
-	 * 
-	 * @return
-	 */
-	boolean isEmpty();
-
-	// /**
-	// * 是否包含指定元素
-	// * @param o
-	// * @return
-	// */
-	// boolean contains(Object o);
-
-	/**
-	 * 获取当前集合迭代器对象
-	 * 
-	 * @return
-	 */
-	Iterator<E> iterator();
-	//
-	// /**
-	// * 返回集合数组对象
-	// *
-	// * @return
-	// */
-	// Object[] toArray();
-	//
-	// /**
-	// * 将集合元素复制到新数组中
-	// * @param a
-	// * @return
-	// */
-	// <T> T[] toArray(T[] a);
-
-	/**
-	 * 在集合末尾追加元素
-	 * 
-	 * @param e
-	 * @return
-	 */
-	boolean add(E e);
-
-	/**
-	 * 将元素添加至指定指定索引处
-	 * 
-	 * @param index
-	 * @param e
-	 * @return
-	 */
-	boolean add(int index, E e);
-
-	/**
-	 * 获取指定索引处元素
-	 * 
-	 * @param index
-	 * @return
-	 */
-	E get(int index);
-
-	/**
-	 * 替换指定索引处元素为新元素，并返回被替换元素，
-	 * 
-	 * @param index
-	 * @param e
-	 * @return
-	 */
-	E set(int index, E e);
-
-	/**
-	 * 删除并返回指定指定索引处元素
-	 * 
-	 * @param index
-	 * @return
-	 */
-	E remove(int index);
-
-	// /**
-	// * 返回该对象在集合中的下标，不存在返回-1
-	// * @param o
-	// * @return
-	// */
-	// int indexOf(Object o);
-
-}
\ No newline at end of file
diff --git a/group20/592146505/data _structure/src/cn/wsc/utils/Stack.java b/group20/592146505/data _structure/src/cn/wsc/utils/Stack.java
deleted file mode 100644
index 3f156461e8..0000000000
--- a/group20/592146505/data _structure/src/cn/wsc/utils/Stack.java	
+++ /dev/null
@@ -1,22 +0,0 @@
-package cn.wsc.utils;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){		
-	}
-	
-	public Object pop(){
-		return null;
-	}
-	
-	public Object peek(){
-		return null;
-	}
-	public boolean isEmpty(){
-		return false;
-	}
-	public int size(){
-		return -1;
-	}
-}
diff --git a/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java b/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java
new file mode 100644
index 0000000000..aa7763ef00
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java	
@@ -0,0 +1,23 @@
+package org.wsc.exception;
+
+/**
+ *
+ * 空元素异常
+ * @author Administrator
+ * @date 2017年2月26日下午4:15:49
+ * @version v1.0
+ *
+ */
+public class NullElementException extends RuntimeException {
+
+	private static final long serialVersionUID = 4729177529481680909L;
+
+	public NullElementException() {
+		super();
+	}
+
+	public NullElementException(String message) {
+		super(message);
+	}
+	
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java b/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java
new file mode 100644
index 0000000000..a5b66c54a1
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java	
@@ -0,0 +1,23 @@
+package org.wsc.exception;
+
+/**
+ *
+ * 重复元素异常
+ * @author Administrator
+ * @date 2017年2月26日下午4:15:49
+ * @version v1.0
+ *
+ */
+public class RepeatingElementException extends RuntimeException {
+
+	private static final long serialVersionUID = 4729177529481680909L;
+
+	public RepeatingElementException() {
+		super();
+	}
+
+	public RepeatingElementException(String message) {
+		super(message);
+	}
+	
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java b/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java
new file mode 100644
index 0000000000..28b8db4132
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java	
@@ -0,0 +1,234 @@
+package org.wsc.list;
+
+import java.util.Arrays;
+import java.util.ConcurrentModificationException;
+import java.util.NoSuchElementException;
+
+import javafx.stage.StageStyle;
+
+/**
+ * ArrayList类
+ * 
+ * @author c_malina007
+ * @param <E>
+ */
+public class ArrayList<E> implements List<E> {
+
+	/** 元素个数 */
+	private int size;
+
+	/** 默认容量 */
+	private static final int DEFAULT_CAPACITY = 10;
+
+	/** 默认最大容量 */
+	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
+
+	/** 默认数组 */
+	private static final Object[] EMPTY_ELEMENTDATA = {};
+
+	/** 用于存放元素 */
+	private Object[] elementData;
+
+	/**
+	 * 无参构造将使用默认数组
+	 */
+	public ArrayList() {
+		elementData = EMPTY_ELEMENTDATA;
+	}
+
+	@Override
+	public int size() {
+		return size;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	// @Override
+	// public boolean contains(Object o) {
+	// // TODO Auto-generated method stub
+	// return false;
+	// }
+
+	@Override
+	public Iterator<E> iterator() {
+		return new Itr();
+	}
+
+	private class Itr implements Iterator<E> {
+		int cursor; // 当前索引
+		int lastRet = -1;//
+
+		@Override
+		public boolean hasNext() {
+			return cursor != size;
+		}
+
+		@SuppressWarnings("unchecked")
+		@Override
+		public E next() {
+			if (cursor > size) {
+				throw new NoSuchElementException();
+			}
+			Object[] elementData = ArrayList.this.elementData;
+			if (cursor >= elementData.length) {
+				throw new ConcurrentModificationException();
+			}
+			return (E) elementData[lastRet = cursor++];
+		}
+
+		@Override
+		public void remove() {
+			if (lastRet < 0)
+				throw new IllegalStateException();
+			try {
+				ArrayList.this.remove(lastRet);
+				cursor = lastRet;
+				lastRet = -1;
+				size--;
+			} catch (IndexOutOfBoundsException ex) {
+				throw new ConcurrentModificationException();
+			}
+		}
+
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E[] toArray() {
+		return (E[]) elementData;
+	}
+
+	@Override
+	public <T> T[] toArray(T[] a) {
+		return null;
+	}
+
+	@Override
+	public boolean add(E element) {
+		// 保证数组长度正确
+		ensureCapacityInternal(size + 1);
+		// 使用后缀自操作符
+		elementData[size++] = element;
+		return true;
+	}
+
+	@Override
+	public boolean add(int index, E element) {
+		rangeCheckForAdd(index);// 进行添加操作的索引范围检查
+		// 保证数组长度正确
+		ensureCapacityInternal(size + 1);
+		// 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到
+		// destPos+length-1 位置
+		System.arraycopy(elementData, index, elementData, index + 1, size - index);
+		elementData[index] = element;
+		size++;
+		return true;
+	}
+
+	private void ensureCapacityInternal(int minCapacity) {
+		if (elementData == EMPTY_ELEMENTDATA)
+			minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY);
+		// 传入最小容量大于当前数组长度，则扩容
+		if (minCapacity > elementData.length)
+			grow(minCapacity);
+	}
+
+	/**
+	 * 扩容
+	 * 
+	 * @param minCapacity
+	 */
+	private void grow(int minCapacity) {
+		int oldCapacity = elementData.length;// 获取原数组长度
+		// 计算新容量
+		int newCapacity = oldCapacity + (oldCapacity >> 1);// 原容量+(原容量/2)，使用位移符提高运行速度
+		newCapacity = newCapacity < minCapacity ? minCapacity : newCapacity;
+		if (newCapacity > MAX_ARRAY_SIZE)
+			newCapacity = hugeCapacity(newCapacity);
+		// 将原数组数据复制到一个长度为newCapacity的新数组中
+		elementData = Arrays.copyOf(elementData, newCapacity);
+	}
+
+	/**
+	 * 传入容量是否大于最大容量常量，如大于最大容量，则返回int类型所能表示的最大值 ArrayList最大容量为int类型所能表示的最大值
+	 * 
+	 * @param minCapacity
+	 * @return
+	 */
+	private int hugeCapacity(int minCapacity) {
+		if (minCapacity < 0) {
+			throw new OutOfMemoryError("The index cannot be negative");
+		}
+		return minCapacity > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E get(int index) {
+		rangeCheck(index);// 进行索引的范围检查
+		return (E) elementData[index];
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E set(int index, E element) {
+		rangeCheck(index);// 进行索引的范围检查
+		// 取到指定索引元素，将新元素置入该索引位，并返回原元素
+		E oldValue = (E) elementData[index];
+		elementData[index] = element;
+		return oldValue;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E remove(int index) {
+		rangeCheck(index);// 进行索引的范围检查
+		// 获取指定索引处元素
+		E rmValue = (E) elementData[index];
+		// 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到
+		// destPos+length-1 位置
+		System.arraycopy(elementData, index + 1, elementData, index, size - (index - 1));
+		size--;
+		return rmValue;
+	}
+
+	// @Override
+	// public int indexOf(Object o) {
+	// // TODO Auto-generated method stub
+	// return 0;
+	// }
+
+	/**
+	 * 添加时的索引范围检查
+	 * 
+	 * @param index
+	 */
+	private void rangeCheckForAdd(int index) {
+		if (index > this.size || index < 0)// 添加可以往末位插入，所以这里索引等于元素个数也可以
+			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+	}
+
+	/**
+	 * 索引范围检查
+	 * 
+	 * @param index
+	 */
+	private void rangeCheck(int index) {
+		if (index < 0 || index >= this.size)
+			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+	}
+
+	/**
+	 * 以字符串形式返回索引和元素个数信息
+	 * 
+	 * @param index
+	 * @return
+	 */
+	private String outOfBoundsMsg(int index) {
+		return "Index: " + index + ", Size: " + this.size;
+	}
+
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/list/Iterator.java b/group20/592146505/data _structure/src/org/wsc/list/Iterator.java
new file mode 100644
index 0000000000..59590bbf7e
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/list/Iterator.java	
@@ -0,0 +1,21 @@
+package org.wsc.list;
+
+public interface Iterator<E> {
+	/**
+	 * 是否存在下一个元素
+	 * @return
+	 */
+	boolean hasNext();
+
+	/**
+	 * 获取下一个元素
+	 * @return
+	 */
+	E next();
+
+	/**
+	 * 删除当前元素
+	 */
+	void remove();
+
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java b/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java
new file mode 100644
index 0000000000..b909cfeabc
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java	
@@ -0,0 +1,316 @@
+package org.wsc.list;
+
+import java.util.ConcurrentModificationException;
+import java.util.NoSuchElementException;
+
+/**
+ * LinkedList类
+ * 实现List接口和Queue接口
+ * 基于链表的集合
+ * @author Administrator
+ * @date 2017年2月25日上午10:52:41
+ * @version v1.0
+ *
+ * @param <E>
+ */
+public class LinkedList<E> implements List<E>,Queue<E> {
+
+	private int size;
+	Node<E> first; // 链表的头节点
+	Node<E> last; // 链表的尾节点
+
+	private static class Node<E> {
+		E item; // 存储数据
+		Node<E> prev; // 上一个节点
+		Node<E> next; // 下一个节点
+
+		Node(Node<E> prev, E element, Node<E> next) {
+			this.item = element;
+			this.next = next;
+			this.prev = prev;
+		}
+	}
+
+	@Override
+	public int size() {
+		return size;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	@Override
+	public Iterator<E> iterator() {
+		return new Itr();
+	}
+
+	private class Itr implements Iterator<E> {
+		int cursor; // 当前索引
+		int lastRet = -1;// 上一次索引
+
+		@Override
+		public boolean hasNext() {
+			return cursor != size;
+		}
+
+		@Override
+		public E next() {
+			if (cursor > size) {
+				throw new NoSuchElementException();
+			}
+			return get(lastRet = cursor++);
+		}
+
+		@Override
+		public void remove() {
+			if (lastRet < 0)
+				throw new IllegalStateException();
+			try {
+				LinkedList.this.remove(lastRet);
+				cursor = lastRet;
+				lastRet = -1;
+				size--;
+			} catch (IndexOutOfBoundsException ex) {
+				throw new ConcurrentModificationException();
+			}
+		}
+
+	}
+
+	@Override
+	public boolean add(E e) {
+		linkLast(e);
+		return true;
+	}
+
+	@Override
+	public boolean add(int index, E element) {
+		checkPositionIndex(index);// 位置范围检查
+		// 如果索引等于元素个数，则直接插入尾部
+		if (index == size) {
+			linkLast(element);
+		} else {
+			linkBefore(element, node(index));
+		}
+		return true;
+	}
+
+	@Override
+	public E get(int index) {
+		return node(index).item;
+	}
+
+	/**
+	 * 维护头节点
+	 * 
+	 * @param e
+	 */
+	void linkFirst(E e) {
+		Node<E> f = first;
+		// 创建新节点，将原头节点作为新节点的下一个节点
+		Node<E> newNode = new Node<E>(null, e, f);
+		// 将新节点设置为头节点
+		first = newNode;
+		// 如原头节点为null，则尾节点也为newNode
+		if (f == null) {
+			last = newNode;
+		} else {// 否则将新节点作为原头节点的上一个节点
+			f.prev = newNode;
+		}
+		size++;
+
+	}
+
+	/**
+	 * 维护尾节点
+	 * 
+	 * @param e
+	 */
+	void linkLast(E e) {
+		Node<E> l = last;
+		// 创建新节点，将尾节点作为新节点的上一个节点
+		Node<E> newNode = new Node<E>(l, e, null);
+		// 将新节点设置为尾节点
+		last = newNode;
+		// 如原尾节点为null，则头节点也为newNode
+		if (l == null) {
+			first = newNode;
+		} else {// 否则将新节点作为原尾节点的下一个节点
+			l.next = newNode;
+		}
+		size++;
+	}
+
+	/**
+	 * 在指定节点前插入新节点
+	 * 
+	 * @param e
+	 * @param node
+	 */
+	void linkBefore(E e, Node<E> node) {
+		// 获取node的上一个节点，并创建新节点，将pred做为新节点的上一个节点，将node作为新节点的下一个节点
+		final Node<E> pred = node.prev;
+		final Node<E> newNode = new Node<>(pred, e, node);
+		// 将node的上一个节点指向newNode
+		node.prev = newNode;
+		// 如prev为null，则说明node为first，那么将新节点设为first
+		if (pred == null) {
+			first = newNode;
+		} else {// 否则，将新节点设为pred的下一个节点
+			pred.next = newNode;
+		}
+		size++;
+	}
+
+	/**
+	 * 获取节点
+	 * 
+	 * @param index
+	 * @return
+	 */
+	Node<E> node(int index) {
+		// 索引小于长度的2分之一则从前向后遍历，否则从后向前遍历，减少遍历次数
+		if (index < (size >> 1)) {
+			Node<E> x = first;
+			for (int i = 0; i < index; i++)
+				x = x.next;
+			return x;
+		} else {
+			Node<E> x = last;
+			for (int i = size - 1; i > index; i--)
+				x = x.prev;
+			return x;
+		}
+	}
+
+	/**
+	 * 获取头节点
+	 * 
+	 * @return
+	 */
+	public E getFirst() {
+		Node<E> f = first;
+		if (f == null)
+			throw new NoSuchElementException();
+		return f.item;
+	}
+
+	/**
+	 * 获取尾节点
+	 * 
+	 * @return
+	 */
+	public E getLast() {
+		Node<E> l = last;
+		if (l == null)
+			throw new NoSuchElementException();
+		return l.item;
+	}
+
+	@Override
+	public E set(int index, E e) {
+		checkElementIndex(index);// 索引范围检查
+		// 获取索引处节点，填入新值，返回原值
+		Node<E> x = node(index);
+		E oldVal = x.item;
+		x.item = e;
+		return oldVal;
+	}
+
+	@Override
+	public E remove(int index) {
+		checkElementIndex(index);// 索引范围检查
+		return unlink(node(index));
+	}
+
+	public E removeFirst() {
+		//获取头节点
+        final Node<E> f = first;
+        if (f == null)
+            throw new NoSuchElementException();
+        return remove(0);
+    }
+	
+	/**
+	 * 删除节点
+	 * 
+	 * @param x
+	 * @return
+	 */
+	E unlink(Node<E> x) {
+		// 获取此节点的上一个节点和下一个节点
+		E element = x.item;
+		Node<E> prev = x.prev;
+		Node<E> next = x.next;
+		// 如prev节点为null，则说明x节点为first，那么将next节点设为first
+		if (prev == null) {
+			first = next;
+		} else {// 否则，将prev节点的下一个节点设为next
+			prev.next = next;
+		}
+		// 如next节点为null，则说明x节点为last，那么将prev节点设为last
+		if (next == null) {
+			last = prev;
+		} else {// 否则，将next节点的上一个节点设为prev
+			next.prev = prev;
+		}
+		x.item = null;
+		size--;
+		return element;
+	}
+
+	@Override
+	public void enQueue(E e) {
+		linkLast(e);
+	}
+
+	@Override
+	public E deQueue() {
+		return removeFirst();
+	}
+	
+	/**
+	 * 位置范围检查 >0 && <=size
+	 * 
+	 * @param index
+	 */
+	private void checkPositionIndex(int index) {
+		if (index > this.size || index < 0)// 添加可以往末位插入，所以这里索引等于元素个数也可以
+			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+	}
+
+	/**
+	 * 索引范围检查 >0 && <size
+	 * 
+	 * @param index
+	 */
+	private void checkElementIndex(int index) {
+		if (index < 0 || index >= this.size)
+			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+	}
+
+	/**
+	 * 以字符串形式返回索引和元素个数信息
+	 * 
+	 * @param index
+	 * @return
+	 */
+	private String outOfBoundsMsg(int index) {
+		return "Index: " + index + ", Size: " + this.size;
+	}
+
+	@Override
+	public E[] toArray() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public <T> T[] toArray(T[] a) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/list/List.java b/group20/592146505/data _structure/src/org/wsc/list/List.java
new file mode 100644
index 0000000000..2fd90c6395
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/list/List.java	
@@ -0,0 +1,106 @@
+package org.wsc.list;
+
+/**
+ * List接口
+ *
+ * @author Administrator
+ * @date 2017年2月20日下午9:15:32
+ * @version v1.0
+ *
+ * @param <T>
+ */
+public interface List<E> {
+
+	/**
+	 * 获取集合元素个数
+	 * 
+	 * @return
+	 */
+	int size();
+
+	/**
+	 * 集合是否为空
+	 * 
+	 * @return
+	 */
+	boolean isEmpty();
+
+	// /**
+	// * 是否包含指定元素
+	// * @param o
+	// * @return
+	// */
+	// boolean contains(Object o);
+
+	/**
+	 * 获取当前集合迭代器对象
+	 * 
+	 * @return
+	 */
+	Iterator<E> iterator();
+
+	/**
+	 * 返回集合数组对象
+	 *
+	 * @return
+	 */
+	Object[] toArray();
+
+	/**
+	 * 将集合元素复制到新数组中
+	 * 
+	 * @param a
+	 * @return
+	 */
+	<T> T[] toArray(T[] a);
+
+	/**
+	 * 在集合末尾追加元素
+	 * 
+	 * @param e
+	 * @return
+	 */
+	boolean add(E e);
+
+	/**
+	 * 将元素添加至指定指定索引处
+	 * 
+	 * @param index
+	 * @param e
+	 * @return
+	 */
+	boolean add(int index, E e);
+
+	/**
+	 * 获取指定索引处元素
+	 * 
+	 * @param index
+	 * @return
+	 */
+	E get(int index);
+
+	/**
+	 * 替换指定索引处元素为新元素，并返回被替换元素，
+	 * 
+	 * @param index
+	 * @param e
+	 * @return
+	 */
+	E set(int index, E e);
+
+	/**
+	 * 删除并返回指定指定索引处元素
+	 * 
+	 * @param index
+	 * @return
+	 */
+	E remove(int index);
+
+	// /**
+	// * 返回该对象在集合中的下标，不存在返回-1
+	// * @param o
+	// * @return
+	// */
+	// int indexOf(Object o);
+
+}
\ No newline at end of file
diff --git a/group20/592146505/data _structure/src/org/wsc/list/Queue.java b/group20/592146505/data _structure/src/org/wsc/list/Queue.java
new file mode 100644
index 0000000000..2087335e58
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/list/Queue.java	
@@ -0,0 +1,42 @@
+package org.wsc.list;
+
+/**
+ *
+ * 队列
+ * 
+ * @author Administrator
+ * @date 2017年2月25日下午6:08:01
+ * @version v1.0
+ *
+ * @param <E>
+ */
+public interface Queue<E> {
+
+	/**
+	 * 入列
+	 * 
+	 * @param e
+	 */
+	public void enQueue(E e);
+
+	/**
+	 * 出列
+	 * 
+	 * @return
+	 */
+	public E deQueue();
+
+	/**
+	 * 是否为空
+	 * 
+	 * @return
+	 */
+	public boolean isEmpty();
+
+	/**
+	 * 元素长度
+	 * 
+	 * @return
+	 */
+	public int size();
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/stack/Stack.java b/group20/592146505/data _structure/src/org/wsc/stack/Stack.java
new file mode 100644
index 0000000000..96b931ca07
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/stack/Stack.java	
@@ -0,0 +1,24 @@
+package org.wsc.stack;
+
+import org.wsc.list.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java b/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java
new file mode 100644
index 0000000000..b68784541d
--- /dev/null
+++ b/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java	
@@ -0,0 +1,166 @@
+package org.wsc.tree_node;
+
+import org.wsc.exception.NullElementException;
+import org.wsc.exception.RepeatingElementException;
+
+/**
+ * BinaryTreeNode 二叉树结构
+ *
+ *
+ * @author Administrator
+ * @date 2017年2月26日下午5:47:32
+ * @version v1.0
+ *
+ * @param <E>
+ *            必须实现Comparable接口
+ */
+@SuppressWarnings("rawtypes")
+public class BinaryTreeNode<E extends Comparable> {
+
+	/** 左节点 */
+	private BinaryTreeNode<E> left;
+	/** 数据区 */
+	private E data;
+	/** 右节点 */
+	private BinaryTreeNode<E> right;
+
+	/**
+	 * 插入
+	 * 
+	 * @param data
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public BinaryTreeNode<E> insert(E data) {
+		if (data == null)
+			throw new NullElementException("Do not insert a null");
+		// 当前数据区为空,则将data放入数据区
+		if (this.data == null) {
+			this.data = data;
+			return this;
+		}
+		// 对比当前数据区数据和data大小
+		int result = this.data.compareTo(data);
+		// 如果相等，则抛出异常
+		if (result == 0)
+			throw new RepeatingElementException("Do not insert duplicate element");
+		// 当前数据区数据大于data，将data递归放入左节点
+		if (result > 0) {
+			// 左节点为空，则将数据置入左节点
+			if (left == null)
+				left = new BinaryTreeNode<E>(data);
+			else// 左节点不为空，则将数据递归置入左节点
+				left.insert(data);
+		} else {
+			// 右节点为空，则将数据置入右节点
+			if (right == null)
+				right = new BinaryTreeNode<E>(data);
+			else// 右节点不为空，则将数据递归置入右节点
+				right.insert(data);
+		}
+		return this;
+	}
+
+	/**
+	 * 查询
+	 * 
+	 * @param data
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public BinaryTreeNode<E> seek(E data) {
+		checkCurrElement();
+		if (data == null)
+			return null;
+		// 对比当前数据区数据和data大小
+		int result = this.data.compareTo(data);
+		if (result == 0) {
+			return this;
+		} else if (result > 0) {// 当前数据区数据大于data，递归对比左节点
+			return left == null ? null : left.seek(data);
+		} else {// 当前数据区数据小于data，递归对比右节点
+			return right == null ? null : right.seek(data);
+		}
+
+	}
+
+	/**
+	 * 删除
+	 * 
+	 * @param data
+	 * @return
+	 */
+	public BinaryTreeNode<E> remove(E data) {
+		return removeChild(null, data);
+	}
+
+	@SuppressWarnings("unchecked")
+	public BinaryTreeNode<E> removeChild(BinaryTreeNode<E> supNode, E data) {
+		checkCurrElement();
+		if (data == null)
+			return null;
+		// 对比当前数据区数据和data大小
+		int result = this.data.compareTo(data);
+		// 如果相同，将通过父节点将子节点引用置为null
+		if (supNode != null && result == 0) {
+			if (supNode.left == this)
+				supNode.left = null;
+			else
+				supNode.right = null;
+		} else if (result > 0) {// 当前数据区数据大于data，递归对比左节点
+			return left == null ? null : left.removeChild(this, data);
+		} else {// 当前数据区数据小于data，递归对比右节点
+			return right == null ? null : right.removeChild(this, data);
+		}
+		return this;
+	}
+
+	/**
+	 * 检查当前节点元素是否有效
+	 */
+	private void checkCurrElement() {
+		if (this.data == null)
+			throw new NullElementException("The current node element is null");
+	}
+
+	public BinaryTreeNode() {
+		super();
+	}
+
+	public BinaryTreeNode(E data) {
+		super();
+		this.data = data;
+	}
+
+	public BinaryTreeNode(BinaryTreeNode<E> left, E data, BinaryTreeNode<E> right) {
+		super();
+		this.left = left;
+		this.data = data;
+		this.right = right;
+	}
+
+	public E getData() {
+		return data;
+	}
+
+	public void setData(E data) {
+		this.data = data;
+	}
+
+	public BinaryTreeNode<E> getLeft() {
+		return left;
+	}
+
+	public void setLeft(BinaryTreeNode<E> left) {
+		this.left = left;
+	}
+
+	public BinaryTreeNode<E> getRight() {
+		return right;
+	}
+
+	public void setRight(BinaryTreeNode<E> right) {
+		this.right = right;
+	}
+
+}
diff --git "a/group20/755659358/blogs/blog\345\234\260\345\235\200.txt" "b/group20/755659358/blogs/blog\345\234\260\345\235\200.txt"
new file mode 100644
index 0000000000..82dd8add37
--- /dev/null
+++ "b/group20/755659358/blogs/blog\345\234\260\345\235\200.txt"
@@ -0,0 +1 @@
+week02:http://www.jianshu.com/p/22d2cbefdaa1
diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/ArrayList.java b/group20/755659358/week01/src/liuxincourse/ArrayList.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/src/liuxincourse/ArrayList.java
rename to group20/755659358/week01/src/liuxincourse/ArrayList.java
diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/LinkedList.java b/group20/755659358/week01/src/liuxincourse/LinkedList.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/src/liuxincourse/LinkedList.java
rename to group20/755659358/week01/src/liuxincourse/LinkedList.java
diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/List.java b/group20/755659358/week01/src/liuxincourse/List.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/src/liuxincourse/List.java
rename to group20/755659358/week01/src/liuxincourse/List.java
diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Queue.java b/group20/755659358/week01/src/liuxincourse/Queue.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/src/liuxincourse/Queue.java
rename to group20/755659358/week01/src/liuxincourse/Queue.java
diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Stack.java b/group20/755659358/week01/src/liuxincourse/Stack.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/src/liuxincourse/Stack.java
rename to group20/755659358/week01/src/liuxincourse/Stack.java
diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/ArrayListTest.java b/group20/755659358/week01/test/liuxincourse/ArrayListTest.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/test/liuxincourse/ArrayListTest.java
rename to group20/755659358/week01/test/liuxincourse/ArrayListTest.java
diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/LinkedListTest.java b/group20/755659358/week01/test/liuxincourse/LinkedListTest.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/test/liuxincourse/LinkedListTest.java
rename to group20/755659358/week01/test/liuxincourse/LinkedListTest.java
diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/QueueTest.java b/group20/755659358/week01/test/liuxincourse/QueueTest.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/test/liuxincourse/QueueTest.java
rename to group20/755659358/week01/test/liuxincourse/QueueTest.java
diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/StackTest.java b/group20/755659358/week01/test/liuxincourse/StackTest.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/test/liuxincourse/StackTest.java
rename to group20/755659358/week01/test/liuxincourse/StackTest.java
diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/SuiteTest.java b/group20/755659358/week01/test/liuxincourse/SuiteTest.java
similarity index 100%
rename from group20/755659358/liuxincourse_datastructure/test/liuxincourse/SuiteTest.java
rename to group20/755659358/week01/test/liuxincourse/SuiteTest.java
diff --git a/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java
new file mode 100644
index 0000000000..e4985900cb
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java
@@ -0,0 +1,219 @@
+package com.coderising.practice.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		int j = origin.length - 1;
+		for (int i = 0; i <= j; i++, j--) {
+			int temp = origin[i];
+			origin[i] = origin[j];
+			origin[j] = temp;
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		ArrayList<Integer> list = new ArrayList<>();
+		for (int i = 0; i < oldArray.length; i++) {
+			list.add(oldArray[i]);
+		}
+		for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
+			Integer integer = (Integer) iterator.next();
+			if (integer.equals(0)) {
+				iterator.remove();
+			}
+		}
+		
+		return integerListToArray(list);
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		ArrayList<Integer> list = new ArrayList<>();
+		for (int i = 0; i < array1.length; i++) {
+			if (list.contains(Integer.valueOf(array1[i]))) {
+				continue;
+			}
+			list.add(Integer.valueOf(array1[i]));
+		}
+		for (int i = 0; i < array2.length; i++) {
+			if (list.contains(Integer.valueOf(array2[i]))) {
+				continue;
+			}
+			list.add(Integer.valueOf(array2[i]));
+		}
+		Collections.sort(list);
+		return integerListToArray(list);
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+
+		return Arrays.copyOf(oldArray, oldArray.length + size);
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max < 2) {
+			return new int[0];
+		}
+		ArrayList<Integer> list = new ArrayList<>();
+		list.add(1);
+		list.add(1);
+		int nextFibo = list.get(list.size() - 2) + list.get(list.size() - 1);
+		while (nextFibo < max) {
+			list.add(nextFibo);
+			nextFibo = list.get(list.size() - 2) + list.get(list.size() - 1);
+		}
+
+		return integerListToArray(list);
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		if (max<2) {
+			return new int[]{};
+		}
+		ArrayList<Integer> list = new ArrayList<>();
+
+		for (int i = 2; i < max; i++) {
+			if (isPrime(i)) {
+				list.add(i);
+			}
+		}
+		return integerListToArray(list);
+	}
+	
+	public int[] integerListToArray(List<Integer> list){
+		int len = list.size();
+		int[] result = new int[len];
+		for (int i = 0; i < len; i++) {
+			result[i] = list.get(i);
+		}
+		return result;
+	}
+
+	public boolean isPrime(int a) {
+		boolean flag = true;
+		for (int i = 2; i <= Math.sqrt(a); i++) {
+			if (a % i == 0) {
+				flag = false;
+				break;
+			}
+		}
+		return flag;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		ArrayList<Integer> list=new ArrayList<>();
+		for (int i = 2; i < max; i++) {
+			int [] splits=numSplit(i);
+			if (sumArray(splits)==i) {
+				list.add(i);
+			}
+		}
+
+		return integerListToArray(list);
+	}
+	
+	public int sumArray(int[] arr){
+		int sum=0;
+		for (int i = 0; i < arr.length; i++) {
+			sum+=arr[i];
+		}
+		return sum;
+	}
+	
+	public int[] numSplit(int x){
+		if (x<=1) {
+			return new int[]{};
+		}
+		if (x==2) {
+			return new int[]{1,2};
+		}
+		int k=1;
+		ArrayList<Integer> list=new ArrayList<>();
+		while (k<=x&&(x/k>=2)) {
+			if (x%k==0) {
+				list.add(k);
+			}
+			k++;
+		}
+		
+		
+		return integerListToArray(list);
+	}
+	
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		StringBuilder sb=new StringBuilder();
+		for (int i = 0; i < array.length; i++) {
+			sb.append(array[i]);
+			if (i!=array.length-1) {
+				sb.append(seperator);
+			}
+		}
+		return sb.toString();
+	}
+
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java
new file mode 100644
index 0000000000..2984b2719c
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java
@@ -0,0 +1,73 @@
+package com.coderising.practice.array;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.practice.array.ArrayUtil;
+
+public class ArrayUtisTest {
+	
+	private ArrayUtil util;
+	
+	@Before
+	public void init(){
+		util=new ArrayUtil();
+	}
+	
+
+	@Test
+	public void testReverse(){
+		int [] origin={1,2,3,4,6};
+		ArrayList<Integer> list=new ArrayList<>();
+		list.add(1);
+		list.add(2);
+		util.reverseArray(origin);
+		assertArrayEquals(new int[]{6,4,3,2,1}, origin);
+	}
+	
+	@Test
+	public void testRomoveZero(){
+		int [] origin={1,2,3,0,4,0,6};
+		assertArrayEquals(new int[]{1,2,3,4,6}, util.removeZero(origin));
+	}
+	
+	@Test
+	public void testMerge(){
+		int [] a1={3,0,4,6};
+		int [] a2={3,6,8,10};
+		assertArrayEquals(new int[]{0,3,4,6,8,10}, util.merge(a1,a2));
+	}
+	
+	@Test
+	public void testGrow(){
+		int [] a1={3,0,4,6};
+		assertArrayEquals(new int[]{3,0,4,6,0,0}, util.grow(a1,2));
+	}
+	
+	@Test
+	public void testFibo(){
+		assertArrayEquals(new int[]{1,1,2,3}, util.fibonacci(4));
+	}
+	
+	@Test
+	public void testGetPrime(){
+		assertArrayEquals(new int[]{2,3,5,7,11}, util.getPrimes(13));
+	}
+	
+	@Test
+	public void testGetPerfectNum(){
+		
+		assertArrayEquals(new int[]{6,28,496}, util.getPerfectNumbers(1000));
+	}
+	
+	@Test
+	public void testJoin(){
+		
+		assertEquals("3-5-8", util.join(new int[]{3,5,8}, "-"));
+	}
+
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java
new file mode 100644
index 0000000000..71f5c939f2
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.practice.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java
new file mode 100644
index 0000000000..069faad8bb
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java
@@ -0,0 +1,140 @@
+package com.coderising.practice.litestruts;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.SAXException;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	
+    	
+    	View view=new View();
+    	Map<String,String> viewMap=new HashMap<String, String>();
+    	Map<String, String> xmlMap=parseXML(actionName);
+    	
+    	try {
+
+			Class<?> clazz= Class.forName(xmlMap.get("className"));
+
+			Object object=clazz.newInstance();
+			if (object instanceof LoginAction) {
+				LoginAction action =(LoginAction) object;
+				action.setName(parameters.get("name"));
+				action.setPassword(parameters.get("password"));
+			}
+			Method execute = clazz.getMethod("execute");
+			String executResult=(String) execute.invoke(object);
+			Field[] fields=clazz.getDeclaredFields();
+			Method[] methods=clazz.getDeclaredMethods();
+			for (Method method : methods) {
+				if (method.getName().contains("get")) {
+					String resultString=(String) method.invoke(object);
+					for (Field field : fields) {
+						field.setAccessible(true);
+						if (field.get(object).equals(resultString)) {
+							viewMap.put(field.getName(), resultString);
+						}
+					}
+				}		
+			}
+			
+			view.setJsp(xmlMap.get(executResult));
+			
+    	} catch (ClassNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}  catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	
+    	
+    	view.setParameters(viewMap);
+    	
+    	
+    	return view;
+    }    
+    
+    public static Map<String, String> parseXML(String actionName){
+    	SAXParserFactory factory=SAXParserFactory.newInstance();
+    	StrutsHandler hander=new StrutsHandler(actionName);
+    	SAXParser parser;
+		try {
+			parser = factory.newSAXParser();
+			parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/coderising/practice/litestruts/struts.xml"),hander);
+		} catch (ParserConfigurationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SAXException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return hander.getResult();
+    }
+    
+    public static void setPara(Map<String, String> map){
+    	
+    	
+    }
+    
+    public static String executAction(String className){
+    	
+    	return null;
+    }
+    
+  
+    
+   
+
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java
new file mode 100644
index 0000000000..2b3d3ab88b
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java
@@ -0,0 +1,57 @@
+package com.coderising.practice.litestruts;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class StrutsHandler extends DefaultHandler {
+
+	private String actionName;
+	private String key;
+	private String value;
+
+	private String currentActionName;
+
+	private Map<String, String> result = new HashMap<String, String>();
+
+	public StrutsHandler(String actionName) {
+		this.actionName = actionName;
+	}
+
+	public Map<String, String> getResult() {
+		return result;
+	}
+
+	@Override
+	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+		if ("action".equals(qName)) {
+			currentActionName = attributes.getValue(attributes.getIndex("name"));
+			if (currentActionName.equals(actionName)) {
+				value = attributes.getValue(attributes.getIndex("class"));
+				result.put("className", value);
+			}
+
+		}
+		if ("result".equals(qName) && actionName.equals(currentActionName)) {
+			key = attributes.getValue("name");
+		}
+
+	}
+
+	@Override
+	public void endElement(String uri, String localName, String qName) throws SAXException {
+		if ("result".equals(qName) && actionName.equals(currentActionName)) {
+			result.put(key, value);
+		}
+	}
+
+	public void characters(char[] ch, int start, int length) throws SAXException {
+		if (actionName.equals(currentActionName)) {
+			value = new String(ch, start, length);
+		}
+	};
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..cc57e4c6a8
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java
@@ -0,0 +1,53 @@
+package com.coderising.practice.litestruts;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+	
+	@Test
+	public void testParse() {
+		String actionName = "login";
+		
+		System.out.println(Struts.parseXML(actionName));
+	}
+	
+	
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/View.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/View.java
new file mode 100644
index 0000000000..66643290d4
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.practice.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml b/group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml
new file mode 100644
index 0000000000..7b2a62ef58
--- /dev/null
+++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.practice.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.practice.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/group20/872045674/20170226/src/com/coding/basic/ArrayList.java b/group20/872045674/20170226/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..8b495831fe
--- /dev/null
+++ b/group20/872045674/20170226/src/com/coding/basic/ArrayList.java
@@ -0,0 +1,87 @@
+package com.coding.basic;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[7];
+	
+	public void add(Object o){
+		if(size>elementData.length-1){
+			ensureCapacity(size);
+		}
+		elementData[size++] = o;
+	}
+
+	public void add(int index, Object o){
+		System.out.println(elementData.length+" length");
+		System.out.println(size+" size");
+		size++;
+		if(index<0||index>size||index>Integer.MAX_VALUE){
+			System.out.println("add 位置输入错误，请输入合理的位置");
+			return;
+		}
+		if(size>elementData.length-1){
+			ensureCapacity(size);
+		}
+		System.arraycopy(elementData,index,elementData,index+1,size-index-1);
+		elementData[index] = o;
+	}
+	
+	public Object get(int index){
+		if(index<0||index>size-1){
+			System.out.println("get 位置输入错误，请输入合理的位置");
+			return null;
+		}
+
+		return elementData[index];
+	}
+	
+	public Object remove(int index){
+		if(index<0||index>size-1){
+			System.out.println("remove 位置输入错误，请输入合理的位置");
+			return false;
+		}
+		System.arraycopy(elementData,index+1,elementData,index,size-index-1);
+		elementData[--size]=null;
+		return true;
+	}
+	
+	public int size(){
+		return size;
+	}
+
+	private void ensureCapacity(int nimCapacity){
+		int oldCapacity = elementData.length;
+		int newCapacity = oldCapacity+(oldCapacity/2+1);
+		if(newCapacity < nimCapacity){
+			newCapacity = nimCapacity;
+		}
+		if(newCapacity>Integer.MAX_VALUE){
+			newCapacity = Integer.MAX_VALUE;
+		}
+		elementData = Arrays.copyOf(elementData,newCapacity);
+	}
+
+	public static void main(String[] args) {
+		ArrayList list=new ArrayList();
+
+		list.add(1);
+		list.add(2);
+		list.add(3);
+		list.add(4);
+		list.add(2,10);
+		list.remove(3);
+		for(int i=0;i<list.size();i++){
+			System.out.println(list.get(i));
+		}
+		//System.out.println("temp"+list.toString());
+
+		//int x=2;
+		//String[] l = {"a","d","v","cd","s"};
+		//System.out.println(l[x--]);
+	}
+
+}
diff --git a/group20/872045674/20170226/src/com/coding/basic/BinaryTreeNode.java b/group20/872045674/20170226/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group20/872045674/20170226/src/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group20/872045674/20170226/src/com/coding/basic/Iterator.java b/group20/872045674/20170226/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group20/872045674/20170226/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/872045674/20170226/src/com/coding/basic/LinkedList.java b/group20/872045674/20170226/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..d30b046f22
--- /dev/null
+++ b/group20/872045674/20170226/src/com/coding/basic/LinkedList.java
@@ -0,0 +1,152 @@
+package com.coding.basic;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		addFirst(o);
+	}
+	public void add(int index , Object o){
+		Node node = head;
+		for(int i=0;i<index;i++){
+			node = node.next;
+		}
+
+		Node newNode=new Node();
+		newNode.data=o;
+		newNode.next=node;
+		add2Index(head,index,newNode);
+
+	}
+	private int count=0;
+	private void add2Index(Node node,int index,Node nextNode){
+		count++;
+		if(index==count){
+			node.next=nextNode;
+			return;
+		}
+		add2Index(node.next,index,nextNode);
+	}
+
+	public Object get(int index){
+		Node node = head;
+		for(int i=0;i<index;i++){
+			if(node.next==null){
+				System.out.println("位置输入错误");
+				break;
+			}
+			node = node.next;
+		}
+		return node.data;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		int count=0;
+
+		return count;
+	}
+
+
+
+
+	
+	public void addFirst(Object o){
+		Node newNode=new Node();
+		newNode.data=o;
+		newNode.next=head;
+		head=newNode;
+	}
+	public void addLast(Object o){
+		Node newNode=new Node();
+		newNode.data=o;
+		if(head==null){
+			head=newNode;
+		}else{
+			lastElement(head,o);
+		}
+
+	}
+
+	private void lastElement(Node node,Object o){
+		if(node.next==null){
+			Node newNode=new Node();
+			newNode.data=o;
+			node.next=newNode;
+			return;
+		}
+		lastElement(node.next,o);
+	}
+
+	public Object removeFirst(){
+		if(head==null){
+			System.out.println("数据为空，不用删除");
+			return false;
+		}
+		head = head.next;
+		return true;
+	}
+	public Object removeLast(){
+		removeLastNode(head);
+		return true;
+	}
+
+	private void removeLastNode(Node node){
+		if(node.next==null){
+			node.data = null;
+			return;
+		}
+		removeLastNode(node.next);
+	}
+
+	public Iterator iterator(){
+		return new LinkedListIterator(this);
+	}
+	private class LinkedListIterator implements Iterator{
+		private LinkedList list = null;
+		private Node node=null;
+		private LinkedListIterator(LinkedList l){
+			this.list = l;
+			this.node = head;
+		}
+		@Override
+		public boolean hasNext() {
+			if(node.next==null){
+				return false;
+			}
+			node = node.next;
+			return true;
+		}
+
+		@Override
+		public Object next() {
+			return node.data;
+		}
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+	}
+
+	public static void main(String[] args) {
+		LinkedList list = new LinkedList();
+		list.addFirst(1);
+		list.addFirst(2);
+		list.addFirst(3);
+		list.addFirst(4);
+		list.addLast(5);
+		list.removeLast();
+		System.out.println(list.size());
+		//list.add(3,10);
+		//System.out.println(list.get(4));
+		Iterator i=list.iterator();
+		while(i.hasNext()){
+			System.out.println(i.next());
+		}
+	}
+}
diff --git a/group20/872045674/20170226/src/com/coding/basic/List.java b/group20/872045674/20170226/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group20/872045674/20170226/src/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group20/872045674/20170226/src/com/coding/basic/Queue.java b/group20/872045674/20170226/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..e4dddae073
--- /dev/null
+++ b/group20/872045674/20170226/src/com/coding/basic/Queue.java
@@ -0,0 +1,44 @@
+package com.coding.basic;
+
+public class Queue {
+	private int size=0;
+
+	private ArrayList list = new ArrayList();
+
+	public void enQueue(Object o){
+		list.add(o);
+		size++;
+	}
+	
+	public Object deQueue(){
+		if(size<=0){
+			System.out.println("队列为空");
+			return null;
+		}
+		size--;
+		Object obj = list.get(0);
+		list.remove(0);
+		return obj;
+	}
+	
+	public boolean isEmpty(){
+		if(size==0){
+			return true;
+		}
+		return false;
+	}
+	
+	public int size(){
+		return size;
+	}
+
+	public static void main(String[] args) {
+		Queue q=new Queue();
+		q.enQueue(1);
+		q.enQueue(2);
+		q.enQueue(3);
+		q.enQueue(4);
+		System.out.println(q.deQueue());
+		System.out.println(q.deQueue());
+	}
+}
diff --git a/group20/872045674/20170226/src/com/coding/basic/Stack.java b/group20/872045674/20170226/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..ee3d781092
--- /dev/null
+++ b/group20/872045674/20170226/src/com/coding/basic/Stack.java
@@ -0,0 +1,23 @@
+package com.coding.basic;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java"
index 6ca5cecb15..5386f34431 100644
--- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java"
+++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java"
@@ -1,6 +1,6 @@
 package BasicData;
 
-//insert ����������
+//insert 方法有问题
 public class MyTreeNode<T extends Comparable<T>> {
 
 	private T data;
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java"
new file mode 100644
index 0000000000..42bda4b210
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java"
@@ -0,0 +1,213 @@
+package org.Ralf.ArrayUtil;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import javax.naming.spi.DirStateFactory.Result;
+
+public class ArrayUtil {
+
+	public static void reverseArray(int[] origin) {
+		/**
+		 * ����һ����������a , �Ը������ֵ�����û� ���磺 a = [7, 9 , 30, 3] , �û���Ϊ [3, 30, 9,7] ���
+		 * a = [7, 9, 30, 3, 4] , �û���Ϊ [4,3, 30 , 9,7]
+		 * 
+		 * @param origin
+		 * @return
+		 * 
+		 */
+		
+		for (int i = 0; i < origin.length / 2; i++) {
+			int temp = origin[i];
+			origin[i] = origin[origin.length - i - 1];
+			origin[origin.length - i - 1] = temp;
+		}
+		
+	}
+
+	/**
+	 * ���������µ�һ�����飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * Ҫ������������ֵΪ0����ȥ��������Ϊ0��ֵ����һ���µ����飬���ɵ�������Ϊ�� {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return int[]
+	 */
+	public static int[] removeZero(int[] oldArr) {
+
+		if (oldArr == null) {
+			return null;
+		}
+		int[] newArr = new int[oldArr.length];
+		int size = 0;
+
+		for (int i = 0; i < oldArr.length; i++) {
+			if (oldArr[i] != 0) {
+				newArr[size] = oldArr[i];
+				size++;
+			}
+		}
+		return Arrays.copyOf(newArr, size);
+
+	}
+
+	/**
+	 * ���������Ѿ�����õ��������飬 a1��a2 , ����һ���µ�����a3, ʹ��a3 ����a1��a2 ������Ԫ�أ� ������Ȼ������� ���� a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] �� a3 Ϊ[3,4,5,6,7,8] , ע�⣺ �Ѿ��������ظ�
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+
+		// method
+		ArrayList<Integer> 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])) {// ����list��index�ҵ����������������ж��Ƿ������Ԫ��
+				arrayList.add(array2[i]);
+			}
+		}
+		int[] newArr = new int[arrayList.size()];
+		// arrayList.toArray(newArr);
+		for (int i = 0; i < arrayList.size(); i++) {
+			newArr[i] = arrayList.get(i);
+		}
+		Arrays.sort(newArr);// ����ð�����򣬲������򣬿������򷨵�ʵ��
+		return newArr;
+	}
+
+	/**
+	 * ��һ���Ѿ��������ݵ����� oldArray������������չ�� ��չ��������ݴ�СΪoldArray.length + size
+	 * ע�⣬�������Ԫ��������������Ҫ���� ���� oldArray = [2,3,6] , size = 3,�򷵻ص�������Ϊ
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int size) {
+		int[] newArray = new int[oldArray.length + size];
+		for (int i = 0; i < oldArray.length; i++) {
+			newArray[i] = oldArray[i];
+		}
+		return newArray;
+	}
+
+	/**
+	 * 쳲���������Ϊ��1��1��2��3��5��8��13��21...... ������һ�����ֵ�� ����С�ڸ�ֵ������ ���磬 max = 15 ,
+	 * �򷵻ص�����Ӧ��Ϊ [1��1��2��3��5��8��13] max = 1, �򷵻ؿ����� []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+		int[] newArray = {};
+		if (max == 1) {
+			return newArray;
+		}
+		newArray = new int[2 * max];
+		int size = 0;
+		int a = 1;
+		int b = 1;
+		newArray[size++] = a;
+		newArray[size++] = b;
+		while (b <= max) {
+			int temp = b;
+			b = a + b;
+			newArray[size++] = b;
+			a = temp;
+		}
+
+		return Arrays.copyOf(newArray, size - 1);
+	}
+
+	/**
+	 * ����С�ڸ������ֵmax�������������� ����max = 23, ���ص�����Ϊ[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		if (max < 2) {
+			return null;
+		}
+		int[] aar = new int[max];
+		int size = 0;
+		for (int i = 2; i < max; i++) {
+			if (isPrime(i)) {
+				aar[size++] = i;
+			}
+		}
+		return Arrays.copyOf(aar, size);
+	}
+
+	private static boolean isPrime(int aar) {
+		boolean flag = true;
+		for (int i = 2; i <= Math.sqrt(aar); i++) {
+			if (aar % i == 0) {
+				flag = false;
+				break;
+			}
+		}
+		return flag;
+	}
+
+	/**
+	 * ��ν���������� ��ָ�����ǡ�õ�����������֮�ͣ�����6=1+2+3 ����һ�����ֵmax�� ����һ�����飬 ��������С��max ����������
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPerfectNumbers(int max) {
+		if (max < 1) {
+			return null;
+		}
+		int[] arr = new int[max];
+		int size = 0;
+		for (int i = 1; i <= max; i++) {
+			if (isPerfectNumber(i)) {
+				arr[size++] = i;
+			}
+		}
+		return Arrays.copyOf(arr, size);
+	}
+
+	private static boolean isPerfectNumber(int num) {
+		int sum = 0;
+		for (int i = 1; i < num; i++) {
+			if (num % i == 0) {
+				sum += i;
+			}
+
+		}
+		if (sum == num) {
+			return true;
+		} else
+			return false;
+	}
+
+	/**
+	 * ��seperator ������ array���������� ����array= [3,8,9], seperator = "-" �򷵻�ֵΪ"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public static String join(int[] array, String seperator) {
+		if (array.length < 1) {
+			return null;
+		}
+		StringBuilder string = new StringBuilder();
+		for (int i = 0; i < array.length - 1; i++) {
+			string.append(array[i]).append(seperator);
+		}
+		string.append(array[array.length - 1]);
+		return string.toString();
+	}
+}
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java"
new file mode 100644
index 0000000000..48f12a3337
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java"
@@ -0,0 +1,100 @@
+package org.Ralf.ArrayUtilTest;
+
+import static org.junit.Assert.*;
+
+import org.Ralf.ArrayUtil.ArrayUtil;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@Test
+	public void reverseArray() {
+		int[] origin = {9,8,7,6,5,4,3,2,1};
+		int[] originCopy = origin;
+		int[] reverse = {1,2,3,4,5,6,7,8,9};
+		ArrayUtil.reverseArray(origin);
+		Assert.assertArrayEquals(origin, reverse);
+		ArrayUtil.reverseArray(origin);
+		Assert.assertArrayEquals(origin, originCopy);
+	}
+	
+	@Test
+	public void removeZero(){
+		int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
+		int[] newarr = ArrayUtil.removeZero(oldArr);
+		int[] realArr = {1,3,4,5,6,6,5,4,7,6,7,5};
+		Assert.assertArrayEquals(newarr, realArr);
+	}
+	
+	@Test
+	public void merge(){
+		
+		int[] a1 ={3, 5, 7,8};
+		int[] a2 = {4, 5, 6,7};
+		int[] newarr = ArrayUtil.merge(a1, a2);
+		int[] realArr = {3,4,5,6,7,8};
+		Assert.assertArrayEquals(newarr, realArr);
+	}
+	
+	@Test
+	public void grow(){
+		int[] oldArray = {2,3,6};
+		int[] realArr = {2,3,6,0,0,0};
+		int[] newArray = ArrayUtil.grow(oldArray, 3);
+		Assert.assertArrayEquals(newArray, realArr);
+	}
+	
+	@Test
+	public void fibonacci(){
+		
+		int[] realArr = {1,1,2,3,5,8,13};
+		int[] newArray = ArrayUtil.fibonacci(15);
+		Assert.assertArrayEquals(newArray, realArr);
+	}
+	@Test
+	public void getPrimes(){
+		int[] realArr = {2,3,5,7,11,13,17,19};
+		int[] newArray = ArrayUtil.getPrimes(23);
+		Assert.assertArrayEquals(newArray, realArr);
+	}
+	
+	@Test
+	public void getPerfectNumbers(){
+		int[] realArr = {6, 28, 496, 8128};
+		int[] newArray = ArrayUtil.getPerfectNumbers(10000);
+		Assert.assertArrayEquals(newArray, realArr);
+	}
+	
+	@Test
+	public void join(){
+		int[] realArr = {6, 28, 496, 8128};
+		int[] newArray = ArrayUtil.getPerfectNumbers(10000);
+		Assert.assertArrayEquals(newArray, realArr);
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+}
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java"
new file mode 100644
index 0000000000..40b5de161a
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java"
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+public class LoginAction {
+
+	private String name;
+	private String passWord;
+	private String message;
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPassWord() {
+		return passWord;
+	}
+	public void setPassWord(String passWord) {
+		this.passWord = passWord;
+	}
+	public String getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+	public String execute(){
+		if ("test".equals(name) && "1234".equals(passWord)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+}
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java"
new file mode 100644
index 0000000000..e971e779b6
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java"
@@ -0,0 +1,71 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class ReadXml {
+
+	private Document document = null;
+	private HashMap<String, String> hashMap;
+
+	public ReadXml(String filename) {
+		try {
+			document = new SAXReader().read((filename));
+			hashMap = new HashMap<String, String>();
+		} catch (DocumentException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	public String parseXml(String actionName) {
+
+		// List<?> actions = document.selectNodes("//struts/action");
+		String className = null;
+		Element root = document.getRootElement();
+		List<?> actions = root.elements("action");
+		if (actions.isEmpty()) {
+			return null;
+		}
+		for (Iterator<?> iter = actions.iterator(); iter.hasNext();) {
+			Element element = (Element) iter.next();
+			Attribute attr1 = element.attribute("name");
+			if (attr1.getValue().equals(actionName)) {
+				Attribute attr2 = element.attribute("class");
+				className = attr2.getValue();
+				//��ȡ��Ԫ�صĵ�����ֵ
+				for (Iterator<?> iterator = element.elementIterator(); iterator
+						.hasNext();) {
+					Element childElement = (Element) iterator.next();
+					Attribute childAttribute = childElement.attribute("name");
+					hashMap.put(childAttribute.getValue(),
+							childElement.getText());
+				}
+			}
+
+		}
+		return className;
+	}
+
+	public String getJsp(String result) {
+		if (result == null) {
+			return null;
+		}
+		String string_jsp = null;
+		if (!hashMap.isEmpty()) {
+			for (String string : hashMap.keySet()) {
+				if (result.equals(string)) {
+					string_jsp = hashMap.get(string);
+				}
+			}
+		}
+		return string_jsp;
+	}
+}
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java"
new file mode 100644
index 0000000000..2892617845
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java"
@@ -0,0 +1,93 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Struts {
+
+	private static final String NAME = "name";
+	private static final String PASSWORD = "password";
+	private static String excuteString;
+	private static Object object = null;// ���ط����ʵ��
+	private static Class<?> actionClass = null;// �����ȡ����
+
+	@SuppressWarnings("unchecked")
+	public static View runAction(String actionName,
+			Map<String, String> parameters) {
+		// ��ȡ�����ļ�struts.xml
+		View view = new View();
+		ReadXml readXml = new ReadXml("E:\\struts.xml");
+		String classNameString = readXml.parseXml(actionName);//��ȡxml
+		object = initAction(classNameString);//ͨ�������ʼ����
+		
+		excuteMethod(parameters);//ִ��setter��excute����
+		
+		view.setParameterMap(setMapParameter());//��ȡ���е�getter������ִ�к󽫷������ͽ�����浽view��
+		String jspResult = readXml.getJsp(excuteString);//��ȡjsp����
+		view.setJsp(jspResult);
+		
+		return view;
+	}
+
+	public static Object initAction(String classNameString) {
+		System.out.println(classNameString);
+		try {
+			actionClass = Class.forName(classNameString);
+		} catch (ClassNotFoundException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+		Object newObject = null;
+		try {
+			newObject = actionClass.newInstance();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return newObject;
+	}
+
+	public static void excuteMethod(Map<String, String> parameters) {
+
+		try {
+			Method methodOfName = actionClass
+					.getMethod("setName", String.class);
+			methodOfName.invoke(object, parameters.get(NAME));
+			//
+			Method methodOfPassword = actionClass.getMethod("setPassWord",
+					String.class);
+			methodOfPassword.invoke(object, parameters.get(PASSWORD));
+
+			Method excuteMethod = actionClass.getMethod("execute");
+			excuteString = (String) excuteMethod.invoke(object);
+
+		} catch (Exception e) {
+			// TODO: handle exception
+		}
+	}
+
+	public static Map<String, String> setMapParameter() {
+		
+		Method[] getterMethods = actionClass.getMethods();
+		HashMap<String, String> hashMap = new HashMap<>();
+
+		for (int i = 0; i < getterMethods.length; i++) {
+			String getterName = getterMethods[i].getName();
+			if (getterName.startsWith("get")) {
+				try {
+					String value = (String) getterMethods[i].invoke(object);
+					hashMap.put(getterName.substring(3).toLowerCase(), value);
+					//System.out.println("----" + getterName.substring(2));
+				} catch (Exception e) {
+					// TODO: handle exception
+				}
+
+			}
+		}
+		return hashMap;
+	}
+}
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java"
new file mode 100644
index 0000000000..b7f0884f41
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java"
@@ -0,0 +1,40 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        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/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java"
new file mode 100644
index 0000000000..bda8419e5f
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java"
@@ -0,0 +1,28 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+
+	private String jsp;
+	private Map parameter;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map getParameters() {
+		return parameter;
+	}
+
+	public View setParameterMap(Map parameter) {
+		this.parameter = parameter;
+		return this;
+	}
+
+}
diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt"
new file mode 100644
index 0000000000..d4f3154c38
--- /dev/null
+++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt"
@@ -0,0 +1 @@
+http://blog.csdn.net/u011371324/article/details/60329949
\ No newline at end of file
diff --git a/group22/group22.md b/group22/group22.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/group22/group22.md
@@ -0,0 +1 @@
+
diff --git a/group23/group23.md b/group23/group23.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/group23/group23.md
@@ -0,0 +1 @@
+
diff --git a/group24/group24.md b/group24/group24.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/group24/group24.md
@@ -0,0 +1 @@
+
diff --git a/group25/group25.md b/group25/group25.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/group25/group25.md
@@ -0,0 +1 @@
+
diff --git a/group26/group26.md b/group26/group26.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/group26/group26.md
@@ -0,0 +1 @@
+
diff --git a/group27/group27.md b/group27/group27.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/group27/group27.md
@@ -0,0 +1 @@
+
diff --git a/liuxin/.project b/liuxin/.project
index fab8d7f04c..b6d8ce6204 100644
--- a/liuxin/.project
+++ b/liuxin/.project
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>2017Learning</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>coding2017</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/liuxin/src/com/coderising/array/ArrayUtil.java b/liuxin/src/com/coderising/array/ArrayUtil.java
index e5ddb476a6..78845d06d0 100644
--- a/liuxin/src/com/coderising/array/ArrayUtil.java
+++ b/liuxin/src/com/coderising/array/ArrayUtil.java
@@ -1,96 +1,96 @@
-package com.coderising.array;
-
-public class ArrayUtil {
-	
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换
-		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
-		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * @param origin
-	 * @return
-	 */
-	public void reverseArray(int[] origin){
-		
-	}
-	
-	/**
-	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
-	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
-	 * @param oldArray
-	 * @return
-	 */
-	
-	public int[] removeZero(int[] oldArray){
-		return null;
-	}
-	
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
-	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-	
-	public int[] merge(int[] array1, int[] array2){
-		return  null;
-	}
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持
-	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * @param oldArray
-	 * @param size
-	 * @return
-	 */
-	public int[] grow(int [] oldArray,  int size){
-		return null;
-	}
-	
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
-	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
-	 * max = 1, 则返回空数组 []
-	 * @param max
-	 * @return
-	 */
-	public int[] fibonacci(int max){
-		return null;
-	}
-	
-	/**
-	 * 返回小于给定最大值max的所有素数数组
-	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * @param max
-	 * @return
-	 */
-	public int[] getPrimes(int max){
-		return null;
-	}
-	
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
-	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * @param max
-	 * @return
-	 */
-	public int[] getPerfectNumbers(int max){
-		return null;
-	}
-	
-	/**
-	 * 用seperator 把数组 array给连接起来
-	 * 例如array= [3,8,9], seperator = "-"
-	 * 则返回值为"3-8-9"
-	 * @param array
-	 * @param s
-	 * @return
-	 */
-	public String join(int[] array, String seperator){
-		return null;
-	}
-	
-
-}
+package com.coderising.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/liuxin/src/com/coderising/litestruts/LoginAction.java b/liuxin/src/com/coderising/litestruts/LoginAction.java
index dcdbe226ed..1005f35a29 100644
--- a/liuxin/src/com/coderising/litestruts/LoginAction.java
+++ b/liuxin/src/com/coderising/litestruts/LoginAction.java
@@ -1,39 +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;
-    }
-}
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/liuxin/src/com/coderising/litestruts/Struts.java b/liuxin/src/com/coderising/litestruts/Struts.java
index 85e2e22de3..9761246bed 100644
--- a/liuxin/src/com/coderising/litestruts/Struts.java
+++ b/liuxin/src/com/coderising/litestruts/Struts.java
@@ -1,34 +1,37 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-
-
-public class Struts {
-
-    public static View runAction(String actionName, Map<String,String> parameters) {
-
-        /*
-         
-		0. 读取配置文件struts.xml
- 		
- 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
-		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
-		("name"="test" ,  "password"="1234") ,     	
-		那就应该调用 setName和setPassword方法
-		
-		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
-		
-		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
-		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
-		放到View对象的parameters
-		
-		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
-		放到View对象的jsp字段中。
-        
-        */
-    	
-    	return null;
-    }    
-
-}
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+
+
+public class Struts {
+
+	
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    
+    	return null;
+    }    
+
+}
diff --git a/liuxin/src/com/coderising/litestruts/StrutsTest.java b/liuxin/src/com/coderising/litestruts/StrutsTest.java
index b8c81faf3c..a44c1878ac 100644
--- a/liuxin/src/com/coderising/litestruts/StrutsTest.java
+++ b/liuxin/src/com/coderising/litestruts/StrutsTest.java
@@ -1,43 +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<String,String> params = new HashMap<String,String>();
-        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<String,String> params = new HashMap<String,String>();
-        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"));
-	}
-}
+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<String,String> params = new HashMap<String,String>();
+        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<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/liuxin/src/com/coderising/litestruts/View.java b/liuxin/src/com/coderising/litestruts/View.java
index 07df2a5dab..0194c681f6 100644
--- a/liuxin/src/com/coderising/litestruts/View.java
+++ b/liuxin/src/com/coderising/litestruts/View.java
@@ -1,23 +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;
-	}
-}
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/liuxin/src/com/coderising/litestruts/struts.xml b/liuxin/src/com/coderising/litestruts/struts.xml
index 0582b7d4ea..4c6eeabbd4 100644
--- a/liuxin/src/com/coderising/litestruts/struts.xml
+++ b/liuxin/src/com/coderising/litestruts/struts.xml
@@ -8,4 +8,4 @@
     	<result name="success">/jsp/welcome.jsp</result>
     	<result name="error">/jsp/error.jsp</result>
     </action>
-</struts>
+</struts>
\ No newline at end of file
diff --git a/liuxin/src/com/coding/basic/ArrayList.java b/liuxin/src/com/coding/basic/ArrayList.java
index 1f185736f9..57412dcf7f 100644
--- a/liuxin/src/com/coding/basic/ArrayList.java
+++ b/liuxin/src/com/coding/basic/ArrayList.java
@@ -1,32 +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;
-	}
-	
-}
+package com.coding.basic;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/liuxin/src/com/coding/basic/BinaryTreeNode.java b/liuxin/src/com/coding/basic/BinaryTreeNode.java
index d7ac820192..266eff3d56 100644
--- a/liuxin/src/com/coding/basic/BinaryTreeNode.java
+++ b/liuxin/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/liuxin/src/com/coding/basic/Iterator.java b/liuxin/src/com/coding/basic/Iterator.java
index 06ef6311b2..dbe8b9afb2 100644
--- a/liuxin/src/com/coding/basic/Iterator.java
+++ b/liuxin/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/liuxin/src/com/coding/basic/LinkedList.java b/liuxin/src/com/coding/basic/LinkedList.java
index d6f6ffebec..d162a3687c 100644
--- a/liuxin/src/com/coding/basic/LinkedList.java
+++ b/liuxin/src/com/coding/basic/LinkedList.java
@@ -1,7 +1,5 @@
 package com.coding.basic;
 
-
-
 public class LinkedList implements List {
 	
 	private Node head;
@@ -73,20 +71,20 @@ public  void remove(int i, int length){
 		
 	}
 	/**
-	 * 假定当前链表和list均包含已升序排列的整数
-	 * 从当前链表中取出那些list所指定的元素
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
 	 * 例如当前链表 = 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){
+	public  int[] getElements(LinkedList list){
 		return null;
 	}
 	
 	/**
 	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 从当前链表中中删除在list中出现的元素 
+	 * 从当前链表中中删除在listB中出现的元素 
 
 	 * @param list
 	 */
diff --git a/liuxin/src/com/coding/basic/List.java b/liuxin/src/com/coding/basic/List.java
index 10d13b5832..396b1f6416 100644
--- a/liuxin/src/com/coding/basic/List.java
+++ b/liuxin/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/liuxin/src/com/coding/basic/Queue.java b/liuxin/src/com/coding/basic/Queue.java
index 36e516e266..08d2d86b14 100644
--- a/liuxin/src/com/coding/basic/Queue.java
+++ b/liuxin/src/com/coding/basic/Queue.java
@@ -1,19 +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;
-	}
-}
+package com.coding.basic;
+
+public class Queue {
+	
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/liuxin/src/com/coding/basic/Stack.java b/liuxin/src/com/coding/basic/Stack.java
index a5a04de76d..4bfe28057f 100644
--- a/liuxin/src/com/coding/basic/Stack.java
+++ b/liuxin/src/com/coding/basic/Stack.java
@@ -1,22 +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;
-	}
-}
+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;
+	}
+}
