2017-11-04 1 views
0

나는 Products이라는 Class을 가졌습니다. 이 클래스는 nameprice입니다. 나는 제품을 다음과 같은 방법으로 생성 할 수 있습니다 : 그 나는이 제품이 이미 난에 저장되어있어 ArrayList에 존재하는지 체크를 가정하고있어 후"Boolean equals()"를 사용하여 ArrayList에 저장된 객체 비교

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

를 그 다음하지 않는 경우 I 단지 거기에 넣어. 나는이 사용하기로되어있어 다음

public boolean equals(Object obj){ 

} 

문제는 내가에서 제품을 저장하기로되어있어 ArrayList 만약 내가, 그것을 가정하고있는 public static void main에서 생성 및 초기화 방법입니다 이 booleanArrayList 전에도 생성됩니다.

Class 자체를 ArrayList으로 설정해야합니까?

public class ArrayList<Product>{ 
} 

답변

1

이 부울은 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 
} 

이것은 당신이 ArrayList를 만드는 방법은 다음과 같습니다 :

는이 같은) (제품의 방법을 등호을 덮어 쓸 필요가

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

을 그리고이 때 당신이 제품을 추가하는 방법입니다 목록에 존재하지 않습니다 :

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 때문에 것은 제품의 메소드에 해당, 당신은 당신이 그것을 내부에 전달되는 객체 대 제품 방법의 equals 메소드를 호출하는 방법을 포함 호출 할 때

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

아래에이 일을 시도 할 수 있습니다.

+0

설명이 약간 짧지 만 감사합니다. : 3 – DoombringerBG

1

booleanArrayList가 있기 전에 생성됩니까?

당신은 오해하는 방법을 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 클래스를 만들 필요가 없습니다. 당신이 똑같이 구현하면, 실행시 목록에 있는지 확인하기 위해 호출됩니다. myList.contains(book)

실제로 코드에서 검사 수행을 건너 뛸 수있는 구조가 있습니다. java.util.HashSet을 사용할 수 있습니다. 중복을 추가 할 수 없습니다. 또한 요소가 추가 된 경우이를 나타내는 부울 값을 반환합니다. 예 :

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

규칙을 쉽게 따르는 것을 잊지 마십시오. equals를 정의 할 때는 hashCode도 정의하십시오. IDE를 사용하면 쉽게 생성 할 수 있습니다.

+0

아직 완전히 이해하지 못했기 때문에'HashSet'을 사용하는 것을 피하고 싶습니다. 그러나 도움이 필요하고 그것을 작성하는 데 시간을 내 주셔서 감사합니다.^_^ – DoombringerBG

관련 문제