我是一名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);
}
}
这不起作用。 谢谢你指导我..
答案 0 :(得分:3)
一般情况下,不保证任何类型的List
都只包含唯一元素,但我认为您不必完成创建Iterator
的过程。< / p>
仅使用List.contains()
就足够了 - 如果列表中不包含该元素,请将其添加,否则抛出异常*。
public void addProduct(Product theProduct) throws ProductAlreadyExistsException {
if(allProducts.contains(theProduct)) {
throw new ProductAlreadyExistsException("Not unique!");
}
allProducts.add(theProduct);
}
*:抛出异常有点愚蠢的IMO。这应该只保留用于真正特殊的行为。你最好选择某种Set
。
答案 1 :(得分: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()
返回一个字符串。
答案 2 :(得分:0)
Makoto的回答是一种确保对象在List
中唯一的简单方法。
此外,您需要确保在要添加到列表中的对象类中实现equals(Object obj)
方法。 List.contains()
方法对其包含的每个对象调用equals(yourObject)
并返回true
,只要equals(yourObject)
为List
中的任何对象返回true,就会返回equals(Object obj)
。 / p>
在这里,您可以看到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;
}
}
的良好实施。
{{1}}