编写一个方法来删除出现在arraylist 2中的arraylist 1中的对象

时间:2017-10-31 00:11:50

标签: java arraylist

我正在尝试编写一个带有两个数组列表list1和list2的方法,并从两个arrayLists中找到的list1中删除对象。

  public void filter( ArrayList<Object> list1, ArrayList<Object> list2 ) {
    for ( int x = 0; x < list1.size() - 1; x++ ) {
        for ( int i = 0; i < list2.size() - 1;i++) {

            if ( list1.get( x ) == list2.get( i ) ) {
                list1.remove( list1.get( x ) );
                break;
            }

        }
    }
}


//Output:
//list1 = [34, third, 99, 2]
//list2 = [first, 99, third]
//after filter(list1, list2) --> [34, third, 2]

正如您所看到的,过滤器正在取出99,这是正确的,但不是第三个 知道我做错了什么吗?

由于

编辑:我忘了提,我不能使用contains或indexOf方法

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误:

  1. 您使用==代替equals方法,因此一个与另一个完全相同的对象不会被视为匹配,这不是我们想要什么。
  2. 您跳过每个列表的最后一个元素,因为for循环条件为n < list.size() - 1而不是n < list.size()
  3. 删除元素时,您没有正确处理循环索引。会发生的是,如果你需要删除元素3并且你这样做,你应该再次尝试使用元素3,因为它是一个新元素(旧元素4已被移动到元素3的位置,之后全部)。
  4. 由于您已经拥有要删除的元素的索引,因此您应该使用ArrayList#remove(int index)方法而不是ArrayList#remove(Object o)方法。
  5. 这是固定代码:

    public void filter( ArrayList<Object> list1, ArrayList<Object> list2 ) {
        for ( int x = 0; x < list1.size(); x++ ) {
            for ( int i = 0; i < list2.size(); i++ ) {
    
                if ( list1.get( x ).equals( list2.get( i ) ) ) {
                    list1.remove( x );
                    x--;
                    break;
                }
    
            }
        }
    }