2012-05-19 4 views
1

이 문제는 나를 미치게합니다. 나는 vectorA (float), vectorB (string1), vectorC (string2)가 평행하고 vectorA에서 복제본을 제거하고 싶습니다. 벡터 간의 일치도는 입니다. 아이디어가 있으십니까?병렬 목록을 동기화 상태로 유지하면서 중복 제거

+0

'vectorA'가 정렬 되었습니까? 정확한 복제본을 없애거나 일부 엡실론에서 중복을 시도하고 있습니까? –

답변

1

본 항목에 대해 set<float>을 작성한 후 vectorA 중복 색인을 스캔 한 다음 중복 된 것으로 표시된 색인을 삭제하고 벡터 끝에서 다시 시작합니다.

Set<Float> seen = new HashSet<Float>(); 
List<Integer> del = new List<Integer>(); 
for (int i = 0 ; i != vectorA.size() ; i++) { 
    if (seen.add(vectorA[i])) { 
     del.add(i); 
    } 
} 
for (int i = del.size()-1 ; i >= 0 ; i--) { 
    vectorA.remove(del[i]); 
    vectorB.remove(del[i]); 
    vectorC.remove(del[i]); 
} 

그렇지 않으면 색인이 동기화되지 않기 때문에 되돌아 오는 것이 중요합니다.

+0

thnx 올바른 논리를 가지고있는 것 같지만, java (?!)에서 그 방법을 찾을 수 없습니다. insert()? push_back()? –

+0

@ user1296783 죄송합니다. Java 대신 C++ 코드를 썼습니다. 이제 작동합니다. – dasblinkenlight

+0

del.elementAt (i)를 의미합니까? –

1

세 값을 조합하고 equalshashCode을 재정의하는 클래스를 만듭니다. 이러한 인스턴스를 세 개의 병렬 목록 대신 단일 목록에 추가하십시오. 중복 된 항목을 제거 할 준비가되면 (처음부터 유지하고 나중에 제거해야한다고 가정) LinkedHashSet에 추가하고 ArrayList으로 되돌립니다. LinkedHashSet은 중복을 제거하는 동안 삽입 순서를 유지합니다 (중요하지 않은 경우 표준 HashSet).

Set<Float> seen = new HashSet<Float>(); 
int uniques = 0; 
for (int i = 0; i < n; i++) { 
    if (seen.add(vectorA[i])) { 
    vectorA[uniques] = vectorA[i]; 
    vectorB[uniques] = vectorB[i]; 
    vectorC[uniques] = vectorC[i]; 
    uniques++; 
    } 
} 

하고 작업을 완료 한 후 다음 위치 uniques 후 모든 요소를 ​​무시 (또는 새로운 배열로 모두 복사) :

class Triple { 
    float num; 
    String a; 
    String b; 

    public boolean equals(Object o) { 
     if (o == null || !(o instanceof Triple)) 
      return false; 
     return num == ((Triple)o).num; // strict equality 
    } 

    public int hashCode() { 
     return Float.floatToRawIntBits(num); 
    } 
} 

List<Triple> removeDuplicates(List<Triple> items) { 
    return new ArrayList<Triple>(new LinkedHashSet<Triple>(items)); 
} 
2

여기에 적절한 알고리즘, 단일 패스입니다.

관련 문제