zoukankan      html  css  js  c++  java
  • java集合框架之比较器Comparator、Comparable

     参考http://how2j.cn/k/collection/collection-comparator-comparable/693.html

    Comparator

    假设Hero有三个属性 name,hp,damage
    一个集合中放存放10个Hero,通过Collections.sort对这10个进行排序
    那么到底是hp小的放前面?还是damage小的放前面?Collections.sort也无法确定
    所以要指定到底按照哪种属性进行排序
    这里就需要提供一个Comparator给定如何进行两个对象之间的大小比较

    Hero代码

    package charactor;
      
    public class Hero  {
        public String name;
        public float hp;
      
        public int damage;
      
        public Hero() {
      
        }
      
        public Hero(String name) {
     
            this.name = name;
        }
      
        public String toString() {
            return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]
    ";
        }
     
        public Hero(String name, int hp, int damage) {
            this.name = name;
            this.hp = hp;
            this.damage = damage;
        }
      
    }

    TestCollection代码

    package collection;
         
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Random;
        
    import charactor.Hero;
         
    public class TestCollection {
        public static void main(String[] args) {
            Random r =new Random();
            List<Hero> heros = new ArrayList<Hero>();
                
            for (int i = 0; i < 10; i++) {
                //通过随机值实例化hero的hp和damage
                heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
            }
            System.out.println("初始化后的集合:");
            System.out.println(heros);
                
            //直接调用sort会出现编译错误,因为Hero有各种属性
            //到底按照哪种属性进行比较,Collections也不知道,不确定,所以没法排
            //Collections.sort(heros);
                
            //引入Comparator,指定比较的算法
            Comparator<Hero> c = new Comparator<Hero>() {
                @Override
                public int compare(Hero h1, Hero h2) {
                    //按照hp进行排序
                    if(h1.hp>=h2.hp)
                        return 1;  //正数表示h1比h2要大
                    else
                        return -1;
                }
            };
            Collections.sort(heros,c);
            System.out.println("按照血量排序后的集合:");
            System.out.println(heros);
        }
    }

    Comparable

    使Hero类实现Comparable接口
    在类里面提供比较算法
    Collections.sort就有足够的信息进行排序了,也无需额外提供比较器Comparator

    Hero代码

    package charactor;
        
    public class Hero implements Comparable<Hero>{
        public String name;
        public float hp;
           
        public int damage;
           
        public Hero(){
              
        }
          
        public Hero(String name) {
            this.name =name;
      
        }
          
        //初始化name,hp,damage的构造方法
        public Hero(String name,float hp, int damage) {
            this.name =name;
            this.hp = hp;
            this.damage = damage;
        }
      
        @Override
        public int compareTo(Hero anotherHero) {
            if(damage<anotherHero.damage)
                return 1; 
            else
                return -1;
        }
      
        @Override
        public String toString() {
            return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]
    ";
        }
          
    }

    TestCollection代码

    package collection;
       
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Random;
      
    import charactor.Hero;
       
    public class TestCollection {
        public static void main(String[] args) {
            Random r =new Random();
            List<Hero> heros = new ArrayList<Hero>();
              
            for (int i = 0; i < 10; i++) {
                //通过随机值实例化hero的hp和damage
                heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
            }
              
            System.out.println("初始化后的集合");
            System.out.println(heros);
              
            //Hero类实现了接口Comparable,即自带比较信息。
            //Collections直接进行排序,无需额外的Comparator
            Collections.sort(heros);
            System.out.println("按照伤害高低排序后的集合");
            System.out.println(heros);
              
        }
    }

    自定义顺序的TreeSet

    默认情况下,TreeSet中的数据是从小到大排序的,不过TreeSet的构造方法支持传入一个Comparator

    public TreeSet(Comparator comparator)

    通过这个构造方法创建一个TreeSet,使得其中的的数字是倒排序的

    TreeSetDemo代码(实现倒序

    package Test.testtest;
    
    import java.util.Comparator;
    import java.util.TreeSet;
    
    /**
     * @Auther: 李景然
     * @Date: 2018/5/25 14:43
     * @Description:
     */
    public class TreeSetDemo {
        public static void main(String[] args) {
            TreeSet<Integer> treeSet=new TreeSet<>(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return -Integer.compare(o1,o2);//实现倒序
                }
            });
    
            for (int i=0;i<100;i++){
                double d=Math.random()*100;
                treeSet.add(Integer.valueOf((int)d));
            }
            System.out.println(treeSet);
        }
    }

    运行结果:

  • 相关阅读:
    CodeForces
    CodeForces
    CodeForces
    【模板】POJ-1511(dijkstra堆优化+链式前向星)
    【模板】POJ-1502(dijkstra)
    P2862 [USACO06JAN]Corral the Cows G
    P2495 [SDOI2011]消耗战
    CF613D Kingdom and its Cities
    P4655 [CEOI2017]Building Bridges
    P3917 异或序列
  • 原文地址:https://www.cnblogs.com/lijingran/p/9088626.html
Copyright © 2011-2022 走看看