如何在我的arraylist中删除此事件,而不是仅仅检查它是否发生

时间:2014-10-23 01:00:47

标签: java

下面的代码如果传递set1 = {1,2,4,5,4,5}和set2 = {4,5,4},因为4,5在set1中连续发生,我想要而不是以下方法返回true或false,它从set1中删除{4,5,4}的连续出现,因此set1 = {1,2,5}。

public static boolean contains(ArrayList<Integer> set1, ArrayList<Integer> set2) {
OUTER:
for (int i = 0; i < set1.size() - set2.size(); i++) {
     for (int j = 0; j < set2.size(); j++) {
         if (!set1.get(i + j).equals(set2.get(j)))
              continue OUTER;
     return true;
 } 
 return false;
}

2 个答案:

答案 0 :(得分:2)

首先,我将您的contains重命名为indexOf并修改它以使用List接口并返回表示匹配索引的int

public static int indexOf(List<Integer> set1, List<Integer> set2) {
    OUTER: for (int i = 0; i < set1.size() - set2.size(); i++) {
        for (int j = 0; j < set2.size(); j++) {
            if (!set1.get(i + j).equals(set2.get(j)))
                continue OUTER;
            return i;
        }
    }
    return -1;
}

然后为所有匹配元素调用remove()的方法,如

public static void removeLinearMatch(List<Integer> al, List<Integer> bl) {
    int size = (bl != null) ? bl.size() : 0;
    int index = indexOf(al, bl);
    while (index > 0 && size > 0) {
        al.remove(index);
        size--;
    }
}

最后要测试,

public static void main(String[] args) {
    List<Integer> al = new ArrayList<>(Arrays.asList(1, 2, 4, 5, 4, 5));
    List<Integer> bl = new ArrayList<>(Arrays.asList(4, 5, 4));
    removeLinearMatch(al, bl);
    System.out.println(al);
}

我得到了

的请求输出
[1, 2, 5]

答案 1 :(得分:1)

您还可以通过添加另一个循环来实现此目的:

public static boolean remove(ArrayList<Integer> set1, ArrayList<Integer> set2) {
    OUTER: for (int i = 0; i <= set1.size() - set2.size(); i++) {
        for (int j = 0; j < set2.size(); j++) {
            if( !set1.get(i + j).equals(set2.get(j))) continue OUTER;
        }
        for (int j = 0; j < set2.size(); j++){
            set1.remove(i + set2.size()-1 - j);
        }
        return true;
    }
    return false;
}

如果已修改第一个集合,则返回 true ,否则返回 false