使用对象的 float 属性的 compareTo() 方法。它是如何使用的,为什么?

compareTo() method using float attribute of object. How is it used, and why?

我class的代码,我完全看不懂。我在互联网上读到 compareTo() 方法用于比较字符串与字符串以及对象与字符串,但在我的代码中它用于比较 float 与字符串,我猜?!您能否解释一下如何在下面的代码中使用 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();
//  };
}

不管你比较什么,你可以根据你的定义来判断哪个在前,哪个在后。在 compareTo 方法中,-1 表示它排在第一位,而与之比较的元素排在后面。 1 表示它在元素之后,0 表示它们相等且不会重新排列。

如果速度较大,则它在您的列表中排在后面,如果速度较小,则排在后面。字符串按长度进行比较,例如,如果您执行 "Chicken".compareTo("Cow") ,则 chicken 会排在后面。

compareTo() 方法用于对特定 class 的对象进行排序。 在您的情况下,它根据 speed 属性.

的值比较 Car 个对象

因此,您可以使用它按 speed 属性.

的值对 Car 对象的列表(或数组)进行排序

Comparable接口的contract,分别compareTo()方法为:

  • 它 returns 0 当两个对象都被考虑时 "the same" 从排序的角度来看
  • it returns -1 分别为 +1(准确地说是任何负值或正值)以指示 "other" 对象何时分别小于 "this" 对象。

换句话说:该方法提供了一种方法来定义可以排序的对象的自然顺序。

如果按速度订购汽车真的有意义,那就完全是另外一回事了。我会争辩说:no,这没有意义。如果有的话,你 could/should 定义 external Comparator 对象来定义 "ordering" 汽车的不同方式,然后 SpeedComparator 显然会按速度排序(但在明确的方式)。