我正在尝试编写一个代码来确定DNA序列的两个输入是否是反向恭维。程序要求用户将序列作为字符串提供。
我已经正确执行了代码,但是如果字符都是'A''T''C'或'G',我想写一个继续程序的if
语句。
这是我自己提出的,但它不起作用,甚至看起来都不是很接近。我是这门语言的新手,来自ADA,我很难过任何帮助都会很棒。
if ( seqFirst.charAt(i) != 'A' || seqFirst.charAt(i) != 'T' ||
seqFirst.charAt(i) != 'C' || seqFirst.charAt(i) != 'G' ||
seqSecond.charAt(i) != 'A' || seqSecond.charAt(i) != 'T' ||
seqSecond.charAt(i) != 'C' || seqSecond.charAt(i) != 'G' )
答案 0 :(得分:0)
您只需在整个条件表达式中将||
更改为&&
。
通过解释,请考虑代码的简化版本:
if (c != 'A' || c != 'T' ) { // IS BAD }
并考虑c
为'A'
的情况。第一个谓词的计算结果为false
。第二个谓词的计算结果为true
。整个表达式为false || true
... true
..." BAD"
现在将||
更改为&&
,然后获得false && true
...这是false
..." NOT BAD"
我是该语言的新手,来自ADA ......
这不是真正的问题。问题是理解布尔代数是如何工作的;即DeMorgan's Laws。
答案 1 :(得分:0)
我看到了可能的De Morgan法律问题。记住!(a或b)=!a和!b。
答案 2 :(得分:0)
据我所知,当其中一个与另一个相等时,2个DNA串是反向恭维,但是反转并且核苷酸改变了。由于我不知道您的Java版本,我在Java7中编写了一些可读的方法:
public static boolean isComplimentaryReverse(String str1, String str2) {
//invalid input, could throw exception
if (str1.length() != str2.length()) {
return false;
}
//could be static final field
Map<Character, Character> replaceTable = new HashMap<>();
replaceTable.put('G', 'C');
replaceTable.put('C', 'G');
replaceTable.put('T', 'A');
replaceTable.put('A', 'T');
String reverseStr1 = new StringBuilder(str1).reverse().toString();
for (int i = 0; i < str2.length(); i++) {
//invalid input, could throw exception
if (!replaceTable.containsKey(reverseStr1.charAt(i))) {
return false;
}
if (str2.charAt(i) != replaceTable.get(reverseStr1.charAt(i))) {
return false;
}
}
return true;
}
答案 3 :(得分:0)
使用正则表达式简化。
private static final String VALID_DNA = "[ATCG]+";
...
if (seqFirst.matches(VALID_DNA) && seqSecond.matches(VALID_DNA)) {
// keep going...
}