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

标签 java search collections

如何在 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/

相关文章:

java - 'stringList[3]' 等字符串的正则表达式

java - 如何更新每个循环中的数据而不是在 Android 中一次显示所有循环数据

java - 如何在 JFreeChart 时间序列图中设置日期刻度的最大标签线

java - Eclipse 中的 Stacktrace 折叠

java - 为什么 'Files.exists'返回true,而 'File.exists'返回false?仅当文件名为多字节字符时才会发生

php - 为较大的句子分配标签?

php - 如何使用 PHP/MySQL 搜索其他变量的特定内容?

search - 在 MacVIm 中打开 Ack

c++ - 如何命名同时充当其他集合容器的 B+Tree 键/值映射集合

java - 多个集合中的同一对象