我的目标是在给定模式添加到数组列表后获取字符。我的问题是,使用此代码我得到了一个错误。它超过了文本的长度。
public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern)
{
ArrayList<Character> charAfterPattern = new ArrayList<Character>();
int patternLength = pattern.length();
int i = 0;
while (i < text.length())
{
charAfterPattern.add(text.charAt(text.indexOf(pattern, i) + patternLength));
i = i + text.indexOf(pattern, i) + patternLength;
}
return charAfterPattern;
}
答案 0 :(得分:0)
我可以看到您的代码存在三个主要问题。
前两个与indexOf()
的运作方式有关。
-1
。你不允许这种情况,因此处理字符串的某些部分两次。i = i + text.indexOf(...
,而是i = text.indexOf(...
。第三个问题是你没有正确处理模式在文本末尾的情况,即。没有下一个角色。
这是基于你的粗略解决方案:
public static List<Character> getCharsThatFollowPattern (String text, String pattern)
{
List<Character> charAfterPattern = new ArrayList<Character>();
int patternLength = pattern.length();
int i = 0;
while (i < text.length())
{
int index;
if ((index = text.indexOf(pattern, i)) < 0) // Check pattern is present
break;
i = index + patternLength;
if (i < text.length()) // Check there is a next character
{
charAfterPattern.add(text.charAt(i));
}
}
return charAfterPattern;
}
基础测试:
("abc", "ab") => [ 'c' ]
("abcabdabe", "ab") => [ 'c', 'd', 'e' ]
("abcabdab", "ab") => [ 'c', 'd' ]
("ababdab", "ab") => [ 'a', 'd' ]
答案 1 :(得分:0)
这是一个使用更合适的返回类型String
:
public static String getCharsThatFollowPattern(String text, String pattern) {
return text.replaceAll(".*?" + pattern + "(.)(.(?!" + pattern + "))*", "$1");
}
如果你拼命,绝对必须有List<Character>
,请将上述内容改为该类型:
public static List<Character> getCharsThatFollowPattern(String text, String pattern) {
return text.replaceAll(".*?" + pattern + "(.)(.(?!" + pattern + "))*", "$1")
.chars().mapToObj(i -> (char) i).collect(Collectors.toList());
}
另请注意,您应始终对方法API使用最抽象的类型,即List<Character>
而不是ArrayList<Character>
。请参阅Liskov substitution principle。