201621123005《java程序设计》第八次实验总结

201621123005《Java程序设计》第八次实验总结


  1. 本周学习总结

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

  1. 书面作业

  1. ArrayList代码分析


1.1 解释ArrayList的contains源代码

public boolean contains(Object o) {
    return indexOf(o) >= 0;
  }  
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

当元素不为null时,调用equals()方法来确定元素是否存在,当存在是返回true,否则返回false
1.2 解释E remove(int index)源代码

public E remove(int index) {
    rangeCheck(index);
    modCount++;
    E oldValue = elementData(index);
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null;           
    return oldValue;
}

先判断数组是否越界,当不越界时,将对应的元素取出来,然后把后面所有的元素往前,最后返回被删除的元素。原来最后一个元素位置为null
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的具体类型吗?
不需要,因为是用Object数组实现,而Object类又是所有类的父亲,所以不需要考虑。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?

public boolean add(E e) {
    ensureCapacityInternal(size + 1);//判断空间是否足够,不够就扩充
    elementData[size++] = e;//容量增一,在尾部增加
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
         {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);        }

        ensureExplicitCapacity(minCapacity);
    }

当elementData是默认的长度的空数组的时,就确保数组容量是传入参数和默认长度的最大值。

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
      if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

modCount先自增,当数组容量不够时,调用grow()方法。

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)//判断容量够不够
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

所以当数组容量不够时,数组容量会对数组进行自动扩容并把原数组的值拷贝到这个数组中。
1.5 分析private void rangeCheck(int indeyo'ox)源代码,为什么该方法应该声明为private而不声明为public?
因为类的用户是不需要知道remove()的时候具体发生了什么,只需要知道是否正确删除就可以了。


2、HashSet原理

2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
首先计算哈希码的值即调用hashCode方法,然后根据哈希码查找对应存储位置,如果指定位置已有其他元素,则调用equals方法与已有元素进行比较,如果比较结果为假,则将元素插入,如果为真,则用新的值替换旧的值。
2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)
时间复杂度是o(1),因为添加的时候是通过哈希算法来确定元素的添加位置,判断次数是常量。


3、 ArrayListIntegerStack

题集jmu-Java-05-集合之ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
存储方式不同,上次运用数组存储,这次用动态数组,相比动态数组简简洁很多,比如动态数组在获取栈顶元素或出栈都可以直接运用size()来获得栈顶位置,然后进行操作,而数组则需定义一个top指针。
3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。
先定义一个接口,在接口内存放接口的名称,然后在类里面根据所需要的功能去重写这些方法,如果想要修改时就直接在类里面修改,想要增加时就只需要在接口中添加想要的,然后在类里面去编写这个方法,所以就是很方便而且灵活。


4、 Stack and Queue

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

package week9;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

interface IntegerStack{
		public Integer push(Integer  item);
		public Integer pop(); 
	}

class ArrayInterStack implements IntegerStack{
	private List<Integer> list;
	public ArrayInterStack (){
		list=new ArrayList<Integer>();
	}
	@Override
	public Integer push(Integer  item) {
		// TODO Auto-generated method stub
		if (item == null)
            return null;
        list.add(item);
        return item;
   
		
	}

	@Override
	public Integer pop() {
		// TODO Auto-generated method stub
		
		if (list.isEmpty())
            return null;
        return list.remove(list.size() - 1);
   
	
	}
	@Override
	public String toString() {
		return list.toString();
	}
}
public class Main201621123005{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayInterStack arr=new ArrayInterStack();
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		char ch[]=str.toCharArray();
		for (int i = 0; i < str.length(); i++) {
			arr.push((int) ch[i]);
			}
		for (int i = 0; i < ch.length; i++) {
			if(ch[i]==arr.pop())
			{	
				System.out.println("huiwen");
				break;
			}
			
			else
				{
				System.out.println("buhuiwen");
				break;
				}
		}
		}
}

4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?
把A,B窗口存放的人放在两个队列

Queue<Integer> dequeA=new ArrayDeque<>();
    	Queue<Integer> dequeB=new ArrayDeque<>();

根据奇偶入队

if(m%2==0){
    		{	dequeB.add(m);
    		
    		}
    		else
    			dequeA.add(m);
			}
    	}

输出操作

while(dequeA.size()!=0||dequeB.size()!=0){
    		if(dequeA.size()>=2&&dequeB.size()>=1)
    		{
    			//
    		}
    		
		else if(dequeA.size()<2&&dequeB.size()>=1){
			//
				}
		else if(dequeA.size()>=2&&dequeB.size()<1)
		{
		    //
		}
		else
			System.out.print(dequeA.remove());
	
	}

5、 统计文字中的单词数量并按单词的字母顺序排序后输出
5.1 实验总结
用Set集时可以避免重复元素进入,而且TreeSet使字符排序。

for (String e : words) {
			if(i<10)
			{	i++;
			
			System.out.println(e);
			}
			else break;
			
		}

用如上来输出排名前十的字符。


6、 选做:统计文字中的单词数量并按出现次数排序

6.1 伪代码

创建HashMap对象map;
读入字符串;
当遇到!!!!!时退出;
当map中不存在word时times=1;
当map中存在word时times+1;
创建ArrayList对象list;
用Collections.sort()排序;
输出map长度;
输出前十个数据;

6.2 实验总结

List<Map.Entry<String,Integer>> list=new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
		Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
			public int compare(Map.Entry<String,Integer>o1,Map.Entry<String,Integer>o2)
			{
				if(o1.getValue()==o2.getValue()){
					return o1.getKey().compareTo(o2.getKey());
				}
				if( o1.getValue()>o2.getValue())
					return -1;
				else 
					return 1;
				
					
			}
		});

这道题是主要把Map中的键值对放进ArrayList,然后用Collections.sort()排序。


3.码云及PTA

题目集:jmu-Java-05-集合

3.1. 码云代码提交记录

3.2 截图PTA题集完成情况图

3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
2 381 381 12 5
3 661 280 19 7
4 974 313 24 5
5 1358 384 33 9
6 2211 853 37 4
7 4623 412 42 5

posted on 2017-11-11 18:31  网路1611张凯艳  阅读(186)  评论(3编辑  收藏  举报

导航