在ArrayList中跳过元素?

时间:2016-04-24 13:45:35

标签: java arraylist

我的问题的简短摘要: 我不知道为什么但我的ArrayList中的元素被跳过,因此不会增加它们。

我有以下代码:

public static ArrayList<Integer> match(String S, String T) {
    ArrayList<Integer> ret = new ArrayList<>();
    ArrayList<int[]> I = new ArrayList<>(); // (start, curT)

    for (int i = 0; i < S.length(); i++) {

        for (int j = 0; j < I.size(); j++) { // loop potential matches
            int[] curI = I.get(j);

            curI[1]++;
            System.out.println("SimpleStringMatcher.match: run " + i + " curI[" + j + "]:" + Arrays.toString(curI));
            if (T.charAt(curI[1]) != S.charAt(i)) { // if it doesn't match, remove it
                System.out.println("SimpleStringMatcher.match: run " + i + " T.charAt(" + curI[1] + ")[" + T.charAt(curI[1]) + "] != S.charAt(" + i + ")[" + S.charAt(i) + "]");
                I.remove(j);
            } else if (curI[1] == T.length() - 1) { // if cur pos of the potential match equals the n(T) its a match
                I.remove(j);
                ret.add(curI[0]);
            }
        }

        if (S.charAt(i) == T.charAt(0)) { // add new potential match
            if (T.length() > 1) { // if n(T) equals 1, it's a match
                I.add(new int[]{i, 0});
            } else {
                ret.add(i);
            }
        }

        System.out.println("SimpleStringMatcher.match: run " + i + " I:" + getArrString(I) + "; R:" + getArrString(ret));
    }

    return ret;
}

它在字符串S中搜索字符串T,并在ArrayList<Integer>中返回匹配起始位置。

为此,我使用ArrayList<int[]> I,它将潜在候选人存储为一对:(start, curT)start是潜在匹配开始的S中的位置,curT是当前位置int T

现在我的问题;当我执行这样的方法时:

public static void main(String[] args){
    String s = "gagagagagagagagag";
    String t = "gagagag";
    System.out.println("String S: '" + s + "'; T: '" + t + "'; Match: " + SimpleStringMatcher.match(s, t).toString());

}

我得到以下输出:

SimpleStringMatcher.match: run 0 I:{[0, 0]}; R:{}
SimpleStringMatcher.match: run 1 curI[0]:[0, 1]
SimpleStringMatcher.match: run 1 I:{[0, 1]}; R:{}
SimpleStringMatcher.match: run 2 curI[0]:[0, 2]
SimpleStringMatcher.match: run 2 I:{[0, 2];[2, 0]}; R:{}
SimpleStringMatcher.match: run 3 curI[0]:[0, 3]
SimpleStringMatcher.match: run 3 curI[1]:[2, 1]
SimpleStringMatcher.match: run 3 I:{[0, 3];[2, 1]}; R:{}
SimpleStringMatcher.match: run 4 curI[0]:[0, 4]
SimpleStringMatcher.match: run 4 curI[1]:[2, 2]
SimpleStringMatcher.match: run 4 I:{[0, 4];[2, 2];[4, 0]}; R:{}
SimpleStringMatcher.match: run 5 curI[0]:[0, 5]
SimpleStringMatcher.match: run 5 curI[1]:[2, 3]
SimpleStringMatcher.match: run 5 curI[2]:[4, 1]
SimpleStringMatcher.match: run 5 I:{[0, 5];[2, 3];[4, 1]}; R:{}
SimpleStringMatcher.match: run 6 curI[0]:[0, 6]
SimpleStringMatcher.match: run 6 curI[1]:[4, 2]
SimpleStringMatcher.match: run 6 I:{[2, 3];[4, 2];[6, 0]}; R:{0}
SimpleStringMatcher.match: run 7 curI[0]:[2, 4]
SimpleStringMatcher.match: run 7 T.charAt(4)[g] != S.charAt(7)[a]
SimpleStringMatcher.match: run 7 curI[1]:[6, 1]
SimpleStringMatcher.match: run 7 I:{[4, 2];[6, 1]}; R:{0}
SimpleStringMatcher.match: run 8 curI[0]:[4, 3]
SimpleStringMatcher.match: run 8 T.charAt(3)[a] != S.charAt(8)[g]
SimpleStringMatcher.match: run 8 I:{[6, 1];[8, 0]}; R:{0}
SimpleStringMatcher.match: run 9 curI[0]:[6, 2]
SimpleStringMatcher.match: run 9 T.charAt(2)[g] != S.charAt(9)[a]
SimpleStringMatcher.match: run 9 I:{[8, 0]}; R:{0}
SimpleStringMatcher.match: run 10 curI[0]:[8, 1]
SimpleStringMatcher.match: run 10 T.charAt(1)[a] != S.charAt(10)[g]
SimpleStringMatcher.match: run 10 I:{[10, 0]}; R:{0}
SimpleStringMatcher.match: run 11 curI[0]:[10, 1]
SimpleStringMatcher.match: run 11 I:{[10, 1]}; R:{0}
SimpleStringMatcher.match: run 12 curI[0]:[10, 2]
SimpleStringMatcher.match: run 12 I:{[10, 2];[12, 0]}; R:{0}
SimpleStringMatcher.match: run 13 curI[0]:[10, 3]
SimpleStringMatcher.match: run 13 curI[1]:[12, 1]
SimpleStringMatcher.match: run 13 I:{[10, 3];[12, 1]}; R:{0}
SimpleStringMatcher.match: run 14 curI[0]:[10, 4]
SimpleStringMatcher.match: run 14 curI[1]:[12, 2]
SimpleStringMatcher.match: run 14 I:{[10, 4];[12, 2];[14, 0]}; R:{0}
SimpleStringMatcher.match: run 15 curI[0]:[10, 5]
SimpleStringMatcher.match: run 15 curI[1]:[12, 3]
SimpleStringMatcher.match: run 15 curI[2]:[14, 1]
SimpleStringMatcher.match: run 15 I:{[10, 5];[12, 3];[14, 1]}; R:{0}
SimpleStringMatcher.match: run 16 curI[0]:[10, 6]
SimpleStringMatcher.match: run 16 curI[1]:[14, 2]
SimpleStringMatcher.match: run 16 I:{[12, 3];[14, 2];[16, 0]}; R:{0;10}
String S: 'gagagagagagagagag'; T: 'gagagag'; Match: [0, 10]

我的问题理解是从run 6run 10的过程:在我看来它似乎遗漏了I中的一些元素。 不应该输出

SimpleStringMatcher.match: run 6 curI[0]:[0, 6]
SimpleStringMatcher.match: run 6 curI[1]:[2, 4]
SimpleStringMatcher.match: run 6 curI[2]:[4, 2]
SimpleStringMatcher.match: run 6 I:{[2, 4];[4, 2];[6, 0]}; R:{0}

这也会在接下来的4次运行中发生,这样做也会导致curI[1]增加1,从而扭曲整个结果。有没有人知道为什么会这样?

我是一名学生,目前正在尝试了解字符串匹配是如何工作的,所以请不要回答类似于&#39;只需使用X.y()&#39;。

PS:这是我第一次在这里提问,所以请给我反馈我应该做得更好/不同的事情。

PSS:英语不是我的第一语言。希望你们无论如何都能理解它。

0 个答案:

没有答案