zoukankan      html  css  js  c++  java
  • 2.3 comparator(比较器)

    1.comparator是java的一种机制,用来帮助我们给相同对象的不同属性排序

    2.Comparable接口,是一个对象本身就已经支持自比较所需要实现的接口,如String,Integer自己就已经实现了Comparable接口,可以完成比较大小的操作,在sort时,如果不指定Comparator就以自然顺序排序,即实现Comparable接口设定的排序方式

    3.Comparator是一个专用的比较器,当对象不支持自比较或者自比较函数必能满足要求时,可以通过写一个比较器来完成两个对象之间的大小的比较。

    比如java.util.Arrays下就有按照自然排序的Arrays.sort(a)和按照自定义排序的Arrays.sort(a,cmp)cmp指Comparator

    4.举例,对Student对象的不同属性排序

    package com.cx.sort;
    
    import java.util.Comparator;
    
    public class Student {
        private String name;
        private int id;
        public static final Comparator<Student> By_NAME=new ByName();
        public static final Comparator<Student> By_ID=new ById();
        
        public String getName() {
            return name;
        }
        public int getId() {
            return id;
        }
        public Student(String name,int id) {
            this.name=name;
            this.id=id;
        }
        //按照名字排序
        private static class ByName implements Comparator<Student>{
            public int compare(Student v, Student w) {
                return v.name.compareTo(w.name);
            }
        }
        //按照id排序
        private static class ById implements Comparator<Student> {
            public int compare(Student v, Student w) {
                return v.id-w.id;
            }        
        }
    }
    package com.cx.sort;
    
    import java.util.Comparator;
    
    public class Test {
        public static void sort(Object[] a,Comparator comparator) {
            //插入排序
            int N=a.length;
            for(int i=1;i<N;i++) {
                for(int j=i;j>0 && less(comparator,a[j],a[j-1]);j--) {
                    exch(a,j,j-1);
                }
            }
        }
        private static boolean less(Comparator c,Object v,Object w) {
            //Comparator里的方法是compare()
            //Comparable里的方法是compareTo()
            return c.compare(v, w)<0;
        }
        private static void exch(Object[] a,int i,int j) {
            Object swap=a[i]; a[i]=a[j];  a[j]=swap;
        }
        
        private static void show(Student[] a) {
            for(int i=0;i<a.length;i++) {
                System.out.println("姓名:"+a[i].getName()+" "+"编号:"+a[i].getId());
            }
        }
        
        public static void main(String[] args) {
            Student a=new Student("a", 5);
            Student b=new Student("b", 1);
            Student[] stu= {a,b}; 
            System.out.println("按照编号排序");
            sort(stu, Student.By_ID);
            show(stu);
            System.out.println("按照姓名排序:");
            sort(stu,Student.By_NAME);
            show(stu);        
        }
    
    }

    结果:

    按照编号排序
    姓名:b 编号:1
    姓名:a 编号:5
    按照姓名排序:
    姓名:a 编号:5
    姓名:b 编号:1
  • 相关阅读:
    Python学习-第三天代码作业
    网络原理-1
    整理操作系统
    操作系统--开发语言--重点
    操作系统
    C#数组的声明方式
    string.Format对C#字符串格式化(转)
    C#中两个Form窗口之间的传值(父->子)(子->父) (转)
    opencv MatchTemplate()模板匹配寻找最匹配部分
    摄像头,图片筛选颜色
  • 原文地址:https://www.cnblogs.com/sunnyCx/p/8167667.html
Copyright © 2011-2022 走看看