Javaでネストされた値に基づいてオブジェクトのリストをソート

champ.exe:

私は以下の点に基づいてソートする必要があり、複数の日付の配信を予定して車のリストを持っています:

  • 場合isReady>0,、それは表に最初に表示されるはずです。そして、他の値は、その特定の日のためにその下に来ます。
  • 場合isReady>0や、オブジェクトgear!=null、その後、それはその特定の日のために表に最初に表示されます。オブジェクトの他の値が続きますgear==null
  • 場合はisReady>0、オブジェクトgear!=nullとオブジェクトがtyre!=null、その値は、その特定の日付の表に最初に表示されます。他の値オブジェクトが続くgear==nulltyre==null

ここにあるclassコードは:

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

私はどこ最初の条件のために罰金を作品コンパレータを開発しましたisReady>0あなたは、上記の他の条件との助けに私を喜ばでした。

前もって感謝します。

イオアニスBarakos:

あなたは複数の属性で並べ替えることができますので、このコンパレータをチェック

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}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313084&siteId=1