码迷,mamicode.com
首页 > 编程语言 > 详细

Java中Comparator接口和Comparable接口的使用

时间:2015-08-19 11:15:43      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:arrays   collection   sort   集合   

一般情况下在实现对对象元素的数组或集合进行排序的时候会用到Comparator和Comparable接口,通过在元素所在的类中实现这两个接口中的一个,然后对数组或集合调用Arrays.sort或者Collentions.sort方法即可实现对数组或集合的排序。就sort方法里面的参数来说,实现了不同的接口则传递的参数也不尽相同。对于实现了Comparator接口的类来说,sort方法需要接受的参数不仅包括数组或集合,还要包括实现了该接口的类对象;而对实现了Comparable接口的类来说,参数不仅包括数组或者集合,还要包括实现了该接口的类对象。具体怎么区别呢,其实很简单,因为看两个接口所实现的方法就知道,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("\nAfter change the order....\n");
        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("\nAfter change the order....\n");
        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是应该是以对象的引用作为各个对象元素的标志,而不是元素的值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java中Comparator接口和Comparable接口的使用

标签:arrays   collection   sort   集合   

原文地址:http://blog.csdn.net/mnmlist/article/details/47776663

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!