有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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的回答,我应该把整个电影对象作为键,并覆盖一个相等的方法吗


共 (2) 个答案

  1. # 1 楼答案

    不要使用列表,使用地图。然后,您可以解释这样一个事实:映射通常只允许使用agiven键的一个值

    Map<Integer, Movie> map = new HashMap<Integer, Movie>();
    
    //for each movie:
    Movie movie = new Movie(1,"movie1")
    map.put(movie.id, movie.title)
    

    然后是地图。values()将为您提供电影3和电影4

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

    使用带有自定义比较器的已排序列表按id排序,然后对其进行迭代,取出每个id的最后一步

  2. # 2 楼答案

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

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

    实现这样一个键的正确方法需要创建另一个对象,并重写其equalshashCode方法。这是一个更先进的领域