2012-10-18 124 views
-1

我正在尝试构建一个矩阵行和列有值为“aaa”为对齐目的。但是当我运行它我得到一个错误任何人都可以告诉我我要去哪里错了,如何修复it.below是我的代码为什么我是这个错误

 public class compute_matrix { 
static String seq1="aaa"; 
static String seq2="aaa"; 
static int[][] matrix; 
static int max_row; 
static int max_col; 
private static int match_reward=1; 
private static int mismatch_penalty= -1; 
private static int gap_cost= -1; 
private static boolean case_sensitive; 

private static boolean isCaseSensitive() { 
    return case_sensitive; 
} 

private static int max(int ins, int sub, int del, int i) { 
    if (ins > sub) { 
     if (ins > del) { 
      return ins > i? ins : i; 
     } else { 
      return del > i ?del : i; 
     } 
    } else if (sub > del) { 
     return sub> i ? sub : i; 
    } else { 
     return del > i ? del : i; 
    } 
} 

protected char sequence[]; 




    public static void main(String args[]){ 
    int r, c, rows, cols, ins, sub, del, max_score; 

    rows = seq1.length()+1; 
    cols = seq2.length()+1; 

    matrix = new int [rows][cols]; 

    // initiate first row 
    for (c = 0; c < cols; c++) 
     matrix[0][c] = 0; 

    // keep track of the maximum score 
    max_row = max_col = max_score = 0; 

    // calculates the similarity matrix (row-wise) 
    for (r = 1; r < rows; r++) 
    { 
     // initiate first column 
     matrix[r][0] = 0; 

     for (c = 1; c < cols; c++) 
     { 
         sub = matrix[r-1][c-1] + scoreSubstitution(seq1.charAt(r),seq2.charAt(c)); 
      ins = matrix[r][c-1] + scoreInsertion(seq2.charAt(c)); 

      del = matrix[r-1][c] + scoreDeletion(seq1.charAt(r)); 

      // choose the greatest 
      matrix[r][c] = max (ins, sub, del, 0); 

      if (matrix[r][c] > max_score) 
      { 
       // keep track of the maximum score 
       max_score = matrix[r][c]; 
       max_row = r; max_col = c; 
      } 
     } 
    } 

    } 

private static int scoreSubstitution(char a, char b) { 
    if (isCaseSensitive()) 
     if (a == b) 
      return match_reward; 
     else 
      return mismatch_penalty; 
    else 
     if (Character.toLowerCase(a) == Character.toLowerCase(b)) 
      return match_reward; 
     else 
      return mismatch_penalty; 
} 

private static int scoreInsertion(char a) { 
return gap_cost; 
} 

private static int scoreDeletion(char a) { 
    return gap_cost; 
} 
public char charAt (int pos) 
{ 
    // convert from one-based to zero-based index 
    return sequence[pos-1]; 
} 

    } 

,我的错误是显示这个

   Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3 
    at java.lang.String.charAt(String.java:695) 
    at compute_matrix.main(compute_matrix.java:67) 

Java结果:1

+3

您是一位学习Java的Visual Basic程序员吗? – Wug

+2

你最好自己调试你的问题。 –

回答

4
rows = seq1.length()+1; 
    cols = seq2.length()+1; 

    matrix = new int [rows][cols]; 

再后来:

for (c = 1; c < cols; c++) 
    { 
    //when c == cols-1, it is also `seq2.length()` 
    //the access to seq2.charAt(c) will cause this exception then. 
        sub = matrix[r-1][c-1] + scoreSubstitution(seq1.charAt(r),seq2.charAt(c)); 
     ins = matrix[r][c-1] + scoreInsertion(seq2.charAt(c)); 

     del = matrix[r-1][c] + scoreDeletion(seq1.charAt(r)); 

在上述循环中,当c == cols-1,它也是seq2.length(),接入到seq2.charAt(c)将导致此异常然后。

您将行数和列初始化为length() + 1,稍后您将从0重复为length(包含),而字符串只包含length()个字符 - 从0到n不相等。

如果你是过去的C程序员 - 我假设你期望在字符串末尾有一个\0终止符。在java中你没有这些 - 因为String是一个对象 - 你可以持有一个字段来表示它的确切长度。意思是字符串中的最后一个字符,实际上是最后一个字符。

+0

我对Java很新颖......我明白你在说什么,但我可以弄清楚如何改变它的代码以便工作.....请帮助我 –

+0

@SonalAkhal:我不确定我是谁遵循逻辑,但我怀疑初始化您的尺寸为'seq1.length()'和'seq2.length()'(不带+1)将做... – amit

+0

谢谢阿米特它的工作仍然有一个小问题,但我知道如何解决它。再次感谢您的帮助。 –

0

在你的代码的行60 sub = matrix[r-1][c-1] + scoreSubstitution(seq1.charAt(r),seq2.charAt(c));对于r 最大值为4,所以当你仰望的seq.charAt(3)有nothingso这表明指数越界

0

我重构你的代码更规范的Java。

的事情,我已经改变了:

  • 类是现在所谓SimilarityMatrix,更合适的,自我记录的名字
  • 变量声明现在发生的,他们习惯于作为主顶部反对
  • 现在的工作是在类的实例来完成,而不是主要方法
  • 我使用了内置的Math.max(int, int),而不是我自己的滚动
  • 我删除了很多不必要的嵌套if语句。Java的短路评价在这里帮助
  • 由于两个rc以及r+1c+1在你的计算循环使用频繁,我同时追踪
  • 我删除了很多对静态的依赖关系(做很多事情的实例变量)
  • 剩下的静态状态是所有最终现在(我让他们常量)
  • 使用更多的java-Y变量名(java的人真的很喜欢他们的骆驼)

public class SimilarityMatrix 
{ 
    public static final int matchReward = 1; 
    public static final int mismatchPenalty = -1; 
    public static final int gapCost = -1; 

    private int[][] matrix; 
    private int maxRow = 0; 
    private int maxCol = 0; 
    private boolean caseSensitive = false; 

    SimilarityMatrix(String s1, String s2, boolean dontIgnoreCase) 
    { 
     this(s1, s2); 
     caseSensitive = dontIgnoreCase; 
    } 

    SimilarityMatrix(String s1, String s2) 
    { 
     int rows = s1.length() + 1; 
     int cols = s2.length() + 1; 
     matrix = new int[rows][cols]; 

     int max_score = 0; 

     for (int x = 0; x < cols; x++) 
     { 
      matrix[0][x] = 0; 
      matrix[x][0] = 0; 
     } 

     for (int r = 0, rp1 = 1; rp1 < rows; ++r, ++rp1) 
     { 
      for (int c = 0, cp1 = 1; cp1 < rows; ++c, ++cp1) 
      { 
       int sub = matrix[r][c] + scoreSubstitution(s1.charAt(r), s2.charAt(c)); 
       int ins = matrix[rp1][c] + scoreInsertion(s2.charAt(c)); 

       int del = matrix[r][cp1] + scoreDeletion(s1.charAt(r)); 

       // choose the greatest 
       matrix[rp1][cp1] = Math.max(Math.max(ins, sub), Math.max(del, 0)); 

       if (matrix[rp1][cp1] > max_score) 
       { 
        // keep track of the maximum score 
        max_score = matrix[rp1][cp1]; 
        maxRow = rp1; 
        maxCol = cp1; 
       } 
      } 
     } 
    } 

    public static void main(String args[]) 
    { 
     SimilarityMatrix me = new SimilarityMatrix("aaa", "aaa"); 
     System.out.println(me.getMaxRow() + " " + me.getMaxCol()); 
    } 

    private int scoreSubstitution(char a, char b) 
    { 
     if ((a == b && caseSensitive) || Character.toLowerCase(a) != Character.toLowerCase(b)) 
      return matchReward; 
     else 
      return mismatchPenalty; 
    } 

    public int getMaxRow() 
    { 
     return maxRow; 
    } 

    public int getMaxCol() 
    { 
     return maxCol; 
    } 

    private int scoreInsertion(char a) 
    { 
     return gapCost; 
    } 

    private int scoreDeletion(char a) 
    { 
     return gapCost; 
    } 
} 
+0

关于风格的说明:你的很好(虽然你的缩进可以使用一些工作)。一般而言,一致性比语义更重要。当你在小组中工作时,尽量让你的代码看起来像组中的任何风格,即使你不喜欢它。除了大括号。那些在自己的路线上,期间。 – Wug