diff --git a/group16/1012075117/.DS_Store b/group16/1012075117/.DS_Store
new file mode 100644
index 0000000000..5008ddfcf5
Binary files /dev/null and b/group16/1012075117/.DS_Store differ
diff --git a/group16/1012075117/.classpath b/group16/1012075117/.classpath
new file mode 100644
index 0000000000..3f8de4ef9b
--- /dev/null
+++ b/group16/1012075117/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/group16/1012075117/DataStructure219/.project b/group16/1012075117/.project
similarity index 100%
rename from group16/1012075117/DataStructure219/.project
rename to group16/1012075117/.project
diff --git a/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs b/group16/1012075117/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs
rename to group16/1012075117/.settings/org.eclipse.jdt.core.prefs
diff --git a/group16/1012075117/src/com/array/ArrayUtil.java b/group16/1012075117/src/com/array/ArrayUtil.java
new file mode 100644
index 0000000000..e3fb19b62f
--- /dev/null
+++ b/group16/1012075117/src/com/array/ArrayUtil.java
@@ -0,0 +1,257 @@
+package com.array;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+ /**
+ * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+ * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+ *
+ * @param origin
+ * @return
+ */
+ public void reverseArray(int[] origin) {
+ int length;
+ int[] temp;
+
+ length = origin.length;
+ temp = new int[length];
+ for (int i = 0; i < length; i++) {
+ temp[length - i - 1] = origin[i];
+ }
+ 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 flag = 0;
+ int j = 0;
+ int length;
+ length = oldArray.length;
+ int[] newArray;
+
+ for (int i = 0; i < length; i++) {
+ if (oldArray[i] != 0) {
+ flag++;
+ }
+ }
+ newArray = new int[flag];
+ for (int i = 0; i < 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[] temp;
+ int[] array3;
+ int flag = 0;
+ int repeat = 0;
+ boolean boolea = true;
+ int length1 = array1.length;
+ int length2 = array2.length;
+ temp = new int[length1 + length2];
+
+ // 先把a1添加到temp
+ for (int i = 0; i < length1; i++) {
+ temp[i] = array1[i];
+ }
+ // 把a2中不重复的添加到temp
+ for (int i = 0; i < length2; i++) {
+ for (int j = 0; j < length1; j++) {
+ if (temp[j] == array2[i]) {
+ boolea = false;
+ repeat++;
+ }
+ }
+ if (boolea) {
+ temp[length1 + flag] = array2[i];
+ flag++;
+ }
+ boolea = true;
+ }
+ // 有重复就new一个数组长度减去重复的长度的a3,排序并返回
+ if (repeat != 0) {
+ array3 = new int[length1 + length2 - repeat];
+ for (int i = 0; i < (temp.length - repeat); i++) {
+ array3[i] = temp[i];
+ }
+ Arrays.sort(array3);
+ return array3;
+ }
+ // 无重复就排序并返回
+ 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) {
+ int[] temp;
+ int length;
+
+ length = oldArray.length;
+ temp = new int[length + size];
+ for (int i = 0; i < length; i++) {
+ temp[i] = oldArray[i];
+ }
+ oldArray = null;
+ oldArray = temp;
+
+ 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) {
+ int[] temp = new int[2];
+ int[] array;
+ int f1 = 1;
+ int f2 = 1;
+ int length = 2;
+
+ if (max <= 1) {
+ return null;
+ }
+
+ temp[0] = f1;
+ temp[1] = f2;
+ if (max == 2) {
+ return temp;
+ }
+
+ for (int i = 2; temp[i - 1] < max; i++) {
+ if ((f1 + f2) >= max)
+ break;
+ if (i + 1 > temp.length) {
+ temp = new ArrayUtil().grow(temp, 1);
+ }
+ temp[i] = f1 + f2;
+ f1 = temp[i - 1];
+ f2 = temp[i];
+ length++;
+ }
+ array = new int[length];
+ for (int i = 0; i < length; i++) {
+ array[i] = temp[i];
+ }
+
+ return array;
+ }
+
+ /**
+ * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+ *
+ * @param max
+ * @return
+ */
+ public int[] getPrimes(int max) {
+ int[] temp = new int[1];
+ boolean flag = true;
+ int i = 0;
+
+ if (max < 3)
+ return null;
+
+ for (int j = 2; j < max; j++) {
+ for (int k = 2; k <= Math.sqrt(j); k++) {
+ if (j % k == 0) {
+ flag = false;
+ break;
+ }
+ }
+ if (flag) {
+ if (i + 1 > temp.length)
+ temp = new ArrayUtil().grow(temp, 1);
+ temp[i] = j;
+ i++;
+ }
+ flag = true;
+ }
+ return temp;
+ }
+
+ /**
+ * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数
+ *
+ * @param max
+ * @return
+ */
+ public int[] getPerfectNumbers(int max) {
+ int[] temp = new int[1];
+ int i = 0;
+
+ if (max < 6)
+ return null;
+
+ for (int j = 1; j < max; j++) {
+ int total = 0;
+ for (int k = 1; k < j / 2 + 1; k++) {
+ if (j % k == 0)
+ total += k;
+ }
+ if (total == j) {
+ if (i + 1 > temp.length)
+ temp = new ArrayUtil().grow(temp, 1);
+ temp[i] = j;
+ i++;
+ }
+ }
+ return temp;
+ }
+
+ /**
+ * 用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 || seperator == null)
+ return null;
+
+ StringBuilder sb = new StringBuilder();
+ int length = array.length;
+ for(int i=0;i parameters) throws Exception {
+
+ /*
+ *
+ * 0. 读取配置文件struts.xml
+ *
+ * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)
+ * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" ,
+ * "password"="1234") , 那就应该调用 setName和setPassword方法
+ *
+ * 2. 通过反射调用对象的execute 方法, 并获得返回值,例如"success"
+ *
+ * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如
+ * {"message": "登录成功"} , 放到View对象的parameters
+ *
+ * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,
+ * 放到View对象的jsp字段中。
+ *
+ */
+
+ int flag = 0;
+ String className;
+ String executeResult;
+ String jsp;
+ Element resultElement;
+ List actionList = new ArrayList<>();
+ Map classNameMap = new HashMap();
+ Map messagesMap = new HashMap();
+ View view = new View();
+
+ actionList = getRootElement("src/com/litestruts/struts.xml");// 获取所有节点
+ classNameMap = getClassName(actionList, actionName, classNameMap);// 获取action的类名并放到Map中
+
+ className = (String) classNameMap.get("className");
+ messagesMap = getResult(className, parameters);// messages包含了,调用execute()后的返回值result,和所有getter方法的值和属性
+
+ executeResult = (String) messagesMap.get("result");
+ messagesMap.remove("result");
+ flag = (int) classNameMap.get("flag");
+ resultElement = actionList.get(flag);
+ jsp = getJSP(executeResult, resultElement);// 获取到里的jsp
+
+ view.setJsp(jsp);
+ view.setParameters(messagesMap);
+
+ return view;
+ }
+
+ /**
+ * 获取所有节点
+ *
+ * @param fileName
+ * @return
+ */
+ private static List getRootElement(String fileName) {
+ File inputXml = new File(fileName);
+ SAXReader saxReader = new SAXReader();
+ Document document = null;
+ try {
+ document = saxReader.read(inputXml);
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ Element root = document.getRootElement();
+ List al = new ArrayList();
+ for (Iterator> i = root.elementIterator(); i.hasNext();) { // 获取所有action节点
+ Element action = (Element) i.next();
+ al.add(action);
+ }
+ return al;
+ }
+
+ /**
+ * 根据给定的actionName,获取对应的class名字
+ *
+ * @param al
+ * @param actionName
+ * @param map
+ * @return
+ */
+ private static Map getClassName(List al, String actionName, Map map) {
+ String className = null;
+ for(int i=0;i getResult(String className, Map parameters) throws Exception {
+ Class> actionClass = null;
+ Constructor> constructor = null;
+ Object object = null;
+ Method method = null;
+ Map map = new HashMap();
+ try {
+ actionClass = Class.forName(className);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ try {
+ constructor = actionClass.getConstructor();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ }
+ object = constructor.newInstance();
+ Set keySet = parameters.keySet();
+ // 据parameters中的数据,调用对象的setter方法
+ for (String key : keySet) {
+ if (key.equals("name")) {
+ method = actionClass.getMethod("setName", String.class);
+ method.invoke(object, parameters.get(key));
+ }
+ if (key.equals("password")) {
+ method = actionClass.getMethod("setPassword", String.class);
+ method.invoke(object, parameters.get(key));
+ }
+ }
+ // 通过反射调用对象的execute 方法,并获得返回值,例如"success"
+ method = actionClass.getMethod("execute");
+ String result = (String) method.invoke(object);
+ map.put("result", result);
+
+ //找到对象的所有getter方法,把值和属性形成一个HashMap
+ Method getName = actionClass.getMethod("getName");
+ Method getPassword = actionClass.getMethod("getPassword");
+ Method getMessage = actionClass.getMethod("getMessage");
+ map.put("name", getName.invoke(object));
+ map.put("password", getPassword.invoke(object));
+ map.put("message", getMessage.invoke(object));
+
+ return map;
+ }
+
+ private static String getJSP(String result, Element actionElement) {
+ String jsp = null;
+ for (Iterator> i = actionElement.elementIterator(); i.hasNext();) { // 获取所有action子节点result
+ Element resultElement = (Element) i.next();
+ if(resultElement.attribute("name").getValue().equals(result)) {
+ jsp = resultElement.getTextTrim();
+ }
+ }
+ return jsp;
+ }
+
+}
\ No newline at end of file
diff --git a/group16/1012075117/src/com/litestruts/StrutsTest.java b/group16/1012075117/src/com/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..f404679192
--- /dev/null
+++ b/group16/1012075117/src/com/litestruts/StrutsTest.java
@@ -0,0 +1,39 @@
+package com.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+ @Test
+ public void testLoginActionSuccess() throws Exception {
+
+ String actionName = "login";
+
+ Map params = new HashMap();
+ params.put("name", "test");
+ params.put("password", "1234");
+
+ View view = Struts.runAction(actionName, params);
+
+ Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+ Assert.assertEquals("login successful", view.getParameters().get("message"));
+ }
+
+ @Test
+ public void testLoginActionFailed() throws Exception {
+ String actionName = "login";
+ Map params = new HashMap();
+ params.put("name", "test");
+ params.put("password", "123456"); // 密码和预设的不一致
+
+ View view = Struts.runAction(actionName, params);
+
+ Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+ Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+ }
+
+}
diff --git a/group16/1012075117/src/com/litestruts/View.java b/group16/1012075117/src/com/litestruts/View.java
new file mode 100644
index 0000000000..227f6c2ed2
--- /dev/null
+++ b/group16/1012075117/src/com/litestruts/View.java
@@ -0,0 +1,26 @@
+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/1012075117/src/com/litestruts/struts.xml b/group16/1012075117/src/com/litestruts/struts.xml
new file mode 100644
index 0000000000..90d26a0822
--- /dev/null
+++ b/group16/1012075117/src/com/litestruts/struts.xml
@@ -0,0 +1,11 @@
+
+
+
+ /jsp/homepage.jsp
+ /jsp/showLogin.jsp
+
+
+ /jsp/welcome.jsp
+ /jsp/error.jsp
+
+
\ No newline at end of file
diff --git a/group16/2562124714/.idea/misc.xml b/group16/2562124714/.idea/misc.xml
index e97ef03f44..05483570e0 100644
--- a/group16/2562124714/.idea/misc.xml
+++ b/group16/2562124714/.idea/misc.xml
@@ -1,22 +1,6 @@
-
+
-
-
-
-
- 1.7
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/group16/2562124714/.idea/workspace.xml b/group16/2562124714/.idea/workspace.xml
index d357c0f9a1..bba44e297b 100644
--- a/group16/2562124714/.idea/workspace.xml
+++ b/group16/2562124714/.idea/workspace.xml
@@ -13,49 +13,60 @@
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
@@ -63,46 +74,78 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -130,8 +173,6 @@
-
-
@@ -141,14 +182,23 @@
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
-
-
+
+
@@ -166,6 +216,7 @@
+
@@ -209,20 +260,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
@@ -410,6 +521,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -426,6 +667,14 @@
+
+
+
+
+
+
+
+
@@ -468,6 +717,15 @@
+
+
+
+
+
+
+
+
+
@@ -501,6 +759,12 @@
+
+
+
+
+
+
@@ -529,6 +793,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -557,6 +837,8 @@
1487640652721
+
+
@@ -568,40 +850,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
-
+
+
-
+
+
+
+
+
@@ -616,66 +914,269 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
+
+
-
+
-
-
+
+
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -683,7 +1184,6 @@
-
@@ -699,82 +1199,182 @@
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
+
+
-
+
-
+
+
+
-
-
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/group16/2562124714/src/Test/StrutsTest.java b/group16/2562124714/src/Test/StrutsTest.java
new file mode 100644
index 0000000000..663c9dba3b
--- /dev/null
+++ b/group16/2562124714/src/Test/StrutsTest.java
@@ -0,0 +1,43 @@
+package Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+ @Test
+ public void testLoginActionSuccess() {
+
+ String actionName = "login";
+
+ Map params = new HashMap();
+ params.put("name","test");
+ params.put("password","1234");
+
+
+ com.coderising.litestruts.View view = com.coderising.litestruts.Struts.runAction(actionName,params);
+
+ Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+ Assert.assertEquals("login successful", view.getParameters().get("message"));
+ }
+
+ @Test
+ public void testLoginActionFailed() {
+ String actionName = "login";
+ Map params = new HashMap();
+ params.put("name","test");
+ params.put("password","123456"); //密码和预设的不一致
+
+ com.coderising.litestruts.View view = com.coderising.litestruts.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/2562124714/src/Test/TestRunner.java b/group16/2562124714/src/Test/TestRunner.java
index 2bf465f832..963fb955d3 100644
--- a/group16/2562124714/src/Test/TestRunner.java
+++ b/group16/2562124714/src/Test/TestRunner.java
@@ -10,7 +10,7 @@
*/
public class TestRunner {
public static void main(String[] args) {
- org.junit.runner.Result result = JUnitCore.runClasses(BinaryTreeNodeTest.class);
+ org.junit.runner.Result result = JUnitCore.runClasses(StrutsTest.class);
for (Failure failure:result.getFailures()) {
System.out.println(failure.toString());
}
diff --git a/group16/2562124714/src/com/coderising/action/LoginAction.java b/group16/2562124714/src/com/coderising/action/LoginAction.java
new file mode 100644
index 0000000000..8f1ea73abb
--- /dev/null
+++ b/group16/2562124714/src/com/coderising/action/LoginAction.java
@@ -0,0 +1,41 @@
+package com.coderising.action;
+
+/**
+ * Created by zhangwj on 2017/3/9.
+ */
+public class LoginAction {
+ private String Name;
+ private String Password;
+ private String Message;
+
+ public void setName(String name)
+ {
+ this.Name = name;
+ }
+ public void setPassword(String pass)
+ {
+ this.Password = pass;
+ }
+
+ public String exectue()
+ {
+ if (this.Name == "test" && this.Password == "1234")
+ {
+ this.Message = "login successful";
+ return "success";
+ }
+ else
+ {
+ this.Message = "login failed,please check your user/pwd";
+ return "fail";
+ }
+ }
+
+ public String getMessage()
+ {
+ return this.Message;
+ }
+
+
+
+}
diff --git a/group16/2562124714/src/com/coderising/array/ArrayUtil.java b/group16/2562124714/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..4b496a41f7
--- /dev/null
+++ b/group16/2562124714/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,292 @@
+package com.coderising.array;
+
+import com.*;
+
+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 (1 == origin.length || 0 == origin.length)
+ {
+ return;
+ }
+
+ int temp = 0;
+ 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 Integer[] removeZero(int[] oldArray){
+ com.coding.basic.ArrayList blist = new com.coding.basic.ArrayList();
+
+ //int j = 0;
+
+ for(int i = 0; i < oldArray.length; i++)
+ {
+ if (0 != oldArray[i])
+ {
+ blist.add(oldArray[i]);
+ }
+ }
+
+ Object[] newArray = blist.ToArray();
+
+ return (Integer[])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){
+ com.coding.basic.ArrayList blist = new com.coding.basic.ArrayList();
+ int i = 0;
+
+ for (i = 0; i < array1.length; i++)
+ {
+ blist.add(array1[0]);
+ }
+
+ for(i = 0; i < array2.length; i++)
+ {
+ for (int j = 0; j < blist.size(); j ++)
+ {
+ if (array2[i] >= (int)blist.get(j + 1))
+ {
+ if (array2[i] == (int)blist.get(j + 1))
+ {
+ break;
+ }
+ //已经到最后了
+ if (j == blist.size() - 1)
+ {
+ if (array2[i] == (int)blist.get(j + 1))
+ {
+ break;
+ }
+ else
+ {
+ blist.add(j + 1, array2[i]);
+ break;
+ }
+ }
+ else
+ {
+ if (array2[i] <= (int)blist.get(j + 2))
+ {
+ if (array2[i] == (int)blist.get(j + 2))
+ {
+ break;
+ }
+ else
+ {
+ blist.add(j + 1, array2[i]);
+ break;
+ }
+ }
+ }
+
+ }
+ else
+ {
+ if (j == 0)
+ {
+ blist.add(j + 1, array2[i]);
+ break;
+ }
+ else
+ {
+ continue;
+ }
+ }
+ }
+ }
+
+ return (Integer[]) blist.ToArray();
+ }
+ /**
+ * 把一个已经存满数据的数组 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 Integer[] fibonacci(int max){
+ com.coding.basic.ArrayList result = new com.coding.basic.ArrayList();
+ int i = 0;
+ int TempMax = 0;
+
+
+ while (true)
+ {
+ TempMax = CaculateFibonacci(i++);
+ if (TempMax <= max)
+ {
+ result.add(TempMax);
+ continue;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return (Integer[])result.ToArray();
+ }
+
+ public int CaculateFibonacci(int i)
+ {
+ if (1 == i)
+ return 1;
+ else if (2 == i)
+ return 1;
+ else
+ return CaculateFibonacci(i - 1) + CaculateFibonacci(i - 2);
+ }
+
+ /**
+ * 返回小于给定最大值max的所有素数数组
+ * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+ * @param max
+ * @return
+ */
+ public Integer[] getPrimes(int max){
+ com.coding.basic.ArrayList result = new com.coding.basic.ArrayList();
+
+
+
+ for(int i = 2; i < max; i ++)
+ {
+ if(CaculatePrimes(i))
+ {
+ result.add(i);
+ }
+ }
+
+ return (Integer[])result.ToArray();
+ }
+
+ //计算素数函数 算法好像不高明啊!
+ public boolean CaculatePrimes(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 Integer[] getPerfectNumbers(int max){
+ com.coding.basic.ArrayList result = new com.coding.basic.ArrayList();
+
+ for (int i = 6; i < max; i++)
+ {
+ if (IsPerfectNumber(i))
+ {
+ result.add(i);
+ }
+ }
+ return (Integer[])result.ToArray();
+ }
+
+ //计算所有的因子之和 算法并不高明啊!
+ public boolean IsPerfectNumber(int Num)
+ {
+ int temp = 0;
+ for (int i = 1; i < Num; i++)
+ {
+ if (Num % i == 0)
+ {
+ temp += i;
+ }
+ }
+ if (temp == Num)
+ {
+ return true;
+ }
+ else
+ {
+ 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 - 1; i++)
+ {
+ result += Integer.toString(array[i])+ seperator;
+ }
+
+ result += Integer.toString(array[array.length]);
+
+
+ return result;
+ }
+
+
+}
diff --git a/group16/2562124714/src/com/coderising/litestruts/Struts.java b/group16/2562124714/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..2bc79f1199
--- /dev/null
+++ b/group16/2562124714/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,128 @@
+package com.coderising.litestruts;
+
+import com.sun.org.apache.regexp.internal.RE;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.print.Doc;
+import org.w3c.dom.Document;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class Struts {
+
+ public static View runAction(String actionName, Map parameters) {
+
+ //0. SAX Parser is faster and uses less memory than DOM parser. Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档
+ //Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档
+
+ long lasting = System.currentTimeMillis();
+
+ try {
+ File f = new File("C:\\Users\\zhangwj\\Desktop\\java课程\\coding\\coding2017-1\\group16\\2562124714\\src\\com\\coderising\\litestruts\\struts.xml");
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document doc = builder.parse(f);
+ NodeList nl = doc.getElementsByTagName("struts");
+ for (int i = 0; i < nl.getLength(); i++) {
+
+ Node node = doc.getElementsByTagName("action").item(i); //get action node
+ //System.out.print("action name is " + doc.getElementsByTagName("action").item(i).getFirstChild().getNodeValue());
+ Element e = (Element) node;
+ System.out.printf("attribute of name is "+ e.getAttribute("name") + " actionName Need is" + actionName);
+ if (e.getAttribute("name").toString().equals(actionName)) {
+ //1 获取相应的class 设置用户名和密码
+ // System.out.print("action name is " + e.getAttribute("name") + " action class is " + e.getAttribute("class"));
+ Class ActionClass = Class.forName(e.getAttribute("class"));
+ //强制类型转换
+ Object Action = ActionClass.newInstance();
+ for (Map.Entry entry : parameters.entrySet()
+ ) {
+ if (entry.getKey() == "name") {
+ //设置姓名
+ //2 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"
+ Method fun_setName = ActionClass.getDeclaredMethod("setName", String.class);
+ fun_setName.invoke(Action, entry.getValue());
+
+ } else if (entry.getKey() == "password") {
+ //设置密码
+ Method fun_setName = ActionClass.getDeclaredMethod("setPassword", String.class);
+ fun_setName.invoke(Action, entry.getValue());
+ } else {
+ continue;
+ }
+ }
+
+ Method ExecuteMethod = ActionClass.getDeclaredMethod("exectue");
+ //2 调用execute方法
+ String ss = "11";
+ Object ExecuteResultValue = ExecuteMethod.invoke(Action);
+
+ //3通过反射找到对象的所有getter方法(例如 getMessage),
+ //通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
+ //放到View对象的parameters
+ Method Getter_Method = ActionClass.getDeclaredMethod("getMessage");
+ Object message = Getter_Method.invoke(Action);
+ Map messageMap = new HashMap();
+ messageMap.put("message", (String) message);
+ com.coderising.litestruts.View view = new com.coderising.litestruts.View();
+ view.setParameters(messageMap);
+
+ //4 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,
+ //放到View对象的jsp字段中。
+ //首先获取result节点
+ NodeList ResultNL = ((Element) node).getElementsByTagName("result");
+ for (int j = 0; j < ResultNL.getLength(); j++
+ ) {
+ Node node1 = ResultNL.item(j);
+ Element e1 = (Element) node1;
+ System.out.println("name is " + e1.getAttribute("name") + "return Value is" + (String) ExecuteResultValue);
+ if (e1.getAttribute("name").toString().equals((String) ExecuteResultValue)) {
+ view.setJsp(node1.getFirstChild().getNodeValue());
+ }
+ }
+
+ 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中的 配置,以及execute的返回值, 确定哪一个jsp,
+ 放到View对象的jsp字段中。
+
+ */
+
+ return null;
+ }
+
+}
diff --git a/group16/2562124714/src/com/coderising/litestruts/View.java b/group16/2562124714/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group16/2562124714/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/2562124714/src/com/coderising/litestruts/struts.xml b/group16/2562124714/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..90cf18b7da
--- /dev/null
+++ b/group16/2562124714/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+
+
+
+ /jsp/homepage.jsp
+ /jsp/showLogin.jsp
+
+
+ /jsp/welcome.jsp
+ /jsp/error.jsp
+
+
\ No newline at end of file
diff --git a/group16/2562124714/src/com/coding/basic/ArrayList.java b/group16/2562124714/src/com/coding/basic/ArrayList.java
index f1d5a9fdd9..acdfadd83d 100644
--- a/group16/2562124714/src/com/coding/basic/ArrayList.java
+++ b/group16/2562124714/src/com/coding/basic/ArrayList.java
@@ -1,5 +1,7 @@
package com.coding.basic;
+import java.util.Objects;
+
public class ArrayList implements List {
private int size = 0;
@@ -96,5 +98,22 @@ public int size(){
public Iterator iterator(){
return null;
}
+
+ public Object[] ToArray()
+ {
+ Object [] Array = new Object[this.size];
+ if(this.size == 0)
+ {
+ return new Object[0];
+ }
+
+ //使用System.arraycopy()来复制数组是更优的办法 zwj 20170309
+ for (int i = 0 ; i < this.size; i ++)
+ {
+ Array[i] = this.elementData[i];
+ }
+
+ return Array;
+ }
}
diff --git a/group16/313001956/.classpath b/group16/313001956/.classpath
index b42037dde2..249d4729ec 100644
--- a/group16/313001956/.classpath
+++ b/group16/313001956/.classpath
@@ -8,5 +8,6 @@
+
diff --git a/group16/313001956/RemoteSystemsTempFiles/.project b/group16/313001956/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000000..5447a64fa9
--- /dev/null
+++ b/group16/313001956/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+
+
+ RemoteSystemsTempFiles
+
+
+
+
+
+
+ org.eclipse.rse.ui.remoteSystemsTempNature
+
+
diff --git a/group16/313001956/WebContent/WEB-INF/resource/struts.xml b/group16/313001956/WebContent/WEB-INF/resource/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group16/313001956/WebContent/WEB-INF/resource/struts.xml
@@ -0,0 +1,11 @@
+
+
+
+ /jsp/homepage.jsp
+ /jsp/showLogin.jsp
+
+
+ /jsp/welcome.jsp
+ /jsp/error.jsp
+
+
\ No newline at end of file
diff --git a/group16/313001956/src/com/coderising/array/ArrayUtil.java b/group16/313001956/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..158b1bc6df
--- /dev/null
+++ b/group16/313001956/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,202 @@
+
+package com.coderising.array;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
+
+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 size = origin.length;
+ if (size == 0) {
+ return;
+ }
+ int semi = size / 2;
+ int temp;
+ for (int i = 0; i < semi; 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) {
+ ArrayList arrayList = new ArrayList();
+ int size = oldArray.length;
+ for (int i = 0; i < size; i++) {
+ if (oldArray[i] != 0)
+ arrayList.add(oldArray[i]);
+ }
+
+ return arrayListToArray(arrayList);
+ }
+
+ /**
+ * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ a1 =
+ * [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ
+ *
+ * @param array1
+ * @param array2
+ * @return
+ */
+
+ public int[] merge(int[] array1, int[] array2) {
+ ArrayList arraylist = new ArrayList();
+ int size1 = array1.length;
+ int size2 = array2.length;
+ int j = 0;
+ for (int i = 0; i < size1; i++) {
+ if (j >= size2)
+ arraylist.add(array1[i]);
+ else {
+ for (; j < size2; j++) {
+ if (array1[i] < array2[j]) {
+ arraylist.add(array1[i]);
+ break;
+ } else if (array1[i] == array2[j]) {
+ arraylist.add(array2[j]);
+ j++;
+ break;
+ } else {
+ arraylist.add(array2[j]);
+ }
+ }
+ }
+ }
+ return arrayListToArray(arraylist);
+ }
+
+ private int[] arrayListToArray(ArrayList arraylist) {
+ int newSize = arraylist.size();
+ int[] newArray = new int[newSize];
+ for (int i = 0; i < newSize; i++)
+ newArray[i] = Integer.parseInt(arraylist.get(i).toString());
+ 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 newsize = oldArray.length + size;
+ int[] newArray = new int[newsize];
+ System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+ return newArray;
+ }
+
+ /**
+ * 쳲Ϊ1123581321...... һֵ Сڸֵ 磬 max = 15 ,
+ * صӦΪ [11235813] max = 1, ؿ []
+ *
+ * @param max
+ * @return
+ */
+ public int[] fibonacci(int max) {
+ int array[] = null;
+ ArrayList arraylist = new ArrayList();
+ arraylist.add(1);
+ arraylist.add(1);
+ if (max == 1)
+ return null;
+ int temp = 1;
+ for (int i = 1; (temp = Integer.parseInt(arraylist.get(i).toString())
+ + Integer.parseInt(arraylist.get(i - 1).toString())) <= max; i++) {
+
+ arraylist.add(temp);
+ }
+
+ return arrayListToArray(arraylist);
+ }
+
+ /**
+ * Сڸֵmax max = 23, صΪ[2,3,5,7,11,13,17,19]
+ *
+ * @param max
+ * @return
+ */
+ public int[] getPrimes(int max) {
+ ArrayList al = new ArrayList();
+ if (max == 1) {
+ return null;
+ } else if (max == 2) {
+ al.add(2);
+ } else {
+ for (int i = 2; i < max; i++) {
+ for (int j = 2; j <= Math.sqrt(max); j++) {
+ if (i % j == 0)
+ break;
+ }
+ al.add(i);
+ }
+ }
+ return arrayListToArray(al);
+ }
+
+ /**
+ * ν ָǡõ֮ͣ6=1+2+3 һֵmax һ飬 Сmax
+ *
+ * @param max
+ * @return
+ */
+ public int[] getPerfectNumbers(int max) {
+ ArrayList al = new ArrayList();
+ int num = 0;
+ for (int i = 1; i < max; i++) {
+ num = 0;
+ for (int j = 1; j < i; j++) {
+ if (i % j == 0)
+ num += j;
+ }
+ if (num == i)
+ al.add(i);
+ }
+ return arrayListToArray(al);
+ }
+
+ /**
+ * seperator array array= [3,8,9], seperator = "-" ֵΪ"3-8-9"
+ *
+ * @param array
+ * @param s
+ * @return
+ */
+ public String join(int[] array, String seperator) {
+ String s = "";
+ int lenth = array.length;
+ for (int i = 0; i < lenth; i++) {
+ if (i == 0)
+ s += i;
+ else {
+ s += seperator + i;
+ }
+ }
+ return s;
+ }
+
+}
diff --git a/group16/313001956/src/com/coderising/download/DownloadThread.java b/group16/313001956/src/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..0653f71d80
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/DownloadThread.java
@@ -0,0 +1,57 @@
+package com.coderising.download;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.DownloadListener;
+import com.coding.basic.ArrayList;
+
+public class DownloadThread extends Thread {
+
+ Connection conn;
+ Integer startPos;
+ Integer endPos;
+ DownloadListener listener;
+ File file;
+ int threadNum;
+ ArrayList threadDone;
+
+ public DownloadThread(Connection conn, int startPos, int endPos, DownloadListener listener, File file,
+ Integer threadNum, ArrayList threadDone) {
+
+ this.conn = conn;
+ this.startPos = startPos;
+ this.endPos = endPos;
+ this.listener = listener;
+ this.file = file;
+ this.threadNum = threadNum;
+ this.threadDone = threadDone;
+ // run();
+ }
+
+ @Override
+ public synchronized void run() {
+ try {
+ byte[] bt = conn.read(startPos, endPos, file);
+
+ threadDone.add(1);
+
+ if (conn != null) {
+ conn.close();
+ }
+ if (threadDone.size() == threadNum) {
+
+ listener.notifyFinished();
+ }
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/group16/313001956/src/com/coderising/download/FileDownloader.java b/group16/313001956/src/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..6903506b6b
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/FileDownloader.java
@@ -0,0 +1,97 @@
+package com.coderising.download;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.util.List;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coding.basic.ArrayList;
+
+public class FileDownloader {
+
+ String url;
+
+ DownloadListener listener;
+
+ ConnectionManager cm;
+
+ public FileDownloader(String _url) {
+ this.url = _url;
+
+ }
+
+ public void execute() {
+ // ʵĴ룬 ע⣺ Ҫö߳ʵ
+ // ӿ, Ҫд⼸ӿڵʵִ
+ // (1) ConnectionManager , ԴһӣͨConnectionԶȡеһΣstartPos,
+ // endPosָ
+ // (2) DownloadListener, Ƕ߳أ Ŀͻ˲֪ʲôʱҪʵֵ
+ // ̶ִ߳Ժ listenernotifiedFinished ͻ˾յ֪ͨ
+ // ʵ˼·
+ // 1. ҪConnectionManageropenӣ
+ // ȻͨConnection.getContentLengthļij
+ // 2. 3߳أ עÿ߳ҪȵConnectionManageropen
+ // Ȼread readжȡļĿʼλúͽλõIJ ֵbyte[]
+ // 3. byteд뵽ļ
+ // 4. е̶߳Ժ ҪlistenernotifiedFinished
+
+ // Ĵʾ룬 Ҳ˵ֻһ̣߳ Ҫɶ̵߳ġ
+ Connection conn = null;
+ try {
+ Integer threadNum = 3;
+ //Integer threadDone = 0;
+ ArrayList threadDone=new ArrayList();
+ conn = cm.open(this.url);
+ if (conn.getConn().getResponseCode() == 200) {
+ int length = conn.getContentLength();
+ int size = (length % threadNum == 0 ? length / threadNum : length / threadNum + 1);
+
+ String filename = url.substring(url.lastIndexOf('/'));
+ String filePath = "C:\\Users\\Administrator\\Desktop\\" + filename;
+ File file = new File(filePath);
+ RandomAccessFile raf = new RandomAccessFile(file, "rw");
+ raf.setLength(length);
+ raf.close();
+
+ for (int i = 0; i < threadNum; i++) {
+ Connection connThread = cm.open(this.url);
+ new DownloadThread(connThread, i * size, (i + 1) * size - 1, listener, file, threadNum,
+ threadDone).start();
+ }
+ }
+ } catch (ConnectionException e) {
+ e.printStackTrace();
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ if (conn != null) {
+ conn.close();
+ }
+ }
+
+ }
+
+ public void setListener(DownloadListener listener) {
+ this.listener = listener;
+ }
+
+ public void setConnectionManager(ConnectionManager ucm) {
+ this.cm = ucm;
+ }
+
+ public DownloadListener getListener() {
+ return this.listener;
+ }
+
+}
diff --git a/group16/313001956/src/com/coderising/download/FileDownloaderTest.java b/group16/313001956/src/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..cca82ea5da
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+ boolean downloadFinished = false;
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testDownload() {
+
+ //String url = "http://10.10.1.65:1024/wxl.jpg";
+ String url = "http://10.10.1.65:1024/java.pdf";
+ 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/group16/313001956/src/com/coderising/download/api/Connection.java b/group16/313001956/src/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..3a3edf5835
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/api/Connection.java
@@ -0,0 +1,43 @@
+package com.coderising.download.api;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.HttpURLConnection ;
+
+public interface Connection {
+ URL fileurl = null;
+ HttpURLConnection conn = null;
+ InputStream inStream = null;
+
+ /**
+ * ʼͽλã ȡݣ ֵֽ
+ *
+ * @param startPos
+ * ʼλã 0ʼ
+ * @param endPos
+ * λ
+ * @return
+ */
+ public byte[] read(int startPos, int endPos,File file) throws IOException;
+
+ /**
+ * õݵij
+ *
+ * @return
+ */
+ public int getContentLength();
+
+ /**
+ * ر
+ */
+ public void close();
+
+ public void setConn(HttpURLConnection conn);
+ public void setFileurl(URL fileurl);
+ public HttpURLConnection getConn();
+ public URL getFileurl(URL fileurl) ;
+ public void setinStream(InputStream inStream);
+ public InputStream getinStream();
+}
diff --git a/group16/313001956/src/com/coderising/download/api/ConnectionException.java b/group16/313001956/src/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/group16/313001956/src/com/coderising/download/api/ConnectionManager.java b/group16/313001956/src/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/group16/313001956/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/group16/313001956/src/com/coderising/download/api/DownloadListener.java b/group16/313001956/src/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/group16/313001956/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/group16/313001956/src/com/coderising/download/impl/ConnectionImpl.java b/group16/313001956/src/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..94fd2c9b67
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,80 @@
+package com.coderising.download.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.net.URL;
+import java.net.HttpURLConnection;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection {
+ URL fileurl = null;
+ HttpURLConnection uRLconn = null;
+ InputStream inStream = null;
+
+ @Override
+ public byte[] read(int startPos, int endPos, File file) throws IOException {
+ uRLconn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
+ if (inStream == null)
+ inStream = uRLconn.getInputStream();
+ int size = endPos - startPos + 1;
+
+ byte[] bt = new byte[size];
+
+ RandomAccessFile raf = new RandomAccessFile(file, "rw");
+
+ raf.seek(startPos);
+ int lenth=0;
+ //lenth = inStream.read(bt,0,size);
+ while ((lenth = inStream.read(bt,0,size)) != -1)
+ raf.write(bt, 0, lenth);
+ raf.close();
+
+ return bt;
+
+ }
+
+ @Override
+ public int getContentLength() {
+ int fileSize = uRLconn.getContentLength();
+ return fileSize;
+ }
+
+ @Override
+ public void close() {
+ if (inStream != null)
+ try {
+ inStream.close();
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void setConn(HttpURLConnection uRLconn) {
+ this.uRLconn = uRLconn;
+ }
+
+ public HttpURLConnection getConn() {
+ return this.uRLconn;
+ }
+
+ public void setFileurl(URL fileurl) {
+ this.fileurl = fileurl;
+ }
+
+ public URL getFileurl(URL fileurl) {
+ return this.fileurl;
+ }
+
+ public void setinStream(InputStream inStream) {
+ this.inStream = inStream;
+ }
+
+ public InputStream getinStream() {
+ return this.inStream;
+ }
+}
diff --git a/group16/313001956/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group16/313001956/src/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..ff96aaa595
--- /dev/null
+++ b/group16/313001956/src/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,35 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+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 {
+ try {
+ URL fileurl=new URL(url);
+ HttpURLConnection uRlconn = (HttpURLConnection)fileurl.openConnection();
+ //ӵ
+ uRlconn.setRequestMethod("GET");
+ uRlconn.setReadTimeout(5000);
+ Connection conn = new ConnectionImpl();
+ conn.setFileurl(fileurl);
+
+ conn.setConn(uRlconn);
+ return conn;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+}
diff --git a/group16/313001956/src/com/coderising/litestruts/LoginAction.java b/group16/313001956/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..bc492a3dfb
--- /dev/null
+++ b/group16/313001956/src/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/group16/313001956/src/com/coderising/litestruts/Struts.java b/group16/313001956/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..cdaa7d0214
--- /dev/null
+++ b/group16/313001956/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,108 @@
+package com.coderising.litestruts;
+
+//import java.awt.List;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+//import javax.print.attribute.standard.Media;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class Struts {
+
+ @SuppressWarnings("unchecked")
+ public static View runAction(String actionName, Map parameters) {
+
+ /*
+ *
+ * 0. ȡļstruts.xml
+ *
+ * 1. actionNameҵӦclass LoginAction, ͨʵ
+ * parametersеݣösetter parametersе ("name"="test" ,
+ * "password"="1234") , ǾӦõ setNamesetPassword
+ *
+ * 2. ͨöexectue ÷ֵ"success"
+ *
+ * 3. ͨҵgetter getMessage, ͨã ֵγһHashMap ,
+ * {"message": "¼ɹ"} , ŵViewparameters
+ *
+ * 4. struts.xmlе ,Լexecuteķֵ ȷһjsp
+ * ŵViewjspֶС
+ *
+ */
+ View view = new View();
+ Map map = new HashMap();
+ view.setParameters(map);
+ try {
+
+ SAXReader reader = new SAXReader();
+ String dir = System.getProperty("user.dir");
+
+ Document document = reader.read(new File(dir + "/src/com/coderising/litestruts/struts.xml"));
+ Element struts = document.getRootElement();
+ java.util.List list_action = struts.elements("action");
+
+ Element item = null;
+ for (int i = 0; i < list_action.size(); i++) {
+ item = list_action.get(i);
+ String nm = item.attributeValue("name");
+ if (actionName.equals(nm)) {
+ break;
+ }
+ }
+ String str_class = item.attributeValue("class");
+ // String real_class=dir+"/"+str_class.replace('.', '/');
+ // Class> cl = Class.forName( dir.replace('\\',
+ // '.')+".src."+str_class);
+ Class> cl = Class.forName(str_class);
+ Object instance = cl.newInstance();
+
+ String dNmae = parameters.get("name");
+ String dpassword = parameters.get("password");
+ Method mName = cl.getMethod("setName", String.class);
+ Method mPassword = cl.getMethod("setPassword", String.class);
+ mName.invoke(instance, dNmae);
+ mPassword.invoke(instance, dpassword);
+
+ Method mExectue = cl.getMethod("execute");
+ Object result = mExectue.invoke(instance);
+
+ Method[] methods = cl.getMethods();
+ for (Method method : methods) {
+ if (isGetter(method)) {
+ String mGettername = method.getName().substring(3);
+ Object mResult = method.invoke(instance);
+ view.getParameters().put(mGettername.toLowerCase(), mResult);
+ }
+ }
+
+ java.util.List resulList = item.elements();
+ for (Element el : resulList) {
+ if (result.toString().equals(el.attributeValue("name"))) {
+ view.setJsp(el.getTextTrim());
+ break;
+ }
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return view;
+ }
+
+ // жǷgetter
+ public static boolean isGetter(Method method) {
+ if (!method.getName().startsWith("get"))
+ return false;
+ if (method.getParameterTypes().length != 0)
+ return false;
+ if (void.class.equals(method.getReturnType()))
+ return false;
+ return true;
+ }
+
+}
diff --git a/group16/313001956/src/com/coderising/litestruts/StrutsTest.java b/group16/313001956/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..9e98836f5f
--- /dev/null
+++ b/group16/313001956/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+ @Test
+ public void testLoginActionSuccess() {
+
+ String actionName = "login";
+
+ Map params = new HashMap();
+ params.put("name","test");
+ params.put("password","1234");
+
+
+ View view = Struts.runAction(actionName,params);
+
+ Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+ Assert.assertEquals("login successful", view.getParameters().get("message"));
+ }
+
+ @Test
+ public void testLoginActionFailed() {
+ String actionName = "login";
+ Map params = new HashMap();
+ params.put("name","test");
+ params.put("password","123456"); //ԤIJһ
+
+ View view = Struts.runAction(actionName,params);
+
+ Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+ Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+ }
+}
diff --git a/group16/313001956/src/com/coderising/litestruts/View.java b/group16/313001956/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f1e7fcfa19
--- /dev/null
+++ b/group16/313001956/src/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/group16/313001956/src/com/coderising/litestruts/struts.xml b/group16/313001956/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..ff7623e6e1
--- /dev/null
+++ b/group16/313001956/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+
+
+
+ /jsp/homepage.jsp
+ /jsp/showLogin.jsp
+
+
+ /jsp/welcome.jsp
+ /jsp/error.jsp
+
+
\ No newline at end of file
diff --git a/group16/313001956/src/com/coding/basic/ArrayList.java b/group16/313001956/src/com/coding/basic/ArrayList.java
index 3bec144013..03d2547c30 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
index de886c9084..14fee11655 100644
--- a/group16/313001956/src/com/coding/basic/LinkedList.java
+++ b/group16/313001956/src/com/coding/basic/LinkedList.java
@@ -136,5 +136,186 @@ void Setnext(Node n) {
next = n;
}
}
+ /**
+ * Ѹ Ϊ 3->7->10 , úΪ 10->7->3
+ */
+ public void reverse(LinkedList list) {
+
+ Node node = list.head.next;
+ list.head.next = null;
+ while (node != null) {
+ Node temp = node.next;
+ node.next = head.next;
+ head.next = node;
+ node = temp;
+ }
+
+ }
+
+ /**
+ * ɾһǰ벿 磺list = 2->5->7->8 , ɾԺֵΪ 7->8 list = 2->5->7->8->10
+ * ,ɾԺֵΪ7,8,10
+ *
+ */
+ public void removeFirstHalf(LinkedList list) {
+ int lsize = list.size();
+ int semisize = lsize / 2;
+ Node node = head.next;
+
+ for (int i = 0; i < semisize; i++) {
+ node.data = null;
+ Node temp = node.next;
+ node.next = null;
+ node = temp;
+ }
+ head.next = node;
+ }
+
+ /**
+ * ӵiԪؿʼ ɾlength Ԫ עi0ʼ
+ *
+ * @param i
+ * @param length
+ * @throws Exception
+ */
+ public void remove(LinkedList list, int i, int length) {
+ int lsize = list.size();
+ if (i < 0 || i > lsize - 1 || (i + length > lsize - 1))
+ throw new IndexOutOfBoundsException("Խ磡");
+ Node nodebefore = list.head, node = list.head;
+ for (int j = 0; j <= i + length; j++)
+ if (j <= i) {
+ node = node.next;
+ if (j == i - 1)
+ nodebefore = node;
+ } else {
+ Node temp = node.next;
+ node.data = null;
+ node.next = null;
+ node = temp;
+ }
+ nodebefore.next = node;
+ }
+
+ /**
+ * ٶǰlistBе ӵǰȡЩlistBָԪ 統ǰ =
+ * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
+ * صĽӦ[101,301,401,601]
+ *
+ * @param list
+ */
+ public int[] getElements(LinkedList list, LinkedList listB) {
+ ArrayList al = new ArrayList();
+ int sizeB = listB.size();
+ int index;
+ Object o;
+ for (int i = 0; i < sizeB; i++) {
+ index = Integer.parseInt(listB.get(i).toString());
+ o = list.get(index);
+ al.add(o);
+ }
+ int[] array = new int[al.size()];
+ for (int i = 0; i < al.size(); i++)
+ array[i] = Integer.parseInt(al.get(i).toString());
+ return array;
+ }
+
+ /**
+ * ֪еԪֵУԵ洢ṹ ӵǰɾlistBгֵԪ
+ *
+ * @param list
+ */
+
+ public void subtract(LinkedList list, LinkedList listB) {
+ int sizeB = listB.size();
+ int index;
+ int end = 0;
+ Node node = list.head;
+ for (int i = 0; i < sizeB; i++) {
+ index = Integer.parseInt(listB.get(i).toString());
+ for (int j = end; j < index; j++) {
+ if (j != index - 1)
+ node = node.next;
+ else {
+ Node temp = node.next.next;
+ node.next.data = null;
+ node.next.next = null;
+ node.next = temp;
+ node = temp;
+ end = j;
+ }
+ }
+ }
+ }
+
+ /**
+ * ֪ǰеԪֵУԵ洢ṹ ɾֵͬĶԪ ʹòԱԪصֵͬ
+ */
+ public void removeDuplicateValues() {
+ Object o = head.data;
+ Node prenode = null;
+ for (Node node = head.next; node != null; node = node.next) {
+ if (o.equals(node.data)) {
+ Node temp = node.next;
+ node.data = null;
+ node.next = null;
+ prenode.next = temp;
+ node = prenode;
+ } else {
+ o = node.data;
+ prenode = node;
+ }
+ }
+ }
+
+ /**
+ * ֪еԪֵУԵ洢ṹ дһЧ㷨 ɾֵminСmaxԪأдԪأ
+ *
+ * @param min
+ * @param max
+ */
+ public void removeRange(int min, int max) {
+ Node prenode = null;
+ for (Node node = head.next; node != null; node = node.next) {
+ int value = Integer.parseInt(node.data.toString());
+ if (value > min) {
+ if (value >= max) {
+ break;
+ } else {
+ Node temp = node.next;
+ node.data = null;
+ node.next = null;
+ prenode.next = temp;
+ node = prenode;
+ }
+
+ } else {
+ prenode = node;
+ }
+ }
+ }
+
+ /**
+ * 赱ǰͲlistָԪֵУͬһеԪֵͬ
+ * ҪCԪΪǰlistԪصĽұCеԪֵ
+ *
+ * @param list
+ */
+ public LinkedList intersection(LinkedList listA, LinkedList listB) {
+ LinkedList listC = new LinkedList();
+ Node nodeBaf = listB.head;
+ for (Node nodeA = listA.head; nodeA != null; nodeA = nodeA.next) {
+ for (Node nodeB = nodeBaf; nodeB != null; nodeB = nodeB.next) {
+ if (nodeA.data.equals(nodeB.data)) {
+ listC.add(nodeA.data);
+ nodeBaf = nodeB.next;
+ break;
+ }
+ }
+ }
+
+ return null;
+ }
+
}
diff --git a/group16/313001956/src/com/coding/basic/LinkedListTest.java b/group16/313001956/src/com/coding/basic/LinkedListTest.java
new file mode 100644
index 0000000000..2acd774160
--- /dev/null
+++ b/group16/313001956/src/com/coding/basic/LinkedListTest.java
@@ -0,0 +1,28 @@
+package com.coding.basic;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LinkedListTest {
+
+ @Test
+ public final void testReverse() {
+
+ LinkedList list=new LinkedList();
+ list.add(3);
+ list.add(7);
+ list.add(10);
+
+ LinkedList testlist=new LinkedList();
+ testlist.add(10);
+ testlist.add(7);
+ testlist.add(3);
+
+ list.reverse(list);
+ Assert.assertEquals(list.size(), testlist.size());
+ Assert.assertEquals(list.get(0), testlist.get(0));
+ Assert.assertEquals(list.get(1), testlist.get(1));
+ Assert.assertEquals(list.get(2), testlist.get(2));
+ }
+
+}
diff --git a/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java b/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java
index 7c6522e50a..2c1fca67d4 100644
--- a/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java
+++ b/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java
@@ -26,13 +26,21 @@ public static void reverseArray(int[] origin){
*/
public static int[] removeZero(int[] oldArray){
- int[] notZero = new int[oldArray.length];
- for(int i = 0;i < oldArray.length ;i++){
+ int zeroCount = 0;
+ for(int i = 0;i < oldArray.length; i++){
+ if(oldArray[i] == 0){
+ zeroCount++;
+ }
+ }
+ int[] newArr = new int[oldArray.length - zeroCount];
+ int index = 0;
+ for(int i = 0;i < oldArray.length; i++){
if(oldArray[i] != 0){
-
+ newArr[index] = oldArray[i];
+ index++;
}
}
- return oldArray;
+ return newArr;
}
/**
@@ -60,22 +68,29 @@ public static int[] merge(int[] array1, int[] array2){
combineArr[i] = array1[i];
}
for(int i = 0;i < array2.length; i++){
+ int index = array1.length -1;
+ boolean same = false;
for(int j = 0;j < repeatedNum.length; j++){
- if(array2[i] != repeatedNum[j]){
- combineArr[array1.length + i] = array2[i];
+ if(array2[i] == repeatedNum[j]){
+ same = true;
}
}
+ if(!same){
+ index += 1;
+ combineArr[index] = array2[i];
+ }
}
//冒泡排序
for(int i = 0;i < combineArr.length;i++){
for(int j = i + 1;j < combineArr.length;j++){
- int x = combineArr[i];
- if(x > combineArr[j]){
-
+ if(combineArr[i] > combineArr[j]){
+ int x = combineArr[i];
+ combineArr[i] = combineArr[j];
+ combineArr[j] = x;
}
}
}
- return null;
+ return combineArr;
}
/**
* 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size
@@ -87,7 +102,11 @@ public static int[] merge(int[] array1, int[] array2){
* @return
*/
public static int[] grow(int [] oldArray, int size){
- return null;
+ int[] newArr = new int[oldArray.length + size];
+ for(int i = 0;i < oldArray.length; i++){
+ newArr[i] = oldArray[i];
+ }
+ return newArr;
}
/**
@@ -98,7 +117,31 @@ public static int[] grow(int [] oldArray, int size){
* @return
*/
public static int[] fibonacci(int max){
- return null;
+ if(max == 1){
+ return null;
+ }else{
+ int length = 0;
+ int dataBefore = 0;
+ int dataAfter = 1;
+ while(dataAfter < max){
+ int date = dataAfter;
+ dataAfter = dataAfter + dataBefore;
+ dataBefore = date;
+ length++;
+ }
+ int index = 0;
+ int[] result = new int[length];
+ dataBefore = 0;
+ dataAfter = 1;
+ while(dataAfter < max){
+ result[index] = dataAfter;
+ int date = dataAfter;
+ dataAfter = dataAfter + dataBefore;
+ dataBefore = date;
+ index ++;
+ }
+ return result;
+ }
}
/**
@@ -108,6 +151,12 @@ public static int[] fibonacci(int max){
* @return
*/
public static int[] getPrimes(int max){
+ int i = 1;
+ int length = 0;
+ while(i < max){
+ i++;
+ int search = 1;
+ }
return null;
}
@@ -130,7 +179,14 @@ public static int[] getPerfectNumbers(int max){
* @return
*/
public static String join(int[] array, String seperator){
- return null;
+ StringBuilder sb = new StringBuilder();
+ for(int i=0 ;i < array.length; i++){
+ sb.append(String.valueOf(array[i]));
+ if(i != array.length - 1){
+ sb.append(seperator);
+ }
+ }
+ return sb.toString();
}
public static void main(String[] args) {
@@ -139,9 +195,29 @@ public static void main(String[] args) {
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) {
+ /*int[] oldArr = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} ;
+ int[] newArr = removeZero(oldArr);
+ for (int i : newArr) {
+ System.out.print(i+",");
+ }*/
+ /*int[] a1 = {3, 5, 7,8};
+ int[] a2 = {4, 5, 6,7};
+ int[] merge = merge(a1,a2);
+ for (int i : merge) {
+ System.out.print(i+",");
+ }*/
+ /*int[] oldArray = {2,3,6};
+ int size = 3;
+ int[] newArr = grow(oldArray, size);
+ for (int i : newArr) {
+ System.out.print(i+",");
+ }*/
+ /*int[] array= {3,8,9};
+ String seperator = "-";
+ String join = join(array, seperator);
+ System.out.println(join);*/
+ int[] fibonacci = fibonacci(15);
+ for (int i : fibonacci) {
System.out.print(i+",");
}
}
diff --git a/group16/1012075117/DataStructure219/.classpath b/group16/420355244/Homework3/.classpath
similarity index 70%
rename from group16/1012075117/DataStructure219/.classpath
rename to group16/420355244/Homework3/.classpath
index fceb4801b5..3e0fb272a8 100644
--- a/group16/1012075117/DataStructure219/.classpath
+++ b/group16/420355244/Homework3/.classpath
@@ -1,6 +1,7 @@
-
+
+
diff --git a/group16/420355244/Homework3/.gitignore b/group16/420355244/Homework3/.gitignore
new file mode 100644
index 0000000000..ae3c172604
--- /dev/null
+++ b/group16/420355244/Homework3/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/group16/420355244/Homework3/.project b/group16/420355244/Homework3/.project
new file mode 100644
index 0000000000..57ff5cb4f2
--- /dev/null
+++ b/group16/420355244/Homework3/.project
@@ -0,0 +1,17 @@
+
+
+ Homework3
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/group16/420355244/Homework3/src/com/coderising/array/ArrayUtil.java b/group16/420355244/Homework3/src/com/coderising/array/ArrayUtil.java
new file mode 100644
index 0000000000..e5ddb476a6
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coderising.array;
+
+public class ArrayUtil {
+
+ /**
+ * 给定一个整形数组a , 对该数组的值进行置换
+ 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7]
+ 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+ * @param origin
+ * @return
+ */
+ public void reverseArray(int[] origin){
+
+ }
+
+ /**
+ * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+ * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为:
+ * {1,3,4,5,6,6,5,4,7,6,7,5}
+ * @param oldArray
+ * @return
+ */
+
+ public int[] removeZero(int[] oldArray){
+ return null;
+ }
+
+ /**
+ * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的
+ * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复
+ * @param array1
+ * @param array2
+ * @return
+ */
+
+ public int[] merge(int[] array1, int[] array2){
+ return null;
+ }
+ /**
+ * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size
+ * 注意,老数组的元素在新数组中需要保持
+ * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+ * [2,3,6,0,0,0]
+ * @param oldArray
+ * @param size
+ * @return
+ */
+ public int[] grow(int [] oldArray, int size){
+ return null;
+ }
+
+ /**
+ * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列
+ * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13]
+ * max = 1, 则返回空数组 []
+ * @param max
+ * @return
+ */
+ public int[] fibonacci(int max){
+ return null;
+ }
+
+ /**
+ * 返回小于给定最大值max的所有素数数组
+ * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+ * @param max
+ * @return
+ */
+ public int[] getPrimes(int max){
+ return null;
+ }
+
+ /**
+ * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3
+ * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数
+ * @param max
+ * @return
+ */
+ public int[] getPerfectNumbers(int max){
+ return null;
+ }
+
+ /**
+ * 用seperator 把数组 array给连接起来
+ * 例如array= [3,8,9], seperator = "-"
+ * 则返回值为"3-8-9"
+ * @param array
+ * @param s
+ * @return
+ */
+ public String join(int[] array, String seperator){
+ return null;
+ }
+
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/download/DownloadThread.java b/group16/420355244/Homework3/src/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..900a3ad358
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+ Connection conn;
+ int startPos;
+ int endPos;
+
+ public DownloadThread( Connection conn, int startPos, int endPos){
+
+ this.conn = conn;
+ this.startPos = startPos;
+ this.endPos = endPos;
+ }
+ public void run(){
+
+ }
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/download/FileDownloader.java b/group16/420355244/Homework3/src/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..c3c8a3f27d
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+
+ String url;
+
+ DownloadListener listener;
+
+ ConnectionManager cm;
+
+
+ public FileDownloader(String _url) {
+ this.url = _url;
+
+ }
+
+ public void execute(){
+ // 在这里实现你的代码, 注意: 需要用多线程实现下载
+ // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+ // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定)
+ // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有
+ // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。
+ // 具体的实现思路:
+ // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度
+ // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法
+ // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组
+ // 3. 把byte数组写入到文件中
+ // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法
+
+ // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。
+ Connection conn = null;
+ try {
+
+ conn = cm.open(this.url);
+
+ int length = conn.getContentLength();
+
+ new DownloadThread(conn,0,length-1).start();
+
+ } catch (ConnectionException e) {
+ e.printStackTrace();
+ }finally{
+ if(conn != null){
+ conn.close();
+ }
+ }
+
+
+
+
+ }
+
+ public void setListener(DownloadListener listener) {
+ this.listener = listener;
+ }
+
+
+
+ public void setConnectionManager(ConnectionManager ucm){
+ this.cm = ucm;
+ }
+
+ public DownloadListener getListener(){
+ return this.listener;
+ }
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/download/FileDownloaderTest.java b/group16/420355244/Homework3/src/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..4ff7f46ae0
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+ boolean downloadFinished = false;
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testDownload() {
+
+ String url = "http://localhost:8080/test.jpg";
+
+ FileDownloader downloader = new FileDownloader(url);
+
+
+ ConnectionManager cm = new ConnectionManagerImpl();
+ downloader.setConnectionManager(cm);
+
+ downloader.setListener(new DownloadListener() {
+ @Override
+ public void notifyFinished() {
+ downloadFinished = true;
+ }
+
+ });
+
+
+ downloader.execute();
+
+ // 等待多线程下载程序执行完毕
+ while (!downloadFinished) {
+ try {
+ System.out.println("还没有下载完成,休眠五秒");
+ //休眠5秒
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.println("下载完成!");
+
+
+
+ }
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/download/api/Connection.java b/group16/420355244/Homework3/src/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/group16/420355244/Homework3/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/group16/420355244/Homework3/src/com/coderising/download/api/ConnectionException.java b/group16/420355244/Homework3/src/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/download/api/ConnectionManager.java b/group16/420355244/Homework3/src/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/group16/420355244/Homework3/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/group16/420355244/Homework3/src/com/coderising/download/api/DownloadListener.java b/group16/420355244/Homework3/src/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/group16/420355244/Homework3/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/group16/420355244/Homework3/src/com/coderising/download/impl/ConnectionImpl.java b/group16/420355244/Homework3/src/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..36a9d2ce15
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+ @Override
+ public byte[] read(int startPos, int endPos) throws IOException {
+
+ return null;
+ }
+
+ @Override
+ public int getContentLength() {
+
+ return 0;
+ }
+
+ @Override
+ public void close() {
+
+
+ }
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group16/420355244/Homework3/src/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..172371dd55
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+ @Override
+ public Connection open(String url) throws ConnectionException {
+
+ return null;
+ }
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/litestruts/LoginAction.java b/group16/420355244/Homework3/src/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group16/420355244/Homework3/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/420355244/Homework3/src/com/coderising/litestruts/Struts.java b/group16/420355244/Homework3/src/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+ public static View runAction(String actionName, Map parameters) {
+
+ /*
+
+ 0. 读取配置文件struts.xml
+
+ 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)
+ 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是
+ ("name"="test" , "password"="1234") ,
+ 那就应该调用 setName和setPassword方法
+
+ 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"
+
+ 3. 通过反射找到对象的所有getter方法(例如 getMessage),
+ 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
+ 放到View对象的parameters
+
+ 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,
+ 放到View对象的jsp字段中。
+
+ */
+
+ return null;
+ }
+
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/litestruts/StrutsTest.java b/group16/420355244/Homework3/src/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+ @Test
+ public void testLoginActionSuccess() {
+
+ String actionName = "login";
+
+ Map params = new HashMap();
+ params.put("name","test");
+ params.put("password","1234");
+
+
+ View view = Struts.runAction(actionName,params);
+
+ Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+ Assert.assertEquals("login successful", view.getParameters().get("message"));
+ }
+
+ @Test
+ public void testLoginActionFailed() {
+ String actionName = "login";
+ Map params = new HashMap();
+ params.put("name","test");
+ params.put("password","123456"); //密码和预设的不一致
+
+ View view = Struts.runAction(actionName,params);
+
+ Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+ Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+ }
+}
diff --git a/group16/420355244/Homework3/src/com/coderising/litestruts/View.java b/group16/420355244/Homework3/src/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group16/420355244/Homework3/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/Homework3/src/com/coderising/litestruts/struts.xml b/group16/420355244/Homework3/src/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..171848ecd1
--- /dev/null
+++ b/group16/420355244/Homework3/src/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+
+
+
+ /jsp/homepage.jsp
+ /jsp/showLogin.jsp
+
+
+ /jsp/welcome.jsp
+ /jsp/error.jsp
+
+
diff --git a/group16/420355244/Homework3/src/com/coding/basic/ArrayList.java b/group16/420355244/Homework3/src/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..1f185736f9
--- /dev/null
+++ b/group16/420355244/Homework3/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/group16/420355244/Homework3/src/com/coding/basic/BinaryTreeNode.java b/group16/420355244/Homework3/src/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group16/420355244/Homework3/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/Homework3/src/com/coding/basic/Iterator.java b/group16/420355244/Homework3/src/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group16/420355244/Homework3/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/Homework3/src/com/coding/basic/LinkedList.java b/group16/420355244/Homework3/src/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..4fdb03db8a
--- /dev/null
+++ b/group16/420355244/Homework3/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/group16/420355244/Homework3/src/com/coding/basic/List.java b/group16/420355244/Homework3/src/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group16/420355244/Homework3/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/Homework3/src/com/coding/basic/Queue.java b/group16/420355244/Homework3/src/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..36e516e266
--- /dev/null
+++ b/group16/420355244/Homework3/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/group16/420355244/Homework3/src/com/coding/basic/Stack.java b/group16/420355244/Homework3/src/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..a5a04de76d
--- /dev/null
+++ b/group16/420355244/Homework3/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;
+ }
+}