如何在 Java (8) 中找到一个集合(列表或集合)是另一个集合的子集,尽管元素不相邻,例如 [1,2,3,4,5] 作为大集合,如果我想搜索 [2,3,4] 返回 true,[2,5] 返回 true,但 [4,2] 返回 false,尽管 4 和 2 在集合中但顺序不同
有实用程序可以帮助我执行此操作吗? 或者一段代码可以正确执行此操作?
谢谢
最佳答案
如果 a 包含 b,则该函数返回 true。
该函数将集合转换为数组,如果你的集合类没有实现.toArray()
函数,它将无法工作!
public class CollectionUtils {
private CollectionUtils() {
}
/**
* @return true if A contains B in order
*/
public static <T> boolean checkAcontainsB(Collection<T> a, Collection<T> b) {
if (a == null || b == null || b.size()>a.size()) {
return false;
}
if (b.isEmpty()) {
return true;
}
final Object[] aElements = a.toArray();
final Object[] bElements = b.toArray();
for (int i = 0; i < aElements.length; i++) {
int bIndex = 0;
for(int j = i; j< aElements.length; j++) {
if(aElements[j] == bElements[bIndex]) {
bIndex++;
if(bIndex>=bElements.length) {
return true;
}
}
}
}
return false;
}
}
你可以测试一下:
@Test
public void test() {
Assert.assertFalse(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4,5)));
Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4)));
Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,4)));
Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4,1,2,3,4), Arrays.asList(3,4,2)));
Assert.assertFalse(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4,5,6)));
}
关于java - 在java中查找不相邻但顺序相同的子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40363978/