zoukankan      html  css  js  c++  java
  • Java中的comparable接口和Comparator接口的区别

    一.comparable和Comparator的区别

      1、Comparable和Comparator都是用来实现集合中元素的比较、排序的。

      2、Comparable是在类内部定义的方法实现的排序,位于java.lang下。

      3、Comparator是在类外部实现的排序,位于java.util下。

      4、实现Comparable接口需要覆盖compareTo方法,实现Comparator接口需要覆盖compare方法。

      5、Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。

    二.深度认识

     首先Comparable这个接口是使用在你需要排序的元素类上的。

     而Comparator不是使用在你需要排序的元素类上的,它需要实现一个子类对象,将子类对象传入可以排序的集合中(TreeSet)。

     当你想去使用comparable接口时必须去修改源代码,因为他是建立在需要被排序的元素类上的。

    那你要是想对String类进行你自己想要的排序怎么办呢?(举例子,不要抬杠)

    首先你不能去修改源代码,第二String类是final类不能继承。

    那么此时你就可以使用Comparator接口实现在类外的排序

    三.实例

    1.对元素类Node实现comparable接口

    package com.cjm.lambda;
    
    import java.util.Set;
    import java.util.TreeSet;
    /**
     * 
     * @author 小明
     *
     */
    public class SetSortlambda {
        public static void main(String[] args) {
            Set<Node> set = new TreeSet<>();
            set.add(new Node("zs",10));
            set.add(new Node("zs1",110));
            set.add(new Node("zs1",10));
            set.add(new Node("zszx",100));
            set.add(new Node("zzxs",10));
            System.out.println(set);
        }
    }
    /*
     * 元素本生实现comparator接口
     */
    class Node implements Comparable<Node> {
        int num;
        String str;
    
        public Node(String str,int num) {
            this.str=str;
            this.num = num;
        }
    
        @Override
        public int compareTo(Node o) {
            if (this.str == null) {
                return -1;
            } else {
                if (o.str == null) {
                    return 1;
                } else {
                    if (this.str.length() < o.str.length()) {
                        return -1;
                    } else {
                        if (this.str.length() > o.str.length()) {
                            return 1;
                        } else {
                            if (this.num < o.num) {
                                return -1;
                            } else {
                                if (this.num > o.num) {
                                    return 1;
                                } else {
                                    return 0;
                                }
                            }
                        }
                    }
                }
            }
    
        }
    
        /* (non-Javadoc)
         * @see java.lang.Object#toString()
         */
        @Override
        public String toString() {
            return  str+num;
        }
    
    }

    2.使用Comparator接口,实现一个Comparator接口的对象(采用内部类的方式)

    package com.cjm.lambda;
    
    import java.util.Comparator;
    import java.util.Set;
    import java.util.TreeSet;
    
    /**
     * Compararator接口实现排序
     * 
     * @author 小明
     *
     */
    
    public class Text {
        public static void main(String[] args) {
            Set<Node> set = new TreeSet<>(new Comparator<Node>() {
    
                @Override
                public int compare(Node node1, Node node2) {
                    if (node1.str.length() < node2.str.length()) {
                        return 1;
                    } else {
                        if (node1.str.length() > node2.str.length()) {
                            return -1;
                        } else {
                            if (node1.num < node2.num) {
                                return 1;
                            } else {
                                if (node1.num > node2.num) {
                                    return -1;
                                } else {
                                    return 0;
                                }
                            }
                        }
                    }
                }
            });
            set.add(new Node("zs", 10));
            set.add(new Node("zs1", 110));
            set.add(new Node("zs1", 10));
            set.add(new Node("zszx", 100));
            set.add(new Node("zzxs", 10));
            System.out.println(set);
        }
    }
  • 相关阅读:
    模块入门–搜索
    [hadoop源码阅读][2]package结构
    [hadoop源码阅读][8]datanodeDataStorage
    [hadoop源码阅读][4]org.apache.hadoop.io
    [hadoop源码阅读][6]org.apache.hadoop.ipcprotocol和心跳分析
    [hadoop源码阅读][1]源码目录结构
    [hadoop源码阅读][4]org.apache.hadoop.io.compress系列3使用压缩
    [hadoop源码阅读][3]新旧api区别
    [hadoop源码阅读][6]org.apache.hadoop.ipcipc总体结构和RPC
    [hadoop源码阅读][8]datanodeFSDataset
  • 原文地址:https://www.cnblogs.com/SAM-CJM/p/9400307.html
Copyright © 2011-2022 走看看