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. android apk 自我保护技术-加密apk

    经过了忙碌的一周终于有时间静下来写点东西了,我们继续介绍android apk防止反编译技术的另一种方法.前两篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blo ...

  2. Oracle中定义package以及存储过程的使用

    使用scott账户下的dept表: select * from dept order by deptno; 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 S ...

  3. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线+线段树

    题目链接: http://codeforces.com/contest/703/problem/D D. Mishka and Interesting sum time limit per test ...

  4. 二分--1043 - Triangle Partitioning

    1043 - Triangle Partitioning PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit:  ...

  5. Leetcode#91 Decode Ways

    原题地址 动态规划题,注意0导致的小陷阱. 代码: int numDecodings(string s) { ] < ] > ; ] >= ] <= : ; ; int nex ...

  6. 一个perfect 的解决 阴影拉伸的方法 shadow map strech

    因为在场景中做了,有的物体产生阴影比如人物,有的物体不产生阴影比如地面,这样在地面凹下去的地方,悬崖,池塘边,就会有阴影的拉伸. 实际上, 没办法上传图片.... L是光源 A 点(人物身上)产生阴影 ...

  7. 重定向 vs output redirect

    http://asawicki.info/files/visual_cpp_redirect.png http://asawicki.info/news_1496_redirecting_output ...

  8. 在linux中使用phpize安装php扩展模块

    介绍:linux系统中,php安装成功后,在bin目录下会生成一个名叫phpize的可执行脚本,这个脚本的用途是动态安装php扩展模块.使用phpize脚本安装php扩展模块的好处:在安装php时没有 ...

  9. CentOS 6下安装nginx

    原文:http://yubosun.akhtm.com/tech/centos-nginx.htm 1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/dow ...

  10. Razor语法学习

    原文:http://www.cnblogs.com/youring2/archive/2011/07/24/2115254.html 1.Razor的文件类型 Razor支持两种文件类型,分别是.cs ...