类比较器

1.内部比较器

实现类为Card类,继承compareable接口重写compare方法。

public class Card implements 
Comparable
<Card>{
    private int num;
    private int type;
    @Override
    public int compareTo(Card o) { //扑克牌数字相同按照花色比较,用1234表示花色,从小到大排序。
        return this.num-o.num!=0?this.num-o.num:this.type-o.type;
    }
    public Card(int num, int type) {
        super();
        this.num = num;
        this.type = type;
    }
    @Override
    public String toString() {
        return "Card [num=" + num + ", type=" + type + "]";
    }
    
    
}

测试

public class 比较器 {

    public static void main(String[] args) {
        Vector<Card> vector=new Vector<>();
        vector.add(new Card(7, 4));
        vector.add(new Card(1, 1));
        vector.add(new Card(3, 2));
        vector.add(new Card(7, 3));
        vector.add(new Card(3, 1));
        
        Collections.sort(vector);//使用内部比较器
        for (int i = 0; i < vector.size(); i++) {
            System.out.println(vector.get(i).toString());
        }
    }

}

结果:变得有序了

Card [num=1, type=1]
Card [num=3, type=1]
Card [num=3, type=2]
Card [num=7, type=3]
Card [num=7, type=4]

结论:内部比较器可以按照自己的方式进行排序,但是缺点就是会入侵类。不够优雅。

2.外部比较器。

新建一个类作为比较器,实现接口comparetor

public  class MyComparetor implements Comparator<Card>{

    @Override
    public int compare(Card o1, Card o2) { 
//        if(o1.getNum()!=o2.getNum()){
//            return o1.getNum()-o2.getNum();
//        }else
//            return o1.getType()-o2.getType();
        return o1.getNum()!=o2.getNum()?o1.getNum()-o2.getNum():o1.getType()-o2.getType();
    }


}

测试:

public class 比较器 {

    public static void main(String[] args) {
        Vector<Card> vector=new Vector<>();
        vector.add(new Card(7, 4));
        vector.add(new Card(1, 1));
        vector.add(new Card(3, 2));
        vector.add(new Card(7, 3));
        vector.add(new Card(3, 1));
        
        Collections.sort(vector,
new MyComparetor())
;//使用外部比较器
        for (int i = 0; i < vector.size(); i++) {
            System.out.println(vector.get(i).toString());
        }
    }

}


结果一样。优点更优雅。

 

3.treeMap的排序。treeMap可以按照key排序。比较特殊,也可以自定义key的排序规则,默认按照字典key排序。

其实只是写法不同,原理都是和上面所述的差不多。

下面这写法就是外部比较器的写法。不写的话在Card类里面同样实现了比较接口就等同与内部比较器,结果一样。如果都不设定的话就按照默认的字典顺序进行排序。

public class Test {

    public static void main(String[] args) {
        //比较key
        TreeMap<Card, String> map=new TreeMap<>(
new Comparator<Card>() { @Override public int compare(Card o1, Card o2) { return o1.getNum()!=o2.getNum()?o1.getNum()-o2.getNum():o1.getType()-
o2.getType();
            }
            
        });
        map.put(new Card(1, 2), "bb");
        map.put(new Card(2, 4), "dd");
        map.put(new Card(2, 1), "cc");
        map.put(new Card(1, 1), "aa");
        System.out.println(map);
        
    }

}

结果:

{Card [num=1, type=1]=aa, Card [num=1, type=2]=bb, Card [num=2, type=1]=cc, Card [num=2, type=4]=dd}

posted @ 2017-09-11 16:55  永恒之蓝  阅读(219)  评论(0编辑  收藏  举报