我希望在每次出现字符串中的模式后将字符添加到字符的arraylist中

时间:2017-09-27 23:15:49

标签: java arraylist character

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

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;
} 

2 个答案:

答案 0 :(得分:0)

我可以看到您的代码存在三个主要问题。

前两个与indexOf()的运作方式有关。

  • 找不到模式时返回-1。你不允许这种情况,因此处理字符串的某些部分两次。
  • 它返回相对于字符串的 start 的索引,即使您从开头以外的某个地方搜索也是如此。因此,您不应该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