找到向量的重复并删除,保留并行向量的顺序

时间:2012-05-20 16:14:51

标签: java vector duplicates

此代码只是一个测试,用于查找矢量的副本并将其删除,同时删除其他2个矢量的相应对象

这在第3行中输出了一个Arrayoutofindex。你有什么建议吗?

        for (int k = 0 ; k < vA.size() ; k++)
            {                       
                Object a = vA.elementAt(0);
                Object b = vA.elementAt(k);
                if(a == b && k!=0)
                {
                int duplicate = vA.indexOf(b);
                vA.removeElementAt(duplicate);
                vB.removeElementAt(duplicate);
                vC.removeElementAt(duplicate);                    
                }

4 个答案:

答案 0 :(得分:1)

根据This问题,我建议您阅读,因为它解释了从数组中删除重复项的方法,

您可以使用以下方法: removeDuplicate方法:

    /** List order not maintained **/
public static void removeDuplicate(ArrayList arlList)
{
 HashSet h = new HashSet(arlList);
 arlList.clear();
 arlList.addAll(h);
}

和removeDuplicateWithOrder方法:

    /** List order maintained **/
public static void removeDuplicateWithOrder(ArrayList arlList)
{
   Set set = new HashSet();
   List newList = new ArrayList();
   for (Iterator iter = arlList.iterator(); iter.hasNext();) {
      Object element = iter.next();
      if (set.add(element))
         newList.add(element);
   }
   arlList.clear();
   arlList.addAll(newList);
}

希望以某种方式帮助你。

答案 1 :(得分:1)

您正在中执行条件中的vA.size(),然后尝试从vA内部循环中删除元素。这导致异常。

将vA.size存储在单独的变量中

int size = vA.size();
for (int k = 0 ; k <= size ; k++)

然后,在内部循环中,你曾经拥有

vA.removeElementAt(duplicate);

相反,存储这是一个单独的新列表。

toBeRemoved.add(b);//b is the element to be removed later

并在循环后从vA中删除所有toBeRemoved。

vA.removeAll(toBeRemoved );

编辑:

您的新代码将如下所示 -

int vASize = vA.size();
List vAToBeRemoved = new ArrayList();
for (int k = 0 ; k < vASize; k++)
            {                       
                Object a = vA.elementAt(0);
                Object b = vA.elementAt(k);
                if(a == b )
                {
                int duplicate = vA.indexOf(b);
                vAToBeRemoved.add(b);//elements to be removed later.
                vA.removeElementAt(duplicate);
                vB.removeElementAt(duplicate);
                vC.removeElementAt(duplicate);                    
                }
             }
vA.removeAll(vAToBeRemoved);

答案 2 :(得分:0)

for (int k = 0 ; k <= vA.size() ; k++) k应仅从0运行到va.size() - 1,因为它是从零开始的,即第一个索引是0。将循环语句重写为:

for (int k = 0 ; k < vA.size() ; k++)

答案 3 :(得分:0)

使用以下方法从vector

中删除dulplicate元素

public static Vector removeDuplicateResults(Vector resultsVector){

for(int i=0;i<resultsVector.size();i++){        
    for(int j=0;j<resultsVector.size();j++){            
            if(i!=j){                                            
                Object resultsVectorObject1 = resultsVector.elementAt(i);
                Object resultsVectorObject2 = resultsVector.elementAt(j);
                Object[] resultsObjectArray1 = (Object[]) resultsVectorObject1;
                Object[] resultsObjectArray2 = (Object[]) resultsVectorObject2;
                if(Arrays.equals(resultsObjectArray1, resultsObjectArray2))
                {
                    resultsVector.removeElementAt(j);
                }
            }
    }
}
return resultsVector;

}