两者都可用来在定义比较方法,然后用在排序中。

Comparable是类本身继承的接口

Comparator实在类外定义一个排序的类

比较而言,觉得Comparator更灵活一些,但是Comparable方便一些。

举个栗子:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; public class Main { public static void main(String[] args) {
ArrayList<Pair> list = new ArrayList<>();
list.add(new Pair(8, 1));
list.add(new Pair(6, 5));
list.add(new Pair(6, 3));
list.add(new Pair(5, 7));
list.add(new Pair(4, 9));
// 用Comparator排序 -- 按照两个数的和排序
list.sort(new PairComparator());
for (Pair p: list)
System.out.println(p);
System.out.println();
// 用Comparable排序 -- 先按第一个数排序 再按第二个数排序
Collections.sort(list);
for (Pair p: list)
System.out.println(p);
}
} class PairComparator implements Comparator<Pair> { @Override
public int compare(Pair p1, Pair p2) {
int sum1 = p1.getSum();
int sum2 = p2.getSum();
return (sum1 == sum2 ? 0 : (sum1 < sum2 ? -1 : 1));
} } class Pair implements Comparable<Pair> { private int first;
private int second; public Pair(int first, int second) {
this.first = first;
this.second = second;
} @Override
public int compareTo(Pair p) {
if (first == p.first) {
if (second == p.second) return 0;
return second < p.second ? -1 : 1;
}
return first < p.first ? -1 : 1;
} public int getSum() {
return first + second;
} public String toString() {
return "[first:" + first + ", second:" + second + ", sum:" + getSum() + "]";
} }

输出:

[first:8, second:1, sum:9]
[first:6, second:3, sum:9]
[first:6, second:5, sum:11]
[first:5, second:7, sum:12]
[first:4, second:9, sum:13] [first:4, second:9, sum:13]
[first:5, second:7, sum:12]
[first:6, second:3, sum:9]
[first:6, second:5, sum:11]
[first:8, second:1, sum:9]

对于一些已经写好的类,比如String,我们当然不能去修改它的compareTo()方法,于是可以写一个自定义的比较器。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("abcd");
list.add("bcd");
list.add("cd");
list.add("d");
Collections.sort(list);
System.out.println(list);
list.sort(new MyStringComparator());
System.out.println(list);
}
} // 自定义的String排序方法 按字符串长度排序
class MyStringComparator implements Comparator<String> { @Override
public int compare(String o1, String o2) {
int len1 = o1.length();
int len2 = o2.length();
return (len1 == len2 ? 0 : (len1 < len2 ? -1 : 1));
} }

输出:

[abcd, bcd, cd, d]
[d, cd, bcd, abcd]

Comparable接口和Comparator接口的不同用法的更多相关文章

  1. Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

    Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...

  2. Java中实现对象的比较:Comparable接口和Comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  3. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  4. Java:实现对象的比较 comparable接口和comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  5. Comparable接口与Comparator接口的比较————总结

    之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...

  6. 比较器:Compare接口与Comparator接口区别与理解

    一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...

  7. java中Comparatable接口和Comparator接口的区别

    1.不同类型的排序规则 .自然排序是什么?   自然排序是一种升序排序.对于不同的数据类型,升序规则不一样:   BigDecimal BigInteger Byte Double Float Int ...

  8. Comparatable接口和Comparator接口的使用与区别

    这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...

  9. Java中Comparable接口和Comparator接口的简单用法

    对象比较器 1.Comparable接口 此接口强行对实现它的每个类的对象进行整体排序,这种排序成为类的自然排序,类的compareTo方法称为类的自然比较方法. 代码示例 import java.u ...

  10. Java中的Comparable接口和Comparator接口

    Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...

随机推荐

  1. Spring MVC 自动为对象注入枚举类型

    原文地址:http://1358440610-qq-com.iteye.com/blog/2079048 如果一个对象里面有枚举类型的话,则Spring MVC是不能够直接进行注入的,因为它只实现了一 ...

  2. windows 远程连接“发生身份验证错误 要求的函数不受支持”

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\P ...

  3. gdbserver

    这里写下gdbserver的用法: 两台机子,宿主机A和目标机B. step1: 我们在B上安装gdbserver,在A上编译可执行程序a.out,把a.out拷贝到B上面去. step2: 在A上打 ...

  4. 获取MessageBox按钮本地字符串(OK、Cancel、Yes、No等)

    问题仍然由定制MessageBox引发. 定制MessageBox,虽加入自定义些东西,但仍然希望,最大限度接近系统原生框.碰到的问题,就是其钮文本. 即如MessageBox.Show()之Mess ...

  5. Python基础-python数据类型之字符串(四)

    字符串 字符串是python中常用的数据类型,使用('或")来创建. 创建字符串: 下标索引 字符串实际上是字符的数组,所以也支持索引. str1 = 'abcdef' 切片 定义:切片是指 ...

  6. [leetcode]39. Combination Sum组合之和

    Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), fin ...

  7. python基础之Day12

    一.闭包函数 什么是闭包函数? 闭:函数是一个内部函数 包:指的是该函数包含对外部作用域(非全局作用域)名字的引用. 给函数传值的方式有两种: 1.使用参数直接给函数传值 2.包给函数 1 2 3 4 ...

  8. Spring Boot 启动(一) SpringApplication 分析

    Spring Boot 启动(一) SpringApplication 分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...

  9. 一个价格,两份大礼!Mockplus X MindManager限时联合大促

    3月暖春,阳光明媚了,工作量也伴随气温回升了,面对那么多的tasks,效率提升已经迫在眉睫.为了更好的服务产品设计,为各位产品经理.UI设计师.UX设计师等带来更快更简单的设计解决方案,Mockplu ...

  10. .net 简单任务调度平台安装简要说明

    .net 简单任务调度平台,用于.net dll,exe的任务的挂载,任务的隔离,调度执行,访问权限控制,监控,管理,日志,错误预警,性能分析等. 平台基于quartz.net进行任务调度功能开发,采 ...