2012-06-19 2 views
0

아래 함수는 제품 목록을 반환합니다. 제품 목록은 고유해야합니다.자바 해시 세트 중복 제거

벡터 ServAttributes는 사용자 지정 클래스의 개체를 저장합니다. 사용자 정의 클래스에는 중복을 포함 할 수있는 제품 이름을 제공하는 getProduct 함수가 있습니다.

전체 벡터를 스크롤하고 객체를 검색하고 getProduction 함수를 호출하고 해시 세트에 중복 제품을 제거해야합니까? Vector는 400 개의 객체를 저장할 수 있습니다. 아래의 기능을 수행하는 짧은 방법이 있습니까? 구아바 같은 범용 도우미 라이브러리와

private Vector<ServAttributes> ServAttributes = null; 

public HashSet<String> retProduct() { 

    HashSet<String> Produset = new HashSet<String>(); 

    for (int x = 0; x < ServAttributes.size(); x++) { 
     ServAttributes record = ServAttributes.get(x); 

     if (record.getProduct()) != null) { 
      Produset.add(record.getProduct()); 
     } 

    return Produset; 
} 
+0

는'Vectors'를 사용하지 마십시오. : | 대신'List'를 사용하십시오. – Garbage

+0

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367에서 이름 지정 규칙을 따르십시오. 특히, 변수는 소문자로 시작해야합니다. 특히 클래스와 완전히 동일한 이름을 가진 변수는 절대 없어야합니다. 그것은 의도적으로 읽을 수 없게하려고하는 것과 같습니다. 가독성에 해를 끼치는 경우 이름을 줄이지 마십시오 (ServAttributes vs ServerAttributes, Produset vs products 또는 productSet). –

+0

List는 ArrayList 또는 LinkedList와 같은 다른 구현을 권장하지 않는 한 List입니다. –

답변

1

, 당신은 기능적인 방법으로이 작업을 수행 할 수 있습니다 :

재고 자바와
return Sets.newHashSet(Iterables.filter(Iterables.transform(serverAttributes, new Function<ServAttributes, String>() { 
    public void apply(ServAttributes attributes) { 
     return attributes.getProduct(); 
    } 
}), Predicates.notNull())); 

, 당신은 할 수 개선의 몇 가지 있습니다. 당신은 우선 루프 강화 사용할 수 있습니다

for (ServAttributes attributes : serverAttributes) { 
    productSet.add(attributes.getProduct()); 
} 
+0

'null'인 제품은 건너 뛰지 않습니다. – BalusC

+0

@BalusC : 나는 그를 위해 그의 방법을 다시 쓰는 것에 관심이 없다. 나는 향상된 for-loop를 사용하는 방법을 보여주고있었습니다. 그러나 Guava 예제를 업데이트 할 것입니다. –

0

당신은 ServAttributes 클래스에 액세스 할 수있는 경우, 다음 equalshashCode 방법은 다음 중복 제거하려면 다음 코드를 사용하여 설정을 무시하고 :

참고 :이 수익을 HashSet은 ServAttributes입니다. 제품 이름 만 필요하면 벡터를 반복해야합니다. 다음과 같이 ServAttributes 클래스에서

HashSet<ServAttributes> noDub= new HashSet(new LinkedHashSet(ServAttributes)); 

equalshashCode를 오버라이드 (override) :

@Override 
public int hashCode() { 
    return product.hashCode(); 
} 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if(obj instanceof ServAttributes) { 
     ServAttributes s1 = (ServAttributes)obj; 

     if(s1.getProduct().equals(this.getProduct())) { 
      return true; 
     } 
    } 
    return false; 
}