首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找不相邻的子集合,但在java中按相同的顺序查找

查找不相邻的子集合,但在java中按相同的顺序查找
EN

Stack Overflow用户
提问于 2016-11-01 16:09:09
回答 4查看 228关注 0票数 1

如果一个集合(列表或集合)是另一个集合的子集,而元素(例如,1, 2,3,4 ,5等元素与大型集合不相邻),如果我想搜索2,3,4返回true,也可以2,5返回true,但4,2返回false,尽管4和2在集合中,但顺序不同,那么如何在Java (8)中找到

有实用工具帮我做这件事吗?或者一段代码做得很好?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-01 16:32:45

如果a包含b,则此函数返回true。

此函数将集合转换为数组,如果您的集合类没有实现.toArray()函数,它将无法工作!

代码语言:javascript
复制
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;
    }

}

你可以测试它:

代码语言:javascript
复制
@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)));
}
票数 0
EN

Stack Overflow用户

发布于 2016-11-01 16:21:04

没有经过充分的测试,但你可以尝试这样的方法,

代码语言:javascript
复制
    int[] x = {1,2,3,4,5};
    int[] y = {2,5};
    int yIndex = 0;

    for(int i: x){
        if(y[yIndex] == i){
            yIndex++;
            if(yIndex >= y.length){
                break;
            }
        }
    }

    System.out.println(yIndex == y.length ? "Match" : "Not Match");
票数 0
EN

Stack Overflow用户

发布于 2016-11-01 16:27:27

您可以很容易地使用集合提供的一种实用程序方法,它完全可以完成您想要做的事情。

代码语言:javascript
复制
    Collections.disjoint(c1, c2)

如果传递的两个集合没有任何相同的项,则上面的方法返回true。这正是你想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40363978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档