#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
свойства.