2016-02-12 57 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"))); 
    } 
}