我正在使用以下方法,
public class Solution {
public static void main(String[] args) {
List<Car> cars = new ArrayList<Car>();
cars.add(new Car(1,"A"));
cars.add(new Car(2,"B"));
cars.add(new Car(3,"C"));
cars.add(new Car(4,"D"));
cars.add(new Car(5,"E"));
cars.add(new Car(6,"F"));
if(cars.contains(new Car(4))){
System.out.println(cars.get(cars.indexOf(new Car(4))));
}
}
}
class Car {
int number;
String name;
Car(int number, String name){
this.number = number;
this.name = name;
}
Car(int number){
this.number = number;
}
@Override
public boolean equals(Object obj) {
Car other = null;
if(obj instanceof Car){
other = (Car) obj;
}
return this.number == other.number;
}
@Override
public int hashCode() {
return number;
}
@Override
public String toString() {
return number + " " +name;
}
}
任何人都可以验证并告知我这种方法
cars.get(cars.indexOf(new Car(4)))
请忽略我在这里创建的Car对象,这只是为了理解。 在我的情况下,我需要只有一个属性的对象来识别对象。
是正确的,或者是否有更好的方法。
由于
答案 0 :(得分:0)
不,这很令人困惑。
你&#34;劫持&#34; equals方法,应该确实说两辆车是否相等(因此具有相同的数字和相同名称),只是为了能够使用indexOf()
在列表中找回您的车。您还会创建&#34;无效&#34;汽车对象(因为汽车应该总是有一个名字)只是为了实现你的特定用例。
只需迭代列表即可找到具有所需数字的列表:
Optional<Car> car = cars.stream().filter(car -> car.getNumber() == 4).findAny();
或者使用Map<Integer, Car>
更快,如果您经常需要按照他们的号码找到汽车。
此外,每次覆盖equals时,您还应该覆盖hashCode并尊重它们的相互契约(即两个相等的对象必须具有相同的hashCode)。
答案 1 :(得分:0)
您可以通过循环查找所需的数字来获取它的位置/位置:
for (int i = 0; i < cars.size(); i++) {
if(cars.get(i).getNumber == 4){
System.out.println(i); //this will print the position of Car in a list when number == 4
}
}
答案 2 :(得分:0)
通过索引获取对象的方法是正确的。但代码的复杂性仍然是O(n)。 但在这种情况下,我建议您考虑使用HashMap
答案 3 :(得分:0)
这是一种不寻常的方法,因为通过编写一个忽略equals()
的{{1}},你已经做到了这一点,以致大多数人预期不平等的两辆车被认为是平等的。
那是:
name
...返回 new Car(2,"Jaguar").equals(new Car(2,"Ford"))
,这是非常不正常的。
碰巧,在你的小程序中它起作用 - 但是使true
无法正常工作会在更大的程序中引起各种问题。
您还可以查看地图:
equal()
有关在列表中查找对象的更好方法,请参阅How to search in a List of Java object。
答案 4 :(得分:0)
记录:你的实施
@Override
public boolean equals(Object obj) {
Car other = null;
if(obj instanceof Car){
other = (Car) obj;
}
return this.number == other.number;
}
在许多层面都是错误的。如果你调用new Car(3).equals("some string");
,它将直接抛出NullPointerException。
提示:您的检查实例可能会很快返回false
;然后你不应该试着去other.number
!