我知道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中。
有办法做到这一点吗?
答案 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>
- 以及特定列表中该项目的出现次数。在你的例子中:
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>
会这样做,但是拥有一个独特的类将允许很好的辅助方法,比如隐式增加计数器值。
另一种需要不同性质开销的替代方案:首先对两个列表进行排序,然后迭代第一个列表并检查第二个列表的每个条目是否都显示出来。