2012-10-18 143 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