因此,我应该制作一个包含字符的列表,该字符跟随文本中每个非尾部出现的模式。列表索引n中存储的字符必须是模式的第n次非尾部出现之后的字符。
例如:测试用例getCharsThatFollowPattern(“ abcabdabcab”,“ ab”)应该返回ArrayList ['c','d','c']。
我在尝试使列表遍历模式文本时遇到问题。我在测试用例中得到了['a','a','a']而不是['c','d','c']。
public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern) {
ArrayList<Character> character = new ArrayList<Character>();
int i = 0;
while (i < text.length())
{
if (i < text.length())
{
character.add(text.charAt(text.indexOf(pattern, i)));
i = i + text.indexOf(pattern, i) + pattern.length();
}
}
return character;
}
为什么不迭代呢? :(
答案 0 :(得分:1)
您的目的是在较大的text
值中找到一个子字符串模式,然后将每个这些字符添加到数组中。您的代码中发生了一些事情,因此,我尝试创建一个最简单的示例,说明如何使其工作,但排除了您本来可以做的事情(例如创建数组和填充值)。
下面的代码查找下一个模式的起始位置– indexOfNextPatternStart
–以后将发生“ ab”的位置。然后,它加上“ ab”本身的长度,以得到之后的索引。因此,在您的text
示例中,它以"abc"
开头–“ ab”显然在最前面,但是您希望索引为"c"
。这就是indexOfCharAfterPattern
所包含的内容。到那时,您已经将角色隔离了。在我的示例中,我将其临时存储为charAfterPattern
并打印出来。
我添加了if (indexOfCharAfterPattern < text.length())
检查以防止text
中的最后一个“ ab”。最后一个“ ab”之后没有任何内容,因此试图向前看下一个字符将无效。
public static void printThatFollowPattern(String text, String pattern) {
int i = 0;
while (i < text.length()) {
int indexOfNextPatternStart = text.indexOf(pattern, i);
int indexOfCharAfterPattern = indexOfNextPatternStart + pattern.length();
if (indexOfCharAfterPattern < text.length()) {
char charAfterPattern = text.charAt(indexOfCharAfterPattern);
System.out.println("charAfterPattern: " + charAfterPattern);
} else {
break;
}
i = indexOfCharAfterPattern + 1;
}
}