arraylist java删除列表中的元素
帮帮我
Movie{
int id;
String title;
}
List<Movie> movies = new ArrayList<Movie>();
Movie movie1 = new Movie(1,"movie1");
Movie movie2 = new Movie(2,"movie2");
Movie movie3 = new Movie(1,"movie3");
Movie movie4 = new Movie(2,"movie4");
movies.add(movie1); movies.add(movie2); movies.add(movie3); movies.add(movie4);
现在我有一个电影列表,包括以上四部电影
(movies1,movies2,movies3,movies4)
但是我希望我的电影列表只包含最后添加的电影,这些电影具有相同的Id 也就是说:
(movies3,movies4);
更新: 谢谢@leffebrene的回答,但现在如果我想要两个或更多字段,而不是一个。我该怎么办
Movie{
int id; String title ; String plot;
}
for example for both id and title field.
(1,"title1","plot1"),(2,"title2","plot2"),(1,"title3","plot3"),(1,"title1","plot4")
will become
(2,"title2","plot2"),(1,"title3","plot3"),(1,"title1","plot4"),
根据Leffebrene的回答,我应该把整个电影对象作为键,并覆盖一个相等的方法吗
# 1 楼答案
不要使用列表,使用地图。然后,您可以解释这样一个事实:映射通常只允许使用agiven键的一个值
然后是地图。values()将为您提供电影3和电影4
其他经典解决方案包括:覆盖电影。equals()比较ID,然后将它们添加到集合中。这将产生同样的行为。尽管不确定集合是否会保留第一个或最后一个,所以您可能必须颠倒迭代顺序
使用带有自定义比较器的已排序列表按id排序,然后对其进行迭代,取出每个id的最后一步
# 2 楼答案
为此,您需要使用正确的数据结构。在这种情况下,地图将起作用:
现在,地图包含{movie3,movie4}或最后添加的具有该ID的电影
如果你想使用“复合键”,其中整数ID和标题标识电影,你需要使用更复杂的数据结构,或者求助于黑客。创建复合键的一种简单方法是将其中的字段连接成字符串,然后将该字符串用作地图中的键:
实现这样一个键的正确方法需要创建另一个对象,并重写其equals和hashCode方法。这是一个更先进的领域