20172311《程序设计与数据结构》第五周学习总结

教材学习内容总结

第九章 排序与查找

一丶查找

  • 查找的方法主要包括线性查找法和二分查找法
  • 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该指定目标并不存在
  • 二分查找的复杂度是对数级的,这使得他对于大型查找池非常有效率
  • 为了能查找某一对象,我们必须能够将一个对象跟另一个对象进行比较。因此,所涉及的元素实现了Comparable接口且彼此是可比较的
  • Java程序的main方法必须用static修饰符来声明。这样,解释器不用实例化含有main的类的对象,就可以调用main方法
  • 静态方法不是作用于具体的对象中,因而不能引用实例变量,只可以引用静态变量
  • 要创建一个泛型方法,只需要在方法头的返回类型前插入一个泛型声明即可,且泛型声明必须位于返回类型之前
public static <T extends Comparable<T>>boolean
      linearSearch(T[] data,int min,int max,T target)

二丶排序

  • 排序是这样一个过程,即基于某一标准,将某一组项目按照某个规定顺序排列
  • 基于效率排序算法通常也分为两类 :顺序排序和对数排序,其中顺序排序包括选择排序、插入排序和冒泡排序,对数排序包括快速排序法和归并排序法
  • 基数排序并不是基于排序关键字来比较排序项,而是基于排序关键字的结构。对于排序关键字中每个数字/字符的每种可能取值,都会创建一个单独的队列。队列的数目就称为基数

教材学习中的问题和解决过程

  • 问题:创建泛型方法与创建一个引用泛型参数的类有何区别?

  • 问题解决方案:

泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map
一个最普通的泛型类:

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{ 
    //key这个成员变量的类型为T,T的类型由外部指定  
    private T key;

    public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
        this.key = key;
    }

    public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
        return key;
    }
}  
//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
//传入的实参类型需与泛型的类型参数类型相同,即为Integer.
Generic<Integer> genericInteger = new Generic<Integer>(123456);

//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic<String> genericString = new Generic<String>("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());  

注意

  • 泛型的类型参数只能是类类型,不能是简单类型

泛型方法

在java中,泛型类的定义非常简单,但是泛型方法就比较复杂了。

尤其是我们见到的大多数泛型类中的成员方法也都使用了泛型,有的甚至泛型类中也包含着泛型方法,这样在初学者中非常容易将泛型方法理解错了。

泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。

/*
 泛型方法的基本介绍
 传入的泛型实参
 return T 返回值为T类型
 说明:
   1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
   2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
   3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
   4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
 */
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
  IllegalAccessException{
        T instance = tClass.newInstance();
        return instance;
}  

代码调试中的问题和解决过程

  • 问题:使用线性查找法对Contact类对象进行查找时出现错误,查找数组中已有对象返回false

  • 问题解决方案:

线性查找法代码

//线性查找法
    public static <T> boolean linearSearch(T[] data, int min, int max, T target)
    {
        int index = min;
        boolean found = false;

        while (!found && index <= max)
        {
            found = data[index].equals(target);
            index++;
        }
        return found;
    }  

通过与结对伙伴讨论得知.equals方法是Object类里的方法,对Object类对象能够正常使用,但是对自己创建的类不能正常使用,Contact类就是自己写的类,判断是否相等必须自己再写一个判断是否相等的方法来实现。

自己写的判断Contact对象是否相等的方法的代码 、

 public boolean equal(Contact other){
        if (lastName.equals(other.lastName)&&firstName.equals(other.firstName)&&phone.equals(other.phone))
            return true;
        else 
            return false;
    }  

代码托管

上周考试错题总结

上周无错题!!!

结对及互评

  • 本周结对学习情况
    本周主要对查找和排序方法进行了较为深入的学习,我跟我的结对小伙伴对诸多问题进行了较为深入的讨论,并最终使得问题得以解决,通过结对学习较大提高了学习的效率,还是非常的开心的!

感想

本周的主要学习内容是对查找和排序方法的实现的学习,有一个较深的感触就是理解算法与实现算法还是有较大距离的,在算法的实现过程中总会出现各种各样的bug,需要耐下心来通过调试解决问题!本周收获还是挺多的,继续努力吧!!!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 4/4
第二周 464/464 1/2 10/14 理解掌握了用数组和链表实现栈的方法
第三周 494/958 1/3 10/24 理解掌握了用数组和链表实现队列的方法
第四周 1629/2587 2/5 20/44 对用链表和数组实现列表进行了学习
第五周 856/3443 2/6 15/59 较为深入的学习了查找和排序方法的实现
  • 计划学习时间:20小时

  • 实际学习时间:15小时

  • 改进情况:提高学习的效率,保证学习的质量,遇到难题不要慌,耐下心来解决问题!!!

参考资料

posted on 2018-10-17 18:37  socialsea  阅读(267)  评论(2编辑  收藏  举报