zoukankan      html  css  js  c++  java
  • Java中Comparator、Comparable的比较功能

    Comarable和Comparator都是用来实现集合中元素的比较、排序的,Comparable是在集合内部定义的方法实现排序,Comparator是在集合外部实现的排序,Comparable位于java.lang包,Comparator位于java.util包。

    Comparable:

    当前类小于参数返回负数,等于返回0,大于返回正数。

    class Person implements Comparable<Person>{
        String name;
        int age;
        Person(String n, int a) {
            name = n;
            age = a;
        }
    
        @Override
        public int compareTo(Person person) {
            return name.compareTo(person.name);
        }
    }
    ArrayList<Person> list = new ArrayList<Person>();
    list.add(new Person("aaa", 10));
    list.add(new Person("bbb", 20));
    list.add(new Person("ccc", 30));
    Collections.sort(list); //这里会自动调用Person中重写的compareTo方法。

    Comparator:

    可以通过两种方式实现自定义排序

    1.定义一个类实现Comparator接口,重写compare方法。

    2.语法不同,在内部new这个接口并重写compare方法。

    第一个参数小于第二个参数返回负数,相等返回0,大于返回正数。

    class Person {
        String name;
        int age;
        Person(String n, int a) {
            name = n;
            age = a;
        }
    }
    class DemoComparator implements Comparator<Person> {
        @Override
        public int compare(Person a, Person b) {
            return a.name.compareToIgnoreCase(b.name);
        }
    }
    class Demo {
        public static void main(String[] args) {
            List<Person> persons = Arrays.asList(
                new Person("Joe", 24),
                new Person("Pete", 18),
                new Person("Chris", 21)
            );
            Collections.sort(persons, new DemoComparator());
            System.out.println(persons);
            //[{name=Chris, age=21}, {name=Joe, age=24}, {name=Pete, age=18}]
            Collections.sort(persons, new Comparator<Person>() {
                @Override
                public int compare(Person a, Person b) {
                    return a.age < b.age ? -1 : a.age == b.age ? 0 : 1;
                }
            });
            System.out.println(persons);
            //[{name=Pete, age=18}, {name=Chris, age=21}, {name=Joe, age=24}]
        }
    }
  • 相关阅读:
    react路由传参的三种方式:
    毕设登录逻辑分析
    redis缓存数据库的配置和分析
    c#窗体虚线图形验证码设计
    C#窗体技巧
    关于子窗体的层级关系
    安装SQL SERVER开启SA用户登录的方法
    SQL中CONVERT日期不同格式的转换用法
    sql server中自连接的使用
    IFieldEdit Interface 接口
  • 原文地址:https://www.cnblogs.com/DreamFather/p/14581098.html
Copyright © 2011-2022 走看看