gpt4 book ai didi

java - 在循环中查找字符串时出现模式问题

转载 作者:行者123 更新时间:2023-12-01 13:34:23 25 4
gpt4 key购买 nike

在这种情况下,我的 getCount() 方法应该返回 2,但它返回 7。我认为它计数不正确的原因是因为它循环了 for 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;
}
}

这是我的输出:

A count: 1
C count: 0
G count: 4
T count: 2
Strand: AGGTTGG
Strand length: 7
Pattern Count: 7

最佳答案

注意您的 for 循环:

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

如果 pattern 存在于 passedStrand 中,则它将始终为 true。它实际上并不依赖于循环的任何部分。由于循环运行 passedStrand.length() 次,因此该条件将被检查多次。并且每次,由于它为 truepatternCount 都会递增。因此 patternCount 的最终值将是 passedStrand.length();

您想要做的是,从每个索引开始,检查下一个 pattern.length() 个字符,组成一个等于 pattern 的字符串。如果是,则增加 patternCount。因此,您需要在此处使用 substring 方法:

int patternLen = pattern.length();

for (int i = 0; i < passedStrand.length() - patternLen + 1; i++) {
if (passedStrand.substring(i, i + patternLen).equals(pattern)) {
patternCount++;
}
}

另请注意,循环直到 passedStrand 字符串末尾才会真正运行。你只需要运行到索引处,从那里有可能完全出现pattern字符串。

<小时/>

由于 substring 调用,此方法在 for 循环内创建额外的 String 对象。您可以使用 String#indexOf 方法来避免这种情况。您只需继续在 passedStrand 中查找 pattern 的下一个 index,直到获得 index-1,结束处。

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;
}

关于java - 在循环中查找字符串时出现模式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com