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]

第二个列表是 [ww, ss, ee, dd]

两个 ArrayList 的并集是:[ee, t, ww, dd]

什么地方出了错..?我已经被困在这个问题上太久了,我再也不想听到联盟这个词了。请帮忙

4

4 回答 4

4

您可以使用 aSet来获得联合,它可以更好地处理它。您应该注意到的唯一想法是它可能会改变元素的顺序。

这是一个例子:

    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

您可以更改执行此操作的方式。将 的所有元素添加array1arrayUnion. 然后迭代它并为每个项目检查它是否在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一个,因为您必须再次检查在 处替换的项目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 回答