• 201621123008 《Java 程序设计》 第九周学习总结


    1. 本周学习总结

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

    2. 书面作业

    本次作业题集集合

    1. List中指定元素的删除(题集题目)

    1.1 实验总结。并回答:列举至少2种在List中删除元素的方法。

    总结:在做这道题的时候我是通过for循环正向遍历进而删除的,刚开始没注意到删除一个元素时i的变化导致答案错误,思考之后发现每删除一个元素i的值都要减一。

    以该题为例列举了三种删除方法:

    • 方法一
    public static void remove1(List<String> list, String str) {
    
    		for (int i = 0; i < list.size(); i++)
    			if (list.get(i).equals(str)) {
    				list.remove(i);
    				i -= 1;
    			}
    

    分析:该方法是通过正向遍历删除某一元素的,每删除一个元素i的值减一。

    方法二

    public static void remove2(List<String> list, String str) {
    		for(int i=list.size()-1;i>=0;i--) {
    			if (list.get(i).equals(str)) {
    				list.remove(i);
    			}
    			
    		}
    	}
    

    分析:该方法通过逆向遍历删除某一元素,此时i的值不受影响。

    方法三

    public static void remove3(List<String> list, String str) {
    		Iterator iterator=list.iterator();
    		while(iterator.hasNext()) {
    			if(iterator.next().equals(str)) {
    				iterator.remove();
    			}
    		}
    	}
    

    分析:使用迭代器进行删除要方便很多,但是要注意remove()之前要有next()

    其他

    也可以用stream(), filter(), collect()进行过滤,从而达到删除的目的。

    补充: Iterator实现原理

    2. 统计文字中的单词数量并按出现次数排序(题集题目)

    2.1 伪代码(不得复制代码,否则扣分)

    创建TreeMap对象
    进入循环按行读入字符串,以!!!!!跳出循环。
    对每行字符串使用split("\s+")分割。
    判断单词是否存在,不存在则加入,value置为1,存在则不加入,value+1;输出该对象的长度。
    创建List对象:List<Entry<String,Integer>> list=newArrayList<Map.Entry<String, Integer>>(map.entrySet());
    使用Collection.sort对List对象进行排序,按照value进行升序。
    使用Entry<String,Integer>entry=list.get(i);                      entry.getKey()    entry.getValue()   输出映射。
    

    2.2 实验总结

    总结:新学的知识点

    Map.Entry: Map的内部接口,表示一个Map实体,即key-value键值对。内含有getKey(), getValue方法。

    3. 倒排索引(题集题目)

    3.1 截图你的代码运行结果

    3.2 伪代码(不得复制代码,否则扣分)

    创建两个TreeMap对象:wordMap,key为单词value为ArrayList对象存放单词所在行数;rowMap,key为具体的行数,value为该行的内容。
    按一行一行的去读取字符串,将字符串进行分割,把分割出来的单词放入wordMap,如果单词不存在则加入wordMap,生成新的ArrayList对象将当前行数加入,如果单词存在则取出value,判断当前行数是否在value中,若不在则加入,遇到!!!!!时结束读取。
    使用wordMap.forEach((key, value) -> System.out.println(key + "=" + value));输出单词即对应的行数。
    接收查询关键字,对查询关键字进行分割,通过for循环遍历每个单词,找出所有单词共有的行数。
    输出共有的行数。
    
    

    3.3 实验总结

    总结:因为是用List存放行数信息,可能会有重复的行数出现,过程中排除重复的行数就可以了。

    4.Stream与Lambda

    编写一个Student类,属性为:

    private Long id;
    private String name;
    private int age;
    private Gender gender;//枚举类型
    private boolean joinsACM; //是否参加过ACM比赛
    

    创建一集合对象,如List,内有若干Student对象用于后面的测试。

    4.1 使用传统方法编写一个搜索方法List<Student> search(List<Student> stuList, Long id, String name, int age, Gender gender, boolean joinsACM),然后调用该方法将id>某个值,name为某个值, age>某个值, gender为某个值,参加过ACM比赛的学生筛选出来,放入新的集合。在main中调用,然后输出结果。(截图:出现学号、姓名)

    具体代码

    	public static List<Student> search1(List<Student> studentList,Long id, String name, int age, Gender gender, boolean joinsACM) {
    		List<Student> ACMStudents = new ArrayList<>();
    		Student s = new Student(id, name, age, gender, joinsACM);
    		for (int i = 0; i < studentList.size(); i++) {
    			if (studentList.get(i) != null) {
    				if (joinsACM == true) {
    					if (studentList.get(i).equals(s)) {
    						ACMStudents.add(s);
    
    					}
    				}
    			}
    		}
    		return ACMStudents;
    
    	}
    

    输入数据:

            List<Student> studentList = new ArrayList<>();
    		studentList.add(new Student(001l, "张三", 18, Gender.MAN, true));
    		studentList.add(new Student(002l, "李四", 18, Gender.MAN, false));
    		studentList.add(null);
    		studentList.add(new Student(003l, "王二", 18, Gender.MAN, true));
    		studentList.add(null);
    		studentList.add(new Student(004l, "麻子", 18, Gender.MAN, false));
    
    Student.search2(studentList,001l, "张三", 18, Gender.MAN, true)
    
    

    输出数据:

    周文华 201621123008
    [Student [id=1, name=张三, age=18, gender=MAN, joinsACM=true]]
    

    4.2 使用java8中的stream(), filter(), collect()编写功能同4.1的代码,并测试(要出现测试数据)。构建测试集合的时候,除了正常的Student对象,再往集合中添加一些null,你编写的方法应该能处理这些null而不是抛出异常。(截图:出现学号)

    函数代码

    public static List<Student> search2(List<Student> studentList,Long id, String name, int age, Gender gender, boolean joinsACM){
    		Student s = new Student(id, name, age, gender, joinsACM);
    		List<Student> ACMStudents = studentList.stream().filter(e->e!=null&&e.equals(s)).collect(Collectors.toList());
    		return ACMStudents;
    		
    	}
    

    输入数据同上

    输出数据:

    周文华 201621123008
    [Student [id=1, name=张三, age=18, gender=MAN, joinsACM=true]]
    

    5. 泛型类:GeneralStack

    题集jmu-Java-05-集合之GeneralStack

    5.1 GeneralStack接口的代码

    interface GeneralStack<E>{
    	public E push(E item); 
    	public E pop();             
    	public E peek();           
    	public boolean empty();         
    	public int size();             
    }
    

    5.2 结合本题与以前作业中的ArrayListIntegerStack相比,说明泛型有什么好处

    分析:之前都是建立一个Integer类型的数组,只能存放Integer类型的数据,这就有了局限性,如果想存入String类型的就不可以,使用泛型之后就使的代码更具有适用性了;我们在使用ArrayList时其内部采用Object数组存储,如果不指定类型,后面就要自己再进行强制类型转换,指定类型之后就消除了强制类型转换,也提高了类型安全。

    6. 选做:泛型方法

    基础参考文件GenericMain,在此文件上进行修改。

    6.1 编写方法max,该方法可以返回List中所有元素的最大值。List中的元素必须实现Comparable接口。编写的max方法需使得String max = max(strList)可以运行成功,其中strListList类型。也能使得Integer maxInt = max(intList);运行成功,其中intListList类型。注意:不得直接调用Collections.max函数。

    函数代码

    	public static <T extends Comparable<T>> T max(List<T> list) {
    		T max = list.get(0);
    
    		for (int i = 0; i < list.size(); i++) {
    			if (max.compareTo(list.get(i)) < 0)
    				max = list.get(i);
    		}
    		return max;
    
    	}
    	
    

    测试代码

    		List<Integer> intList = new ArrayList<>();
    		intList.add(1);
    		intList.add(2);
    		intList.add(3);
    		intList.add(4);
    		System.out.println(max(intList));
    		
    		List<StuUser> stuList=new ArrayList<>();
    		stuList.add(new StuUser(10, "10"));
    		stuList.add(new StuUser(10, "11"));
    		stuList.add(new StuUser(13, "20"));
    		stuList.add(new StuUser(13, "11"));
    		System.out.println(max1(stuList));
    

    输出结果

    4
    4
    

    6.2 选做:现有User类,其子类为StuUser,且均实现了Comparable接口。编写方法max1,基本功能同6.1,使得User user = max1(stuList);可以运行成功,其中stuListList类型。也可使得Object user = max(stuList)运行成功。

    函数代码

    	public static <T extends StuUser> T max1(List<T> list) {
    		T max=list.get(0);
    		for (int i = 0; i < list.size(); i++) {
    			if (max.compareTo(list.get(i)) < 0)
    				max = list.get(i);
    		}
    		return max;
    		
    		
    	}
    

    测试代码

    List<StuUser> stuList=new ArrayList<>();
    		stuList.add(new StuUser(10, "10"));
    		stuList.add(new StuUser(10, "11"));
    		stuList.add(new StuUser(13, "20"));
    		stuList.add(new StuUser(13, "11"));
    		System.out.println(max1(stuList));
    		
    		List<Object> objList=new ArrayList<>();
    		objList.add(stuList);
    		System.out.println(max1(stuList));
    

    输出结果

    StuUser [no=20, toString()=User [age=13]]
    StuUser [no=20, toString()=User [age=13]]
    

    6.3 选做:编写int myCompare(T o1, T o2, Comparator c)方法,该方法可以比较两个User对象,也可以比较两个StuUser对象,传入的比较器c既可以是Comparator,也可以是Comparator。注意:该方法声明未写全,请自行补全。

    函数代码

    	public static <T extends User> int myCompare(T o1,T o2,Comparator<T> c) {
    		return c.compare(o1, o2);
    		
    	}
    

    测试代码

    	User user1=new User(5);
    		User user2=new User(20);
    		System.out.println(myCompare(user1, user2, new UserReverseComparator()));
    		
    		StuUser stu1=new StuUser(10, "10");
    		StuUser stu2=new StuUser(10, "12");
    		System.out.println(myCompare(stu1, stu2, new StuUserComparator()));
    

    输出结果

    15
    -2
    

    7. 选做:逆向最大匹配分词算法

    集合实验文件中的第07次实验(集合).doc文件,里面的题目6.

    7.1 写出伪代码(不得直接复制代码)

    伪代码

    将词表放入HashSet。
    创建一个ArrayList对象用于存储该句子中词。
    设置一个front指针,初始化为0;
    进入循环:while (sentence.length() != 0)
    设置最大词长度:maxLength = sentence.length();
    令String temp = sentence.substring(front, maxLength);
    如果temp在词表中存在则加入2所创建的ArrayList对象,将temp删除:sentence = sentence.replace(temp, "");,将front置为0;如果在词表中不存在则front+1,进行front>=maxLength判断,为true跳出循环。
    逆向输出ArrayList对象中的内容。
    

    源代码

    public static void main(String[] args) {
    
    		Set<String> wordsSet = new HashSet<>();
    		Scanner sc = new Scanner(System.in);
    		String[] words = sc.nextLine().split("\s+");
    
    		for (String str : words) {
    			wordsSet.add(str);
    		}
    
    		while (true) {
    			List<String> newList = new ArrayList<>();
    			String sentence = sc.nextLine();
    			int front = 0;
    
    			while (sentence.length() != 0) {
    				int maxLength = sentence.length();
    				String temp = sentence.substring(front, maxLength);
    				if (wordsSet.contains(temp)) {
    					newList.add(temp);
    					sentence = sentence.replace(temp, "");
    					front = 0;
    				} else {
    					front += 1;
    					if(front>=maxLength)
    						break;
    				}
    			}
    
    			if (newList.size() > 0) {
    				System.out.print(newList.get(newList.size() - 1));
    				if (newList.size() > 2)
    					for (int i = newList.size() - 2; i >= 0; i--)
    						System.out.print(" " + newList.get(i));
    			}
    			System.out.println();
    
    		}
    
    	}
    

    7.2 截图你的代码运行结果。

    3.码云及PTA

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

    3.1. 码云代码提交记录

    • 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

    3.2 截图PTA题集完成情况图



    3.3 统计本周完成的代码量

    需要将每周的代码统计情况融合到一张表中。
    自己的目标能实现吗?

    周次 总代码量 新增文件代码量 总文件数 新增文件数
    1 665 20 20 20
    2 1705 23 23 23
    3 1834 30 30 30
    4 1073 1073 17 17
    5 1073 1073 17 17
    6 2207 1134 44 27
    7 3292 1085 59 15
    8 3505 213 62 3
    9 8043 1246 153 16
    10 8606 543 167 14

    4. 评估自己对Java的理解程度

    • 尝试从以下几个维度评估自己对Java的理解程度
    维度 程度
    语法 还有很多的语法需要去学习,还需要多加练习。
    面向对象设计能力 这方面做的也不是很好,可能只会一些基本的吧,要学习的地方太多太多太多
    应用能力 感觉自己只是学到了一点皮毛,更深的知识和技术都还没学到,不知道自己能不能做的出来
    至今为止代码行数 8606
  • 相关阅读:
    Unity 3D 一个简单的角色控制脚本
    Unity3D 纹理偏移(TextureOffset)浅析
    递归函数的原理
    彻底搞定 C/C++ 指针
    zygote的分裂
    SystemServer分析
    Zygote原理学习
    Vmware Linux虚拟机磁盘扩容方法
    Ubuntu12.04 64bit版本下载Android源码完整教程
    Android2.2源码属性服务分析
  • 原文地址:https://www.cnblogs.com/Dzwh/p/7841477.html
Copyright © 2020-2023  润新知