CSDN:https://blog.csdn.net/weixin_41357182

导航

201621123001 《Java程序设计》第9周学习总结

1. 本周学习总结

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

1.2 选做:收集你认为有用的代码片段

  • 关于泛型
<T extends Comparable <T> > T max(List<T>list) 
//编写方法max可以返回list中所有元素最大值,List中元素实现Comparable接口
//通配符的超类型
Pair <? super Manager >result;

  • 关于stream(), filter(), collect()
  List<Integer>integerList = new ArrayList<>();
        integerList.stream().filter(e -> e>5).collect(Collectors.toList());
 //实现功能:将所有大于5的生成一个新的List对象       

2. 书面作业

本次作业题集集合

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

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

Answer:本题要求编写两个函数covnertStringToList函数remove函数。将元素以空格为分隔符直接用sc.next()实现即可,放入列表中直接可以用add()方法,返回列表。移除相同元素可遍历列表,用equals方法比较,在删除元素的时候我是直接用list.remove(int)实现,值的注意的是从size-1开始反向遍历。

在List中删除元素的方法:

  • 直接用List中的remove
 public static void remove(List<String> list, String str){
        for (int i = list.size()-1;i >= 0;i--){
            if (str.equals(list.get(i))){
                list.remove(i);
            }
        }
    }    
  • 用迭代器Iterator的remove
 public static void remove(List<String> list, String word) {
        for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
            String str = (String) iterator.next();
            if (str.equals(word))
                iterator.remove();
        }
    }
        

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

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

Answer:

get str
if str.equals("!!!!!")
	break;
else if contains str -> change value
else put
compare value
print

2.2 实验总结

Answer:因为这道题是上周写的,实验总结已经在上一周的博客中写过了。(再做点补充好了)

  • 本题选用Map,定义为:
Map<String,Integer> treeMap = new TreeMap<String,Integer>();
  • 因为要统计出每个单词出现的次数,就需要改变键所对应的值
	if (str.equals("!!!!!")){
                break;
            }

	else if(!treeMap.containsKey(str))
                treeMap.put(str, 1);
	else{
                int n = treeMap.get(str);
                treeMap.put(str, n + 1);

            }

  • 要求按照出现次数排序,就用到了lambda表达式比较值
Collections.sort(list,((o1, o2) -> o2.getValue().compareTo(o1.getValue())));

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

本题较难,做不出来不要紧。但一定要有自己的思考过程,要有提交结果。

3.1 截图你的代码运行结果

运行结果:

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

while sc.hasNextLine()
输入 line
if line.equals("!!!!!") break;
String[] word = line.split(" ");
遍历word[]
 if (map.containsKey(word[i]))
      number = map.get(word[i]);
number.add(行数);
map.put(单词, 行数的集合);
print all;

输入查询关键字
遍历每一行
if (某行contains关键字)
           在集合中加入行号
如果没找到 print("found 0 results");
如果找到 print(行集与行集内每一行的内容);
	

3.3 实验总结

Answer:

  • 定义一个动态数组储存输入的每一行(刚开始时候没有定义这个,导致后面查找关键字无从下手),以及定义一个集合(形成单词与所在行数的集的映射)
 ArrayList<String> words = new ArrayList<String>();
 TreeMap<String,Set<Integer>> map = new TreeMap<String,Set<Integer>>();       
  • 在查找关键字时候真的是逻辑混乱,理一下:输入了一行,然后空格分割每个单词,在每一行中遍历,保证输入的每一个单词都在每一行进行查找,如果有一个单词不包含,那就跳过这行。否则就可以加入行数。

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(Long id, String name, int age, Gender gender, boolean joinsACM),然后调用该方法将id>某个值,name为某个值, age>某个值, gender为某个值,参加过ACM比赛的学生筛选出来,放入新的集合。在main中调用,然后输出结果。(截图:出现学号、姓名)

选用id> 3L ,name=zhangyilin,age>17,gender=Famale,参加过ACM比赛

截图:

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

 List<Student>result = Arrays.stream(students)
                .filter(student -> student!=null && student.getId()>3L
                        && student.getName().equals("zhangyilin")
                        && student.getAge()>17
                        && student.getGender().equals(Gender.Famale)
                        && student.isJoinsACM()
                ).collect(Collectors.toList());


截图:

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相比,说明泛型有什么好处

Answer:以前作业中的ArrayListIntegerStack一旦定义完毕,就只能存放Integer数据类型。但是如果这个栈还需要操作其他的数据类型呢?这时候就可以定义成泛型的,即没有明确定义是哪一个类型,因为对所有类型数据都适用,那它就是公用的,这么一来,就可以免去了定义很多个不同数据类型的操作。岂不是美滋滋,就可以减少很多不必要的代码。

6. 选做:泛型方法

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

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

max方法:

public static <E extends Comparable<E>> E max(List<E> list){         
            Collections.sort(list);
            return list.get(list.size()-1);
        }

截图:

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

max1方法:

 public static <E extends Comparable<? super E> > E max1(List<E> list,Comparator<? super E>age){
            Collections.sort(list,age);
            return list.get(list.size()-1);

        }

截图:

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

int myCompare(T o1, T o2, Comparator c)方法:

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

截图:

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

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

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

Answer:

wordset.add(word)
line = sc.nextLine 
for i =  line.length -> 0 
	for j= 0 -> i 
		if(wordset.contains(line.sub(j,i)))
			list1.add();
	if (no found )
		list1.add(line.sub(j-1,i));
for i = list1.size-1 -> 0
	print		

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

3.码云及PTA

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

3.1. 码云代码提交记录

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

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)

3.3 统计本周完成的代码量

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

周次 总代码量 新增代码量 总文件数 新增文件数
1 374 374 5 5
2 889 515 15 10
3 1417 528 22 7
4 1838 421 27 5
6 2608 770 38 11
7 3270 662 48 10
8 4068 798 52 4
9 4543 475 60 8
10 4988 445 65 5

我原来的目标就是每周代码量在百行,目前看来,每周都达到了。

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

尝试从以下几个维度评估自己对Java的理解程度

维度 程度
语法 PTA的题目基本能搞定,常用的语法可以熟练运用。有个别题目还是需要寻求帮助。
面向对象设计能力 目前主要思想就是面向对象编程,但是如果要说可以熟练的使用面向对象思想为所要解决的问题建模,我觉得说不上熟练但是应该是可以的。
应用能力 貌似还没有使用Java编写过什么实用简单的小工具
至今为止代码行数 4988

选做:5.使用Java解决实际问题

有n门课程,每个学生对每门课程都有几个不懂的问题(每题都有标号)。教师期望对所有学生的问题进行归类,首先对问题按课程分类,在某类中又将同一个学生的题目归类在一起。现有的操作流程,是每个学生把自己的各科目中不懂得题目按课程分类号后发给学习委员,学习委员进行统一汇总。现在希望编写一个程序,帮助学习委员分类,并统计每门课程中哪些题目不懂率最高。尝试写出解决该问题的大概步骤?每个学生发给学习委员的文件内容应遵循一定规范方便程序处理,尝试写出该规范。

Answer:

  • 大概步骤:

    1. 输入学生名字和不会的问题标号
    2. 将问题存放在Map的键中,将学生姓名加入到相应的键的值集合中。
    3. 最后比较值集合的大小,可统计每题不懂的人数。
  • 规范:

    姓名 问题标号 问题标号 问题标号

  • 运行截图:

posted on 2017-11-17 09:28  一个0010  阅读(471)  评论(1编辑  收藏  举报