zoukankan      html  css  js  c++  java
  • Java中Comparator接口和Comparable接口的使用

    普通情况下在实现对对象元素的数组或集合进行排序的时候会用到Comparator和Comparable接口,通过在元素所在的类中实现这两个接口中的一个。然后对数组或集合调用Arrays.sort或者Collentions.sort方法就可以实现对数组或集合的排序。就sort方法里面的參数来说。实现了不同的接口则传递的參数也不尽同样。对于实现了Comparator接口的类来说。sort方法须要接受的參数不仅包含数组或集合。还要包含实现了该接口的类对象。而对实现了Comparable接口的类来说,參数不仅包含数组或者集合,还要包含实现了该接口的类对象。

    详细怎么差别呢,事实上非常easy,由于看两个接口所实现的方法就知道,Comparator定义的方法为compare(Object o1, Object o2)。方法涉及两个类对象。所以须要在另外一个新的类来实现对数组元素的比較,所以在调用sort方法时须要传递这个额外的实现了Comparator接口的类对象;而实现了Comparable接口的类实在元素类的内部实现了排序的逻辑,所以调用sort方法时不须要传递额外的类对象。废话少说,直接上代码。
    1.通过实现Comparator接口来实现对数组或集合的比較

    class SortCat implements Comparator<Cat1>
    {
        @Override
        public int compare(Cat1 o1, Cat1 o2)//实现了Comparator接口的compare方法
        {
            // TODO Auto-generated method stub
            int size1=o1.getSize(),size2=o2.getSize();
            if(size1!=size2)
                return size1-size2;
            return o1.getColor().compareTo(o2.getColor());
        }
    }
    class Cat1 
    {
        private String color;
        private int size;
        public  Cat1(String color,int size)
        {
            this.color=color;
            this.size=size;
        }
        public int getSize()
        {
            return size;
        }
        public String getColor()
        {
            return color;
        }
        public String toString()
        {
            return color+" cat,size = "+size;
        }
    
    }
    public class HashMapComparatorDemo
    {
    
        public static void main(String[] args)
        {
            // TODO Auto-generated method stub
            String colorArr[]={"black","yellow","white","colorful","gray","brown","blue","orange"};
            int catSizeArr[]={5,3,7,9,6,4,1,8,2};
            Random random=new Random();
            Cat1 catArr[]=new Cat1[10];
            int sizeIndex=0,colorIndex=0;
            for(int i=0;i<10;i++)
            {
                sizeIndex=random.nextInt(catSizeArr.length);
                colorIndex=random.nextInt(colorArr.length);
                catArr[i]=new Cat1(colorArr[colorIndex], catSizeArr[sizeIndex]);
                System.out.println("Color:"+catArr[i].getColor()+",size:"+catArr[i].getSize());
            }
            System.out.println("
    After change the order....
    ");
            Arrays.sort(catArr,new SortCat());//不仅要传递数组參数。还要传递实现了Comparator接口的类对象
            for(Cat1 cat:catArr)
                System.out.println("Color:"+cat.getColor()+",size:"+cat.getSize());
    
        }
    
    }

    结果:

    Color:white,size:4
    Color:colorful,size:4
    Color:colorful,size:4
    Color:gray,size:5
    Color:yellow,size:7
    Color:orange,size:6
    Color:black,size:2
    Color:colorful,size:8
    Color:black,size:3
    Color:yellow,size:2
    
    After change the order....
    
    Color:black,size:2
    Color:yellow,size:2
    Color:black,size:3
    Color:colorful,size:4
    Color:colorful,size:4
    Color:white,size:4
    Color:gray,size:5
    Color:orange,size:6
    Color:yellow,size:7
    Color:colorful,size:8

    2.通过实现Comparable接口来实现对数组或集合的比較

    class Cat2  implements Comparable<Cat2>
    {
        private String color;
        private int size;
        public  Cat2(String color,int size)
        {
            this.color=color;
            this.size=size;
        }
        public int getSize()
        {
            return size;
        }
        public String getColor()
        {
            return color;
        }
        public String toString()
        {
            return color+" cat,size = "+size;
        }
        @Override
        public int compareTo(Cat2 o)//在元素类里面实现comparable接口所定义的方法
        {
            // TODO Auto-generated method stub
            int size=o.getSize();
            if(this.size!=size)
                return this.size-size;
            return this.color.compareTo(o.getColor());
        }
    
    }
    public class HashMapComparatorDemo2
    {
    
        public static void main(String[] args)
        {
            String colorArr[]={"black","yellow","white","colorful","gray","brown","blue","orange"};
            int catSizeArr[]={5,3,7,9,6,4,1,8,2};
            Random random=new Random();
            Cat2 catArr[]=new Cat2[10];
            int sizeIndex=0,colorIndex=0;
            for(int i=0;i<10;i++)
            {
                sizeIndex=random.nextInt(catSizeArr.length);
                colorIndex=random.nextInt(colorArr.length);
                catArr[i]=new Cat2(colorArr[colorIndex], catSizeArr[sizeIndex]);
                System.out.println("Color:"+catArr[i].getColor()+",size:"+catArr[i].getSize());
            }
            System.out.println("
    After change the order....
    ");
            Arrays.sort(catArr);//仅须要传递数组或集合就可以
            for(Cat2 cat:catArr)
                System.out.println("Color:"+cat.getColor()+",size:"+cat.getSize());
    
        }
    
    }

    结果:

    Color:gray,size:7
    Color:orange,size:9
    Color:gray,size:3
    Color:brown,size:5
    Color:orange,size:1
    Color:gray,size:8
    Color:colorful,size:9
    Color:white,size:1
    Color:blue,size:7
    Color:brown,size:1
    
    After change the order....
    
    Color:brown,size:1
    Color:orange,size:1
    Color:white,size:1
    Color:gray,size:3
    Color:brown,size:5
    Color:blue,size:7
    Color:gray,size:7
    Color:gray,size:8
    Color:colorful,size:9
    Color:orange,size:9

    3.另外。还能够用实现了对Comparable接口treeMap、treeSet进行排序,详细应用范围非常广。包含求一个无反复无序数组的前k项元素就能够用treeSet或treeMap非常好滴实现,循环建tree并维持一个大小为k的treeSet或treeMap就可以。超出范围的话先插入一个元素。然后删除排在最后的元素就可以。以下这段代码只实现的是有序建树并将treeMap输出出来的功能。

    class Cat implements Comparable<Cat>
    {
        private String color;
        private int size;
        public  Cat(String color,int size)
        {
            this.color=color;
            this.size=size;
        }
        public int getSize()
        {
            return size;
        }
        public String getColor()
        {
            return color;
        }
        @Override
        public int compareTo(Cat o)
        {
    //      //优先依据颜色排序
    //      String color1=o.getColor();
    //      if(this.color.compareTo(color1)!=0)
    //          return this.color.compareTo(color1);
    //      return this.size-o.size;
            //优先依据大小排序
            int size=o.getSize();
            if(this.size!=size)
                return this.size-size;
            return this.color.compareTo(o.getColor());
        }
        public String toString()
        {
            return "Color:"+color+",size = "+size;
        }
    }
    public class HashMapComparableDemo
    {
    
        public static void main(String[] args)
        {
            SortedMap<Cat, Integer>map=new TreeMap();
            String colorArr[]={"black","yellow","white","colorful","gray","brown","blue","orange"};
            int catSizeArr[]={5,3,7,9,6,4,1,8,2};
            Random random=new Random();
            int sizeIndex=0,colorIndex=0,count=0;;
            int mapSize=10;
            for(int i=0;i<mapSize;i++)
            {
                sizeIndex=random.nextInt(catSizeArr.length);
                colorIndex=random.nextInt(colorArr.length);
                count=random.nextInt(20)+5;
                map.put(new Cat(colorArr[colorIndex], catSizeArr[sizeIndex]), count);
            }
            Iterator<Entry<Cat, Integer>>iterator=map.entrySet().iterator();
            Entry<Cat, Integer>entry;
            while(iterator.hasNext())
            {
                entry=iterator.next();
                System.out.println(entry.getKey().toString()+",Count:"+entry.getValue().toString());
            }
    
        }
    
    }

    结果:

    Color:black,size = 1,Count:15
    Color:black,size = 2,Count:12
    Color:gray,size = 2,Count:24
    Color:brown,size = 5,Count:24
    Color:gray,size = 5,Count:14
    Color:brown,size = 6,Count:13
    Color:white,size = 6,Count:7
    Color:yellow,size = 6,Count:12
    Color:gray,size = 7,Count:9
    Color:brown,size = 8,Count:17

    另外:对某些对象建立treeMap或hashMap的时候还须要重写一下equals方法,防止发生插入同样元素的情况,由于默认情况下treeMap或HashMap是应该是以对象的引用作为各个对象元素的标志。而不是元素的值。

  • 相关阅读:
    MVC的12种ActionResult介绍以及应用示例【转】
    SQL Server抛出异常信息 RAISERROR
    lambda select和where区别
    JS中的原型对象与构造器
    JS原型的动态性
    关于困惑已久的var self=this的解释
    JS原型对象的问题
    再谈.NET委托(delegate、Func<>)
    在函数作用域嵌套下使用this
    Python 易错点
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7289812.html
Copyright © 2011-2022 走看看