java - 删除列表中的元素

时间:2014-11-05 15:49:03

标签: java arraylist

帮我解决这个问题

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

现在我有一系列电影,包括以上所有4部。

 (movies1,movies2,movies3,movies4)

但是我希望我的电影列表只包含在具有相同Id的视频中添加的最后一部电影 这是:

  (movies3,movies4);

更新 感谢@LeffeBrune的答案,但现在如果我想要两个或更多字段,而不仅仅是一个。我该怎么办?

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

根据LeffeBrune的回答,我应该将整个电影对象作为关键字并覆盖相同的方法。

2 个答案:

答案 0 :(得分:7)

您需要为此使用正确的数据结构。在这种情况下,地图将起作用:

Map<Integer, Movie> movies = new HashMap<>();
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.put(movie1.id, movie1);
movies.put(movie2.id, movie2);
movies.put(movie3.id, movie3);
movies.put(movie4.id, movie4);

现在,地图包含{movie3,movie4}或最后添加的具有该ID的电影。

如果你想使用“复合键”,其中整数ID和标题标识电影,你需要使用更复杂的数据结构或诉诸黑客。创建复合键的一种简单方法是将其中的字段连接成一个字符串,然后将该字符串用作地图中的键:

import java.util.HashMap;
import java.util.Map;

class Movies {
  static class Movie {
    int id;
    String title;
    String plot;

    Movie(int id, String title, String plot) {
      this.id = id;
      this.title = title;
      this.plot = plot;
    }

    @Override
    public String toString() {
      return String.format("{ %d, %s => %s }", id, title, plot);
    }
  }

  public static void main(String[] args) {
    Map<String, Movie> movies = new HashMap<>();
    Movie movie1 = new Movie(1, "title1" ,"plot1");
    Movie movie2 = new Movie(2, "title2", "plot2");
    Movie movie3 = new Movie(1, "title3", "plot3");
    Movie movie4 = new Movie(1, "title1", "plot4");

    // Create composite key by combining id and title into a string. 
    movies.put(movie1.id + movie1.title, movie1);
    movies.put(movie2.id + movie2.title, movie2);
    movies.put(movie3.id + movie3.title, movie3);
    movies.put(movie4.id + movie4.title, movie4);

    for (Map.Entry<String, Movie> entry : movies.entrySet()) {
      System.out.printf(
          "Key: %s Value: %s%n", entry.getKey(), entry.getValue());
    }
  }
}

实现此类密钥的正确方法是创建另一个对象并覆盖其 equals hashCode 方法。这是更先进的领域。

答案 1 :(得分:0)

不要使用列表,使用地图。然后你可以说明地图通常只允许一个带有agiven键的值。

Map<Integer, Movie> map = new HashMap<Integer, Movie>();

//for each movie:
Movie movie = new Movie(1,"movie1")
map.put(movie.id, movie.title)

然后map.values()将为您提供电影3和电影4。

其他经典解决方案包括:覆盖Movie.equals()以比较ID,然后将它们添加到集合中。这将产生相同的行为。尽管不确定集合是否会保留第一个或最后一个 - 所以你可能不得不颠倒迭代的顺序。

使用带有自定义比较器的排序列表来生成按ID排序的集合,然后迭代它,拉出每个id发生的最后一次移动。