通过在Java中获取对象的索引从List获取对象

时间:2017-02-27 07:49:31

标签: java collections

我正在使用以下方法,

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对象,这只是为了理解。 在我的情况下,我需要只有一个属性的对象来识别对象。

是正确的,或者是否有更好的方法。

由于

5 个答案:

答案 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