Hi,
ich habe die Aufgabe, mittels dem Vergleich von Strings zwei DNA Sequenzen zu vergleichen und anschließend zu sagen, ob eine Sequens passt (also A=T, T=A, C=G, G=C) und wenn ja, anzugeben, wo die erste Bindung möglich ist.
Meine Idee ist für jeden String ein Array anzulegen und das Vergleichsarray mit einer For - Schleife mit dem größeren Array zu vergleichen. Kommt es zu keiner Bindung, fülle ich das Vergleichsarray von vorne auf, damit es nach rechts "rückt", wo die nächste Bindung gecheckt wird. Soweit zur Theorie.
Hier der Code dazu:
Ich konnte mittels debugging noch keinen Fehler finden, aber der Test sagt mir, dass ich falsche Werte ausgebe. Ein Vergleich sollte z.B. 0 returnen, bei mir kam 5 raus. Siet einer von euch vielleicht den Fehler?
ich habe die Aufgabe, mittels dem Vergleich von Strings zwei DNA Sequenzen zu vergleichen und anschließend zu sagen, ob eine Sequens passt (also A=T, T=A, C=G, G=C) und wenn ja, anzugeben, wo die erste Bindung möglich ist.
Meine Idee ist für jeden String ein Array anzulegen und das Vergleichsarray mit einer For - Schleife mit dem größeren Array zu vergleichen. Kommt es zu keiner Bindung, fülle ich das Vergleichsarray von vorne auf, damit es nach rechts "rückt", wo die nächste Bindung gecheckt wird. Soweit zur Theorie.
Hier der Code dazu:
Java:
package programming.set10.dna;
public class DNAMatcher {
static String baseTwo = "";
static int p = 0;
public DNAMatcher(String base) {
if (base == "" || base == null) {
throw new IllegalArgumentException("base is not a valid DNA String");
}
base.toUpperCase();
char[] dnaInChars = base.toCharArray();
for (int i = 0; i < dnaInChars.length; i++) {
if (dnaInChars[i] != 'A' && dnaInChars[i] != 'T' && dnaInChars[i] != 'C' && dnaInChars[i] != 'G') {
throw new IllegalArgumentException("base is not a valid DNA String");
}
}
DNAMatcher.baseTwo = base;
return;
}
/**
* Returns the index of the first position in the base DNA string where
* candidateDNA can bind, if any.
*
* @param candidateDNA
* the DNA string to try to bind to the base DNA.
* @return index of the first binding position or {@code -1} if the candidate
* DNA string cannot bind to the base string.
* @throws IllegalArgumentException
* if {@code candidateDNA} is {@code null}, empty, or contains
* characters other than A, C, G, and T.
*/
public int findFirstBindingPosition(String candidateDNA) {
if (candidateDNA == "" || candidateDNA == null) {
throw new IllegalArgumentException("base is not a valid DNA String");
}
candidateDNA.toUpperCase();
char[] dnaInChars = candidateDNA.toCharArray();
for (int i = 0; i < dnaInChars.length; i++) {
if (dnaInChars[i] != 'A' && dnaInChars[i] != 'T' && dnaInChars[i] != 'C' && dnaInChars[i] != 'G') {
throw new IllegalArgumentException("base is not a valid DNA String");
}
}
Character tester = 'X';
char[] baseInChars = baseTwo.toCharArray();
for (int j = 0; j <= baseInChars.length; j++) {
if (j > 0) {
candidateDNA = tester + candidateDNA;
}
char[] candidateArray = candidateDNA.toCharArray();
if (baseInChars.length == candidateArray.length - 1) {
break;
} else {
if (candidateArray[j] == 'X') {
continue;
} else {
for (int z = j; z < candidateArray.length; z++) {
if (matcher(baseInChars[z], candidateArray[z])) {
DNAMatcher.p = j;
} else if (matcher(baseInChars[z], candidateArray[z]) == false) {
continue;
}
}
}
}
}
return p;
}
private boolean matcher(Character matchOne, Character matchTwo) {
if (matchOne == 'A' && matchTwo == 'T') {
return true;
} else if (matchOne == 'T' && matchTwo == 'A') {
return true;
} else if (matchOne == 'C' && matchTwo == 'G') {
return true;
} else if (matchOne == 'G' && matchTwo == 'C') {
return true;
}
return false;
}
}
Ich konnte mittels debugging noch keinen Fehler finden, aber der Test sagt mir, dass ich falsche Werte ausgebe. Ein Vergleich sollte z.B. 0 returnen, bei mir kam 5 raus. Siet einer von euch vielleicht den Fehler?