Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中基于嵌套值的对象排序列表_Java_Sorting_Collections - Fatal编程技术网

java中基于嵌套值的对象排序列表

java中基于嵌套值的对象排序列表,java,sorting,collections,Java,Sorting,Collections,我有一份计划在多个日期交货的汽车清单 需要根据以下几点进行分类: 如果isReady>0,则应首先显示在表中。及 然后,其他值在该特定日期的下方 如果isReady>0和对象gear=空然后,它首先显示在 特定日期的表格。后跟其他值,其中Objectgear==null 如果isReady>0,对象齿轮=空值和对象轮胎=空,则 值首先显示在该特定日期的表中。然后是其他值,其中Objectgear==null和tyre==null 以下是类代码: public class Car {

我有一份计划在多个日期交货的汽车清单 需要根据以下几点进行分类:

  • 如果
    isReady>0,
    则应首先显示在表中。及 然后,其他值在该特定日期的下方
  • 如果
    isReady>0
    和对象
    gear=空
    然后,它首先显示在 特定日期的表格。后跟其他值,其中Object
    gear==null
  • 如果
    isReady>0
    ,对象
    齿轮=空值
    和对象轮胎=空,则 值首先显示在该特定日期的表中。然后是其他值,其中Object
    gear==null
    tyre==null
以下是
代码:

public class Car {
    private int isReady;
    private Tyre tyre;
    private Gear gear;
    private Date deliveryDate;
}


public class Gear {
    private int id;
    private String type;
}


public class Tyre {
    private int id;
    private String grip;
}

public class CarComparator implements Comparator<Car> {
    @Override
    public int compare(Car entry1, Car entry2) {
        int 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;
        }
        return value;
    }
}
公车{
私人int已准备就绪;
私人轮胎;
私人齿轮;
私人日期交货日期;
}
公共级装备{
私有int-id;
私有字符串类型;
}
公营轮胎{
私有int-id;
私用线绳夹;
}
公共类CarComparator实现了Comparator{
@凌驾
公共int比较(车辆入口1、车辆入口2){
int值=0;
if(entry1.getIsReady()>entry2.getIsReady()){
值=-1;
}else if(entry1.getIsReady()
我开发了一个比较器,它在第一种情况下工作良好 其中
isReady>0
。你能帮我了解一下其他情况吗 如上所述


提前谢谢。

老实说,我看不出你的代码有任何问题。也就是说,当entry1大于Entry2时,您的意图是返回-1(与标准相反)。如果您不需要阅读更多的代码,我认为如果您试图比较为您的用例构建的值是大还是小,那么您的代码将起作用

然而,我认为你们的退货方式有一些低效。您不需要返回值。您可以只返回一个实际值

为了进行比较,您可以先比较==然后再计算其余的。但是这可能很难阅读代码,所以我给你两个版本

删除值版本:

public class CarComparator implements Comparator<Car> {
    @Override
    public int compare(Car entry1, Car entry2) {
        if (entry1.getisReady() > entry2.getisReady()) {
            return -1;
        } else if (entry1.getisReady() < entry2.getisReady()) {
            return 1;
        } else if (entry1.getisReady() == entry2.getisReady()) {
            return 0;
        }
    }
}
公共类CarComparator实现Comparator{
@凌驾
公共int比较(车辆入口1、车辆入口2){
if(entry1.getisReady()>entry2.getisReady()){
返回-1;
}else if(entry1.getisReady()
删除值和不同的比较样式:

public class CarComparator implements Comparator<Car> {

    @Override
    public int compare(Car entry1, Car entry2) {
        if (entry1.getisReady() == entry2.getisReady()) return 0;            
        return entry1.getisReady() > entry2.getisReady()? -1 : 1;
    }
}
公共类CarComparator实现Comparator{
@凌驾
公共int比较(车辆入口1、车辆入口2){
if(entry1.getisReady()==entry2.getisReady())返回0;
返回entry1.getisReady()>entry2.getisReady()?-1:1;
}
}
我不确定我是否正确理解了你,但如果我没有,我希望这段代码可以帮助你。我将它们分为3个方法,希望您得到一个getTyre()和getGear()方法。您可以根据需要将它们组合在一起,对于最后一个方法,它的值被划分为变量顺序,以便于读取代码

class CarComparator implements Comparator<Car> {

    public int compare(Car entry1, Car entry2) {
        if (entry1.getisReady() == entry2.getisReady()) return 0;
        return entry1.getisReady() > entry2.getisReady()? -1 : 1;
    }

    public int compareGear(Car entry1, Car entry2){
        if ( (entry1.getGear() != null && entry2.getGear() != null) 
           ||(entry1.getGear() == null && entry2.getGear() == null)
           ){
            return compare(entry1, entry2);
        }  
        return entry1.getGear() != null && entry2.getGear() == null? -1 : 1;

    }

    public int compareTye(Car entry1, Car entry2){
        int order1 = entry1.getGear() != null && entry1.getTyre() != null? 1 : 0;
        int order2 = entry2.getGear() != null && entry2.getTyre() != null? 1 : 0;

        if ( order1 == order2 ) return compare(entry1, entry2);
        return order1 > order2? -1 : 1;
    } 
}
类CarComparator实现Comparator{
公共int比较(车辆入口1、车辆入口2){
if(entry1.getisReady()==entry2.getisReady())返回0;
返回entry1.getisReady()>entry2.getisReady()?-1:1;
}
公共内部比较(车辆入口1、车辆入口2){
if((entry1.getGear()!=null和&entry2.getGear()!=null)
||(entry1.getGear()==null和&entry2.getGear()==null)
){
返回比较(entry1,entry2);
}  
返回entry1.getGear()!=null和&entry2.getGear()==null?-1:1;
}
公共内部隔间(车辆入口1、车辆入口2){
int order1=entry1.getGear()!=null&&entry1.getTyre()!=null?1:0;
int order2=entry2.getGear()!=null&&entry2.getTyre()!=null?1:0;
if(order1==order2)返回compare(entry1,entry2);
退货订单1>订单2?-1:1;
} 
}

检查此比较器,以便可以使用多个属性进行排序

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;
    }
}

为什么不重用Integer.compare来缩短代码

像这样:

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;
    }
}

对于Java 8,您可以这样构建比较器:

//order by delivery date first, ascending order
Comparator<Car> carComparator = Comparator.comparing( Car::getDeliveryDate )
  //order by isReady in ascending order
  .thenComparing( Car::getIsReady )
  //we map null to 1 and non-null to -1 and ignore the rest for now
  .thenComparing( car -> car.getGear() != null ? -1 : 1 ) 
  .thenComparing( car -> car.getTyre() != null ? -1 : 1 );
//先按交货日期下单,再按升序下单
Comparator carComparator=比较器。比较(Car::getDeliveryDate)
//按顺序排列已按升序排列
.然后比较(Car::getIsReady)
//我们将null映射为1,将非null映射为-1,并暂时忽略其余部分
.然后比较(car->car.getGear()!=null?-1:1)
.然后比较(car->car.getTyre()!=null?-1:1);

在当前代码中,如果
结尾处不是
0
,则可以返回该值。但是如果是
0
,则需要比较下一个条件。旁注:您当前的比较器可以简化为
int value=Integer.compare(entry2.getIsReady(),entry1.getIsReady())。当我的值=0时,我需要生成一个函数,例如compareTyre(),并检查其中的条件?@champ.exe您不一定需要将其作为单独的方法,但可以。但是,如果值为
0
,并且您还有一些东西需要比较,则需要进行更多比较。您对
isReady>0
的要求与您的比较器不匹配。澄清一下:您在列表中列出了所有的汽车,并希望1)按日期升序排序,2)按
isReady
升序排序,3)首先为
gear
设置非空值,4)首先为
tire
设置非空值,是否正确?同一日期的汽车应如何准备
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}
]
//order by delivery date first, ascending order
Comparator<Car> carComparator = Comparator.comparing( Car::getDeliveryDate )
  //order by isReady in ascending order
  .thenComparing( Car::getIsReady )
  //we map null to 1 and non-null to -1 and ignore the rest for now
  .thenComparing( car -> car.getGear() != null ? -1 : 1 ) 
  .thenComparing( car -> car.getTyre() != null ? -1 : 1 );