201521123042 《java程序设计》 第八周学习总结

1. 本周学习总结

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

①泛型定义:泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以在集合框架(Collection framework)中看到泛型的动机。

②命名类型的参数:

K —— 键,比如映射的键

V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。

E —— 异常类。

T —— 泛型。
③ 泛型方法:通过在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。泛型类在多个方法签名间实施类型约束。

④其他:

(1)泛型的参数类型可以使用extends语句,例如<T extends superclass>;泛型的参数类型还可以是通配符类型。
(2)泛型的类型参数只能是类类型(包括自定义类),不能是简单类型

2. 书面作业

  • 1.List中指定元素的删除
    题集jmu-Java-05-集合之4-1

  • 1.1 实验总结
      	public static List<String> convertStringToList(String line){
      					String str[]=line.split("\\s+");
      					List<String>string=new ArrayList<String>();
      					for(int i=0;i<str.length;i++){
      						string.add(str[i]);
      					}
      					return string;
      				} 
    

    ①用line.split("\\s+");分隔;

    ②以空格为分隔符,将line转换为List<String>;

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

    ②list中移除掉以与str内容相同的元素,实现此功能使用ArrayList中的方法:

    Ⅰ. list.contains(str):判断list中是否包含str
    Ⅱ. list.remove(str):删除list中str元素。这道题中删除该
    位置的元素时,该位置后面所有元素需要往前移动一位(即i需要减1),这样才能保证所有元素都被检测一次。

  • 2.统计文字中的单词数量并按出现次数排序(尽量不要出现代码)
    题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序

  • 2.1 伪代码(简单写出大体步骤)
        while(true){
          if(x.equals("!!!!!"))break;
              else {
                  if(map.containsKey(x)) map.put(x, map.get(x)+1);
                  else map.put(x, 1); 
              }
          }
      List<Entry<String,Integer>> list =new ArrayList<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) {
              //代码
      })
    
  • 2.2 实验总结

    这道题使用了HashMap,用map.containsKey(x)来判断是否已存在映;,map.get(key)得到键所对应的值; map.put(key, value): 将互相关联的一个关键字与一个值放入该映像,如果关键字已存在,则新的值会代替旧的值;collections.sort()对list进行排序;

  • 3.倒排索引(尽量不要出现代码)
    题集jmu-Java-05-集合之5-4

  • 3.1 截图你的提交结果(出现学号)

  • 3.2 实验总结

    要特别注意当查询的单词不存在的情况,需要多种情况考虑

  • 3.3 伪代码(简单写出大体步骤)

    存放:

      while (!lineword.equals("!!!!!")) {  
       String[] words = temp.split(" ");  
          for (String word : words) {  
          if(index.containsKey(word)){
            subIndex=index.get(word);	
          }
          index.put(word, subIndex.add(line););
          }  line++;
         }
    

    查找:

      if (temp1.length() == 0) {
      			System.out.println("found 0 results");
      		}
      	 
      	 if (!index.containsKey(s)) {
      		   System.out.println("found 0 results");
      		 } 
      	     subIndex1 = index.get(s);
      	 if (subIndex1.size()==0) {
      				System.out.println("found 0 results");
      			} 
      	else {
      		System.out.println(subIndex1);
      			}
    
  • 4.Stream与Lambda
    编写一个Student类,属性为:

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

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

  • 4.1 使用传统方法编写一个方法,将id>10,name为zhang, age>20, gender为女,参加过ACM比赛的学生筛选出来,放入新的集合。在main中调用,然后输出结果。
      public  ArrayList<Student> choose(ArrayList<Student> arrayList){for (Student student :list) {
          if (student.getId() > 10L && student.getName().equals("zhang")
                  && student.getAge() > 20 && student.getGender().equals(Gender.女)&& student.isJoinsACM()) {
              				System.out.println(student);
          	}}
    

    结果:

  • 4.2 使用java8中的stream(), filter(), collect()编写功能同4.1的函数,并测试。
      ArrayList<Student> list1 =(ArrayList<Student>) list.stream().filter(stu -> (stu.getId()>10l&&stu.getName().equals("zhang")&&stu.getAge()>20&&stu.getGender().equals(Gender.女)&&stu.isJoinsACM())).collect(Collectors.toList());
      		for (int i = 0; i < list1.size(); i++) {
      			System.out.println(list1.get(i));
      		}
    

    结果:

  • 4.3 构建测试集合的时候,除了正常的Student对象,再往集合中添加一些null,然后重新改写4.2,使其不出现异常。

加个判断stu不为空的情况即可:stu != null

	ArrayList<Student> list1 =(ArrayList<Student>) list.stream().filter(stu -> (stu!=null&&stu.getId()>10l&&stu.getName().equals("zhang")&&stu.getAge()>20&&stu.getGender().equals(Gender.女)&&stu.isJoinsACM())).collect(Collectors.toList());
					for (int i = 0; i < list1.size(); i++) {
						System.out.println(list1.get(i));
					}
  • 5.泛型类:GeneralStack
    题集jmu-Java-05-集合之5-5 GeneralStack

  • 5.1 截图你的提交结果(出现学号)

  • 5.2GeneralStack接口的代码
       interface GeneralStack<T>{
      	public T push(T item);            //如item为null,则不入栈直接返回null。
      	public T  pop();                 //出栈,如为空,则返回null.
      	public T  peek();                //获得栈顶元素,如为空,则返回null.
      	 public boolean empty();//如为空返回true
      	 public int size();     //返回栈中元素数量
      }
    
  • 5.3 结合本题,说明泛型有什么好处

    泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型的类型参数可以有多个 。题5-5需要我们实现栈中存放多种类型的数据,通过泛型我们既可以实现这个操作。如果不用泛型,我们就需要编写多个类型的栈。部分代码如下:

      class ArrayListGeneralStack<T> implements GeneralStack<T>{
      	 private List<T> list;
            public ArrayListGeneralStack() {
        		list=new ArrayList<T>();
         	}  
      ArrayListGeneralStack<Integer> stack=new ArrayListGeneralStack<Integer>();
      ArrayListGeneralStack<Double> stack=new ArrayListGeneralStack<Double>()>.
    

    ①通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全;

    ②消除了强制类型转换,减小代码出错的可能性

  • 6.泛型方法
    基础参考文件GenericMain,在此文件上进行修改。

  • 6.1 编写方法max,该方法可以返回List中所有元素的最大值。List中的元素必须实现Comparable接口。编写的max方法需使得String max = max(strList)可以运行成功,其中strList为List类型。也能使得Integer maxInt = max(intList);运行成功,其中intList为List类型。
       public class GenericMain {
      	public static<T extends Comparable<T>> T max (List<T>list){
      		Collections.sort(list);
      		T max=list.get(list.size()-1);
      		return max;
      	}
      
      	public static void main(String[] args) {
      		List<String>strList=new ArrayList<String>();
              List<Integer>intList=new ArrayList<Integer>();
             strList.add("b"); 
             strList.add("a");
              intList.add(1);
              intList.add(2);
              String max = max(strList);
             Integer maxInt = max(intList);
             System.out.println("Stringmax="+max);
             System.out.println("Intmax="+maxInt);
      	}
      }
    

    运行结果:

  • 6.2 选做:现有User类,其子类为StuUser,且均实现了Comparable接口。编写方法max1,基本功能同6.1,并使得max1(stuList);可以运行成功,其中stuList为List类型。
      public class GenericMain {
      	public static<T extends StuUser> T max1 (List<T>list){
      		Collections.sort(list,new StuUserComparator());
      		
      		return list.get(list.size()-1);
      	}
      
      	public static void main(String[] args) {
      		 List<StuUser>stuList=new ArrayList<StuUser>();
      		 stuList.add(new StuUser(18,"111"));
      		 stuList.add(new StuUser(17,"222"));
      		 System.out.println(max1(stuList));
      	}
      }
    

    运行结果:

  • 6.3 选做:编写int myCompare(T o1, T o2, Comparator c)方法,该方法可以比较User对象及其子对象,传入的比较器c既可以是Comparator,也可以是Comparator。注意:该方法声明未写全,请自行补全。
      public static<T extends User>int myComoare (T o1, T o2, Comparator c){
      		 return c.compare(o1,o2);
      			}
      		public static void main(String[] args) {
      		 List<StuUser>stuList=new ArrayList<StuUser>();
      		  if(myComoare(new StuUser(18,"111"),new StuUser(17,"222"),new StuUserComparator())>0){
      		        System.out.println("first person is first");
      		    }else{
      		        System.out.println("Second person is Second");
      		    }
      		    if(myComoare(new StuUser(18,"111"),new User(19),new UserReverseComparator())>0){
      		        System.out.println("first person is older");
      		    }
      		    else{
      		        System.out.println("Second person is older");
      		 
      	}
      }
    

    结果:

  • 7.选做:逆向最大匹配分词算法
    集合实验文件中的第07次实验(集合).doc文件,里面的题目6.

  • 7.1 写出伪代码即可
  • 7.2 截图你的代码运行结果。
  • 8.选做:JavaFX入门
    完成其中的作业1、作业2。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。

3. 码云上代码提交记录及PTA实验总结

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

  • 3.1. 码云代码提交记录

posted @ 2017-04-15 18:49  ballon  阅读(241)  评论(0编辑  收藏  举报