0

このコードは、他の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

4 に答える 4

1

この質問によると、配列から重複を削除するための賭けの方法を説明しているので、読むことをお勧めします。

次のメソッドを使用できます。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);
}

これらが何らかの形であなたを助けてくれることを願っています。

于 2012-05-20T16:20:03.297 に答える
1

for条件で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);
于 2012-05-20T16:20:45.413 に答える
0

for (int k = 0 ; k <= vA.size() ; k++) kはゼロベースであるため、から0までのみ実行する必要があります。つまり、最初のインデックスはです。ループステートメントを次のように書き直します。va.size() - 10

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

于 2012-05-20T16:18:00.460 に答える
0

ベクトルから重複要素を削除するには、以下の方法を使用します

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;

}

于 2016-04-07T07:16:58.040 に答える