我正在尝试删除符合特定要求的项目。
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"));
答案 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