Во-первых, @Override equals () в классе Foo, чтобы решить, какие атрибуты делают два объекта равными и удалить, используя recursion
Объясните, как работает рекурсия
qn
представляет, сколько удалений выполнено
Начальная точка i = 0
j = 1
и рекурсия до достижения базового условия
Шаг 1, Базовый условие : если i
или j
превышает размер массива или qn
превышает quantityToRemove
return qn
Шаг 2. Проверьте равенство if элементы массива i
и j
не равны, затем удалите и увеличьте qn
и уменьшите j
, чтобы избежать пропущенного элемента
Шаг 3 для всех i
и увеличить j
Повторяйте до шага 3 до достижения базового условия
Шаг 4 приращение ++i
Шаг 5 начать новую рекурсию с приращением i
и начните j
с i+1
После завершения отвода проверьте, не превышает ли qn
t он quantityToRemove
и удаляем из массива, если он содержит 1 книгу. это для случая, когда у вас есть 4 разные книги и вы хотите удалить их все
...
Trace
i = 0, j = 1, 2, ...., N
i = 1, j = 2, 3, ...., N
i = 2, j = 3, 4, ...., N
i = 3, j = 4, 5, ...., N
...
static class Book {
int id;
String title;
public Book(int id, String title) {
this.id = id;
this.title = title;
}
@Override
public boolean equals(Object obj) {
Book other = (Book) obj;
return this.title.equals(other.title);
}
@Override
public String toString() {
return id + ": " + title;
}
}
public static void main(String[] a) {
Book b1 = new Book(1, "b1");
Book b2 = new Book(2, "b2");
Book b3 = new Book(3, "b3");
Book b4 = new Book(4, "b4");
Book b5 = new Book(1, "b1");
List<Book> list = new ArrayList<>();
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
list.add(b5);
list.add(new Book(1, "b1"));
list.add(new Book(1, "b1"));
list.add(new Book(1, "b1"));
System.out.println(list);
removeDifferent(list, 2);
System.out.println(list);
}
static void removeDifferent(List<Book> booksArray, int quantityToRemove) {
int qn = removeDifferent(booksArray, quantityToRemove, 0, 0, 1);
if (booksArray.size() == 1 && qn < quantityToRemove)
booksArray.remove(0);
}
static int removeDifferent(List<Book> booksArray, int quantityToRemove, int qn, int i, int j) {
if (i >= booksArray.size() || j >= booksArray.size() || qn >= quantityToRemove)
return qn;
if (!booksArray.get(i).equals(booksArray.get(j))) {
booksArray.remove(j);
j--;
qn++;
}
qn = removeDifferent(booksArray, quantityToRemove, qn, i, 1 + j);
++i;
qn = removeDifferent(booksArray, quantityToRemove, qn, i, i + 1);
return qn;
}
, выход
[1: b1, 2: b2, 3: b3, 4: b4, 1: b1, 1: b1, 1: b1, 1: b1]
[1: b1, 4: b4, 1: b1, 1: b1, 1: b1, 1: b1]
, а для этого вход
Book b1 = new Book(1, "b1");
Book b2 = new Book(2, "b2");
Book b3 = new Book(3, "b3");
Book b4 = new Book(4, "b4");
List<Book> list = new ArrayList<>();
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
System.out.println(list);
removeDifferent(list, 4);
System.out.println(list);
, выход
[]