zoukankan      html  css  js  c++  java
  • Java原来如此-比较器(Comparable、Comparator)

    有时候需要对Collection或者不为单一数字的Array进行比较,有两种方法,1是实现Comparable接口,2是实现Comparator接口。

    1.ComParable接口

    Comparable接口的定义如下:
    public interface Comparable<T>

    {
        public int compareTo(T o);
    }
    此方法返回一个int类型的数据,但是此int的值只能是一下三种:
    1:表示大于
    -1:表示小于
    0:表示相等

    实例:

    package zy.java.lang;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    public class ComparableTest implements Comparable<ComparableTest>
    {
        private String id;
        private int age;
    
        public ComparableTest(String id,int age)
        {
            this.id = id;
            this.age = age;
        }
    
        public String getId()
        {
            return id;
        }
    
        public void setId(String id)
        {
            this.id = id;
        }
    
        public int getAge()
        {
            return age;
        }
    
        public void setAge(int age)
        {
            this.age = age;
        }
    
        @Override
        public int compareTo(ComparableTest c)
        {
            return this.age - c.getAge();
        }
    
        public static void main(String[] args)
        {
            //Collection
            ComparableTest ct1 = new ComparableTest("a",39);
            ComparableTest ct2 = new ComparableTest("b",31);
            ComparableTest ct3 = new ComparableTest("c",38);
    
            List<ComparableTest> list = new ArrayList<ComparableTest>();
            list.add(ct1);
            list.add(ct2);
            list.add(ct3);
    
            Collections.sort(list);
    
            for(int i=0;i<list.size();i++)
            {
                System.out.println(list.get(i).getId());
            }
    
            System.out.println("-------------------------------------------");
    
            //Array
            ComparableTest[] ct = new ComparableTest[]{
                    new ComparableTest("a",39),
                    new ComparableTest("b",31),
                    new ComparableTest("c",38)
            };
    
            Arrays.sort(ct);
    
            for(int i=0;i<ct.length;i++)
            {
                System.out.println(ct[i].getId());
            }
        }
    }
    

    2.Comparator接口

    如果一个类已经开放完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这一的问题,java又定义了另一个比较器的操作接口 Comparator 此接口定义在java.util包中,接口定义如下:
    public interface Comparator<T>

    {
      public int compare(T o1,T o2);
    }

    实例:

    package zy.java.lang;
    
    public class Users
    {
        private String id;
        private int age;
    
        public Users(String id, int age) {
            this.id = id;
            this.age = age;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

      

    package zy.java.lang;
    
    import java.util.*;
    
    public class ComparatorTest implements Comparator<Users>
    {
        @Override
        public int compare(Users o1, Users o2)
        {
            return o1.getAge() - o2.getAge();
        }
    
        public static void main(String[] agrs)
        {
            //Collection
            Users u1 = new Users("a",33);
            Users u2 = new Users("b",31);
            Users u3 = new Users("c",38);
    
            List<Users> list1 = new ArrayList<Users>();
            list1.add(u1);
            list1.add(u2);
            list1.add(u3);
    
            Collections.sort(list1, new ComparatorTest());
    
            for(int i=0;i<list1.size();i++)
            {
                System.out.println(list1.get(i).getId());
            }
    
            System.out.println("-------------------------------------------");
    
            //Array
            Users[] u = new Users[]{
                    new Users("a",39),
                    new Users("b",31),
                    new Users("c",38)
            };
    
            Arrays.sort(u);
    
            for(int i=0;i<u.length;i++)
            {
                System.out.println(u[i].getId());
            }
        }
    }
    

     

    选择Comparable接口还是Comparator?
    一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
    Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
    1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
    2、可以使用多种排序标准,比如升序、降序等。

  • 相关阅读:
    LeetCode 42. Trapping Rain Water
    LeetCode 209. Minimum Size Subarray Sum
    LeetCode 50. Pow(x, n)
    LeetCode 80. Remove Duplicates from Sorted Array II
    Window10 激活
    Premiere 关键帧缩放
    AE 「酷酷的藤」特效字幕制作方法
    51Talk第一天 培训系列1
    Premiere 视频转场
    Premiere 暴徒生活Thug Life
  • 原文地址:https://www.cnblogs.com/zyaizz/p/3605103.html
Copyright © 2011-2022 走看看