小怪兽爱吃肉
我想要做的是按日期对所有 DateTime 开始和所有 DateTime 结束进行排序。你可以做一个或另一个,但不能同时做。要按开始日期排序(在实践中似乎很明智),请实现compareTo方法。return this.getDateRange().getStart().compareTo( thatStart );要按停止日期排序(我认为这没有任何意义),请实现Comparator接口。return t1.getDateRange().getEnd().compareTo( t2.getDateRange().getEnd() );LocalDate正如其他人所指出的,您应该使用现代java.time类,而不是可怕的旧Date//类Calendar。SimpleDateFormat对于仅日期值,没有时间和时区,请使用LocalDate.LocalDateRange正如jbx 的答案所讨论的,您应该将您的学期的开始日期和结束日期表示为一对。但是当一个类已经存在时不要写一个类。使用ThreeTen-Extra项目中LocalDateRange的类。该项目为java.time类添加了功能。Comparable在您的Term类上,实现Comparable接口以启用简单轻松的排序。添加方法compareTo。显而易见的方法是比较LocalDate每个Term对象的LocalDateRange对象的开始。该类LocalDate实现compareTo了,不,我们不必这样做。@Overridepublic int compareTo ( Object o ) { if ( this == o ) return 0; if ( o == null || getClass() != o.getClass() ) return 0; LocalDate thatStart = ( ( Term ) o ).getDateRange().getStart(); return this.getDateRange().getStart().compareTo( thatStart );}请参阅有关对象排序的 Java 教程。按停止日期排序您的问题不清楚,但您似乎要求按结束日期进行排序。我无法想象这在实际中是如何有用的。但无论如何,解决方案是通过提供Comparator接口的实现来进行排序。 @Override public int compare ( Term t1 , Term t2 ) { return t1.getDateRange().getEnd().compareTo( t2.getDateRange().getEnd() ); }示例类这是一个示例Term类。可能不是生产质量的代码,但应该让你朝着正确的方向前进。package com.basilbourque.example;import org.threeten.extra.LocalDateRange;import java.time.LocalDate;import java.time.Month;import java.util.*;public class Term implements Comparable { private UUID id; private LocalDateRange dateRange; // Constructor public Term ( LocalDate start , LocalDate stop , UUID id ) { Objects.requireNonNull( start ); // TODO: Add more such checks for all arguments. if ( start.getYear() < 2015 ) { // TODO: Add more such checks for too far into the past or future, for both start and for stop. throw new IllegalArgumentException( "Year of start date is too far in the past. Message # afcd30a0-b639-4ccf-b064-18cc2ea8587b." ); } this.id = id; this.dateRange = LocalDateRange.of( start , stop ); } // Alternative constructor. public Term ( LocalDateRange dateRange , UUID id ) { this( dateRange.getStart() , dateRange.getEnd() , id ); } // --------| Object |------------------------- @Override public String toString ( ) { return "Term{ " + "id=" + id + " | dateRange=" + dateRange + " }"; } public UUID getId ( ) { return id; } public LocalDateRange getDateRange ( ) { return dateRange; } @Override public boolean equals ( Object o ) { if ( this == o ) return true; if ( o == null || getClass() != o.getClass() ) return false; Term term = ( Term ) o; return this.getId().equals( term.getId() ); } @Override public int hashCode ( ) { return Objects.hash( this.getId() ); } @Override public int compareTo ( Object o ) { if ( this == o ) return 0; // If same object. if ( o == null || getClass() != o.getClass() ) return 0; LocalDate thatStart = ( ( Term ) o ).getDateRange().getStart(); return this.getDateRange().getStart().compareTo( thatStart ); } static public class StopDateComparator implements Comparator < Term > { @Override public int compare ( Term t1 , Term t2 ) { return t1.getDateRange().getEnd().compareTo( t2.getDateRange().getEnd() ); } }}试试看。public static void main ( String[] args ) { Term t1 = new Term( LocalDate.of( 2018 , Month.JUNE , 23 ) , LocalDate.of( 2018 , Month.JULY , 23 ) , UUID.randomUUID() ); Term t2 = new Term( LocalDate.of( 2018 , Month.JANUARY , 23 ) , LocalDate.of( 2018 , Month.DECEMBER , 23 ) , UUID.randomUUID() ); Term t3 = new Term( LocalDate.of( 2018 , Month.MARCH , 23 ) , LocalDate.of( 2018 , Month.APRIL , 23 ) , UUID.randomUUID() ); List < Term > terms = new ArrayList <>( List.of( t1 , t2 , t3 ) ); System.out.println( "Before natural sort: " + terms ); Collections.sort( terms ); System.out.println( "After natural sort: " + terms ); Collections.sort( terms , new Term.StopDateComparator() ); System.out.println( "After Comparator sort: " + terms );}自然排序前:[Term{ id=27c0b9e6-076f-4ded-9bbd-bf1a2c7914bc | 日期范围=2018-06-23/2018-07-23 },期限{ id=792bf365-eca4-460b-afad-c5cf62cf9a29 | 日期范围=2018-01-23/2018-12-23 },期限{ id=c49f79e1-11cd-4865-aa46-8fbf3c85dbfd | 日期范围=2018-03-23/2018-04-23 }]自然排序后:[Term{ id=792bf365-eca4-460b-afad-c5cf62cf9a29 | 日期范围=2018-01-23/2018-12-23 },期限{ id=c49f79e1-11cd-4865-aa46-8fbf3c85dbfd | 日期范围=2018-03-23/2018-04-23 },期限{ id=27c0b9e6-076f-4ded-9bbd-bf1a2c7914bc | 日期范围=2018-06-23/2018-07-23 }]比较器排序后:[Term{ id=c49f79e1-11cd-4865-aa46-8fbf3c85dbfd | 日期范围=2018-03-23/2018-04-23 },期限{ id=27c0b9e6-076f-4ded-9bbd-bf1a2c7914bc | 日期范围=2018-06-23/2018-07-23 },期限{ id=792bf365-eca4-460b-afad-c5cf62cf9a29 | 日期范围=2018-01-23/2018-12-23 }]abuts如果您的Term对象应该连续运行,您可以使用该LocalDateRange::abuts方法进行测试。比较的方法是半开放式,开始是包容性的,结束是排斥性的。因此,一年从一年的第一天开始,一直到但不包括下一年的第一天。您在问题的示例中展示了这一点。