美文网首页
外部比较器和内部比较器

外部比较器和内部比较器

作者: 菊地尤里 | 来源:发表于2018-05-29 20:31 被阅读0次

内部比较器实现Comparable和外部比较器实现Comparator
在剑指offer上遇到了一题,使用外部比较器到Comparator

import java.util.Arrays;  
import java.util.Comparator;  
public class Solution {  
    // 使用String.valueOf(int)来变换整型到字符串  
    // 使用StringBuilder来拼接字符串  
    public String PrintMinNumber(int[] numbers) {  
        if (numbers == null || numbers.length == 0)  
            return "";  
        int len = numbers.length;  
        String[] str = new String[len];  
        StringBuilder sb = new StringBuilder();  
        for (int i = 0; i < len; i++) {  
            str[i] = String.valueOf(numbers[i]);  
        }  
        // comparator 外部比较器  
        Arrays.sort(str, new Comparator<String>() {  
            @Override  
            public int compare(String s1, String s2) {  
                String c1 = s1 + s2;  
                String c2 = s2 + s1;  
                return c1.compareTo(c2);  
            }  
        });  
        for (int i = 0; i < len; i++) {  
            sb.append(str[i]);  
        }  
        return sb.toString();  
    }  
}  

一)Comparable
Comparable 是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
Comparable定义:

package java.lang;
import java.util.*;
public interface Comparable<T> {
   public int compareTo(T o);
}

说明实现该接口的类必须实现该方法,对象就可以比较大小。假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。
Java的一些常用类已经实现了Comparable接口,并提供了比较大小的标准。包装类:按照它们对应的数值大小进行比较。Character,Boolean,String,Date,Time等也都实现了Comparable接口。

(二)Comparator
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
Comparator接口的源码如下:

package java.util;
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。因为Object类是所有类的父类,也就是说实现接口的子类已经重写了equals方法。
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

然后复习了一下
为什么实现了equals()就必须实现hashCode()?
每次看都有新发现,可能是以前就不是很懂的原因
我们使用覆写equals是为了满足我们的需求,取代它原来的作用,为了单纯地比较它们内容而不比较地址,但是hashcode阻止了我们。所以我们要把hashcode一并覆写。让equals方法和hashCode方法始终在逻辑上保持一致性。

@Override
 public int hashCode() {
 return name.hashCode()*37+age;
 }

hashCode方法是将对象的存储地址进行映射
“设计hashCode()时最重要的原则就是:无论什么时候,对同一个对象调用hashCode()都应该产生同样的值。如果在将一个对象用put()添加进HashMap时产生一个hashCode值,而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,你就要小心了,因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码”。

一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。

相关文章

  • 外部比较器和内部比较器

    内部比较器实现Comparable和外部比较器实现Comparator在剑指offer上遇到了一题,使用外部比较器...

  • Comparable接口是什么

    Comparable是内部比较器,Comparator是外部比较器。 以下为Comparable和Comparat...

  • java比较器:comparable以及comparator区别

    首先可以参照这篇文件来了解两种比较器的区别内部比较器Comparable和外部比较器Comparator 这里主要...

  • java的比较器小结

    摘要 java的比较器分两种,也即是内外比较器,内部比较器是comparable接口,外部比较器是comparat...

  • 浅谈二叉搜索树(待完善)

    比较器或者比较协议。 默认搜索树内部构造函数传递 比较器。使用搜索树的人可以用比较器,如果没有比较器就当默认实现了...

  • Java基础之比较器

    一、概述 二、分类及详解 1、内部 本类,重写compareable接口 2、外部 创建比较器类,重写compar...

  • 迭代器模式

    内部迭代器和外部迭代器 简单地讲,内部迭代器就是类似 forEach 的迭代器,其内部迭代逻辑已经制定好,只要传入...

  • java比较器详解

    Java比较器 内部比较器: 实现comparable接口, 需要重写comparato方法 ps:写在创建类的内...

  • 比较器

    Comparable类   所谓的比较器指的是进行大小关系的确定判断。  如果要进行数组操作,一般都会使用java...

  • 比较器

    比较器问题的引出 比较器指的是进行大小关系的确定判断; 如果要进行数组操作,肯定要使用java.util.Arra...

网友评论

      本文标题:外部比较器和内部比较器

      本文链接:https://www.haomeiwen.com/subject/praajftx.html