2012-05-19 63 views
1

這個問題使我瘋了。我有vectorA(float),vectorB(string1),vectorC(string2)這是並行的,我想消除vectorA中的重複,而我設法保持向量之間的平行性。 任何想法?刪除重複項,同時保持並行列表同步

+0

是'vectorA'排序,還是什麼?你是否想要消除精確的重複,或重複在某個epsilon,或什麼? –

回答

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糟糕,我寫了C++代碼而不是Java :)它現在應該可以工作。 – dasblinkenlight

+0

你的意思是del.elementAt(i)? –

1

創建一個結合三個值並覆蓋equalshashCode的類。將這些實例添加到一個列表而不是三個並行列表。一旦準備好刪除重複項(假設您需要先保留它們並稍後刪除它們),請將它們添加到LinkedHashSet並返回到ArrayListLinkedHashSet將保留廣告訂單(如果這不重要,請使用標準HashSet),同時刪除重複項。

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

這裏有一單通,原地算法:

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位置之後的所有元素(或它們全部複製到新的陣列)。

相關問題