首页 > 编程语言 >Java的Comparable和Comparator

Java的Comparable和Comparator

时间:2023-06-19 10:56:09浏览次数:46  
标签:Comparable Java name Comparator age Person words public String

Java的Comparable和Comparator

当我们使用自定义 Java 对象执行比较时,我们可以使用ComparableComparator接口。

  1. Java可比对象

    Comparable接口对实现它的每个类的对象强加了总体排序。 此排序称为类的自然排序。 该类的compareTo()方法必须实现以提供自然的比较。

  2. Java比较器

    Comparator接口对某些对象集合强加了整体排序。 可以将比较器传递给排序方法(例如Collections.sort()Arrays.sort()),以实现对排序顺序的精确控制。 比较器还可以用于控制某些数据结构(例如排序集或排序映射)的顺序,或为没有自然顺序的对象集合提供排序。

  3. 可比对象和比较器

    1. Java可比对象
      • 必须定义o1.compareTo(o2)
      • 用于实现对象的自然排序
      • 我们必须修改要对其实例进行排序的类
      • 在同一班
      • 只有一种实现
      • 在 API 中经常通过以下方式实现:字符串,包装类,日期,日历
    2. Java比较器
      • 必须定义compare(o1, o2)
      • 比较类型的两个实例的多种方法-例如 按年龄,姓名比较人
      • 我们可以为我们无法控制的类提供比较器
      • 我们可以有多个比较器的实现
      • 旨在实现对第三方类实例的排序
  4. Java内置比较器示例

    public class JavaBuiltInComparator {
    
        public static void main(String[] args) {
    
            List<String> words = new ArrayList<>();
    
            words.add("dog");
            words.add("pen");
            words.add("sky");
            words.add("rock");
            words.add("den");
            words.add("fountain");
    
            words.sort(Comparator.naturalOrder());
            words.forEach(System.out::println);
    
            words.sort(Comparator.reverseOrder());
            words.forEach(System.out::println);
        }
    }
    

    Comparator.naturalOrder()返回内置的自然顺序Comparator

    words.sort(Comparator.naturalOrder());
    

    Comparator.reverseOrder()返回一个比较器,该比较器强加自然顺序。

    words.sort(Comparator.reverseOrder());
    

    Comparator.comparingInt()方法从提供的类型中提取 int 排序键,并通过该键进行比较。

    class Person {
    
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
    
            this.age = age;
        };
    
        public int getAge() {
    
            return this.age;
        }
    
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Person{");
            sb.append("name='").append(name).append('\'');
            sb.append(", age=").append(age);
            sb.append('}');
            return sb.toString();
        }
    }
    
    public class JavaBuiltInComparator2 {
    
        public static void main(String[] args) {
    
            Person p1 = new Person("Robert", 23);
            Person p2 = new Person("Monika", 18);
            Person p3 = new Person("Tom", 37);
            Person p4 = new Person("Elisabeth", 31);
    
            List<Person> vals = Arrays.asList( p1, p2, p3, p4 );
    
            vals.sort(Comparator.comparingInt(Person::getAge));
            vals.forEach(System.out::println);
        }
    }
    
  5. 多个比较器

    通过Comparator.thenComparing()方法,我们可以在对对象进行排序时使用多个比较器。

    class Person {
    
        private String name;
        private int age;
        private String city;
    
        public Person(String name, int age, String city) {
            this.name = name;
            this.age = age;
            this.city = city;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Person{");
            sb.append("name='").append(name).append('\'');
            sb.append(", age=").append(age);
            sb.append(", city='").append(city).append('\'');
            sb.append('}');
            return sb.toString();
        }
    }
    
    public class JavaMultipleComparatorsEx {
    
        public static void main(String[] args) {
    
            List<Person> persons = Arrays.asList(
                    new Person("Peter", 23, "New York"),
                    new Person("Sarah", 13, "Las Vegas"),
                    new Person("Lucy", 33, "Toronto"),
                    new Person("Sarah", 21, "New York"),
                    new Person("Tom", 18, "Toronto"),
                    new Person("Robert", 23, "San Diego"),
                    new Person("Lucy", 23, "Los Angeles"),
                    new Person("Sam", 36, "Dallas"),
                    new Person("Elisabeth", 31, "New York"),
                    new Person("Ruth", 29, "New York"),
                    new Person("Sarah", 41, "New York")
            );
    
            persons.sort(Comparator.comparing(Person::getName)
                    .thenComparing(Person::getCity)
                    .thenComparing(Person::getAge));
    
            persons.forEach(System.out::println);
        }
    }
    

    先按对象名称比较对象,然后按城市比较对象,最后按年龄比较对象。

    persons.sort(Comparator.comparing(Person::getName)
            .thenComparing(Person::getCity)
            .thenComparing(Person::getAge));
    
  6. Java自定义比较器

    public class JavaCustomComparatorEx {
    
        public static void main(String[] args) {
    
            List<String> words = Arrays.asList("pen", "blue", "atom", "to",
                    "ecclesiastical", "abbey", "car", "ten", "desk", "slim",
                    "journey", "forest", "landscape", "achievement", "Antarctica");
    
            words.sort((e1, e2) -> e1.length() - e2.length());
    
            words.forEach(System.out::println);
    
            words.sort((e1, e2) ->  e2.length() - e1.length() );
    
            words.forEach(System.out::println);
        }
    }
    

    有一个单词表。 根据单词的长度对其进行比较。

    words.sort((e1, e2) -> e1.length() - e2.length());
    

    这个自定义比较器用于按单词的大小按升序对单词进行排序。

    words.sort((e1, e2) ->  e2.length() - e1.length() );
    

标签:Comparable,Java,name,Comparator,age,Person,words,public,String
From: https://www.cnblogs.com/tongsuper/p/17490565.html

相关文章

  • Java多态
    Java多态多态基础Java多态,多态是面向对象特征之一,它允许我们以不同的方式执行单个动作。例如,假设我们有一个Animal类,它有一个方法sound()。由于这是一个泛型类,所以我们不能给它一个实现,如:汪汪,喵喵等。我们不得不给出一个通用的消息。publicclassAnimal{...pub......
  • Kotlin与Java互调原理项目实战
    数天前我将我java开发的工程,全部转换成了kotlin形式的工程。如果你也想做,本身也有一定的java开发安卓程序的功底。本文将比较适合你。创建kotlin工程,拷贝类文件xml文件等核心文件到工程目录下,形成一个kotlin底子的java代码组成的工程,然后通过ctrl+shift+alt+k快捷代码逐个转换......
  • java 如何字符串中提取数字,这个方法真的很不错
    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法。1.使用正则表达式可以使用正则表达式"\d+"来匹配字符串中的数字,并使用Matcher和Pattern类实现。importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassExtractNumbersFromString......
  • java 如何字符串中提取数字,这个方法真的很不错
    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法。1.使用正则表达式可以使用正则表达式"\d+"来匹配字符串中的数字,并使用Matcher和Pattern类实现。importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassExtractNumbersFromString......
  • Java判断null的几种方式
    组内codereview时,有同学提到字符串判断空值的写法,如下两种,(1)null在后,@TestpublicvoidtestDemo1(){Stringstr=null;if(str==null){System.out.println("null在后");return;}}(2)null在前,@TestpublicvoidtestDemo2(){Stringstr=null;if(n......
  • java课程设计
    importjava.sql.*;importstaticjava.sql.DriverManager.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Random;classConnect{//建立数据库的连接Connecti......
  • 10个ai算法常用库java版
    根据AI项目的具体需求,可以选择最合适的库或框架,并开始尝试使用不同的算法来构建AI解决方案。1.Deeplearning4j 它是一个用于Java和Scala的开源分布式深度学习库。Deeplearning4j支持各种深度学习架构,包括卷积神经网络(CNN)、递归神经网络(RNN)和深度信念网络(DBN......
  • Java Websocket 02: 原生模式通过 Websocket 传输文件
    目录JavaWebsocket01:原生模式Websocket基础通信JavaWebsocket02:原生模式通过Websocket传输文件Websocket原生模式传输文件关于Websocket传输的消息类型,允许的参数包括以下三类以下类型之一,同时只能出现一个文本类型(textmessages)的消息:String......
  • java限流
    @ComponentpublicclassLimiterUtil{@ResourceprivateRedisTemplate<String,String>redisTemplate;/***固定窗口限流算法**@returntrue限流false放行*/publicbooleanfixedWindow(Stringkey,intcount){longcountCache=redisTemplate.op......
  • daka :p java day 1!
    书写helloworld!publicclasshelloworld{publicstaticvoidmain(String[]arges){System.out.println("helloworld!");}}  ......