2013-01-24 70 views
25

有可能,我只是没有在这里找到一个简单的一行,但这是我的问题:ArrayList包含另一个ArrayList的

如何检查是否一个ArrayList包含了所有在其他ArrayList中的对象。我期待(如果存在)中的线沿线的东西:

//INCORRECT EXAMPLE: 
if(one.contains(two)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

例如:

ArrayList one = {1, 2, 3, 4, 5} 

ArrayList two = {1, 2, 3} --> True 
ArrayList two = {} --> True 
ArrayList two = {1, 2, 3, 4, 5} --> True 
ArrayList two = {1, 5, 2} --> True 
ArrayList two = {1, 7, 4} --> False 
ArrayList two = {0, 1, 3} --> False 
ArrayList two = {4, 5, 6} --> False 
ArrayList two = {7, 8, 9} --> False 
+1

{1,3,2} =真或假? – cowls

+0

为真。在这种情况下,谢谢你的错误更新 – Evorlor

+0

你想containsAll(已经是答案) – cowls

回答

49

java.util.Collection接口中有一种称为containsAll的方法。在您的设置one.containsAll(two)给出了所需的答案。

3

你的示例代码没有任何意义,但这里有一个例子呢。

ArrayList<Integer> one, two; 
//initialize 
boolean good = true; 
for (int i = 0; i < two.size(); i ++) { 
    if (!(one.contains(two.get(i))) { 
     good = false; 
     break; 
    } 
} 

它只需通过所有two的元素和检查的循环,看看他们在one

然后布尔值good包含您想要的值。

请参阅ArrayList#contains

编辑:哦,哇,我完全忘了containsAll。哦,如果你真的想了解它,这是一种替代方法。

+3

一旦它变成'假'你应该'打破'。没有必要继续检查其余的。 –

+0

@LeeMeador是的,谢谢 – Doorknob

+2

或者(而不是中断)你可以这样做: for(int i = 0; i MadcoreTom

11

每List接口:

myList.containsAll(...); 
10

看看containsAll(Collection<?> c)方法从List接口。我认为这是你正在寻找的。

3

您可以使用列表的containsAll方法进行检查。但是,这是一个线性操作。如果列表很大,你应该把它转换为HashSet,然后再进行containsAll

HashSet tmp = new HashSet(one); 
if (tmp.containsAll(two)) { 
    ... 
} 

如果one长度为N和两个长度为M,该解决方案具有时间O(M+N)复杂性; “普通”containsAll的复杂度为O(M*N),可能会更糟糕。

2

下面是另一个例子使用containsAll()的,我已经用于断言两个数组中的JUnit测试等于:

List<String> expected = new ArrayList<String>(); 
expected.add("this"); 
expected.add("that"); 
expected.add("another"); 

List<String> actual = new ArrayListString(); 
actual.add("another"); 
actual.add("that"); 
actual.add("this"); 

Assert.assertTrue("The lists do not match!", expected.containsAll(actual)); 
相关问题