Я пытаюсь с этим, и потому что нет элемента после трех и получаю исключение arrayoutofbound.
Это должно быть IndexOutOfBoundsException , а не arrayoutofbound
. IndexOutOfBoundsException
появляется, когда индекс выходит за пределы допустимого диапазона (index < 0 || index >= size()
). В вашем случае вам нужно завершить l oop перед items.size() -1
, поскольку вы пытаетесь получить доступ к items.get( i + 1)
. Это должно быть
for(int i = 0; i < items.size() - 1; i++)
Другая проблема с вашим подходом состоит в том, что вы сравниваете только с ближайшим следующим элементом, тогда как соответствующий элемент может находиться где угодно в списке. Следовательно, вам необходимо сравнивать элементы, используя вложенные циклы, т.е. элемент необходимо сравнивать со всеми оставшимися элементами, пока не будет найдено совпадение, и как только совпадение будет найдено, удалите соответствующий элемент и остановите процесс.
Сделайте так:
import java.util.LinkedList;
import java.util.Objects;
class Item {
String name, year, id;
public Item(String name, String year, String id) {
this.name = name;
this.year = year;
this.id = id;
}
public String getName() {
return name;
}
public String getYear() {
return year;
}
@Override
public int hashCode() {
return Objects.hash(name, year, id);
}
@Override
public boolean equals(Object obj) {
Item other = (Item) obj;
return this.name.equals(other.name) && this.year.equals(other.year) && this.id.equals(other.id);
}
@Override
public String toString() {
return "Name: " + name + ", Year: " + year + ", ID: " + id;
}
}
public class Main {
public static void main(String[] args) {
LinkedList<Item> items = new LinkedList<Item>();
Item item1 = new Item("Movie1", "2010", "2");
Item item2 = new Item("Movie2", "2020", "2");
Item item3 = new Item("Movie2", "2020", "3");
Item item4 = new Item("Movie1", "2010", "3");
Item item5 = new Item("Movie2", "2020", "4");
items.add(item1);
items.add(item2);
items.add(item3);
items.add(item4);
items.add(item5);
System.out.println("Original list:");
items.stream().forEach(System.out::println);
remove(items, item1);
System.out.println("\nList after first removal:");
items.stream().forEach(System.out::println);
remove(items, item2);
System.out.println("\nList after second removal:");
items.stream().forEach(System.out::println);
}
static void remove(LinkedList<Item> items, Item item) {
for (int i = 0; i < items.size(); i++) {
for (int j = i + 1; j < items.size(); j++) {
if (items.get(i).getName().equals(items.get(j).getName())
&& items.get(i).getYear().equals(items.get(j).getYear())) {
items.remove(j);
return;
}
}
}
}
}
Вывод:
Original list:
Name: Movie1, Year: 2010, ID: 2
Name: Movie2, Year: 2020, ID: 2
Name: Movie2, Year: 2020, ID: 3
Name: Movie1, Year: 2010, ID: 3
Name: Movie2, Year: 2020, ID: 4
List after first removal:
Name: Movie1, Year: 2010, ID: 2
Name: Movie2, Year: 2020, ID: 2
Name: Movie2, Year: 2020, ID: 3
Name: Movie2, Year: 2020, ID: 4
List after second removal:
Name: Movie1, Year: 2010, ID: 2
Name: Movie2, Year: 2020, ID: 2
Name: Movie2, Year: 2020, ID: 4