此代码只是一个测试,用于查找矢量的副本并将其删除,同时删除其他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);
}
答案 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;
}