如何创建一个方法来检查字符串中的模式并使用ArrayList返回模式后的字符? (说明中提示)

时间:2017-09-26 18:23:13

标签: java arraylist

方法名称 - getCharsThatFollowPattern

提示及其应该做的事情。将String文本和String模式作为参数,并返回一个ArrayList。返回的列表应包含文本中每个非尾部出现的字符。 (模式的非尾部出现是不在文本末尾的模式。)列表的长度必须与模式的非尾部出现次数相同。存储在列表的索引n处的字符必须是模式的第n个非尾部出现之后的字符。例如,getCharsThatFollowPattern(“abcabdabcab”,“ab”)应该返回ArrayList ['c','d','c']。

我的代码如下,以及结果。

public static ArrayList<Character> getCharsThatFollowPattern (String text, String pattern)
{

    ArrayList<Character> character = new ArrayList<>();

    // String str = text;
    // String findStr = pattern;
    int lastIndex = 0;

    while (lastIndex != -1) {

        lastIndex = text.indexOf(pattern, lastIndex);

        if (lastIndex != -1) {


            lastIndex += pattern.length();
            char c = text.charAt(text.lastIndexOf(pattern) - 1);


            character.add(c);
            }
        }



    return character;
}

代码的结果如下。

 getCharsThatFollowPattern("abcabdabcab", "ab") returns [c,c,c,c];

- 这是错误的。

 getCharsThatFollowPattern("abababa", "aba") returns [b, b]; 

- 这是它应该做的。

我的老师为我提供了一个有效的测试用例但是当我自己测试它时它不起作用。

@Test
public void testGetCharsThatFollowPattern ()
{
    ArrayList<Character> list = new ArrayList<Character>();
    list.add('b');
    list.add('b');
    assertEquals(list, 
          PS5Library.getCharsThatFollowPattern("abababa", "aba"));
  }

}

我一直在清理堆栈溢出,无法找到我的问题的答案。任何有关如何解决这个问题的见解都会很棒。感谢你们。

2 个答案:

答案 0 :(得分:1)

我认为你只是有一个小的数学错误,只需要更改指定c的行:

app:tint

答案 1 :(得分:1)

您已接受答案,但您始终添加c的原因如下:

char c = text.charAt(text.lastIndexOf(pattern) - 1);

您总是在最后一次出现模式后查找该字符。 StringIndexOutOfBoundsException导致文本以没有后续字符的模式结束。索引本身是零索引的,因此charAt(5)尝试访问五个字符长文本的第6个字符。

您可以忽略该异常或使用索引检查文本的长度,仅在charAt(index)时调用index < text.length()。后者可以防止不必要的例外创作,也可以改善它的风格; - )