检查子列表是否在列表中

时间:2017-05-31 13:52:22

标签: java list sublist

我有两个列表,L1和L2。我需要检查L2是否是L1的连续子列表。 L1可以小于或大于L2(但从不完全相同的大小)。它们都是字符串列表,但是我需要检查L1中的元素是否包含L2中的元素(而不是直接相等)

这是一个很好的,简洁的方法吗?目前我只有两个迭代器相互追逐,但这似乎是不优雅的

2 个答案:

答案 0 :(得分:3)

i设为0。

遍历L1,检查匹配L2[i]的元素。当你找到它时,增加i。如果找不到,请将其重新设置为0.

如果i达到L2的长度,您就会在L2内按顺序找到L1的内容。

public boolean containsInOrder(List<Foo> list, List<Foo> pattern) {
     int i=0;
     for(Foo item : list) {
        if(Objects.equals(item,pattern.get(i))) {
           i++;
        } else {
           i=0;
        }
        if(i == pattern.size()) {
           return true;
        }
     }
     return false;
}

答案 1 :(得分:0)

递归回答因为我感到厚颜无耻:

 public boolean containsInOrder(List<Foo> list, List<Foo> pattern) {
     if(pattern.isEmpty()) {
         return true;
     }

     if(list.isEmpty()) {
         return false;
     }

     if(Objects.equals(head(list), head(pattern)) {
         return containsInOrder(tail(list), tail(pattern));
     }

     // else 
     return containsInOrder(tail(list), pattern);
 }

 private Foo head(List<Foo> l) {
     return l.get(0);
 }

 private List<Foo> tail(List<Foo> l) {
     return l.subList(1,l.size());
 }

不要在生产代码中使用它:由于Java没有尾部调用优化,如果列表很长,这将会che太多堆栈。但它是一个递归解决方案的有趣例子。