使用对象的 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 显然会按速度排序(但在明确的方式)。
我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 显然会按速度排序(但在明确的方式)。