再加把劲 发表于 2012-12-13 21:26:03

0 开场白元素项类的设计

<div id="cnblogs_post_body">开场白:

很长时间以来一直想把以前所学习的一些基本算法整理一遍,最近准备利用周末的时间在博客园写一个算法系列,留作记录以备将来查看。首先从“元素项类” 谈起。

所有源代码在google code上http://code.google.com/p/algolib-java/ 下载或者直接猛击:/Files/luweiseu/Source_codes.rar





    在线性表以及其它的数据结构中,每个元素都包含数据区,即我们这里讲的“元素项”(Element Item)。元素项的元素值可以是数值类型,如整数、浮点数等;也可以是字符型,如String,char。一般情况下,元素项的类型在同一个线性表中是相同的,但是不能排除类型不同的情况发生。在本书接下来的很多章节将会涉及到元素项的使用及操作,本节内容将重点介绍元素项类的设计和实现。
本系列中采用泛型类编程方法,即元素项建立泛型类(generic type)。元素项类的对象的具体类型可以是任意的,如Integer(整数类型)、Double(双精度类型)、String(字符串类型)等,甚至也可以是用户自定义的类。不管是什么具体类型的对象,这些对象常常需要进行比较,打印等操作。整数类型的对象可以依据整数数值的大小进行比较,打印的内容也是该整数的数值。但是对一个用户自定义的类怎样才能具有可比较性?如何定义自定义类的打印内容?
在C++语言中对象的比较可以通过运算符重载实现,但是JAVA语言中没有这样的机制。在JAVA语言中有一个替代的方法是继承Comparable定义的接口。用户自定义的类通过实现Comparable接口的函数compareTo使得类的对象具有“可比较性”。该函数的返回值为整型,1表示大于,0表示相等,-1表示小于。对类的对象进行打印时,用户可以选择性地打印类中的一些信息,这可以通过重载函数toString来实现,该函数返回类型是String。在执行System.out.println()函数打印对象时,事实上打印的是该对象的toString函数的返回值。
这里以一个常见的类来解释上面讨论的“可比较性”和选择打印过程。设计学生类,Student。包含学生的学号、年龄和成绩信息。学生和学生之间有可能需要比较的对象为年龄或成绩,这里考虑比较成绩,即在事项compareTo函数时,将本学生的成绩与另一个学生进行比价,若大于则返回1,小于则返回-1,等于则返回0。对一个学生对象进行打印时,可以选择将学生的部分或者所有信息显示出来,在toString函数中将需要显示的信息返回即可。
下面是学生类Student的实现:

<div class="cnblogs_code">package Element;

/**
* 学生类,用于测试ElemItem类的可比较性 Studnet.java
*/
    public class Student implements Comparable{
      private int ID;      //学号
      private int age;    //年龄
      private int ave_score;    //平均分
      public Student(){//默认构造函数
            ID = -1;
            age = -1;
            ave_score = -1;
      }
      //有参数构造函数
      public Student(int _id, int _age, int _ave_age){
            ID = _id;
            age = _age;
            ave_score = _ave_age;
      }
      //实现Comparable接口函数
      //当前学生的成绩比带比较的学生的成绩高时返回1,
      //低时返回-1,相等时返回0
      public int compareTo(Object _student) {
            Student _s = (Student)(_student);
            return (ave_score > _s.ave_score)?1:
                ((ave_score < _s.ave_score)? -1:0);
      }
      //获取学生的信息
      public int getID(){ return ID;}
      public int getAge() {return age;}
      public int getAve_score() {return ave_score;}
      
      //打印的内容,打印学生的学号,年龄和成绩
      public String toString(){
            return "Studnet number " + ID + ", age " +
            age + ", aveage score " + ave_score;
      }
    }
页: [1]
查看完整版本: 0 开场白元素项类的设计