Java比较类实例

时间:2013-10-22 19:04:41

标签: java

我收到了这段代码:

public Class Car;
{
    private String name;  
    public int number;     


    public Car(String name, int number) 
    {
        this.name = name;
        this.number = number;
    }

    // this class also got getters and setters 

然后我又上了一堂课:

 public class CarList
    {
        private Collection<Car> cars;


        public CarList()
        {
            cars = new HashSet<>();
        }


       public boolean insertCar(Car car)
        {
            return cars.add(car); 
        }

然后代码继续使用其他一些方法,但它们没有问题。 如果我创建了两个类Car的实例,例如car1(mazda,1)car2(porsche,2),然后我调用方法insertCar,一切正常,方法返回true因为那里两辆车的名字和号码不同。

但是,如果创建例如car1(mazda,1)然后car2(porsche,1)方法也返回true,尽管汽车的数量是相同的。

编辑:所以我的问题是当我尝试“添加”具有相同数字和相同名称的汽车时,如何强制方法返回false(那么@Override等于()方法将如何变化)?

6 个答案:

答案 0 :(得分:1)

首先,您的Car类不会按原样编译。 Class应为classCar之后有一个分号。我只会把它当成错误。

对于您的任务,您必须在代码中进行以下修改:

  • 覆盖equals()类中的hashCode()Car方法,您只需考虑number属性进行对象比较和哈希码计算。

    @Override
    public boolean equals(Object ob) {
        if (!ob instanceof Car) return false;
        Car that = (Car)ob;
        return this.number == that.number;
    }
    
    @Override
    public int hashCode() {
        return number;
    }
    
  • CarList课程中,使用Collection<Car>代替Set<Car>。这将自动处理重复。 Set#add(E)方法只有在Set不存在时才会在equals中添加一个元素(这是基于hashCodefalse进行测试的,这就是您需要覆盖的原因他们)。如果元素已经存在,那么它不会修改集合,并根据需要返回HashSet。 (哎呀,错过了你实际上只是在你的班级中实例化Set<Car>。最好将引用重命名为{{1}})。


相关:

答案 1 :(得分:0)

您可以选择几种方案,最好取决于CarList课程的使用方案。

对您当前代码的最直接修改将是向Add方法添加一些代码以遍历列表中的所有汽车,并检查是否已存在具有相同编号的另一辆汽车。如果是,则不要添加并返回FALSE。

但是上面的插入会有二次性能,这对你来说可能不是很好。

相反,更好的选择是使用额外的数据结构,例如列表中已有的所有车号的HasSet。添加时,请检查重复项集,如果已添加的数字已存在则返回false。

HashSet<Integer> carNumbers = new HashSet<Integer>();
public boolean insertCar(Car car)
{
    if(!carNumbers.contains(car.getNumber()))
    {
        carNumbers.put(car.getNumber());
        return cars.add(car); 
    }

    return false;
}

答案 2 :(得分:0)

您需要覆盖equals的{​​{1}}方法。在该方法中,提供您想要确定两个对象是否相同的逻辑。

Car

或者您希望方法满足的任何条件。

答案 3 :(得分:0)

假设你是Java。

你有两个对象,需要确定它们是否相同。一个是Car在内存位置1000000,另一个是Cat在1200000.看起来不同。完成。

Java做了一个额外的步骤:“对象是否有equals()方法?”如果是这样,它就会被调用,而对象本身可以决定它是否与另一个相等。如果没有,请回到“他们是同一个实例吗?”

所以如果你重写equals()方法,比如

@Override
public boolean equals(Object ob) {
  if (!(ob instanceOf Car)) { return false; }
  Car other = (Cat)ob;
  // decide whether they're equal and return true/false
}

那是朝着正确方向迈出的一步。

第二部分是hashCode()。合同是这样的:

如果a1.equals(a2)则a1.hashCode()== a2.hashCode()

因此,相同的对象必须生成相同的哈希码。但是,不同的对象也可能产生相同的哈希码。

答案 4 :(得分:0)

HashSet答案可行,但他们假设您在任何使用案例中都不会想要两辆具有相同编号和不同名称的汽车。

如果您只想在此用例中使用此行为(例如,该数字在CarList中是唯一的,但通常不是这样),您可以将TreeSet与自定义Comparator一起使用。作为附加功能,列表将自动按数字排序。

cars = new TreeSet<>(new Comparator<>(){
    public int compare(Car a, Car b){
       return a.number - b.number;
    }
});

在这种情况下,您不需要实现equals()或hashCode()。

答案 5 :(得分:0)

按如下方式修改您的课程: 的

public class Car {

private String name;
public int number;

public Car(String name, int number) {
    this.name = name;
    this.number = number;
}

@Override
public boolean equals(Object ob) {
    if (!(ob instanceof Car)) {
        return false;
    }
    Car car = (Car) ob;
    return this.number == car.number;
}

@Override
public int hashCode() {
    return number;
}
}

车清单

public class CarList {

private Set<Car> cars;

public CarList() {
    cars = new HashSet<Car>();
}

public boolean insertCar(Car car) {
    return cars.add(car);
}

}