zoukankan      html  css  js  c++  java
  • 类比较器

    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}

  • 相关阅读:
    20210621SMB1协议安全问题
    用Markdown编辑微信公众号
    重温数据结构01 基本概念
    Mac安装HomeBrew
    曲終
    四、10分钟ToPandas_0.24.2
    三、Pandas速查手册中文版
    一、Numpy库与多维数组
    零.注意的细节
    二、Pandas库与数据处理
  • 原文地址:https://www.cnblogs.com/lq625424841/p/7505762.html
Copyright © 2011-2022 走看看