Java 我想在字符串中每出现一个模式之后将该字符添加到一个字符数组列表中

Java 我想在字符串中每出现一个模式之后将该字符添加到一个字符数组列表中,java,arraylist,character,Java,Arraylist,Character,我的目标是将给定模式后的字符添加到数组列表中。我的问题是,使用这段代码,我得到了一个错误。它超过了文本的长度 public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern) { ArrayList<Character> charAfterPattern = new ArrayList<Character>(); int

我的目标是将给定模式后的字符添加到数组列表中。我的问题是,使用这段代码,我得到了一个错误。它超过了文本的长度

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;
} 
公共静态ArrayList getCharsThatFollowPattern(字符串文本,字符串模式)
{
ArrayList charAfterPattern=新的ArrayList();
int patternLength=pattern.length();
int i=0;
而(i
我发现您的代码存在三个主要问题

前两个与
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;
}

下面是一个简单的解决方案,它使用了更合适的返回类型
String

public static String getCharsThatFollowPattern(String text, String pattern) {
    return text.replaceAll(".*?" + pattern + "(.)(.(?!" + pattern + "))*", "$1");
}
如果您迫切需要一个
列表
,请将上述内容转换为该类型:

public static List<Character> getCharsThatFollowPattern(String text, String pattern) {
    return text.replaceAll(".*?" + pattern + "(.)(.(?!" + pattern + "))*", "$1")
        .chars().mapToObj(i -> (char) i).collect(Collectors.toList());
}
公共静态列表getCharsThatFollowPattern(字符串文本,字符串模式){
返回文本.replaceAll(“.*?”+pattern+”()(((?!“+pattern+”)))、“$1”)
.chars().mapToObj(i->(char)i).collect(collector.toList());
}

还要注意的是,对于方法API,您应该始终使用最抽象的类型,即
List
而不是
ArrayList
。请参见。

您会遇到什么错误?顺便说一句,如果您在调试器中逐步检查代码,您可能会自己找到它。您实际上在尝试做什么?通常会处理
ArrayList
n一个简单的
字符串
(或者最坏的情况下是
StringBuilder
)基本上做了相同的事情。我得到了IndexOutOfBoundsException:字符串索引超出范围:7我试图在模式的每次出现后添加所有字符。例如,如果我有text=“abcabdabe”并且模式是“ab”,它应该返回['c','d','e']对于你的方法和我的原始示例,它仍然只返回['b','b'],而不是['b','b']。这是学校用的,所以它确实需要是数组。对不起,不是我的原始示例。我需要它通过的测试是“abababababa”,“aba”,它返回['b','b']@evan你确定它应该返回['b']?换句话说,匹配时是否需要重复使用输入?是的。因此字符串“abababa”中的第二个a算作模式的结束和开始。然后我将使用
Matcher
public static List<Character> getCharsThatFollowPattern(String text, String pattern) {
    return text.replaceAll(".*?" + pattern + "(.)(.(?!" + pattern + "))*", "$1")
        .chars().mapToObj(i -> (char) i).collect(Collectors.toList());
}