• 201521123034《Java程序设计》第七周学习总结


    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)
  • 相关阅读:
    005本周总结报告
    《大道至简》读后感
    004本周总结报告
    003本周总结报告
    002本周总结报告
    001本周总结报告
    【财经】股市是不是零和博弈?
    【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换
    【Java每日一题】20170217
    【Java每日一题】20170216
  • 原文地址:https://www.cnblogs.com/carol520123/p/6679465.html
Copyright © 2020-2023  润新知