Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在循环中查找字符串时遇到问题_Java - Fatal编程技术网

Java 在循环中查找字符串时遇到问题

Java 在循环中查找字符串时遇到问题,java,Java,在本例中,我的getCount()方法应该返回2,但它返回7。我认为它计数不正确的原因是因为它循环了7次,因为这是字符串的长度。但是,我只想扫描字符串中的模式,并在每次扫描字符串中出现模式时将patternCount增加1。这是我的密码: package a2; public class DNAStrandAdept { private String strand; private String pattern; private String passedStrand

在本例中,我的getCount()方法应该返回2,但它返回7。我认为它计数不正确的原因是因为它循环了7次,因为这是字符串的长度。但是,我只想扫描字符串中的模式,并在每次扫描字符串中出现模式时将patternCount增加1。这是我的密码:

package a2;

public class DNAStrandAdept {

    private String strand;
    private String pattern;
    private String passedStrand;
    private int ACount;
    private int CCount;
    private int GCount;
    private int TCount;
    private int patternCount = 0;

    public static void main(String[] args) {
        DNAStrandAdept test = new DNAStrandAdept("AGGTTGG");
        System.out.println("A count: " + test.getACount());
        System.out.println("C count: " + test.getCCount());
        System.out.println("G count: " + test.getGCount());
        System.out.println("T count: " + test.getTCount());
        System.out.println("Strand: " + test.getStrandString());
        System.out.println("Strand length: " + test.getLength());
        System.out.println("Pattern Count: " + test.getCount("GG"));

    }

    public DNAStrandAdept(String strand) {
        passedStrand = strand;
        if (passedStrand.contains("a") || passedStrand.contains("c")
                || passedStrand.contains("g") || passedStrand.contains("t")) {
            throw new RuntimeException("Illegal DNA strand");
        } else if (passedStrand.contains("1") || passedStrand.contains("2")
                || passedStrand.contains("3") || passedStrand.contains("4")
                || passedStrand.contains("5") || passedStrand.contains("6")
                || passedStrand.contains("7") || passedStrand.contains("8")
                || passedStrand.contains("9") || passedStrand.contains("0")) {
            throw new RuntimeException("Illegal DNA Strand");
        } else if (passedStrand.contains(",") || passedStrand.contains(".")
                || passedStrand.contains("?") || passedStrand.contains("/")
                || passedStrand.contains("<") || passedStrand.contains(">")) {
            throw new RuntimeException("Illegal DNA Strand");
        }
    }

    public int getACount() {
        for (int i = 0; i < passedStrand.length(); i++) {
            if (passedStrand.charAt(i) == 'A') {
                ACount++;
            }

        }
        return ACount;
    }

    public int getCCount() {
        for (int i = 0; i < passedStrand.length(); i++) {
            if (passedStrand.charAt(i) == 'C') {
                CCount++;
            }

        }
        return CCount;
    }

    public int getGCount() {
        for (int i = 0; i < passedStrand.length(); i++) {
            if (passedStrand.charAt(i) == 'G') {
                GCount++;
            }

        }
        return GCount;
    }

    public int getTCount() {
        for (int i = 0; i < passedStrand.length(); i++) {
            if (passedStrand.charAt(i) == 'T') {
                TCount++;
            }
        }
        return TCount;
    }

    public String getStrandString() {
        return passedStrand;
    }

    public int getLength() {
        return passedStrand.length();
    }

    public int getCount(String pattern) {

        for (int i = 0; i < passedStrand.length(); i++) {
            if (passedStrand.contains(pattern)) {
                patternCount++;
            }
        }

        return patternCount;
    }

    public int findPattern(String pattern, int startIndex) {
        return 0;
    }
}

注意你的
for
循环:

for (int i = 0; i < passedStrand.length(); i++) {
        if (passedStrand.contains(pattern)) {
            patternCount++;
        }
    }
还要注意,循环直到
passedStrand
string的末尾才会真正运行。您只需要运行到索引,从那里有可能完全出现
模式
字符串


由于
子字符串
调用,此方法在
for
循环中创建额外的
字符串
对象。您可以通过使用
String#indexOf
方法来避免这种情况。您只需继续在
passedStrand
中查找
模式的下一个
索引
,直到您将
索引
作为
-1
,在那里结束

int startIndex = passedStrand.indexOf(pattern);

while (startIndex != -1) {
    patternCount++;
    startIndex = passedStrand.indexOf(pattern, startIndex + pattern.length());
}

如果效率不是一个大问题,那么regex真的很好。看看如何:

public int getCount(String pattern) {
    int patternCount = 0;

    Matcher matcher = Pattern.compile(pattern).matcher(passedStrand);

    while (matcher.find()) {
        patternCount++;
    }
    return patternCount;
}

@RohitJain我相信有一种比那简单得多的方法,当然有。刚才与您分享了一个专门为此任务创建的算法。@RohitJain您能帮我找到一个更简单的方法来解决我遇到的问题吗?这个方法很有效,谢谢您的帮助,但逻辑太复杂了。你编写代码的方式令人印象深刻。“我坐在这里试图理解这一切。@user122947更新了上一种方法。有点问题。但现在没事了。您可以这样做,这是一种更好的方法。@user122947添加了另一种基于正则表达式的方法。
int startIndex = passedStrand.indexOf(pattern);

while (startIndex != -1) {
    patternCount++;
    startIndex = passedStrand.indexOf(pattern, startIndex + pattern.length());
}
public int getCount(String pattern) {
    int patternCount = 0;

    Matcher matcher = Pattern.compile(pattern).matcher(passedStrand);

    while (matcher.find()) {
        patternCount++;
    }
    return patternCount;
}