метод compareTo () с использованием атрибута float объекта.Как это используется и почему? - PullRequest
1 голос
/ 20 марта 2019

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

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();
//  };
}

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

контракт интерфейса Comparable, соответственно метод compareTo():

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

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

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

1 голос
/ 20 марта 2019

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

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

1 голос
/ 20 марта 2019

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

Если скорость больше, то она появляется позже в вашем списке, если она меньше, она идет позже. Например, строки сравниваются по длине, если вы делаете "Chicken" .compareTo ("Cow"), тогда следует курица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...