2016-02-12 112 views
0

查找特定值/元件I具有二維數組列表在二維的ArrayList

List<List<String>> movies_info = new ArrayList<>(); 

我填充創建新行

movies_info.add(new ArrayList<String>()); 

和添加元素

movies_info.get(i).add(title); 

。 我希望能夠檢查我添加的元素是否已經存在於整個ArrayList中。沒有使用以下for.loop可以實現這個結果嗎?

boolean found = false; 
for (int i = 0; i < movies_info.size(); i++) { 
    if(movies_info.get(i).contain(title)) { 
    found = true; 
} 
if (!found) { 
    movies_info.add(new ArrayList<String>()); 
    movies_info.get(i).add(title); 
} 
+0

不,這是不可能沒有循環或與Java 8做一些等同於循環(也許)。 –

+0

我有一個更高階的函數庫,可以幫助你,如果你不想進入流:https://github.com/smaspe/FunctionalIterables像'if(!FuncIter.any(movies_info,list - > list.contains(title))){movies_info.add(Arrays。asList(標題)); }' – njzk2

+0

感謝@LouisWasserman的澄清。我期待着那樣。我想我會循環。 – Oiproks

回答

0

是這樣的嗎?它簡化了一下..

for(List<String> mInfo : movies_info) { 
    if(!mInfo.contains(title)) { 
     //do stuff 
    } 
} 
+0

你寫的東西與我的基本相同。寫得更好。代碼仍然需要遍歷所有行。也許我還不夠清楚。我想立即掃描2D數組列表的整個結構。那可能嗎? – Oiproks

1

您可以將第二ArrayListHashMap更換和檢查,如果它已經存在。

movies_info.add(new HashMap<String,String>()); 

if (!movies_info.get(i).containsKey(title)){ 
    movies_info.get(i).put(title,title); 
} 

無論是尋求在HashMap的關鍵,並且還加入了新的元素有固定的時間複雜度O(1)

事後得到的值,你可以使用此代碼

for (String title : movie_info.get(i).keySet()){ 
     // Use title 
} 
+0

也可以在那裏使用HashSet取決於你正在尋找的操作級別。 – anaxin

+0

當我回答@PedroHawk時,我的想法是一次搜索整個2D ArrayList,而不通過行。 – Oiproks

+0

你是否擔心記憶複雜? –

1

我會建議採用不同的方法。您可以創建一個名爲Movie的類並創建一個Movie對象的列表,而不是創建String-s的列表。然後,您可以通過調用contains方法直接查詢該列表。

注意:你需要重寫的Movie類兩種方法,hashCodeequals,爲contains方法工作。通過重寫這兩種方法,您將告知list對象如何比較兩個對象。

UPDATE:您不必手動編寫equalshashCode方法(至少不是如果你正在使用Eclipse IDE)。你可以右鍵單擊班級內的任何地方並選擇Source -> Generate hashCode and equals ...,它會提示你在哪個類的字段上要比較兩個對象,選擇字段,點擊確定然後離開你,這兩個方法將會是爲你自動生成。

這裏有一個簡單的例子:

public class Movie 
{ 
    String title; 

    public Movie(String t) 
    { 
     this.title = t; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 

    @Override 
    public int hashCode() 
    { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((title == null) ? 0 : title.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Movie other = (Movie) obj; 
     if (title == null) 
     { 
      if (other.title != null) 
       return false; 
     } else if (!title.equals(other.title)) 
      return false; 
     return true; 
    } 
} 

你可以這樣測試:

import java.util.ArrayList; 
import java.util.List; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     List<Movie> movies = new ArrayList<Movie>(); 
     movies.add(new Movie("Movie 1")); 
     movies.add(new Movie("Movie 2")); 

     System.out.println(movies.contains(new Movie("Movie 1"))); 
    } 
}