Java 比较字符串的逻辑不正确?
这个程序应该比较“DNA”字符串 输入:Java 比较字符串的逻辑不正确?,java,regex,for-loop,boolean,logic,Java,Regex,For Loop,Boolean,Logic,这个程序应该比较“DNA”字符串 输入: 3 ATGC TACG ATGC CGTA AGQ TCF 第一行表示程序将运行多少次。每次运行时,它都会比较两个字符串。A与T匹配,反之亦然。G与C匹配,反之亦然。因此,如果字符串1的第一个字母是A,那么字符串2的第一个字母应该是T。如果下一个字母是T,那么另一个字符串上的下一个字母应该是A等等。如果出现A、T、G或C以外的字母,那么这是一个坏样本。如果不好,打印出来不好,如果好,打印出来好。我尝试了许多不同的组合,它们都很好,但根据法官的测试数据(它
3
ATGC
TACG
ATGC
CGTA
AGQ
TCF 第一行表示程序将运行多少次。每次运行时,它都会比较两个字符串。A与T匹配,反之亦然。G与C匹配,反之亦然。因此,如果字符串1的第一个字母是A,那么字符串2的第一个字母应该是T。如果下一个字母是T,那么另一个字符串上的下一个字母应该是A等等。如果出现A、T、G或C以外的字母,那么这是一个坏样本。如果不好,打印出来不好,如果好,打印出来好。我尝试了许多不同的组合,它们都很好,但根据法官的测试数据(它们有不同的输入),失败了。有人认为这有什么不对吗?我知道这可能不是完成工作的最有效方式,但至少据我所知,确实如此 输出:
好的
坏的
坏的
公共类DNA
{
公共静态void main(字符串[]args)引发IOException
{
扫描仪扫描=新扫描仪(新文件(“dna.dat”);
int T=scan.nextInt();
scan.nextLine();
布尔有效=真;
for(int i=0;i
我添加了toUpperCase并比较了长度相等的字符串,最后一次尝试是查看它们的数据是否有一些小写字母或不同长度的字符串,尽管它们都应该是相同长度和大写字母。尽管如此,该程序仍因“未通过法官测试数据”而被拒绝。全部更改
&&
在
到
如果有,则不是所有字符都是A、T、G或C以外的字符,然后退出循环。当
valid=false
时,第二个for循环需要中断。例如,如果字符1、2、3是错误的,但是#4是匹配项,那么您仍然会得到有效的结果
我会将字符串转换为数组,以简化操作:
for (int i = 0; i < T; i++)
{
boolean valid = true;
String strand1 = scan.nextLine();
strand1 = strand1.toUpperCase();
String strand2 = scan.nextLine();
strand2 = strand2.toUpperCase();
if ( strand1.length() != strand2.length())
{
valid = false;
}
if (valid) {
char[] c1 = strand1.toCharArray();
char[] c2 = strand2.toCharArray();
for (int p = 0; p < c1.length; p++)
{
if (-1 == "ACTG".indexOf(c1[p]) || -1 == "ACTG".indexOf(c2[p]))
{
valid = false;
break;
}
}
if (valid)
{
for (int p = 0; p < c1.length; p++)
{
if (('A' == c1[p] && 'T' != c2[p]) ||
('T' == c1[p] && 'A' != c2[p]) ||
('C' == c1[p] && 'G' != c2[p]) ||
('G' == c1[p] && 'C' != c2[p])) {
valid = false;
break;
}
}
}
}
if (valid)
System.out.println("GOOD");
else
System.out.println("BAD");
}
for(int i=0;i
如果我将其更改为| |,那么即使它为真,也不会使其为假吗?例如,如果我们有ACG,它将不满足第一个条件strand1。charAt(p)!='因此,这是错误的。如果为&,则检查所有字符是否都是A、C、G或T。如果它们不是全部是A、C、G或T,则布尔值设置为false,但如果它们都是false,则保持为true,并继续执行程序的其余部分。
if (strand1.charAt(p) != 'A' && strand1.charAt(p) != 'T' && strand1.charAt(p) != 'G' && strand1.charAt(p) != 'C' && strand2.charAt(p) != 'A' && strand2.charAt(p) != 'T' && strand2.charAt(p) != 'G' && strand2.charAt(p) != 'C')
||
for (int i = 0; i < T; i++)
{
boolean valid = true;
String strand1 = scan.nextLine();
strand1 = strand1.toUpperCase();
String strand2 = scan.nextLine();
strand2 = strand2.toUpperCase();
if ( strand1.length() != strand2.length())
{
valid = false;
}
if (valid) {
char[] c1 = strand1.toCharArray();
char[] c2 = strand2.toCharArray();
for (int p = 0; p < c1.length; p++)
{
if (-1 == "ACTG".indexOf(c1[p]) || -1 == "ACTG".indexOf(c2[p]))
{
valid = false;
break;
}
}
if (valid)
{
for (int p = 0; p < c1.length; p++)
{
if (('A' == c1[p] && 'T' != c2[p]) ||
('T' == c1[p] && 'A' != c2[p]) ||
('C' == c1[p] && 'G' != c2[p]) ||
('G' == c1[p] && 'C' != c2[p])) {
valid = false;
break;
}
}
}
}
if (valid)
System.out.println("GOOD");
else
System.out.println("BAD");
}