删除但外向的物品

时间:2020-05-05 22:32:19

标签: java

我正在尝试删除符合特定要求的项目。

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"));

如果电影1 2010 与另一个项目相同,则删除该电影。

我尝试使用此方法,因为三个之后没有任何项目,并得到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 :(得分:0)

当程序尝试以大于或等于数组(或元素的任何索引集)大小的索引访问元素时,将发生IndexOutOfBoundsException。您代码中的问题在于for循环内的if语句:

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

想象一下,您已遍历LinkedList的最后一个元素。上面的语句试图将最后一个元素与下一个索引中的元素进行比较。显然,这是荒谬的。没有下一个元素。

这最后一个检查是不必要的,只需将for循环修改为以下内容即可使程序停止运行:

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

现在一切正常。

这是一个常见的错误;您做得很好,只要继续练习!

edit:有关该方法中算法缺陷的概述,请参阅@Arvind Kumar Avinash答案;这篇文章着重于解决异常

答案 1 :(得分:0)

我尝试了一下,因为三点之后没有项目,所以得到 arrayoutofbound异常。

它必须是IndexOutOfBoundsException,而不是arrayoutofbound。当索引超出范围(IndexOutOfBoundsException)时,将发生index < 0 || index >= size()。在您的情况下,您尝试访问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