我无法弄清楚为什么我的if语句有效

时间:2016-04-30 03:12:16

标签: java string if-statement for-loop

所以如果序列1:CAG和序列2:AG,我应该得到答复

"Best alignment score :2 CAG AG"

但我得到了

"Best alignment score :0 CAG AG"

我认为我的问题出现在第二个if语句中,就像调试器的情况一样。

使用调试器时,它显示计算机没有进入if语句。

public static int allignment (String dnaSequence1 , String dnaSequence2 /*,int offset*/){
    int newScore = 0;
    int bestScore = 0;
    int newOffset = 0;
    int bestOffset = 0;

    for(int offset =0; offset<=(dnaSequence1.length()-dnaSequence2.length());offset++){
        //newOffset ++;
        newScore = 0;
        for(int place =0; place<dnaSequence2.length();place++ ){
            if(dnaSequence1.charAt(place) == dnaSequence2.charAt(place/*+offset*/)){

                newScore ++;
                if(newScore>bestScore){
                    bestScore = newScore;
                    bestOffset = newOffset;

                }
            }else{ continue;}
        }
        newOffset ++;
    }

    String space = " ";
    System.out.println("Best alignment score :"+bestScore);
    System.out.println(dnaSequence1);
    System.out.print( space(bestOffset) + dnaSequence2);

    int alignmentScore = dnaSequence1.compareToIgnoreCase(dnaSequence2);

    return alignmentScore;
}

public static String space (int bestOffset){
    String space = " ";
    String offsetScaces = "";

    for(int i = 0; i<bestOffset; i++){
        offsetScaces+=space;
        return offsetScaces;
    }
    return offsetScaces;
}

1 个答案:

答案 0 :(得分:1)

您的版本对两个字符串使用相同的索引。因此它检查sequence1('C')中索引0处的核苷酸是否匹配sequence2('A')中索引0处的核苷酸,然后它递增索引并检查索引处的核苷酸是否为1 in sequence1('A')匹配sequence2('G')中索引1处的核苷酸,然后它停止而没有找到匹配。

012
CAG
AG

从上面的例子可以看出,第一个字符串中的字符在任何时候都与第二个字符串相同(0:C / A,1:A / G,2:G / null)

令我印象深刻的是,你可能正在寻找与dnaSequence1中的某个东西对齐的最长的dnaSequence2,而不仅仅是从索引0开始的最长的一段。

该版本试图在第一个序列中找到整个第二个序列,如果不能,则从第二个序列的末尾修剪1个核苷酸并再次尝试。一旦它将第二个序列修剪为空,它将从整个第二个序列开始,并从开始修剪1个核苷酸并重复该过程(如果找到匹配则停止)

public static int allignment(String dnaSequence1, String dnaSequence2 /*,int offset*/) {
    int bestScore = -1;
    int bestOffset = 0;
    String bestSequence = null;

    for(String tempSequence = dnaSequence2; tempSequence.length() > 0; tempSequence = tempSequence.substring(1)) {
        for(String match = tempSequence; match.length() > 0; match = match.substring(0, match.length() - 1)) {
            int matchIndex;
            if (-1 != (matchIndex = dnaSequence1.indexOf(match))) {
                if (match.length() > bestScore) {
                    bestOffset = matchIndex;
                    bestScore = match.length() ;
                    bestSequence = match;
                    break;
                }
            }
        }
        if (null != bestSequence && bestScore > tempSequence.length()) {
            break; // don't bother checking any shorter sequences, we already have a better match
        }
    }

    if (null != bestSequence) {
        System.out.println("Best alignment score :" + bestScore);
        System.out.println(dnaSequence1);
        System.out.print(space(bestOffset) + bestSequence);
    } else {
        System.out.print(dnaSequence1+" and "+dnaSequence2+" cannot be aligned");
    }

    int alignmentScore = dnaSequence1.compareToIgnoreCase(dnaSequence2);

    return alignmentScore;
}

public static String space(int bestOffset) {
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < bestOffset; i++) {
        builder.append(" ");
    }
    return builder.toString();
}