Pattern Matcher获取ArrayIndexOutOfBoundsException:0

时间:2015-03-07 07:46:48

标签: java junit pattern-matching indexoutofboundsexception

以下是我尝试做的伪代码:

procedure naive(T, P):
result = { }
for s = 0 to n – m
    match = true
    for j = 0 to m – 1
        if T[s+j] ≠ P[j]
            match = false
    if match
        result = result + {s}

这是我写的:

public class naivepatternmatcher {
    public static Integer[] main(char[] T, char[] P) {
        Integer[] results = {};
        int count = 0;
        boolean match;
        for (int s = 0; s <= (T.length - P.length); s++) {
            match = true;
            for (int j = 0; j <= P.length - 1; j++) {
                if (T[s + j] != P[j]) {
                    match = false;
                }
            }
            if (match == true) {
                results[count] = s;
                count++;
            }
        }
        return results;
    }
}

当我尝试运行我的Junit测试类时,我得到一个ArrayIndexOutOfBoundsException:0 at&#34; results [count] = s;&#34;在我的主要和&#34; Integer [] results = naivepatternmatcher.main(Sequence,Pattern1);&#34;在我的Junit测试中。

public class naivepatternmatcherTest {

private static final char[] Sequence = new char[] { 'a', 'b', 'a', 'a', 'a',
        'b', 'a', 'c', 'c', 'c', 'a', 'a', 'b', 'b', 'a', 'c', 'c', 'a', 'a',
        'b', 'a', 'b', 'a', 'c', 'a', 'a', 'b', 'a', 'b', 'a', 'a', 'c' };

@Test
public void test() {
    char[] Pattern1 = new char[] { 'a', 'a', 'b' };
    Integer[] ShouldEqual = new Integer[] { 3, 10, 17, 24 };
    Integer[] results = naivepatternmatcher.main(Sequence, Pattern1);
    assertArrayEquals(ShouldEqual, results);
}
}

任何人都可以解决这个问题并解释我缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

您的results是一个空数组,其大小固定为0,结果[count] = s不会将数组的大小增加1,并将s的值附加到其中。最好使用ArrayList来获得这种动态增长的结果。

另一个建议是,如果因为break T[s + j] != P[j]没有必要进一步搜索模式的其余部分,则在内部for循环的末尾添加对if (T[s + j] != P[j]) { match = false; break } 的调用。

Integer[]

请参阅以下代码,以获取实现示例,该示例可使您的返回类型保持ArrayList,并且仅在内部使用public static Integer[] main(char[] T, char[] P) { List<Integer> results = new ArrayList<>(); boolean match; for (int s = 0; s <= (T.length - P.length); s++) { match = true; for (int j = 0; j <= P.length - 1; j++) { if (T[s + j] != P[j]) { match = false; break; } } if (match == true) { results.add(s); } } return results.toArray(new Integer[results.size()]); }

{{1}}

See it run live