Удалить только один, а не все элементы в связанном списке - PullRequest
2 голосов
/ 05 мая 2020

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

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

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

Я пытаюсь проверить, существует ли элемент в списке.

Если элемент существует, удалите элемент .

Просто он удаляет все элементы.

Я просто хочу удалить один элемент Итак, результат должен быть после удаления.

[Movie1, 2010, 2];

Есть ли способ, которым я может это сделать?

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Используйте remove (int index)

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;
    }

    @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", "3");
        items.add(item1);
        items.add(item1);
        items.add(item2);
        System.out.println("Before: ");
        System.out.println(items);

        remove(items, item1);
        remove(items, item2);

        System.out.println("After: ");
        System.out.println(items);

        // Trying to remove item1 again
        remove(items, item1);
        System.out.println("Result: ");
        System.out.println(items);
    }

    /**
     * If list contains more than one occurrence of item, removes the first
     * occurrence of item from list
     * 
     * @param items from which the first occurrence of item has to be removed
     * @param item
     */
    static void remove(LinkedList<Item> items, Item item) {
        for (int i = 0; i < items.size(); i++) {
            if (items.get(i).equals(item)) {
                if (items.subList(i + 1, items.size()).contains(items.get(i))) {
                    items.remove(i);
                    break;
                }
            }
        }
    }
}

Вывод:

Before: 
[Name: Movie1, Year: 2010, ID: 2, Name: Movie1, Year: 2010, ID: 2, Name: Movie2, Year: 2020, ID: 3]
After: 
[Name: Movie1, Year: 2010, ID: 2, Name: Movie2, Year: 2020, ID: 3]
Result: 
[Name: Movie1, Year: 2010, ID: 2, Name: Movie2, Year: 2020, ID: 3]
0 голосов
/ 05 мая 2020

Вы также можете использовать метод list Collections contains, а затем удалить его.

Item item1 = new Item("Movie1", "2010", "2");
if(items.contains(item1){
  items.remove(item1)
}

Кроме того, для работы приведенного выше кода вам необходимо переопределить метод hashcode и equals в Item POJO.

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