0

我有一个Vector,每个单元格都包含一个Data Structure

public class objet_poid_n {
   public  int Num;
    public double Poid;
}

问题是向量可能有重复项,我需要创建一个能够删除重复项的函数或过程..我试过这个,但它无济于事..

 public static void removeDuplicates(Vector v)
{ 
    for(int i=0;i<v.size();i++){
            for(int j=0;j<v.size();j++)
                {
                    if(i!=j)
                        {
                            if(v.elementAt(i).equals(v.elementAt(j)))
                                {
                                    v.removeElementAt(j);
                                }
                        }
                }
                                   }
} 

有任何想法吗 ?

4

6 回答 6

1

在考虑如何删除重复项时,始终首先考虑一个Set. 根据定义,aSet

不包含重复元素的集合。

遍历您的数组并将它们添加到Set实现中。使用LinkedHashSetif 顺序很重要。

will中的元素Set是独一无二的。您可以将它们添加回新的Listclear()旧的并在那里添加它们。

注意:你应该在你的类中实现一个hashCode()andequals(Object)方法。objet_poid_n

注意2:如果Vector你的意思是java.util.Vector,请不要使用它。使用ArrayListLinkedList

于 2013-09-07T23:34:05.097 回答
1
Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);
于 2013-09-07T23:34:08.957 回答
1

首先,您应该equals()在您的方法中实现一个方法,objet_poid_n因为默认行为比较内存地址。

然后,您可以在向量中插入新对象之前使用Vector.contains()Set方法,也可以使用定义为没有重复的集合的 a 。

于 2013-09-07T23:44:38.337 回答
0

删除数组中的元素将改变大小,您将尝试访问不再存在的索引。

最简单的解决方案是:

  1. 实现hashcode/equals在你的objet_poid_n
  2. 将所有元素添加到HashSet

然后您Set将只包含每个元素的一个实例。

阅读有关hashcode/equalsHashSet在必要时阅读。值得您花时间。

于 2013-09-07T23:37:36.250 回答
0

使用以下方法从向量中删除重复元素

公共静态向量removeDuplicateResults(向量结果向量){

    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;
} 
于 2016-04-07T06:24:05.073 回答
0

在我使用数据作为局部变量的情况下,您可以覆盖 add 或 addAll 方法:

data = new Vector<String>() {
        @Override
        public synchronized boolean addAll(Collection<? extends String> arg0) {
            // TODO Auto-generated method stub
            Vector<String> v = (Vector<String>) arg0;
            for (String string : v) {
                if (contains(string)) {
                    return false;
                }
            }
            return super.addAll(v);
        }
    };
于 2016-11-29T17:14:23.097 回答