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。但是,请按照代码来理解它真正在做什么。我相信你导师的意图就是这样。