2014-11-05 69 views
2

幫我這個爪哇 - 刪除元素列表

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的回答,我應該把整個影片對象爲重點,並覆蓋平等的方法。

+0

是否想從'電影'本身中刪除'movie1'和'movie3',或者只是返回具有'id = 2'的電影列表?你的問題表明你希望它們被刪除,但是如果我們再也不需要它們,那麼首先添加它們的意義何在? – Compass 2014-11-05 15:52:16

+1

我假設你的意思是{movie3,movie4}的列表,因爲這些是最後添加了不同ID的兩部電影。 – LeffeBrune 2014-11-05 15:55:48

+0

@LeffeBrune是的,錯字錯誤,對不起! – user2747502 2014-11-05 16:00:43

回答

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

實現這樣的關鍵就需要創建另一個對象的正確方法和覆蓋其等於hashCode方法。這是更先進的領土。

+0

現在,如果我想要兩個或更多的領域,而不是一個?我應該把整個電影對象當作關鍵字並且重寫一個平等的方法嗎?查看我的更新 – user2747502 2014-11-05 16:27:42

+0

唯一標識電影的事物是其ID。繼續使用它作爲關鍵字,並將其他數據的字段添加到Movie類。 – LeffeBrune 2014-11-05 17:29:16

0

不要使用列表,請使用Map。那麼你可以說明地圖通常只允許一個值與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,然後將它們添加到一組。這會給出相同的行爲。雖然不確定套是否會保持第一個或最後一個 - 所以你可能不得不顛倒迭代的順序。

使用帶有自定義比較器的Sorted List來創建一個按ID排序的集合,然後遍歷它,從而拉出每個id發生的最後一個移動。