当没有匹配时陷入循环 - Java

时间:2015-11-10 15:54:56

标签: java loops for-loop while-loop matching

所以在这里,我坚持使用我的程序,这是一个简单的事情。所以基本上在搜索metod是我有3个变量,你可以看到,Char P char T和List pos。在方法下面你可以看到有一个Main,它表示char P,char T有什么值,我的想法是创建一个匹配的程序,我在其中输入一个值P并查看char T中是否有相同的值。它发现了,它应该继续,直到价值完成。所以在找到结果后的main方法中,它应该给你设置值的位置索引。

现在的问题是,如果我给出一个正确的值示例P = abc T = abcqweqweabc它会给我一个正确的,但是如果我做abcqweqweqwe它会一直循环并且永远不会结束这会杀死我的处理器和ram (呵呵)我一直想弄明白,但我找不到问题。它似乎应该工作,我不明白为什么它喜欢它。

public class StringSearch {
    public static void search(char[] P, char[] T, List<Integer> pos) {
        int i = 0;
        int j;
        while(i!=P.length){ 
            for (j= 0; j<T.length; j++){ 
                if(P[i] == T[j]) { 
                    i++;
                    if(i == P.length) { 
                        pos.add((j-(P.length-1)));
                        i = 0; 
                        if(j==T.length-1) { 
                            i = P.length;
                        }
                    }
                }
                else {
                    i = 0;
            }
        }
    }

    public static void main(String[] args) {
        ArrayList<Integer> where = new ArrayList<Integer>();
        search("abcx".toCharArray(), "abcdabcxxabctx".toCharArray(), where);
        for (int i : where) {
            System.out.println(i); 
        }
    }
}

还请!如果你需要知道一些事情。只是评论,我可能会在一分钟内回答你!随时问问题!

编辑:为了给出我正在尝试做的确切含义,我们的字符T是“文本”的位置,字符P是我想要匹配P和T的字母。所以每当我们找到char P和T之间的正确匹配,它应该添加到我们称为pos的列表中。稍后会给我们一个结果,在索引中匹配是相同的。比如T = qweabcqwe和P = abc。它应该给我们一个4的结果。所以我要做的是看看这两者之间是否存在匹配,并且位置中的位置是否相同,如果存在,则放入列表然后循环在主要方法将告诉我们在哪里。

编辑第2.3部分:

public static void search(char[] P, char[] T, List<Integer> pos) {

            for (int i=0;i<=T.length-P.length;) { 
                if (T[i] == P[0]) {
                    boolean match=true;
                    for (int j=0;j<P.length;j++) {
                        if (T[i+j] != P[j]) {
                            match = false;
                            break;
                        }
                    }
                    if (match) {
                        pos.add(i);
                        i = P.length -1;

                    }
                }
            }
        }

        public static void main(String[] args) {
            ArrayList<Integer> where = new ArrayList<Integer>();
            search("abcx".toCharArray(), "abcdabcxxabctx".toCharArray(), where);
            for (int i : where) {
                System.out.println(i); 
            }
        }
    }

3 个答案:

答案 0 :(得分:0)

如果甚至有一个案例

if(P[i] != T[j])

然后你将我设为0

else {
  i = 0;

你陷入了while循环

但基本上你要做的是给你与indexOf()

相同的结果

试试这个:

String Str = new String("qweabcqwe");
String SubStr1 = new String("abc");

System.out.println( Str.indexOf( SubStr1 )); // will print 3

答案 1 :(得分:0)

如果你想自己实现它,你可能想在这里使用Java详细检查KMP算法的解释:http://tekmarathon.com/2013/05/14/algorithm-to-find-substring-in-a-string-kmp-algorithm/

答案 2 :(得分:0)

要查找每个数组中相同位置的每个字符的索引,只需执行以下操作:

for (int i=0;i<P.length && i<T.length;i++) {
   if (P[i] == T[i]) {
       pos.add(i);
   }
}

您只需要一个循环,因为您只比较一个值。

如果你想找到子串的位置,那么你需要一个嵌套循环,但它仍然可以是一个简单的for循环。

for (int i=0;i<=P.length-T.length;i++) { // Can stop when we get to within T length of the end of P
   if (P[i] == T[0]) {
       boolean match=true;
       for (j=0;j<T.length;j++) {
          if (P[i+j] != T[j]) {
             match = false;
             break;
          }
       }
       if (match) {
           pos.add(i);
           // You might want to add T.length-1 to i here to cause it to skip, it depends if you want to find overlapping results or not. (i.e. searching for bobob in bobobob.
       }
   }
}