2017-11-04 5 views
0

ProductsというClassがあります。このクラスはnamepriceです。 私は、製品に以下の方法で作成できます。ただ、私、この製品はすでに私がするし、そうでない場合は、それを保存することになってるArrayListに存在する場合、私がチェックをなってるその後"Boolean equals()"を使用してArrayListに保存されたオブジェクトの比較

Product book = new Product(); 
book.setName("book"); 
book.setPrice(3); 

をそこにそれを置きます。私は、次を使用して、これを行うことになってる:

public boolean equals(Object obj){ 

} 

私は、中に製品を保存することになってるArrayListpublic static void mainで作成し、初期化される場合、問題は、私はそれを行うことになっていますか、ありますこのbooleanArrayListが存在する前に作成されていますか?

Class自体をArrayListとするといいですか?

public class ArrayList<Product>{ 
} 

答えて

1

このブール値は、ArrayListが存在する前に作成されません。

あなたはこのような製品の等号()メソッド上書きする必要があります。

ArrayList<Product> products = new ArrayList<Product>(); 

そして、これはときにあなたが製品を追加する方法である:これは、ArrayListのを作成する方法です

@Override 
public boolean equals(Object obj) { 
    if(obj == this) return true; // Both objects have the same reference -> the objects are equal 
    if((obj == null) || (obj.getClass() != this.getClass())) return false; // Classes are different -> objects are different 
    Product p = (Product) obj; // Cast obj into Product 
    if((this.getPrice() == p.getPrice()) && (this.getName().equals(p.getName()))) return true; // Price and name are the same -> both products are the same 
    return false; // At this point the two objects can't be equal 
} 

をリストには存在しません:

if(!products.contains(yourProduct)){ // Checks if yourProduct is not contained in products 
     products.add(yourProduct); // adds yourProduct to products 
    } 
+0

これを書く時間をとっていただきありがとうございます。各行のコメントを使った説明は、私が本当に理解するのを助けました。 :3 – DoombringerBG

+0

NullPointerExceptionを避けるために、 'obj.getClass()'を呼び出す前に 'obj == null'をチェックする必要があることに注意してください。最初のチェックとして 'obj == this''のチェックを入れることもあります。オブジェクトはそれ自身と同じでなければならないので、これはメソッドの残りの部分よりもはるかに軽量です。 –

+0

@AndyTurnerはそれに気づいてくれてありがとう、私はそれを忘れてしまった。私はそれに応じて私の答えを編集しました。 –

3

その存在を心配しないでください。あなたはoveridingがあなたのProductクラスにequalsメソッドをしているので、あなたはそれが内部的に渡されるオブジェクト対プロダクト方法のequalsメソッドを呼び出す含まれているメソッドを呼び出すと、あなたは

if(yourArayList.contains(book)){ 
    // it existed in the list 
}else{ 
    yourArayList.add(book); 
} 

の下にこれをやって試すことができます。

+0

説明に少し不満ですが、それでもなおありがとうございます。 :3 – DoombringerBG

1

booleanは、ArrayListが存在する前でも作成されていますか?

equalsが誤解されました。あるオブジェクトを引数として呼び出すまで、booleanを「作成」せずに渡すオブジェクトの属性に基づいてbooleanを返します。

あなたequalsメソッドを定義するときは、平等を決定するためのコードを提供していますが、その時点では何も決定されていません。リストのいずれかであなたのProductを持っている場合

@Override 
public boolean equals(Object obj){ 
    if (obj == this) return true 
    if (!(obj instanceof Product)) return false; 
    Product other = (Product)obj; 
    if (!other.getName().equals(getName())) return false; 
    if (!other.getPrice() == getPrice()) return false; 
    return true; 
} 
@Override 
public int hashCode() { 
    return 31*getName().hashCode() + getPrice(); 
} 

今、あなたは、ディーサイドするequalsを使用することができます二つの方法:

  • 使用contains - この方法は、封じ込めをチェックするequalsを呼び出し、または
  • Iteraすべてのオブジェクトを削除し、equalsを手動で呼び出します。
+0

説明をいただき、ありがとうございます。 :3 – DoombringerBG

1

独自のArrayListクラスを作成する必要はありません。 あなたがequalsを正しく実装する場合は、実行時にリストにあるかどうかを確認するために呼び出されます。myList.contains(book)

実際には、コードのチェックをスキップできる構造があります。 java.util.HashSetを使用できます。重複を追加できないようにします。さらに、要素が追加された場合は、ブール値を返します。例えば。

Set<Product> mySet = new HashSet<>(); 
boolean added = mySet.add(book); 

ルールに従うのが簡単であることを忘れないでください。equalsを定義するときは、hashCodeも定義してください。 IDEを使用する場合は、両方を簡単に生成できます。

+0

私はまだそれを完全に理解していないので、 'HashSet'を使用しないことを望みます。しかし、あなたがそれを書いた時の助けと時間を感謝します。^_^ – DoombringerBG

関連する問題