Java 教程 Java 简介 Java 下载安装 Java 入门 Java 语法 Java 注释 Java 变量 Java 数据类型 Java 数据类型转换 Java 运算符 Java 字符串 Java 数学方法 Java 布尔值 Java If ... Else 语句 Java Switch 语句 Java While 循环语句 Java For 循环语句 Java Break 和 Continue 语句 Java 数组 Java 方法 Java 方法中的参数 Java 方法重载 Java 作用域 Java 递归 Java OOP 面向对象编程 Java 对象和类 Java 类属性 Java 类方法 Java 构造函数 Java 修饰符 Java 封装 Java 包(Packages) Java 继承 Java 多态 Java 内部类 (嵌套类) Java 抽象类 Java 接口 Java 枚举 Java 用户输入 (Scanner) Java 日期和时间 Java ArrayList 数组列表 Java 链表 Java HashMap Java HashSet 集合 Java 迭代器 Java 包装类 Java 异常 - Try...Catch Java 正则表达式 Java 线程 Java Lambda 表达式 Java 文件处理 Java 创建文件和写入文件 Java 读取文件 Java 删除文件 Java ArrayList Java ArrayList Java LinkedList Java 列表排序 Java HashMap Java HashSet Java 迭代器 Java 包装类 Java 异常 - Try...Catch Java 正则表达式 Java 线程 Java Lambda 表达式 Java 高级排序(Comparator 和 Comparable) Java 如何将两个数字相加 Java 如何将两个数字相加 Java 如何统计字数 Java 如何反转字符串 Java 如何计算数组元素的和 Java 如何将字符串转换为数组 Java 如何排序数组 Java 如何计算数组元素的平均值 Java 如何找到数组中的最小元素 Java 如何遍历 ArrayList Java 如何遍历 HashMap Java 如何遍历枚举 Java 如何计算矩形的面积 Java 如何判断数字的奇偶性 Java 如何判断数字的正负 Java 如何求一个数的平方根 Java 如何生成随机数 Java 关键字 Java String 方法 Java Math 方法 Java Output 方法 Java Arrays 类 Java ArrayList 方法 Java LinkedList 方法 Java HashMap 方法 Java Scanner 方法 Java 迭代器接口 Java 错误和异常类型 Java abstract 关键字 Java assert 关键字 Java boolean 关键字 Java break 关键字 Java byte 关键字 Java case 关键字 Java catch 关键字 Java char 关键字 Java class 关键字 Java continue 关键字 Java default 关键字 Java do 关键字 Java double 关键字 Java else 关键字 Java enum 关键字 Java exports 关键字 Java extends 关键字 Java final 关键字 Java finally 关键字 Java float 关键字 Java for 关键字 Java if 关键字 Java implements 关键字 Java import 关键字 Java instanceof 关键字 Java int 关键字 Java interface 关键字 Java long 关键字 Java module 关键字 Java native 关键字 Java new 关键字 Java package 关键字 Java private 关键字 Java protected 关键字 Java public 关键字 Java requires 关键字 Java return 关键字 Java short 关键字 Java static 关键字 Java super 关键字 Java switch 关键字 Java synchronized 关键字 Java this 关键字 Java throw 关键字 Java throws 关键字 Java transient 关键字 Java try 关键字 Java var 关键字 Java void 关键字 Java volatile 关键字 Java while 关键字 Java String 方法 Java String charAt() 方法 Java String codePointAt() 方法 Java String codePointBefore() 方法 Java String codePointCount() 方法 Java String compareTo() 方法 Java String compareToIgnoreCase() 方法 Java String concat() 方法 Java String contains() 方法 Java String contentEquals() 方法 Java String copyValueOf() 方法 Java String endsWith() 方法 Java String equals() 方法 Java String equalsIgnoreCase() 方法 Java String format() 方法 Java String getBytes() 方法 Java String getChars() 方法 Java String hashCode() 方法 Java String indexOf() 方法 Java String isEmpty() 方法 Java String join() 方法 Java String lastIndexOf() 方法 Java String length() 方法 Java String matches() 方法 Java String offsetByCodePoints() 方法 Java String regionMatches() 方法 Java String replace() 方法 Java String replaceAll() 方法 Java String replaceFirst() 方法 Java String split() 方法 Java String startsWith() 方法 Java String subSequence() 方法 Java String substring() 方法 Java String toCharArray() 方法 Java String toLowerCase() 方法 Java String toString() 方法 Java String toUpperCase() 方法 Java String trim() 方法 Java String valueOf() 方法 Java Math 方法 Java Math abs() 方法 Java Math acos() 方法 Java Math addExact() 方法 Java Math asin() 方法 Java Math atan() 方法 Java Math atan2() 方法 Java Math cbrt() 方法 Java Math ceil() 方法 Java Math copySign() 方法 Java Math cos() 方法 Java Math cosh() 方法 Java Math decrementExact() 方法 Java Math exp() 方法 Java Math expm1() 方法 Java Math floor() 方法 Java Math floorDiv() 方法 Java Math floorMod() 方法 Java Math getExponent() 方法 Java Math hypot() 方法 Java Math IEEEremainder() 方法 Java Math incrementExact() 方法 Java Math log() 方法 Java Math log10() 方法 Java Math log1p() 方法 Java Math max() 方法 Java Math min() 方法 Java Math multiplyExact() 方法 Java Math negateExact() 方法 Java Math nextAfter() 方法 Java Math nextDown() 方法 Java Math nextUp() 方法 Java Math pow() 方法 Java Math random() 方法 Java Math rint() 方法 Java Math round() 方法 Java Math scalb() 方法 Java Math signum() 方法 Java Math sin() 方法 Java Math sinh() 方法 Java Math sqrt() 方法 Java Math subtractExact() 方法 Java Math tan() 方法 Java Math tanh() 方法 Java Math toDegrees() 方法 Java Math toIntExact() 方法 Java Math toRadians() 方法 Java Math ulp() 方法 Java Output 方法 Java Output print() 方法 Java Output printf() 方法 Java Output println() 方法 Java Arrays 类 Java Arrays.compare() 方法 Java Arrays.equals() 方法 Java Arrays.fill() 方法 Java Arrays.sort() 方法 Java ArrayList 方法 Java ArrayList add() 方法 Java ArrayList addAll() 方法 Java ArrayList clear() 方法 Java ArrayList clone() 方法 Java ArrayList contains() 方法 Java ArrayList ensureCapacity() 方法 Java ArrayList forEach() 方法 Java ArrayList get() 方法 Java ArrayList indexOf() 方法 Java ArrayList isEmpty() 方法 Java ArrayList iterator() 方法 Java ArrayList lastIndexOf() 方法 Java ArrayList listIterator() 方法 Java ArrayList remove() 方法 Java ArrayList removeAll() 方法 Java ArrayList removeIf() 方法 Java ArrayList replaceAll() 方法 Java ArrayList retainAll() 方法 Java ArrayList set() 方法 Java ArrayList size() 方法 Java ArrayList sort() 方法 Java ArrayList spliterator() 方法 Java ArrayList subList() 方法 Java ArrayList toArray() 方法 Java ArrayList trimToSize() 方法 Java LinkedList 方法 Java LinkedList add() 方法 Java LinkedList addAll() 方法 Java LinkedList addFirst() 方法 Java LinkedList addLast() 方法 Java LinkedList clear() 方法 Java LinkedList clone() 方法 Java LinkedList contains() 方法 Java LinkedList getFirst() 方法 Java LinkedList forEach() 方法 Java LinkedList get() 方法 Java LinkedList indexOf() 方法 Java LinkedList isEmpty() 方法 Java LinkedList iterator() 方法 Java LinkedList lastIndexOf() 方法 Java LinkedList listIterator() 方法 Java LinkedList removeFirst() 方法 Java LinkedList remove() 方法 Java LinkedList removeAll() 方法 Java LinkedList removeIf() 方法 Java LinkedList removeLast() 方法 Java LinkedList replaceAll() 方法 Java LinkedList retainAll() 方法 Java LinkedList set() 方法 Java LinkedList size() 方法 Java LinkedList sort() 方法 Java LinkedList spliterator() 方法 Java LinkedList subList() 方法 Java LinkedList toArray() 方法 Java HashMap 方法 Java HashMap clear() 方法 Java HashMap clone() 方法 Java HashMap compute() 方法 Java HashMap computeIfAbsent() 方法 Java HashMap computeIfPresent() 方法 Java HashMap containsKey() 方法 Java HashMap containsValue() 方法 Java HashMap entrySet() 方法 Java HashMap forEach() 方法 Java HashMap get() 方法 Java HashMap getOrDefault() 方法 Java HashMap isEmpty() 方法 Java HashMap keySet() 方法 Java HashMap merge() 方法 Java HashMap put() 方法 Java HashMap putAll() 方法 Java HashMap putIfAbsent() 方法 Java HashMap remove() 方法 Java HashMap replace() 方法 Java HashMap replaceAll() 方法 Java HashMap size() 方法 Java HashMap values() 方法 Java Scanner 方法 Java Scanner close() 方法 Java Scanner delimiter() 方法 Java Scanner findInLine() 方法 Java Scanner findWithinHorizon() 方法 Java Scanner hasNext() 方法 Java Scanner hasNextBoolean() 方法 Java Scanner hasNextByte() 方法 Java Scanner hasNextDouble() 方法 Java Scanner hasNextFloat() 方法 Java Scanner hasNextInt() 方法 Java Scanner hasNextLine() 方法 Java Scanner hasNextLong() 方法 Java Scanner hasNextShort() 方法 Java Scanner locale() 方法 Java Scanner next() 方法 Java Scanner nextBoolean() 方法 Java Scanner nextByte() 方法 Java Scanner nextDouble() 方法 Java Scanner nextFloat() 方法 Java Scanner nextInt() 方法 Java Scanner nextLine() 方法 Java Scanner nextLong() 方法 Java Scanner nextShort() 方法 Java Scanner radix() 方法 Java Scanner reset() 方法 Java Scanner useDelimiter() 方法 Java Scanner useLocale() 方法 Java Scanner useRadix() 方法 Java 迭代器接口 Java 错误和异常类型 Java.io.BufferedInputStream 类 Java.io.BufferedOutputStream 类 Java.io.BufferedReader 类 Java.io.BufferedWriter 类 Java.io.ByteArrayInputStream 类 Java.io.ByteArrayOutputStream 类 Java.io.CharArrayReader 类 Java.io.CharArrayWriter 类 Java.io.Console 类 Java.io.DataInputStream 类 Java.io.DataOutputStream 类 Java.io.File 类 Java.io.FileDescriptor 类 Java.io.FileInputStream 类 Java.io.FileOutputStream 类 Java.io.FilePermission 类 Java.io.FileReader 类 Java.io.FileWriter 类 Java.io.FilterInputStream 类 Java.io.FilterOutputStream 类 Java.io.FilterReader 类 Java.io.FilterWriter 类 Java.io.InputStream 类 Java.io.InputStreamReader 类 Java.io.LineNumberInputStream 类 Java.io.LineNumberReader 类 Java.io.ObjectInputStream 类 Java.io.ObjectInputStream.GetField 类 Java.io.ObjectOutputStream 类 Java.io.ObjectOutputStream.PutField 类 Java.io.ObjectStreamClass 类 Java.io.ObjectStreamField 类 Java.io.OutputStream 类 Java.io.OutputStreamWriter 类 Java.io.PipedInputStream 类 Java.io.PipedOutputStream 类 Java.io.PipedReader 类 Java.io.PipedWriter 类 Java.io.PrintStream 类 Java.io.PrintWriter 类 Java.io.PushbackInputStream 类 Java.io.PushbackReader 类 Java.io.RandomAccessFile 类 Java.io.Reader 类 Java.io.SequenceInputStream 类 Java.io.SerializablePermission 类 Java.io.StreamTokenizer 类 Java.io.StringBufferInputStream 类 Java.io.StringReader 类 Java.io.StringWriter 类 Java.io.Writer 类 Java.io.Interfaces 接口 Java.io.Exceptions 接口 Java.lang Boolean 类 Java.lang.Byte 类 Java.lang.Character 类 Java.lang.Character.Subset 类 Java.lang.Character.UnicodeBlock 类 Java.lang.Class 类 Java.lang.ClassLoader 类 Java.lang.Compiler 类 Java.lang.Double 类 Java.lang.Enum 类 Java.lang.Float 类 Java.lang.InheritableThreadLocal 类 Java.lang.Integer 类 Java.lang.Long 类 Java.lang.Math 类 Java.lang.Number 类 Java.lang.Object 类 Java.lang.Package 类 Java.lang.Process 类 Java.lang.ProcessBuilder 类 Java.lang.Runtime 类 Java.lang.RuntimePermission 类 Java.lang.SecurityManager 类 Java.lang.Short 类 Java.lang.StackTraceElement 类 Java.lang.StrictMath 类 Java.lang.String 类 Java.lang.StringBuffer 类 Java.lang.StringBuilder 类 Java.lang.System 类 Java.lang.Thread 类 Java.lang.ThreadGroup 类 Java.lang.ThreadLocal 类 Java.lang.Throwable 类 Java.lang.Void 类 Java.lang.Interfaces Java.lang.Errors Java.lang.Exceptions Java.math.BigDecimal 类 Java.math.BigInteger 类 Java.math.MathContext 类 Java.math.RoundingMode 枚举 java.time.Clock 类 java.time.Duration 类 java.time.Instant 类 java.time.LocalDate 类 java.time.LocalDateTime 类 java.time.LocalTime 类 java.time.MonthDay 类 java.time.OffsetDateTime 类 java.time.OffsetTime 类 java.time.Period 类 java.time.Year 类 java.time.YearMonth 类 java.time.ZonedDateTime 类 java.time.ZoneId 类 java.time.ZoneOffset 类 java.time.Month 枚举 Java.util.ArrayDeque 类 Java.util.ArrayList 类 Java.util.Arrays 类 Java.util.BitSet 类 Java.util.Calendar 类 Java.util.Collections 类 Java.util.Currency 类 Java.util.Date 类 Java.util.Dictionary 类 Java.util.EnumMap 类 Java.util.EnumSet 类 Java.util.Formatter 类 Java.util.GregorianCalendar 类 Java.util.HashMap 类 Java.util.HashSet 类 Java.util.Hashtable 类 Java.util.IdentityHashMap 类 Java.util.LinkedHashMap 类 Java.util.LinkedHashSet 类 Java.util.LinkedList 类 Java.util.ListResourceBundle 类 Java.util.Locale 类 Java.util.Observable 类 Java.util.PriorityQueue 类 Java.util.Properties 类 Java.util.PropertyPermission 类 Java.util.PropertyResourceBundle 类 Java.util.Random 类 Java.util.ResourceBundle 类 Java.util.ResourceBundle.Control 类 Java.util.Scanner 类 Java.util.ServiceLoader 类 Java.util.SimpleTimeZone 类 Java.util.Stack 类 Java.util.StringTokenizer 类 Java.util.Timer 类 Java.util.TimerTask 类 Java.util.TimeZone 类 Java.util.TreeMap 类 Java.util.TreeSet 类 Java.util.UUID 类 Java.util.Vector 类 Java.util.WeakHashMap 类 Java.util.Interfaces 接口 Java.util.Exceptions 接口 java.util.Formatter.BigDecimalLayoutForm 枚举 Java 正则表达式 - 概述 Java 正则表达式 - groupCount 方法 Java 正则表达式 - MatchResult 接口 Java 正则表达式 - 模式 Java 正则表达式 - Matcher 匹配器类 Java 正则表达式 - PatternSyntaxException 类 Java 正则表达式 - 匹配字符的示例 Java Regex - 匹配字符类 匹配预定义的字符类 匹配 POSIX 字符类 匹配 JAVA 字符类 匹配 Unicode 字符类 java 正则表达式 - 边界匹配器示例 Java 正则表达式的贪婪量词 勉强量词的示例 占有量词的示例 Java Regex - 逻辑运算符示例 java.util.zip - Adler32 类 java.util.zip - CheckedInputStream 类 java.util.zip - CheckedOutputStream 类 java.util.zip - CRC32 类 java.util.zip - Deflater 类 java.util.zip - DeflaterInputStream 类 java.util.zip - DeflaterOutputStream 类 java.util.zip - GZIPInputStream 类 java.util.zip - GZIPOutputStream 类 java.util.zip - Inflater 类 java.util.zip - InflaterInputStream 类 java.util.zip - InflaterOutputStream 类 java.util.zip - ZipEntry 类 java.util.zip - ZipFile 类 java.util.zip - ZipInputStream 类 java.util.zip - ZipOutputStream 类 Java Zip - 异常 Java Zip - Errors

Java 迭代器接口

Java 错误和异常类型

Java.io 包教程

Java 教程

浏览10070
更新时间2025-07-22

Java 高级排序在“列表排序”章节中,您学习了如何按字母顺序和数字顺序对列表进行排序,但如果列表中包含对象呢?为了对对象进行排序,您需要指定一个规则来决定对象

Java 高级排序

在“列表排序”章节中,您学习了如何按字母顺序和数字顺序对列表进行排序,但如果列表中包含对象呢?

为了对对象进行排序,您需要指定一个规则来决定对象的排序方式。例如,如果您有一个汽车列表,你可能想按年份排序,规则可以是年份较早的汽车排在前面。

Comparator 和 Comparable 接口允许你指定用于排序对象的规则。

能够指定排序规则还允许您改变字符串和数字的排序方式。

Comparator(比较器)

实现了 Comparator 接口的对象被称为比较器。

Comparator 接口允许你创建一个包含 compare() 方法的类,该方法比较两个对象以决定哪个在列表中应排在前面。

compare() 方法应返回一个数字,该数字:

  • 为负数时,表示第一个对象应在列表中排在前面。
  • 为正数时,表示第二个对象应在列表中排在前面。
  • 为零时,表示顺序无关紧要。

实现 Comparator 接口的类可能如下所示:

// 按年份排序 Car 对象
class SortByYear implements Comparator {
  public int compare(Object obj1, Object obj2) {
    // 确保对象是 Car 对象
    Car a = (Car) obj1;
    Car b = (Car) obj2;
    
    // 比较对象
    if (a.year < b.year) return -1; // 第一辆车的年份更小
    if (a.year > b.year) return 1;  // 第一辆车的年份更大
    return 0; // 两辆车的年份相同
  }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

要使用比较器,将其作为参数传递给排序方法:

// 使用比较器对汽车进行排序
Comparator myComparator = new SortByYear();
Collections.sort(myCars, myComparator);

运行实例 »

点击 "运行实例" 按钮查看在线实例

下面是一个使用比较器按年份排序汽车列表的完整示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// 定义一个 Car 类
class Car {
  public String brand; // 品牌
  public String model; // 型号
  public int year; // 年份
  
  // 构造函数
  public Car(String b, String m, int y) {
    brand = b;
    model = m;
    year = y;
  }
}

// 创建一个比较器
class SortByYear implements Comparator {
  // 实现 compare 方法
  public int compare(Object obj1, Object obj2) {
    // 确保传入的对象是 Car 类型
    Car a = (Car) obj1;
    Car b = (Car) obj2;
    
    // 比较两辆车的年份
    if (a.year < b.year) return -1; // 第一辆车年份更小
    if (a.year > b.year) return 1;  // 第一辆车年份更大
    return 0; // 两辆车年份相同
  }
}

public class Main { 
  public static void main(String[] args) { 
    // 创建一个汽车列表
    ArrayList<Car> myCars = new ArrayList<Car>();    
    myCars.add(new Car("BMW", "X5", 1999));
    myCars.add(new Car("Honda", "Accord", 2006));
    myCars.add(new Car("Ford", "Mustang", 1970));

    // 使用比较器对汽车进行排序
    Comparator myComparator = new SortByYear();
    Collections.sort(myCars, myComparator);

    // 显示排序后的汽车
    for (Car c : myCars) {
      System.out.println(c.brand + " " + c.model + " " + c.year);
    }
  } 
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

使用 Lambda 表达式

为了简化代码,比较器可以被替换为具有与 compare() 方法相同参数和返回值的 Lambda 表达式:

Collections.sort(myCars, (obj1, obj2) -> {
  Car a = (Car) obj1;
  Car b = (Car) obj2;
  if (a.year < b.year) return -1;
  if (a.year > b.year) return 1;
  return 0;
});

运行实例 »

点击 "运行实例" 按钮查看在线实例

特殊排序规则

比较器还可以用于为字符串和数字制定特殊的排序规则。在此例中,我们使用比较器将所有偶数列在奇数之前:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// 定义一个比较器类 SortEvenFirst,实现 Comparator 接口
class SortEvenFirst implements Comparator {
  // 实现 compare 方法,用于比较两个对象
  public int compare(Object obj1, Object obj2) {
    // 确保传入的对象是 Integer 类型
    Integer a = (Integer) obj1;
    Integer b = (Integer) obj2;
    
    // 检查每个数字是否为偶数
    // 一个数字如果除以 2 的余数为 0,则为偶数
    boolean aIsEven = (a % 2) == 0;
    boolean bIsEven = (b % 2) == 0;
    
    // 如果两个数字同为偶数或同为奇数,则按正常排序规则比较
    if (aIsEven == bIsEven) {
      if (a < b) return -1; // a小于b,返回-1
      if (a > b) return 1;  // a大于b,返回1
      return 0;             // a等于b,返回0
    } else {
      // 如果 a 是偶数,则 a 排在前面,否则 b 排在前面
      if (aIsEven) {
        return -1; // a 是偶数,返回 -1,表示 a 排在前面
      } else {
        return 1;  // b 是偶数,返回 1,表示 b 排在前面
      }
    }
  }
}

public class Main {
  public static void main(String[] args) {
    // 创建一个 Integer 类型的 ArrayList
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    // 向列表中添加一些整数
    myNumbers.add(33);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(34);
    myNumbers.add(8);
    myNumbers.add(12);

    // 创建一个 SortEvenFirst 比较器实例
    Comparator myComparator = new SortEvenFirst();
    // 使用该比较器对列表进行排序
    Collections.sort(myNumbers, myComparator);

    // 遍历并打印排序后的列表
    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

Comparable 接口

Comparable 接口允许对象通过 compareTo() 方法指定其自身的排序规则。

compareTo() 方法接受一个对象作为参数,并将可比较对象与该参数进行比较,以决定哪个在列表中应排在前面。

与比较器类似,compareTo() 方法返回一个数字,该数字:

  • 为负数时,表示可比较对象应在列表中排在前面。
  • 为正数时,表示另一个对象应在列表中排在前面。
  • 为零时,表示顺序无关紧要。

许多原生 Java 类(如 String 和 Integer)都实现了 Comparable 接口。

这就是为什么字符串和数字不需要比较器就可以进行排序的原因。

实现了 Comparable 接口的对象可能如下所示:

class Car implements Comparable {
  public String brand; // 品牌
  public String model; // 型号
  public int year;     // 年份
  
  // 定义此对象如何与其他对象进行比较
  public int compareTo(Object obj) {
    Car other = (Car) obj; // 将传入的对象强制转换为Car类型
    if (year < other.year) return -1; // 如果此对象的年份小于另一个对象的年份,则返回 -1,表示此对象较小
    if (year > other.year) return 1;  // 如果此对象的年份大于另一个对象的年份,则返回 1,表示此对象较大
    return 0; // 如果两个对象的年份相同,则返回 0,表示两个对象相等(在年份上)
  }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

下面是与之前相同的示例,但使用 Comparable 接口而不是比较器:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// 定义一个可比较的 Car 类
class Car implements Comparable<Car> {
  public String brand; // 品牌
  public String model; // 型号
  public int year;     // 年份
  
  // 构造方法,用于初始化 Car 对象
  public Car(String b, String m, int y) {
    brand = b;
    model = m;
    year = y;
  }
  
  // 实现 compareTo 方法,决定此对象如何与其他 Car 对象进行比较
  @Override
  public int compareTo(Car other) {
    if (year < other.year) return -1; // 如果此车的年份小于另一辆车的年份,则返回 -1,表示此车较小
    if (year > other.year) return 1;  // 如果此车的年份大于另一辆车的年份,则返回 1,表示此车较大
    return 0; // 如果两车的年份相同,则返回 0,表示两车相等(在年份上)
  }
}

public class Main { 
  public static void main(String[] args) { 
    // 创建一个汽车列表
    ArrayList<Car> myCars = new ArrayList<Car>();    
    myCars.add(new Car("BMW", "X5", 1999));
    myCars.add(new Car("Honda", "Accord", 2006));
    myCars.add(new Car("Ford", "Mustang", 1970));

    // 对汽车进行排序
    Collections.sort(myCars);

    // 显示汽车列表
    for (Car c : myCars) {
      System.out.println(c.brand + " " + c.model + " " + c.year);
    }
  } 
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

常见的排序技巧

最直观的按自然顺序排序两个数字的方法是编写如下代码:

if(a.year < b.year) return -1; // a 小于 b
if(a.year > b.year) return 1; // a 大于 b
return 0; // a is equal to b

运行实例 »

点击 "运行实例" 按钮查看在线实例

但实际上,这可以用一行代码完成:

return a.year - b.year;

运行实例 »

点击 "运行实例" 按钮查看在线实例

这个技巧还可以用于轻松实现反向排序:

return b.year - a.year;

运行实例 »

点击 "运行实例" 按钮查看在线实例

Comparator vs. Comparable

比较器(comparator)是一个具有一个方法的对象,用于比较两个不同的对象。

可比较对象(comparable)是一个可以与其他对象进行比较的对象。

在可能的情况下,使用 Comparable 接口更容易,但 Comparator 接口更强大,因为它允许你对任何类型的对象进行排序,即使你不能更改其代码。

相关视频

更多

免费

php8,我来也
初级php8,我来也

34万次学习

收藏

免费

Thinkphp6.0正式版视频教程
中级Thinkphp6.0正式版视频教程

39.6万次学习

收藏

免费

细说PHP第一季
中级细说PHP第一季

31万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

65万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

41.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76.8万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

64.2万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.4万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

36.3万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

133.5万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载