Переопределение метода equals в Java для объектов - PullRequest
0 голосов
/ 11 марта 2020

В настоящее время я практикуюсь с объектно-ориентированным программированием, и я наткнулся на использование Override в моей программе. Здесь я хочу переопределить метод equals в классе Car и использовать ТОЛЬКО plateNumber, чтобы определить, является ли Car тем же (равным).

Несмотря на то, что он дает желаемый результат, он не использует логический результат, и мне пришлось использовать CharSequence, чтобы сравнить его. Как я могу использовать сравнение строк в этом случае?

class Car {
    private String make;
    private String model;
    private String plateNumber;
    private int horsePower;

    public Car(String make, String model, String plateNumber, int horsePower) {
        this.make = make;
        this.model = model;
        this.plateNumber = plateNumber;
        this.horsePower = horsePower;
    }


    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getPlateNumber() {
        return plateNumber;
    }

    public void setPlateNumber(String plateNumber) {
        this.plateNumber = plateNumber;
    }

    public int getHorsePower() {
        return horsePower;
    }

    public void setHorsePower(int horsePower) {
        this.horsePower = horsePower;
    }

    @Override
    public boolean equals(Object o) {

        if (o == this)
            return true;

        if (!(o instanceof Car))
            return false;


        Car that = (Car) o;

        return CharSequence.compare(plateNumber, that.plateNumber) == 0;
    }
}

class Main {
    public static void main(String args[]) {

        Car car1 = new Car("Toyota", "RAV4", "ABC-123", 104);
        Car car2 = new Car("Renault", "Megane", "DEF-789", 132);
        Car car3 = new Car("Ford", "Mondeo", "GHI-012", 132);
        Car car4 = new Car("Mercedes", "C180", "ABC-123", 144);


        if (car1.equals(car4)) {
            System.out.println("Equal ");
        } else {
            System.out.println("Not Equal ");
        }

        boolean result = car1.equals(car4);// this should return true because the plateNumbers are the same
        result = car1.equals(car2); // this should return false because the plateNumbers don't match
    }
}

Ответы [ 5 ]

1 голос
/ 11 марта 2020

Каждый объект в Java имеет метод hashCode(), который возвращает int (представление объекта).

В вашем случае вы хотите сравнить hashCodes licencePlate, например:

@Override
public boolean equals(Object o) {

    if (o == this)
        return true;

    if (!(o instanceof Car))
        return false;

    Car that = (Car) o;
    return Objects.equals(this.hashCode(), that.hashCode());
}

@Override
public int hashCode() {
    return this.plateNumber.hashCode();
}

Теперь для сравнения различных полей вам понадобится простое число (этот пост четко объясняет, почему)

@Override
public int hashCode() {
    int prime = 31; //Prime1
    int hash = 7; //Prime2
    hash = prime * hash + (int) id;
    hash = prime * hash + (plateNumber == null ? 0 : plateNumber.hashCode());
    hash = prime * hash + (make == null ? 0 : make .hashCode());
    return hash;
}

Полезная ссылка ( Учебник Baeldung )

0 голосов
/ 11 марта 2020
package Lesson9.streamandoperations;

import java.util.Objects;

class Car {
    private String make;
    private String model;
    private String plateNumber;
    private int horsePower;

    public Car(String make, String model, String plateNumber, int horsePower) {
        this.make = make;
        this.model = model;
        this.plateNumber = plateNumber;
        this.horsePower = horsePower;
    }


    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getPlateNumber() {
        return plateNumber;
    }

    public void setPlateNumber(String plateNumber) {
        this.plateNumber = plateNumber;
    }

    public int getHorsePower() {
        return horsePower;
    }

    public void setHorsePower(int horsePower) {
        this.horsePower = horsePower;
    }


    @Override
public int hashCode() {

    return Objects.hash(plateNumber);
}

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Car other = (Car) obj;
        if (plateNumber == null) {
            if (other.plateNumber != null)
                return false;
        } else if (!plateNumber.equals(other.plateNumber))
            return false;
        return true;
    }

//    @Override
//    public boolean equals(Object o) {
//
//        if (o == this)
//            return true;
//
//        if (!(o instanceof Car))
//            return false;
//
//
//        Car that = (Car) o;
//
//        return CharSequence.compare(plateNumber, that.plateNumber) == 0;
//    }


}

class Main {
    public static void main(String args[]) {

        Car car1 = new Car("Toyota", "RAV4", "ABC-123", 104);
        Car car2 = new Car("Renault", "Megane", "DEF-789", 132);
        Car car3 = new Car("Ford", "Mondeo", "GHI-012", 132);
        Car car4 = new Car("Mercedes", "C180", "ABC-123", 144);


        if (car1.equals(car4)) {
            System.out.println("Equal ");
        } else {
            System.out.println("Not Equal ");
        }

        boolean result = car1.equals(car4);// this should return true because the plateNumbers are the same
        result = car1.equals(car2); // this should return false because the plateNumbers don't match
    }
}
0 голосов
/ 11 марта 2020

Вы просто делаете plateNumber.equals(that.plateNumber).

0 голосов
/ 11 марта 2020

Вы должны использовать

@Override
public boolean equals(Object o) {

    if (o == this)
        return true;

    if (!(o instanceof Car))
        return false;


    Car that = (Car) o;

    return this.plateNumber.equals(that.plateNumber);
}
0 голосов
/ 11 марта 2020

Вы можете просто переопределить класс equals следующим образом:

@Override
public boolean equals(Object o) {

    if (o == this)
        return true;

    if (!(o instanceof Car))
        return false;


    Car that = (Car) o;

    return this.plateNumber.equals(that.plateNumber);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...