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