1

我是一名 Java 新手。但我确信我可以以非常有效的方式完成这项工作。

此方法的目的是添加具有唯一 ID 的产品。如果我的产品是重复的,我应该抛出一个异常。好吧,这个序列不适用于多线程环境。

public void addProduct(Product product)
        throws ProductAlreadyExistsException {
    product.id = ++nextId;
    this.id = product.id;

    Iterator<Product> it = allProducts.iterator();
    Product p= null;

    boolean flag= false;
    if (!allProducts.isEmpty()) {
        while(it.hasNext()){
            p= it.next();
            if ( p.getName() == product.getName())
                throw new ProductAlreadyExistsException(p.getName());
            else
                flag = true;
        }

    }
    else
        allProducts.add(product.id-1, product);

    if(flag){
        allProducts.add(product.id-1, product);
    }
}

我想要的是这样的东西。

    for (Product p : allProducts) {
        if (p.getName() ==  product.getName() ) {
            throw new ProductAlreadyExistsException(p.getName());
        }
            allProducts.add(p);
        }
}

这不起作用。谢谢你指导我。。

4

3 回答 3

3

一般来说,不能保证List任何类型的 a 将只包含独特的元素,但我想你不必经历创建Iterator.

仅仅使用List.contains()就足够了——如果列表不包含该元素,则将其添加进去,否则,抛出异常*。

public void addProduct(Product theProduct) throws ProductAlreadyExistsException {
    if(allProducts.contains(theProduct)) {
        throw new ProductAlreadyExistsException("Not unique!");
    }
    allProducts.add(theProduct);
}

*:抛出异常有点愚蠢的IMO。这应该只保留给真正的异常行为。你可能会更好地使用Set某种代替。

于 2013-06-01T06:28:35.287 回答
3

在 Java 中,您使用s1.equals(s2)方法来识别两个字符串是否相等。

 if ( p.getName() == product.getName()) // This will always return false, because references are compared here

你应该做的是:

if ( p.getName().equals(product.getName()) )

注意:我假设getName()返回一个字符串。

于 2013-06-01T06:40:56.597 回答
0

Makoto 的回答是确保对象在List.

此外,您需要确保equals(Object obj)在要添加到列表中的对象类中实现该方法。该List.contains()方法调用equals(yourObject)它包含的每个对象并返回true,只要equals(yourObject)List.

equals(Object obj)在这里,您可以看到可以在Product课堂上使用的良好实现。

public class Product {
    //Other methods here
    public boolean equals(Object obj) {
        if(this == obj) 
            return true;
        if(obj == null)
            return false;
        if(this.getClass() != obj.getClass())
            return false;
        Product product = (Product)obj;
        boolean result = true;
        //Compare fields of this with fields of product and set result
        return result;
    }
}
于 2013-06-01T06:46:28.177 回答