0
public static <E> ArrayList<E> union
        (ArrayList<E>array1, ArrayList<E>array2)
{
  //arrayUnion will be the arrayList that will be returned
  ArrayList <E> arrayUnion  = new ArrayList <E>(array1);   
  arrayUnion.addAll(array2);
  E current;

  for(int i = 0; i < arrayUnion.size(); i++)
  {
      for(int j = 0; j < arrayUnion.size(); j++)
      {
          current = arrayUnion.get(i);
          if(current.equals(arrayUnion.get(j)))
          {
              arrayUnion.remove(j);
          }
      }
  }

      return arrayUnion;
}

この方法の私のテストでは、これが出力でした:

最初のリストは [ww、ee、rr、t、yy] です。

2 番目のリストは [ww、ss、ee、dd] です。

両方の ArrayList の和集合は [ee, t, ww, dd] です。

何が悪かったのか..?私はこれにあまりにも長い間行き詰まっており、ユニオンという言葉を二度と聞きたくありません. 助けてください

4

4 に答える 4

4

a を使用しSetて共用体を取得すると、より適切に処理できます。注意すべき唯一のことは、要素の順序が変わる可能性があるということです。

次に例を示します。

    List<String> setA = new ArrayList<String>();
    List<String> setB = new ArrayList<String>();

    setA.add("aa");
    setA.add("bb");
    setA.add("cc");

    setB.add("dd");
    setB.add("ee");
    setB.add("ff");

    Set<String> union = new HashSet<String>();
    union.addAll(setA);
    union.addAll(setB);

    System.out.println(setA);
    System.out.println(setB);
    System.out.println(union);
于 2012-10-11T03:39:12.317 に答える
1

最初の要素 (または i=j の任意の要素) はそれ自体と等しいため、すぐに削除します。

于 2012-10-11T03:36:49.240 に答える
0

これを行う方法を変更できます。array1のすべての要素をに追加しますarrayUnion。次に、それを反復処理し、各項目について、それがにあるかどうかを確認しますarray2(を使用しarray2.contains(<E>))ます。そこにない場合は削除すると、ユニオンになります:-)

public static <E> ArrayList<E> union(ArrayList<E> array1,
        ArrayList<E> array2) {
    // arrayUnion will be the arrayList that will be returned
    ArrayList<E> arrayUnion = new ArrayList<E>(array1);
    // arrayUnion.addAll(array2);
    E current;

    for (int i = 0; i < arrayUnion.size(); i++) {       
            current = arrayUnion.get(i);
            if(!array2.contains(current)){
                arrayUnion.remove(current);
            }
    }

    return arrayUnion;
}
于 2012-10-11T03:43:04.977 に答える
0

あなたのコードは、現在のアイテムがそれ自体でチェックされていることを確認する必要があります。jそうでない場合は、 で交換したアイテムを再度確認する必要があるため、アイテムを削除してを 1 つ減らす必要がありますj。あなたのケースで機能するようにコードを変更しました。削除するアイテムの状態チェックを見てください。

public static <E> ArrayList< E > union( ArrayList< E > array1, ArrayList< E > array2 ) {
    // arrayUnion will be the arrayList that will be returned
    ArrayList< E > arrayUnion = new ArrayList< E >( array1 );
    arrayUnion.addAll( array2 );
    E current;

    for ( int i = 0; i < arrayUnion.size( ); i++ ) {

        for ( int j = 0; j < arrayUnion.size( ); j++ ) {
            current = arrayUnion.get( i );

            if ( i != j && current.equals( arrayUnion.get( j ) ) ) {
                arrayUnion.remove( j );
                --j;// This is set to check the item which replace the removed item at previous statement
            }
        }
    }

    return arrayUnion;
}
于 2012-10-11T04:04:52.800 に答える