【问题标题】:Check if sublist is in list in the same order [closed]检查子列表是否以相同的顺序在列表中[关闭]
【发布时间】:2021-12-27 01:40:32
【问题描述】:

我正在尝试找到一种方法来检查一个列表的元素是否在 Java 中以相同的顺序出现在另一个列表中。例如:

char[] list = {'A','B','B','C','B','D'};
char[] sublist = {'B','C','B'};
char[] sublist2 = {'A','B','D'};

应该为 sublist 返回 true,但为 sublist2 返回 false(因为它们出现的顺序不同)。我主要尝试使用带有一些 while 和一些 if 的 for 循环(尽量不使用一些内置函数,可能不是长度)。

我试过了,但我认为它不正确(得到错误的答案):

public static boolean subList(char[] list, char[] sublist) {
    for (int i = 0; i < sublist.length; i++) {
        for (int j = 0; j < list.length; j++) {
            if (sublist[i] == list[j]) {
                break;
            }
        }
        return true; 
    }
    return false;
}

有可能实现吗?

【问题讨论】:

标签: java arrays list compare sublist


【解决方案1】:

这不是最正确的代码,但它可以工作!

public static boolean subList(char[] list, char[] sublist) {
    int subposition = 0;
    boolean subarray = false;
    for (int i = 0; i < list.length; i++) {
        if (subposition < sublist.length) {
            if (list[i] == sublist[subposition]) {
                subposition++;
            } else if (subposition > 0) {
                subposition = 0;
                i--;
            }

            if(subposition == sublist.length) {
                subarray = true;
            }
        }
    }

    return subarray;
}

【讨论】:

    【解决方案2】:

    以下代码应该可以工作:

    • 列表外循环,子列表嵌套循环
    • 创建一个布尔标志found
    • 在嵌套循环比较list的元素starting从列表中的当前位置,一旦检测到差异,found被重置为false
    • 如果在完成嵌套循环后,foundtrue,则检测到子列表。
    public static boolean subList(char[] list, char[] sublist) {
        for(int i = 0; i < list.length; i++) {
            boolean found = true;
            for(int j = 0, k = i; j < sublist.length && found && k < list.length; j++, k++) {
                if (sublist[j] != list[k]) {
                    found = false;
                }
            }
            if (found) return true;
        }
        return false;
    }
    

    测试:

    char[] list = {'A','B','B','C','B','D'};
    char[] sublist = {'B','C','B'};
    char[] sublist2 = {'A','B','D'};        
    System.out.println(subList(list, sublist));  // true
    System.out.println(subList(list, sublist2)); // false
    

    【讨论】:

      【解决方案3】:

      试试这个。

      public static boolean subList(char[] list, char[] sublist) {
          L: for (int i = 0, max = list.length - sublist.length; i <= max; i++) {
              for (int j = 0, k = i; j < sublist.length; j++, k++)
                  if (sublist[j] != list[k])
                      continue L;
              return true;
          }
          return false;
      }
      
      public static void main(String[] args) throws InterruptedException {
          char[] list = {'A', 'B', 'B', 'C', 'B', 'D'};
          char[] sublist = {'B', 'C', 'B'};
          char[] sublist2 = {'A', 'B', 'D'};
          System.out.println(subList(list, sublist));
          System.out.println(subList(list, sublist2));
      }
      

      输出:

      true
      false
      

      【讨论】:

        【解决方案4】:

        快捷方式是将每个char 数组转换为String,因为String 有一个contains 方法,可以为我们提供我们想要的答案。 contains() 接受任何 CharSequence 作为参数,因此 String 有效,并且可能稍微便宜一点的变体是将 sublistsublist2 包装在 CharBuffers 中,而不是将它们也转换为 String

        char[] list = { 'A', 'B', 'B', 'C', 'B', 'D' };
        char[] sublist = { 'B', 'C', 'B' };
        char[] sublist2 = { 'A', 'B', 'D' };
        
        String listString = new String(list);
        System.out.println("Contains sublist? " + listString.contains(CharBuffer.wrap(sublist)));
        System.out.println("Contains sublist2? " + listString.contains(CharBuffer.wrap(sublist2)));
        

        输出:

        Contains sublist? true
        Contains sublist2? false
        

        你的代码出了什么问题?

        在你的内部 for 循环中发生的事情并不重要,因为在循环结束后你会无条件地返回 true。因此,如果 sublist 的长度至少为 1(不为空),您将到达 return statement 并返回 true。如果sublist 为空,则跳过外部的for 循环,因此您将返回到方法的底部并返回false(尽管空列表通常被视为包含在任何列表中)。

        您需要从list(不是sublist)中的每个位置搜索两个列表中的字符不同的位置。如果你发现了这样的差异,那么list中的当前位置没有包含子列表,你应该尝试下一个位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多