下面的代码如果传递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;
}
答案 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 。