java使用compareTo实现一个类的对象之间比较大小操作

首先定义一个对象,注意这个对象必须实现Comparable接口,并重写这个接口的compareTo方法

package cn.demo;

public class Student implements Comparable{
 private int number=0;  //学号
 private String name="";  //学生姓名
 private String gender="";  //性别
 public int getNumber(){
 return number;
 }
 public void setNumber(int number){
 this.number=number;
 }
 public String getName(){
 return name;
 }
 public void setName(String name){
 this.name=name;
 }
 public String getGender(){
 return gender;
 }
 public void setGender(String gender){
 this.gender=gender;
 }

 public int compareTo(Object obj){
 Student student=(Student)obj;
 if(this.number==student.number){
  return 0;  //如果学号相同,那么两者就是相等的
 }else if(this.number>student.getNumber()){
  return 1;  //如果这个学生的学号大于传入学生的学号
 }else{
  return -1;  //如果这个学生的学号小于传入学生的学号
 }
 }
}

在上面的重写方法中标红的地方,如果是小于号,则是按照降序排列,但是在我贴上去的代码,则是按升序排列

接下来就是测试类了:

package cn.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class Test {
 public static void main(String[] args) {
 Student student1=new Student();
 student1.setNumber(5);
 Student student2=new Student();
 student2.setNumber(2);
 Student student3=new Student();
 student3.setNumber(1);
 Student student4=new Student();
 student4.setNumber(4);
 ArrayList<Student> list=new ArrayList<Student>();
 list.add(student1);
 list.add(student2);
 list.add(student3);
 list.add(student4);
 System.out.println("-------排序前-------");
 Iterator<Student> iterator=list.iterator();
 while(iterator.hasNext()){
  Student stu=iterator.next();
  System.out.println(stu.getNumber());
 }
 //使用Collections的sort方法对list进行排序
 System.out.println("-------排序后-------");
 Collections.sort(list);
 iterator=list.iterator();
 while(iterator.hasNext()){
  Student stu=iterator.next();
  System.out.println(stu.getNumber());
 } 

 }
}

如上所示,可以直接使用collections的sort方法进行排序

-------排序前-------
5
2
1
4
-------排序后-------
5
4
2
1

补充知识:【JAVA】用Comparable接口学生的成绩做降序排序!请正确指定泛型;用Comparator实现按照姓名排序,请正确指定泛型!

创建四个学生信息,分别包含姓名(String) , 年龄(int) ,分数(double)

(1)用Comparable接口对下列四位同学的成绩做降序排序, 如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序,请正确指定泛型;

(2)用Comparator实现按照姓名排序,请正确指定泛型。

//定义学生类,并实现Comparable接口<定义Student类型>
public class Student implements Comparable<Student>{

  private String name;
  private int age;
  private double grade;

  public Student() {
  }

  public Student(String name, int age, double grade) {
    this.name = name;
    this.age = age;
    this.grade = grade;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public double getGrade() {
    return grade;
  }

  public void setGrade(double grade) {
    this.grade = grade;
  }

  @Override
  public String toString() {
    return "Student [姓名 :" + name +
        " 年龄 :" + age +
        " 分数" + grade + "]";
  }

  /**
   * 用Comparable接口对下列四位同学的成绩做降序排序,
   * 如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。请正确指定泛型
   * @param o
   * @return
   */
  @Override
  public int compareTo(Student o) {
    if(Double.compare(this.getGrade() , o.getGrade()) != 0){
      if(Double.compare(this.getGrade() , o.getGrade()) > 0){
        return 1;
      }else {
        return -1;
      }
    }
    return this.getAge() - o.getAge();
  }
}

*定义Student类,声明基本的属性,方法及完成对Comparable接口的实现,实现“对成绩实现降序,如果成绩一样,在成绩排序的基础上按照年龄由大到小的排序”的结果。

public class Task {

  public static void main(String[] args) {

 //定义四个学生对象
    Student[] s1 = new Student[4];
    s1[0] = new Student("liusan" , 20 , 90.0);
    s1[1] = new Student("lisi" , 22 , 90.0);
    s1[2] = new Student("wangwu" , 20 , 99.0);
    s1[3] = new Student("sunliu" , 22 , 100.0);

    Arrays.sort(s1);
    System.out.println(Arrays.toString(s1));

    System.out.println("==================");

    //用Comparator实现按照姓名排序,请正确指定泛型
    Arrays.sort(s1, new Comparator<Student>() {
      @Override
      public int compare(Student o1, Student o2) {
        return o1.getName().compareTo(o2.getName());
      }
    });

    System.out.println(Arrays.toString(s1));
  }
}

以上这篇java使用compareTo实现一个类的对象之间比较大小操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java中同类对象之间的compareTo()和compare()方法对比分析

    首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显然是没有意义的. java中同类对象之间的比较又分为两种,基本类型之间的比较和引用类型之间的比较. java中"=="比较对象是否引用了同一个对象,或者比较基本类型变量值是否相等.Object类的equals()方法用来比较是否一个对象(内存地址比较),可以重写. JDK中有些类重写了equals()方法,只要类型.内容都相同,就认为相等.很变态的

  • java源码解析之String类的compareTo(String otherString)方法

    一. 前言 最近我发现了一个事情,那就是在面试笔试中,好多公司都喜欢在String字符串上出问题,涉及到方方面面的知识,包括其中的一些常用方法. String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因为 String 对象是不可变的,所以可以共享. 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识, 也让我更加理解了设

  • Java中替代equals,compareTo和toString的方法

    我们都曾在POJO中重写过equals(),compareTo()和toString()方法.但是另有其他能做到职责分离的更好的方法并带来更简洁的代码.阅读这篇文章来一探究竟吧! 更简明的职责--摆脱equals.compareTo和toString方法 你曾经查看过java文档中的Object类吗?也许吧.每当你向上追溯继承树的时候都会止步于这个类.你会注意到,该类有几个方法是每一个类都必须继承的.而你最喜欢重写的方法可能就是toString(), .equals() and .hashCod

  • Java中比较运算符compareTo()、equals()与==的区别及应用总结

    前言 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常用的比较运算符如下表所示: 本文主要给大家介绍了关于Java比较运算符compareTo().equals()与==区别及应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1.== 和 equals的区别: ==主要是两个变量值的比较,返回值为true 或者是false.对于普通变量,如:int a=10; int  b= 10; a==b,返回为 tr

  • java使用compareTo实现一个类的对象之间比较大小操作

    首先定义一个对象,注意这个对象必须实现Comparable接口,并重写这个接口的compareTo方法 package cn.demo; public class Student implements Comparable{ private int number=0; //学号 private String name=""; //学生姓名 private String gender=""; //性别 public int getNumber(){ return nu

  • Java实现创建运行时类的对象操作示例

    本文实例讲述了Java实现创建运行时类的对象操作.分享给大家供大家参考,具体如下: 获取运行时类的方法: public void test() throws ClassNotFoundException { /* * Class类是反射的源头 * 创建一个类,通过编译(javac.exe),生成对应的.class文件,之后使用java.exe加载(JVM的类加载器完成的)此.class文件. * 此.class文件加载到内存后,就是一个运行时类,存放在缓存区. * 那么这个运行时类本身就是一个C

  • java中如何实现对类的对象进行排序

    我们需要对类按照类中的某一个属性(或者多个属性)来对类的对象进行排序,有两种方法可以实现,一种方法是类实现Comparable<T>接口,然后调用Collections.sort(List)方法进行排序,另一种方法是类不实现Comparable<T>接口,而在排序时使用Collections.sort(List, Comparator<T>)方法,并实现其中的Comparator<T>接口. 先创建一个简单的学生类: public class Student

  • 全面理解Java类和对象

    面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.在面向对象程序设计(OOP)中,不必关心对象的具体实现.在传统的结构化程序设计中,算法是第一位的,数据结构是第二位的,即首先确定如何操作数,再考虑如何组织数据,以方便操作.而OOP则颠倒了这种次序,将数据放在第一位,然后再考虑操作数据的算法. 一.类 类是构造对象的模板和蓝图.通俗地说,类相当于建筑的图纸,而对象相当于建筑物.由类构造对象的过程称为创建对象的实例. Java中通过关键字class定义"类"

  • 解析Java的JVM以及类与对象的概念

    Java虚拟机(JVM)以及跨平台原理 相信大家已经了解到Java具有跨平台的特性,可以"一次编译,到处运行",在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM). JVM也是一个软件,不同的平台有不同的版本.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件.Java虚拟机就是负责将字节码文件翻译成特定平

  • Java反射(Class类,Class对象获取)

    目录 Java反射超详解 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.3Field类及其用法 Java反射超详解 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属的类

  • Java 基础语法让你弄懂类和对象

    目录 Java 基础语法 一.类与对象的初步认知 二.类和类的实例化 三.类的成员 1. 字段/属性/成员变量 2. 方法 3. static 关键字 四.封装 1. private 实现封装 2. getter 和 setter 方法 五.构造方法 1. 基本语法 2. this 关键字 六.认识代码块 1. 什么是代码块 2. 本地代码块 3. 实例代码块 4. 静态代码块 七.补充说明 1. toString 方法 2. 匿名对象 八.总结 Java 基础语法 其实在学习 C 语言时就一直

  • java compare compareTo方法区别详解

    1,compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo (T o)方法,比如MapReduce中Map函数和Reduce函数处理的<key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable<T>接口,实现这个接口可同时用于序列

  • 一步一步学习PHP(5) 类和对象

    在这一节中,我们就来看看在PHP中如何创建一个类和对象. 1. 创建类 在PHP中,创建一个类和在C#/Java中基本类似,闲话少说,给大家看个最简单的例子: 复制代码 代码如下: <?php class People { var $name; public function GetName() { return $this->name; } public function SetName($name) { $this->name=$name; } } $p=new People();

随机推荐