Удаление элемента рядом с исходящим - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь удалить элемент, который соответствует указанным c требованиям.

private LinkedList<Item> items = new LinkedList<>();

items.add(new Item("Movie2", "2020", "2"));
items.add(new Item("Movie1", "2010", "2"));
items.add(new Item("Movie1", "2010", "3"));

, если Movie1 и 2010 совпадают с другим элементом, удалите что mov ie.

Я пробую с этим, и потому что нет элемента после трех и получаю исключение arrayoutofbound. Может мне помочь, спасибо.

for(int i = 0; i < items.size() ; i++){
    if( (items.get(i).getName().equals(items.get( i + 1).getName()) && check year)
      items.remove(items.get(i));
}

Ожидаемый результат:

items.add(new Item("Movie2", "2020", "2"));
items.add(new Item("Movie1", "2010", "2"));

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Я пытаюсь с этим, и потому что нет элемента после трех и получаю исключение 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
0 голосов
/ 06 мая 2020

Исключение IndexOutOfBoundsException возникает, когда программа пытается получить доступ к элементу с индексом, который больше или равен размеру массива (или любого индексированного набора элементов). Проблема в вашем коде заключается в выражении if внутри for l oop:

if( (items.get(i).getName().equals(items.get( i + 1).getName()) && check year)

Представьте, что вы достигли последнего элемента в вашем обходе LinkedList. Вышеприведенный оператор пытается сравнить этот последний элемент с элементом следующего индекса. Ясно, что это бессмысленно; следующего элемента нет.

В этой последней проверке нет необходимости, просто остановите программу, изменив для l oop на следующее:

for(int i = 0; i < items.size() -1; i++)

Теперь все должно работать нормально.

Это это распространенная ошибка; вы делаете отличную работу, просто продолжайте практиковаться!

редактировать: обратитесь к @Arvind Kumar Avina sh ответ для обзора алгоритмов c fl aws в подходе; этот пост посвящен рассмотрению исключения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...