Java 考试不及格,我做错了什么?

Java 考试不及格,我做错了什么?,java,arrays,arraylist,Java,Arrays,Arraylist,所以,我一直在努力让这个程序通过这两个测试用例。我应该制作一个列表,其中包含文本中模式的每个非尾部出现之后的字符 这是代码 public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern) { ArrayList<Character> character = new ArrayList<Character>()

所以,我一直在努力让这个程序通过这两个测试用例。我应该制作一个列表,其中包含文本中模式的每个非尾部出现之后的字符

这是代码


    public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern)
    {

        ArrayList<Character> character = new ArrayList<Character>();

        int i = 0;
        while (i <= text.length())
        {
            int index = text.indexOf(pattern, i);
            if (index + pattern.length() < text.length())
            {

                character.add(text.charAt(index + pattern.length()));
            }

            i = i + text.indexOf(pattern, index) + pattern.length();

        }

        return character;
    }

以下是测试用例:

a对于这个,我得到[b],但我应该得到[b,b]

@Test(timeout = 2000)
   public void testGetCharsThatFollowPattern ()
   {
       ArrayList<Character> list = new ArrayList<Character>();
       list.add('b');
       list.add('b');
       ArrayList<Character> chars = PS5Library.getCharsThatFollowPattern("abababa", "aba");
       assertEquals(list, chars);
   }
b对于这个,我得到[c,d],但我应该得到[c,d,c]

 @Test(timeout = 2000)
    public void testGetCharsThatFollowPattern2 ()
    {
        ArrayList<Character> list = new ArrayList<Character>();
        list.add('c');
        list.add('d');
        list.add('c');
        ArrayList<Character> chars = PS5Library.getCharsThatFollowPattern("abcabdabcab", "ab");
        assertEquals(list, chars);
    }

问题是,您的代码会查找所有单独的事件,这通常是所需的,但您实际需要的是查找所有事件,包括重叠的事件。为此,您需要确保在每次迭代中只移动一个字符,而不是按匹配长度移动

public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern) {
    List<Character> characters = new ArrayList<>();
    for (int i = 0; i < text.length(); i++) {
        i = text.indexOf(pattern, i);
        if (i < 0) break;

        int charIndex = i + pattern.length();
        if (charIndex >= text.length()) break;
        characters.add(text.charAt(charIndex));
    }
    return characters;
}

按如下方式更改循环:

public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern) {

  ArrayList<Character> characters = new ArrayList<Character>();
  int index = text.indexOf(pattern);  
  while (index >= 0) {
    if (index + pattern.length() < text.length()) {
       characters.add(text.charAt(index + pattern.length()));
    }
    index = text.indexOf(pattern, index + 1);  
  }      

  return characters;
}
当再也找不到模式时,索引将返回-1,所以您可以使用它作为退出循环的检查


第二个indexOf仅为+1,因为您希望abababaw与模式aba重叠返回b,b。

您看过RegEx了吗?欢迎使用堆栈溢出。请学习如何使用堆栈溢出,并阅读如何提高问题的质量。然后,你的问题包括你的完整源代码,你有作为一个,它可以被编译和测试的其他人。另请参见:@jbx这是我的老师指定的一系列方法。我发布的代码就是其中的一部分。PS5库中的其他方法不会影响我遇到问题的方法。当我运行它时,我得到了[b,b]。你能确认你用的是最新版本吗?Lemmee试试againCool。但是,请按照代码来理解它真正在做什么。我相信你导师的意图就是这样。