文档章节

关于Compareable和Comparator

o
 osc_wws45aot
发布于 2019/08/22 00:42
字数 696
阅读 12
收藏 0

精选30+云产品,助力企业轻松上云!>>>

1、Compareable使用


 

通常某个类具有内在的排序规则,如按时间 长度等维度是可排序的话,建议实现Compareable接口,重写compareTo方式

这样的话存放数组或集合框架中时,我们可用Arrays.sort(x)或Collections.sort(x)按其自然顺序排序。

例子

import java.util.Objects;

public class Model implements Comparable<Model>{
    private String name;

    private int age;

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Model model = (Model) o;
        return age == model.age &&
                Objects.equals(name, model.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public int compareTo(Model o) {
        int result = name.compareTo(o.getName());
        if(result == 0){
            if(age<o.getAge()){
                return -1;
            }
            if(age>o.getAge()){
                return 1;
            }else{
                return 0;
            }
        }else{
            return result;
        }
        
    }
}
View Code

 

2、重写compareTo原则


 

对于TreeSet TreeMap有序集合,判断某个对象是否存在是按Compareable接口来判断的。

所以当我们重写equals hashCode compareTo方法时,需要用相同的域来判断,这3者强烈建议保持一致。

否则如何两个对象obj1和obj2 obj1.equals(obj2)==true;而obj1.compareTo(obj2) != 0

此时如何存入TreeSet中就会当做两个不同的对象,容易产生迷惑。

代码:

import java.util.Objects;

public class Model implements Comparable<Model>{
    private String name;

    private int age;

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Model model = (Model) o;
        return age == model.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(age);
    }

    @Override
    public int compareTo(Model o) {
        int result = name.compareTo(o.getName());
        if(result == 0){
            if(age<o.getAge()){
                return -1;
            }
            if(age>o.getAge()){
                return 1;
            }else{
                return 0;
            }
        }else{
            return result;
        }

    }
}
View Code

此对象按age来判断是否相等,而compareTo是按name和age来判断是否相等

测试存入TreeSet

public static void main(String[] args) throws IOException {
        Model model1 = new Model();
        model1.setAge(12);
        model1.setName("xiaoming");

        Model model12 = new Model();
        model12.setAge(12);
        model12.setName("xiaoli");

        TreeSet<Model> treeSet = new TreeSet<Model>();
        treeSet.add(model1);
        treeSet.add(model12);
        System.out.println(treeSet.size());
    }
View Code

执行返回:2 

这样从语义上就很让人迷惑了!

 

3、与Comparator区别


 

Compareable是一个类必须实现此接口重写compareTo方法,在类的内部决定如何排序

而Comparator并不要求类一定要实现接口,它是一种额外的附件排序

上代码:

public static void main(String[] args) throws IOException {
        Model model1 = new Model();
        model1.setAge(13);
        model1.setName("xiaoming");

        Model model12 = new Model();
        model12.setAge(12);
        model12.setName("xiaoli");

        List<Model> modelList = new ArrayList<Model>();
        modelList.add(model1);
        modelList.add(model12);
        Collections.sort(modelList, (o1, o2) -> {
            if(o1.getAge() < o2.getAge()){
                return -1;
            }
            if(o1.getAge() > o2.getAge()){
                return 1;
            }else{
                return 0;
            }
        });

        modelList.forEach(model -> System.out.println(model));


    }
View Code

执行返回:

Model{name='xiaoli', age=12}
Model{name='xiaoming', age=13}

 

总结:

1、Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

2、前者固定,后者灵活。后者可实现数据和比较逻辑分离

大多数情况个人建议Comparator接口外挂实现。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Java中Compareable和Comparator两种比较器的区别

Java中Compareable和Comparator两种比较器的区别 参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html 1.引言   在java这个处处是对象的世界里,对两个对象进行按某一属性进行...

osc_qn1pixe7
02/15
4
0
Comparator Tools

Comparator Tools 是 PHP 实现的 Java Compareable 接口,用来实现对象的排序已经一些排序的方法。

匿名
2010/09/09
897
0
二十四,Arrays和比较器

1.Arrays类定义 Arrays类是Java API中提供的类 ,与数组操作相关.可以使用此类对数组进行相关的操作.在java.util包中.Arrays类中提供的方法可直接实现数组的排序、搜索等. 数组赋值:fill();...

ARESXIONG
2015/05/03
9
0
二叉搜索树

二叉搜索树(Binary Search Tree) 定义:二叉搜索树是二叉树的一种,是应用非常广泛的一种二叉树,英文简称为 BST 性质: 任何一个节点的值都大于其左子树所有节点的值 任意一个节点的值都小...

松鼠航
04/10
0
0
二叉搜索树

二叉搜索树(Binary Search Tree) 定义:二叉搜索树是二叉树的一种,是应用非常广泛的一种二叉树,英文简称为 BST 性质: 任何一个节点的值都大于其左子树所有节点的值 任意一个节点的值都小...

osc_o4spoba6
04/11
40
0

没有更多内容

加载失败,请刷新页面

加载更多

macz技巧分享—macOS高端使用技巧

Macos 的占有量不如 Windows,两者之间当操作方式也有很大的不同,当很多人熱悉 Windows 的操作之后,再接触 macos,觉得难上手,其实是习惯问题。如果你学习一些技巧,会觉得 macos 其实也不...

mac小叮当
48分钟前
11
0
手把手教你如何用黑白显示器显示彩色!

来源:大数据文摘 本文约1000字,建议阅读6分钟。 本文为你介绍如何通过黑白显示器上也能显示出彩色。 原来在黑白显示器上也能显示出彩色啊!通过在监视器上覆盖拜耳滤色镜,并拼接彩色图像,...

osc_jklrr90y
49分钟前
18
0
key-value结构排序:给定一个字符串,统计每个字符出现频率,先按value降序,再按key升序

对于key-value结构的排序 第一种:lambda表达式 第二种:函数 第三种:类对()的重载,仿函数形式 #include <iostream>#include <vector>#include <unordered_map>#include <string>#in......

osc_gwtkg2dc
49分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》 目录 世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球...

osc_vew1u0h0
51分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三) 目录 2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》 演讲嘉宾 演讲内容 ...

osc_8o71811p
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部