Метод compareTo (), использующий атрибут объекта с плавающей запятой. Как он используется и почему?

#java #compareto

#java #compareto

Вопрос:

Код из моего класса, я не совсем понимаю его. Я прочитал в Интернете, что метод compareTo () используется для сравнения строк со строками и объектов со строками, но в моем коде он используется для сравнения float со строками, я полагаю?! Можете ли вы объяснить, как используется метод comparedTo() в приведенном ниже коде и почему мы используем его в нашем случае?

 package ro.ase.acs.classes;

import ro.ase.acs.interfaces.Mobility;
//Comparable is a generic interface; click add unimplemented methods ; the method will appear at the end of the class
public final class Car extends Vehicle implements Mobility, Cloneable,Comparable<Car> {
    public static final int maxNbOfKm = 1_000_000;//it is static, in order to acces it use .
    private EngineType engineType;
    private float speed;

    public Car() {
        super();
        engineType = EngineType.gas;
        speed = 0;
    }

    public Car(String _name, EngineType _engineType, float _speed) {
        super(_name, true);
        engineType = _engineType;
        speed = _speed;
    }

    @Override
    public void Start() {
        System.out.println("The "   engineType.toString()  
                " car has started!");
    }

    @Override
    public void Stop() {
        System.out.println("The "   engineType.toString()  
                " car has stopped!");
    }

    @Override
    public void DisplaySpeed() {
        System.out.println(String.format("The %s car runs with %f km/h",
                engineType.toString(), speed));
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("The car named ");
        sb.append(name);
        sb.append(" has a(n) ");
        sb.append(engineType.toString());
        sb.append(" engine and is running with ");
        sb.append(speed);
        sb.append(" km/h");
        return sb.toString();
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Car c = (Car)super.clone();
        c.engineType = engineType;
        c.speed = speed;
        return c;
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Car)) {
            return false;
        }
        else {
            Car c = (Car)obj;
            return name.equals(c.name);
        }
    }

@Override
public int hashCode()
{
    return 31*name.hashCode() 13*(HasEngine()?1:0) 7*engineType.hashCode() (int)speed*100;
}


    public enum EngineType { gas, diesel, electric, hybrid }



    @Override
    public int compareTo(Car o) {
        if(speed==o.speed)
        {return 0;}
        else if (speed>o.speed)
        {
            return 1;
        }
        else
        {return -1;}




    }

//  public final int hashCode() {
    //  return engineType.hashCode();
//  };
}
  

Комментарии:

1. Не по теме: узнайте о монастырях именования Java. Имена методов имеют упрощенный формат, и такая практика использования _param в конструкторах (к добру это или к худу) считается плохой практикой.

Ответ №1:

Контракт сопоставимого интерфейса, соответственно compareTo() метод, является:

  • он возвращает 0, когда оба объекта считаются «одинаковыми» с точки зрения упорядочения
  • он возвращает -1 соответственно 1 (если быть точным, любое отрицательное или положительное значение), чтобы указать, когда «другой» объект меньше, соответственно, больше, чем «этот» объект.

Другими словами: метод предоставляет средство для определения естественного порядка объектов, которые могут быть упорядочены.

Если упорядочивание автомобилей по их скорости действительно имеет смысл, это совершенно другая история. Я бы сказал, что: нет, это не имеет смысла. Если вообще, вы могли бы / должны определить объекты внешнего компаратора, которые определяют различные способы «упорядочивания» автомобилей, и тогда SpeedComparator, очевидно, упорядочил бы по скорости (но явным образом).

Ответ №2:

Не имеет значения, что вы сравниваете, вы можете определить, что идет первым, а что вторым, с помощью того, что вы определяете. В методах compareTo значение -1 означает, что он идет первым, а элемент, с которым вы его сравниваете, идет после него. 1 означает, что он идет после элемента, а 0 означает, что они равны и не переставляются.

Если скорость больше, то она появляется позже в вашем списке, если меньше, то после. Строки сравниваются по длине, например, если вы используете «Chicken».compareTo(«Корова»), то после этого следует chicken.

Ответ №3:

compareTo() метод используется для сортировки объектов определенного класса. В вашем случае он сравнивает Car объекты по значению их speed свойства.

Таким образом, вы можете использовать его для сортировки списка (или массива) Car объектов по значениям их speed свойства.