有趣的Java列表包含查询

时间:2017-07-21 15:40:31

标签: java arrays collections

我知道Java containsAll方法,但这种方法不能满足我的要求。假设我有一个列表A

var engine = _serviceProvider.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine; // Resolver.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
ViewEngineResult viewResult = engine.FindView(ControllerContext, viewName, false);

和另一个清单B

[7 1 0 4 5]

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

来自apache框架的CollectionUtils非常方便。 isSubCollection方法可以解决您的问题。

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

见下面的描述 -

  

如果a是a的子集合,即iff,则返回true   a中e的基数小于或等于e in的基数   b,对于a中的每个元素e。参数:a - 第一个(sub?)   集合,不能为空b - 第二个(超级?)集合,必须   not be null返回:如果a是a的子集合

,则返回true

答案 1 :(得分:0)

我不知道采用“直接”方式(仅通过调用contains()等单一“检查”方法。

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

如果这不是一个选项,您可以通过多种方式自行实施此类检查。例如:

  • 创建一个代表ListItem<T>的类。该类基本上包含来自任意类型列表中的一个元素(在您的示例中为ListItem<Integer> - 以及特定列表中该项目的出现次数。
  • 然后为列表创建ListItem对象
  • 然后当你为ListItem正确实现equals / hashCode时,你可以创建一个ListItems列表 - 然后询问是否包含另一个ListItem。

在你的例子中:

 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)

显然,B的ListItem(1,2)不会出现在列表A的ListItem列表中。

你不一定要为它创建一个特定的类,一个简单的HashMap<T, Integer>会这样做,但是拥有一个独特的类将允许很好的辅助方法,比如隐式增加计数器值。

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