慕桂英546537
检查此比较器,以便您可以使用多个属性进行排序public class CarComparator implements Comparator<Car> { @Override public int compare(Car entry1, Car entry2) { int value; if (entry1.getDeliveryDate().before(entry2.getDeliveryDate())){ value = -1; }else if (entry1.getDeliveryDate().equals(entry2.getDeliveryDate())){ value = 0; }else{ value =1; } //For same day if (value==0){ if (entry1.getIsReady() > entry2.getIsReady()) { value = -1; } else if (entry1.getIsReady() < entry2.getIsReady()) { value = 1; } else if (entry1.getIsReady() == entry2.getIsReady()) { value = 0; } } //if same isReady if (value==0){ if (entry1.getGear()!=null && entry2.getGear()==null) { value = -1; } else if (entry1.getGear()==null && entry2.getGear()==null) { value = 0; } else{ value = 1; } } //if still equals if (value==0){ if (entry1.getTyre()!=null && entry2.getTyre()==null) { value = -1; } else if (entry1.getTyre()==null && entry2.getTyre()==null) { value = 0; } else{ value = 1; } } return value; }}我不确定这是否是您尝试做的。上面的比较器的作用是:首先对日期进行排序,如果找到相等的日期(值=0),则比较 isReady,然后比较 getGear(),最后比较 getTyre()。这样您就可以在比较器中添加所需数量的属性。包括3辆车的主要方法public class Main { public static void main (String[]args) throws UnsupportedEncodingException, ParseException { List<Car> carL = new ArrayList<Car>(); Car car1 = new Car(); car1.setDeliveryDate(new Date()); Gear gear1 = new Gear(); car1.setGear(gear1); Tyre tyre1 = new Tyre(); car1.setTyre(null); car1.setId(1); car1.setDeliveryDate((new SimpleDateFormat("dd-MM-yyyy")).parse("01-01-2000")); car1.setIsReady(0); Car car2 = new Car(); car2.setDeliveryDate(new Date()); Gear gear2 = new Gear(); car2.setGear(gear2); Tyre tyre2 = new Tyre(); car2.setTyre(tyre2); car2.setId(2); car2.setDeliveryDate((new SimpleDateFormat("dd-MM-yyyy")).parse("02-01-2000")); car2.setIsReady(1); Car car3 = new Car(); car3.setDeliveryDate(new Date()); Gear gear3 = new Gear(); car3.setGear(gear3); Tyre tyre3 = new Tyre(); car3.setTyre(tyre3); car3.setId(3); car3.setDeliveryDate((new SimpleDateFormat("dd-MM-yyyy")).parse("01-01-2000")); car3.setIsReady(1); carL.add(car1); carL.add(car2); carL.add(car3); Collections.sort(carL, new CarComparator()); for (Car car : carL) { System.out.println("car: " + car.toString()); } }}输出:car: Car{id=3, isReady=1, tyre=false, gear=false, deliveryDate=Sat Jan 01 00:00:00 EET 2000}car: Car{id=1, isReady=0, tyre=true, gear=false, deliveryDate=Sat Jan 01 00:00:00 EET 2000}car: Car{id=2, isReady=1, tyre=false, gear=false, deliveryDate=Sun Jan 02 00:00:00 EET 2000}
弑天下
为什么不重用 Integer.compareTo 来使代码更短?像这样:import java.util.Comparator;public class CarComparator implements Comparator<Car> { @Override public int compare(Car entry1, Car entry2) { int value = 0; // might want to add a null check for either entry1 and entry2 value = entry1.getDeliveryDate().compareTo(entry2.getDeliveryDate()); if (value == 0) { value = ((Integer)entry1.getIsReady()).compareTo((Integer)entry2.getIsReady()); if (value == 0) { value = getIntegerValueForNullCheck(entry1.getGear()).compareTo(getIntegerValueForNullCheck(entry2.getGear())); if (value == 0) { value = getIntegerValueForNullCheck(entry1.getTyre()).compareTo(getIntegerValueForNullCheck(entry2.getTyre())); } } } return value; } private Integer getIntegerValueForNullCheck (Object o) { return o == null ? 0 : 1; }}包括测试排序的代码:import java.time.Duration;import java.time.Instant;import java.time.LocalDateTime;import java.util.*;public class Sorting { public static void main(String[] args) { List<Car> cars = new LinkedList<>(); Date today = new Date(); Instant now = Instant.now(); Instant after = now.plus(Duration.ofDays(1)); Date tomorrow = Date.from(after); cars.add(new Car(5, new Tyre(1,"1"), new Gear(1, "1"), today )); cars.add(new Car(5, new Tyre(1,"1"), null, today )); cars.add(new Car(5, null, null, today )); cars.add(new Car(4, null, null, today )); cars.add(new Car(3, null, null, tomorrow )); Collections.sort(cars, new CarComparator()); System.out.println(cars); }}输出:[Car{isReady=4, tyre=null, gear=null, deliveryDate=Thu Oct 10 11:27:20 IDT 2019}, Car{isReady=5, tyre=null, gear=null, deliveryDate=Thu Oct 10 11:27:20 IDT 2019}, Car{isReady=5, tyre=Tyre{id=1, grip='1'}, gear=null, deliveryDate=Thu Oct 10 11:27:20 IDT 2019}, Car{isReady=5, tyre=Tyre{id=1, grip='1'}, gear=Gear{id=1, type='1'}, deliveryDate=Thu Oct 10 11:27:20 IDT 2019}, Car{isReady=3, tyre=null, gear=null, deliveryDate=Fri Oct 11 11:27:20 IDT 2019}]