2017-07-21 82 views
-1

我知道Java containsAll方法,但是这种方法对我的需求并不起作用。假设我有列表的有趣的Java列表包含查询

[7 1 0 4 5] 

和另一名单B

[1 1] 

当我使用A.containsAll(B)我得到真正的,但我希望它是假的,因为2个项目不在列表A.

有没有办法做到这一点?

+2

'Java!== JavaScript' –

回答

0

来自apache框架的CollectionUtils非常方便。 isSubCollection方法在这里做的伎俩,并解决您的目的。

public static boolean isSubCollection(Collection<?> a, 
         Collection<?> b) 

下方所见的说明中载录如下─

返回true当且仅当A是B的子集,也就是,当且仅当 基数电子商务在小于或等于e的基数为 b,对于a中的每个元素e。参数:a - 第一(子?) 收集,不能为null b - 第二个(超?)收集,必须 不能为null返回:当且仅当A是B的子集

0

我不知道有一个“直接”的方法来做到这一点(只调用一个“检查”方法,如)。

正如其他答案指出的那样;可能有第三方库方法允许进行这种检查。

如果这不是一个选项,你可以通过多种方式自己实现这种检查。例如:

  • 创建一个代表ListItem<T>的类。这个类基本上包含从任意类型的列表一个元素(在你的榜样将是ListItem<Integer> - 和该项目的出现的特定列表中的数
  • 然后创建列表项的对象为您的列表
  • ,当你再正确地实现equals /哈希码列表项,您可以创建listItems中的列表 - 然后问,如果其他列表项包含

在您的例子:

A: [7 1 0 4 5] gives ListItems (0, 1) (1, 1), (4, 1), (5, 1), (7,1) 

B: [ 1 1 ]  gives ListItem (1, 2) 

而且很明显的列表项(1,2)为B不是显示listItems中的名单A

列表了你不一定创建一个特定的类,一个简单的HashMap<T, Integer>会做,但有一个独特的类将允许很好的辅助方法,如隐式增加计数器值。

另一种需要不同性质开销的替代方法是:首先对两个列表进行排序,然后迭代第一个列表并检查第二个列表中的每个条目是否显示出来。