Java 常用类库 之 比较类 Comparable

http://www.verejava.com/?id=169930999133100

/**
    知识点: 比较类 Comparable

    题目: 将某班学生按数学成绩从小到大排序

    思路:
        1. 抽象出类:
            1.1 班级(ClassSet)
            1.2 学生(Student)
        2. 找出类关系:
            2.1 学生 属于 班级 Student -> ClassSet(多对1)
        3. 找出类属性:
            3.1 ClassSet(班级名称,班级人数)
            3.2 Student(学生名称,数学成绩)
        4. 找出类方法:
            4.1 学生添加到班级 ClassSet{addStudent(Student s)}
            4.2 学生成绩从小到大排序  ClassSet{sortByScore()}
*/
import java.util.Arrays;
public class TestComparable
{
    public static void main(String[] args)
    {
        //实例化4G班级
        ClassSet c=new ClassSet("4G",4);
        //添加学生
        c.addStudent(new Student("李明",90));
        c.addStudent(new Student("李浩",80));
        c.addStudent(new Student("王涛",95));
        c.addStudent(new Student("张胜",70));

        //获得4G班级学生数组集合
        Student[] students=c.getStudents();
        //输出学生信息
        for(Student s:students)
        {
            if(s!=null)
                System.out.println(s.getName()+","+s.getMathScore());
        }

        System.out.println("\n根据学生成绩排序");
        //c.sortByBuble();
        //Arrays.sort(students);
        c.sortByMerge();
        for(Student s:students)
        {
            if(s!=null)
                System.out.println(s.getName()+","+s.getMathScore());
        }

    }
}
class ClassSet
{
    private String className;//班级名称
    private int maxSize;//班级学生人数
    private int currentSize;//当前多少学生
    private Student[] students;//所有学生的数组

    public ClassSet(String className,int maxSize)
    {
        this.className=className;
        this.maxSize=maxSize;
        students=new Student[maxSize];
    }

    public Student[] getStudents()
    {
        return this.students;
    }

    /**
        添加学生
    */
    public void addStudent(Student s)
    {
        for(int i=0;i<students.length;i++)
        {
            if(students[i]==null)
            {
                students[i]=s;
                currentSize++;
                break;
            }
        }
    }
    /**
        按照学生的数学成绩冒泡排序从小到大排序
    */
    public Student[] sortByBuble()
    {
        for(int i=0;i<currentSize-1;i++)
        {
            for(int j=0;j<currentSize-i-1;j++)
            {
                Student s=students[j];
                if(students[j].getMathScore()>students[j+1].getMathScore())
                {
                    students[j]=students[j+1];
                    students[j+1]=s;
                }
            }
        }
        return this.students;
    }

    public void sortByMerge()
    {
        //创建一个临时数组存放分区元素
        Comparable[] tempArray=students.clone();
        merge_sort(students,tempArray,0,students.length);
    }

    private  void merge_sort(Comparable[] array,Comparable[] tempArray, int first, int last) {
        if(first+1<last)
        {
            int mid=(first+last)/2;
            // 对左半部份排序
            merge_sort(array,tempArray,first,mid);
            // 对有半部分排序
            merge_sort(array,tempArray,mid,last);
            // 合并到一个临时数组,再拷贝到array中
            merge(array,tempArray,first,mid,last);
        }
    }

    private  void merge(Comparable[] array,Comparable[] tempArray, int first, int mid,int last) {
        int beginLeft=first;
        int beginRight=mid;
        int k=first;

        while((beginLeft<mid)&&(beginRight<last)){
            if(array[beginLeft].compareTo(array[beginRight])<0){
                tempArray[k]=array[beginLeft];
                beginLeft++;
            }else{
                tempArray[k]=array[beginRight];
                beginRight++;
            }
            k++;
        }
        while(beginLeft<mid){
            tempArray[k++]=array[beginLeft++];
        }
        while(beginRight<last){
            tempArray[k++]=array[beginRight++];
        }
        for(int i=first;i<last;i++){
            array[i]=tempArray[i];
        }
    }
}
class Student implements Comparable
{
    private String name;//学生姓名
    private int mathScore;//数学成绩

    public Student(String name,int mathScore)
    {
        this.name=name;
        this.mathScore=mathScore;
    }
    public String getName()
    {
        return this.name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getMathScore()
    {
        return this.mathScore;
    }
    public void setMathScore(int mathScore)
    {
        this.mathScore=mathScore;
    }

    /**
        实现Comparable 接口要复写 compareTo(T o) 方法
        如果从小到大排序
        大于         则返回 1
        小于         则返回 -1
        等于         则返回 0
        如果从大到小排序
        大于         则返回 -1
        小于         则返回 1
        等于         则返回 0
    */
    public int compareTo(Object obj)
    {
        if(obj instanceof Student)
        {
            Student s=(Student)obj;
            if(this.mathScore>s.getMathScore())
                return 1;
            if(this.mathScore<s.getMathScore())
                return -1;

        }
        return 0;
    }

}

http://www.verejava.com/?id=169930999133100

原文地址:https://www.cnblogs.com/verejava/p/9216575.html

时间: 2024-11-07 11:35:10

Java 常用类库 之 比较类 Comparable的相关文章

Google的Java常用类库 Guava

Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库. 1. 基本工具 [Basic utilities] 让使用Java语言变得更舒适 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服.很多Guava工具类用快速失败拒绝null值,而不是盲目地接受 1.2 前置条件: 让方法中的条件检查更简单 1.3 常见Object方法: 简化Object方法实现,如hashCode()和toSt

Google的Java常用类库 Guava资料

java的人应该都知道Apache commons的java常用类库吧,这个Guava和commons一样,封装出一套比jdk本身提供的常用类库强大.既然有了这个这么强大的类库,我们就没必要重复造轮子了.这东西怎么用,看看官网的文档和API.英文不好的,也有网上翻译出来共享的.开始Guava之旅猛击下面的链接 官方地址:http://code.google.com/p/guava-libraries/  [大家都知道这个要FQ哦,windows下推荐ziyoumen软件] 官方翻译文档:http

Java常用正则表达式验证工具类RegexUtils.java

原文:Java常用正则表达式验证工具类RegexUtils.java 源代码下载地址:http://www.zuidaima.com/share/1550463379442688.htm Java 表单注册常用正则表达式验证工具类,常用正则表达式大集合. 1. 电话号码 2. 邮编 3. QQ 4. E-mail 5. 手机号码 6. URL 7. 是否为数字 8. 是否为中文 9. 身份证 10. 域名 11. IP .... 常用验证应有尽有! 这的确是您从事 web 开发,服务器端表单验证

Java常用类库之StringBuilder与StringBuffer

String与StringBuffer与StringBuilder的比较 String的内容一旦声明则不可改变,如果改变,则改变的肯定是String的引用地址. StringBuffer则是有个字符缓冲区,所有的操作都是对字符缓冲区中操作.与StringBuilder类似. 1. 在执行速度方面的比较:StringBuilder > StringBuffer 2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一

JAVA常用类库简介(转)

Java编程语言中为方便学习者学习,编制了许多类,这些类已经经过测试,都是我们编程的基础.如果不利用这些已存在的类,我们的编程工作将变得异常复杂并且效率低下.所以我们应尽可能多的掌握Java基本类库的内容.类库中的类按照其用途归属于不同的包中. 1.java.lang包 java.lang包 是Java中最常用的包,程序不需要注入,就可以使用该包中的类,利用包中的类可以设计最基本的Java程序. 2.java.awt包 java.awt包中的类提供了图形界面的创建方法,包括按钮.文本框.列表框.

java常用类库

1.StringBuffer StringBuffer是使用缓冲区的,本身也是操作字符串的,但与String不同,String类的内容一旦声明之后则不可改变,改变的只是其内存地址的指向,而StringBuffer中的内容可以改变. 对StringBuffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象的实例化,必须通过构造方法完成. StringBuffer类的应用:频繁修改字符串的内容,用String类是不合适的,此时应该用StringBuffer. 2.

Java常用API及Math类

一.API的概述 API--Application Programing Interface:应用程序编程接口,是java提供的一些预定义的函数: 目的:基于API实现程序的快速编写,只需了解其作用,不用关注源代码. 学习API的方法:先了解API的概况.作用,再看构造函数了解如何创建使用类,最后看方法了解如何调用. 二.数值运算 Math类 1.概述 出自java.lang包(核心包,提供对java编程语言设计至关重要的类,可以直接使用,不用import): Math类包含执行基本数字运算的方

Java常用类库之时间操作类——Date、Calendar、DateFormat、SimpleDateFormat及实例操作

学习目标 掌握Date类的使用 可以使用Calendar类取得一个完整的日期 掌握日期格式化的操作 可以使用SimpleDateFormat进行日期的格式化转换操作 编写取得日期的操作类 进一步掌握Calendar类的使用 进一步掌握SimpleDateFormat类的使用 Date类是一个较为常用的类,但是其操作的日期格式会有一些不符合个人要求,而如果想要进一步取得一些自己需要的时间,则可以使用Calendar类. Date类 在java.util包中定义了Date类,Date类本身使用非常简

031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)

//****ComparatorDemo.java import java.util.* ;class Student{    // 指定类型为Student    private String name ;    private int age ;    public Student(String name,int age){        this.name = name ;        this.age = age ;    }    public boolean equals(Obje