Comparable使一个class具备不同实例间进行比较的行为。这些对象的集合,可作为Collections.sort或Arrays.sort的参数

Comparator可以看成一种算法的实现,将算法和数据分离。实现Comparator的可以作为Collections.sort或Arrays.sort的参数

都可以多条件排序。类似于order by field1,field2
都是接口

import java.util.Arrays;
import java.util.Comparator; public class UserComparator implements Comparator<User> {
/**
*
* @param source
* @param target
* @return 负数:升序;0:顺序不变;正数:降序
*/
@Override
public int compare(User source, User target) {
int result = source.getAge() - target.getAge();
System.out.println(result);
return result;
} public static void main(String[] args) {
User[] users = new User[]{new User("a", 30), new User("b", 20)};
Arrays.sort(users, new UserComparator());
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
} class User { private String id;
private int age; public User(String id, int age) {
this.id = id;
this.age = age;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} }
import java.util.Arrays;

public class User implements Comparable<User> {

    private String id;
private int age; public User(String id, int age) {
this.id = id;
this.age = age;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} @Override
public int compareTo(User target) {
int result = this.age - target.getAge();
System.out.println(result);
return result;
} public static void main(String[] args) {
User[] users = new User[]{new User("a", 30), new User("b", 20)};
Arrays.sort(users);
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}

实例如下:

class Student implements Comparable<Student>{
private String name;
private int age;
private float score; public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
} public String toString()
{
return name+"\t\t"+age+"\t\t"+score;
} @Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
return -;//由高到底排序
else if(this.score<o.score)
return ;
else{
if(this.age>o.age)
return ;//由底到高排序
else if(this.age<o.age)
return -;
else
return ;
}
}
} public class ComparableDemo01 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu[]={new Student("zhangsan",,90.0f),
new Student("lisi",,90.0f),
new Student("wangwu",,99.0f),
new Student("sunliu",,100.0f)};
java.util.Arrays.sort(stu);
for(Student s:stu)
{
System.out.println(s);
}
}
}

程序运行结果:

sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0

但是在设计类的时候,往往没有考虑到让类实现Comparable接口,那么我们就需要用到另外的一个比较器接口Comparator。

从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。

package edu.sjtu.ist.comutil;

import java.util.Comparator;

class Student {
private String name;
private int age;
private float score; public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
} 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 float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
} public String toString()
{
return name+"\t\t"+age+"\t\t"+score;
} } class StudentComparator implements Comparator<Student>{ @Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
if(o1.getScore()>o2.getScore())
return -;
else if(o1.getScore()<o2.getScore())
return ;
else{
if(o1.getAge()>o2.getAge())
return ;
else if(o1.getAge()<o2.getAge())
return -;
else
return ;
}
} } public class ComparableDemo02 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Student stu[]={new Student("zhangsan",,90.0f),
new Student("lisi",,90.0f),
new Student("wangwu",,99.0f),
new Student("sunliu",,100.0f)};
java.util.Arrays.sort(stu,new StudentComparator());
for(Student s:stu)
{
System.out.println(s);
}
} }

上述程序的运行结果与代码实例1一样。

java Comparable和Comaprator的对比的更多相关文章

  1. Java中两个List对比的算法

    Java中两个List对比的算法:   // 测试数据 // tdcsDdt.add("Z"); // tdcsDdt.add("B"); // tdcsDdt ...

  2. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  3. 研究 研究而已 java和.net的HashSet对比

    各位看官,,我不是在引发战争,,我只是想知道事情的真想,我源之于,一段代码我需要实现C#和java的两个版本功能,才发现这一个对比.讨论问题的实质,为什么会出现这样的问题.java和C#都很优秀.请大 ...

  4. java Comparable 比较器的使用

    /** * */ package com.mindreader; import java.util.Arrays; /** * @作者 Mind reader * @内容 对象数组排序——Compar ...

  5. Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)

    继承(inheritance)背后的核心思想是:       bonus = b;    }      } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...

  6. Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)

         面向对象程序设计作为一种重要的程序设计思想,在近些年来得到广泛的推崇.而Java和C++更是面向对象程序设计语言中的翘楚,要彻底摸清面向对象程序设计的精髓和在实际应用中更加高效的进行代码设计 ...

  7. JAVA - Comparable接口 与 Comparator接口

      Similarities:Both are custom ways to compare two objects.Both return an int describing the relatio ...

  8. [目录][总结] C++和Java 中的主要操作对比

    总结一些,C++ 和Java 中的一些常用操作对比,就当是自己的查询工具书啦.(暂时按随笔的更新时间排序) [Stack] c++ V.S. Java (2015.04.27) [Map]   c++ ...

  9. Java VS .NET:Java与.NET的特点对比

    一.前言 为什么要写Java跟.NET对比? .NET出生之后就带着Java的影子.从模仿到创新,.NET平台也越来越成熟.他们不同的支持者也经常因为孰弱孰强的问题争论不休.但是本文并不是为了一分高下 ...

随机推荐

  1. "渴了么"用户场景分析

    典型用户 (1)名字:王美丽 (2)年龄:21 (3)收入:勤工助学和兼职等 (4)代表的用户在市场上的比例和重要性(比例大不等同于重要性高,如付费的用户比例较少,但是影响大,所以更重要). 作为大学 ...

  2. 3、颜色的字符串、十进制、十六进制相互转换(color convert between dec、hex and string )

    int color_int=***; 1.(十进制整数)转换成(十六进制的字符串) String color_hex = String.format("#%06X", (0xFFF ...

  3. JavaScript 闭包详解

    一.Javascript闭包的用途 事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1.匿名自执行函数 我们知道所有的 ...

  4. Hibernate映射类型对照表

    Hibernate映射类型对照表 java类型  Hibernate映射类型  SQL类型 java.math.BigDecimal big_decimal numeric byte[] binary ...

  5. BZOJ2879 [Noi2012]美食节

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2879 这题codevs上也有,不过数据不同:http://codevs.cn/proble ...

  6. C语言中inline的用法

    C语言里面的内联函数(inline)与宏定义(#define)探讨 先简明扼要,说下关键: 1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样 ...

  7. VMware workstation 的虚拟机中再安装workstation

    在VMware workstation 10中运行的虚拟机中再安装workstation软件时,启动时会出现不断重启的故障, 解决办法: 在宿主虚拟机的.vmx文件中添加一行 monitor_cont ...

  8. Find the smallest number whose digits multiply to a given number n

    Given a number ‘n’, find the smallest number ‘p’ such that if we multiply all digits of ‘p’, we get ...

  9. cf div2 237 D

    D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...

  10. UITbaleView上按钮的单选

    设置Id属性,标记是哪个cell @property (nonatomic,assign)NSInteger Id; 设置一个普通状态和选中状态图片不同的按钮 _choose = [[UIButton ...