阿达西哇

导航

 

1. 本周学习总结

以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

2. 书面作业

ArrayList代码分析
1.1 解释ArrayList的contains源代码

答:从ArrayList的contains源代码中可以看到,contains 方法返回的是indexOf(o) >= 0,而indexOf方法中先是判断传入的对象是否为空,如果为空,比较Arraylist数组中是否有空元素,如果有返回空元素的位置;如果对象不为空,则将该对象与Arraylist中的元素进行比较,如果有equals成功的,则返回该元素的位置;否则返回-1。因此当contains返回的数值大于0时,证明这个对象在Arraylist数组中已经存在了。

1.2 解释E remove(int index)源代码

答:首先rangeCheck(index)判断是否有越界(即超过Arraylist数组的长度); E oldValue = elementData(index)获取index位置开始到最后一个位置的个数, System.arraycopy(elementData, index+1, elementData, index, numMoved);将elementData数组index+1位置开始拷贝到elementData从index开始的空间; elementData[--size] = null; 使长度-1 ,设置elementData的原本的size位置为空。

1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?

答:不需要。从1.1和1.2的源代码中可以看到其传入的对象是object,Object在Java中被定义为一个顶级父类,它是任何类父类,因此ArrayList存储数据时不需要考虑元素的类型。

1.4 分析add源代码,回答当内部数组容量不够时,怎么办?


答:当内部数组容量不够时,首先ensureCapacityInternal方法得到最小扩容量,其次ensureExplicitCapacity判断是否要扩容。
参考资料
> ![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407181625613-919350759.png) ![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407181647253-1650872466.png) ![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407181709957-1479271663.png)

1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

答:用了private使rangeCheck这个方法只能在内部调用,从1.1的源代码可以看到其中remove这个方法就调用了rangecheck这个方法,rangecheck这个方法仅在内部被调用,若生命为public则外部也能调用,若是外部有人调用后改变了该方法的内容,那么整个程序就会错乱,因此用private保证了私有性。

HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?

答:计算出带存储的散列码作为存储的位置依据,将对象存入Hash类集合,需要用到hashCode和equals两个方法。

2.2 选做:尝试分析HashSet源代码后,重新解释1.1

答:从源代码中可以看到,hashset中的contain方法返回的是map.containsKey,map.containsKey判断传入的参数有没有对应的value值,有则返回true,没有则返回false。

ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)

05-5-1中的ArrayListIntegerStack
``` private ArrayList list; public ArrayListIntegerStack(){ list=new ArrayList();//使用了Arraylist } public Integer push(Integer item) { // TODO Auto-generated method stub if(item==null) return null; list.add(item);//用到了add方法 return item; } public Integer pop() { // TODO Auto-generated method stub if(list.size()==0) return null; return list.remove(list.size()-1);//用到remove方法
}
<table><tr><td bgcolor=frech grey>04-5-3中的ArrayListIntegerStack</td></tr></table>
private Integer[]arr;//使用数组
private int top=0;//top指针
public ArrayIntegerStack(int capacity) {
	arr=new Integer[capacity];
}
public Integer pop(){
	if(top==0)
	return null;
	 top--;//出栈需要移动指针
	 return arr[top];
	
	 
}

答:在5-1中编写的ArrayListIntegerStack使用的是ArrayList数组来存放对象,因此相应的push、pop、peek等方法的编写用到了list中的add、remove等方法;5-3中则是用数组来存放对象,并且要有top指针。

**3.2 简单描述接口的好处.**

答:接口有利于代码的复用,便于维护,在做大项目的时候有接口的话,可以并行开发,提高效率。


**Stack and Queue**
**4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。**

public class Main201521123034 {

public static void main(String[] args) {
	// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String x=sc.next();
ArrayListStringStack list=new ArrayListStringStack();//创建两个栈,ArrayListStringStack使用的接口是实验5-1中的IntegerStack改成了StringStack
ArrayListStringStack list1=new ArrayListStringStack();
char [] arr = x.toCharArray();
for(int i=0;i<arr.length;i++){
	list.push(String.valueOf(arr[i]));
}
int q=arr.length/2;
int k=arr.length%2;
//分两种情况,一种是字符串长度为奇数,另一种是字符串长度为偶数
if(k==0){
	for(int y=1;y<=q;y++){
		list1.push(list.pop());//将字符串的后一半入栈
	}
	 for(int b=0;!list.empty()&&!list1.empty();b++){
	    	if(!list.pop().equals(list1.pop())){//出栈比较字符是否相等
	    		System.out.println("该字符串不是回文");
	    		break;
	    	}
	    	if(list.empty()&&list1.empty()){
	    		System.out.println("该字符串是回文");
	    	}
	    }
}
else{
	
	for(int p=1;p<=q;p++){
		list1.push(list.pop());
		
	}  
    list.pop();//如果长度为奇数,则list要先出栈一次
	 for(int b=0;!list.empty()&&!list1.empty();b++){
	    	
	    	if(!(list.pop().equals(list1.pop()))){
	    		System.out.println("该字符串不是回文");//同样是出栈比较是否相等
	    		break;
	    	}
	    	if(list.empty()&&list1.empty()){
	    		System.out.println("该字符串是回文");
	    		break;
	    	}
	    }
 }

}

}
<table><tr><td bgcolor=frech grey>运行结果</td></tr></table>
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408093430253-1614157548.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408093507675-1836721324.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408093530082-1260939366.png)

**4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)**
    //创建三个队列,A窗口对应queue2,B窗口对应queue1
Queue<String> queue = new LinkedList<String>();
Queue<String> queue1 = new LinkedList<String>();
Queue<String> queue2 = new LinkedList<String>();

    //当奇数的数字只有一个的情况
   if(queue2.size()==1&&queue1.size()!=0){
		System.out.print(queue2.remove()+" ");
		for(;queue1.size()!=0;){
    		if(queue1.size()==1)
    			System.out.print(queue1.remove());
    		else
    			System.out.print(queue1.remove()+" ");
    	}
	}
	else {
    //当奇数的数字个数大于1时的情况
   		for(int p=1;queue2.size()>0;p++){
		if(queue2.size()==1&&queue1.size()==0)
			System.out.print(queue2.remove());
		else
			System.out.print(queue2.remove()+" ");
		if(p==2&&queue1.size()!=0){
			System.out.print(queue1.remove()+" ");
			p=0;
		}
       }
    //若queue2队列已经为空,queue1仍有元素时,按顺序输出queue1剩下的元素
        if(queue1.size()!=0){
    	 for(;queue1.size()!=0;){
    		if(queue1.size()==1)
    			System.out.print(queue1.remove());
    		else
    			System.out.print(queue1.remove()+" ");
    	}
    }

	}

统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
5.1 实验总结

TreeSet strSet = new TreeSet();//创建TreeSet对象

strSet.add(str);//将每个单词添加进strSet

String[] arr = strSet.toArray(new String[strSet.size()] );//将Treeset中的元素转成String类型再输出

答:这题是经老师上课提醒后才做出来的,要考虑到字母顺序排序,所以要用到TreeSet排序,还有输入一段文字时要用while循环,当输入为“!!!!”时结束。



**6.1 伪代码**

int n=0;
//输入字符串并且加入map中
while(sc.hasNext()){
String x=sc.next();
if(x.equals("!!!!!"))
break;
if (!map.contains(x))
map.put(x, 1);
else
n=map.get(x)+1;
map.put(x, n);
}
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() ;//排序

**6.2 实验总结**

答:使用到了映射map,排序需要map转换成list才能调用Collections。


**面向对象设计大作业-改进**
**7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)**
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185517597-1117798919.png)

![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185525816-1454348896.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185536207-961168244.png)

组员:陈凯欣 邱晓娴
本周项目的改动:实现了页面跳转,以及点击按钮实现数量的添加;目前还在研究如何将之前的代码和gui结合在一起,因为这一点还没解决,所以购物车虽然能做得出页面但是没办法完整实现商品数量的显示,另外也还在研究如何把登录的密码改为密文.

**7.2 使用集合类改进大作业**

集合类在一开始设计的时候就有用到

![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185739410-1669414707.png)
#3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407095102207-1700433581.png)

3.2. PTA实验

![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407095207957-1193639474.png)
posted on 2017-04-07 18:17  阿达西哇  阅读(123)  评论(1编辑  收藏  举报