java - 删除列表中的元素

use*_*502 2 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); 
Run Code Online (Sandbox Code Playgroud)

现在我有一个电影列表,包括上面的所有4个.

 (movies1,movies2,movies3,movies4)
Run Code Online (Sandbox Code Playgroud)

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

  (movies3,movies4);
Run Code Online (Sandbox Code Playgroud)

更新: 感谢@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"),
Run Code Online (Sandbox Code Playgroud)

基于LeffeBrune的答案,我应该将整个电影对象作为键并覆盖相同的方法.

Lef*_*une 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);
Run Code Online (Sandbox Code Playgroud)

现在地图包含{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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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