2013-04-28 76 views
6

在這個任務中,我需要得到漢明距離(漢明距離相等的兩個字符串之間的漢明距離是相應的符號不同的位置數 - 從維基百科)在兩個字符串sequence1和sequence2之間。使用for循環來獲得2個字符串之間的漢明距離

首先,我做了2個新的字符串,這是2個原始字符串,但都與降低案例,使比較更容易。然後我使用for循環,如果比較2個字符串。對於這兩對字符串中的任何字符差異,循環會將1加到int x = 0。方法的返回值將是此x的值。

public static int getHammingDistance(String sequence1, String sequence2) { 
    int a = 0; 
    String sequenceX = sequence1.toLowerCase(); 
    String sequenceY = sequence2.toLowerCase(); 
    for (int x = 0; x < sequenceX.length(); x++) { 
     for (int y = 0; y < sequenceY.length(); y++) { 
      if (sequenceX.charAt(x) == sequenceY.charAt(y)) { 
       a += 0; 
      } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) { 
       a += 1; 
      } 
     } 
    } 
    return a; 
} 

那麼,代碼看起來不錯,功能夠嗎?任何我可以修復或優化代碼?提前致謝。我是一個巨大的菜鳥,所以如果我問了什麼愚蠢的東西,請原諒我

+0

「我能做的任何事情都是修復」是一個屬於這裏的問題。 '優化'問題屬於Code-Review – 2013-04-28 07:44:22

+0

此問題更適合http://codereview.stackexchange.com/。你也會在那裏得到更好的答案。 – jpaugh 2013-04-28 07:45:27

+0

正在做作業嗎? – 2013-04-28 07:49:02

回答

3

你的代碼完全關閉。如你所說,距離是字符串不同的地方的數量 - 所以你應該只有1個循環,一次超過兩個字符串。相反,您有2個嵌套循環,將字符串a中的每個索引與字符串b中的每個索引進行比較。

另外,寫一個if條件導致a+=0是浪費時間。

試試這個:

for (int x = 0; x < sequenceX.length(); x++) { //both are of the same length 
    if (sequenceX.charAt(x) != sequenceY.charAt(x)) { 
     a += 1; 
    } 
} 

也,這仍然是將probbaly不復雜的Unicode字符(其中2個字符可以在邏輯上等於但不具有相同的字符代碼)

工作天真的做法
+0

感謝您的幫助。在問題的範圍內,它會很好地完成這項工作。再次感謝:D – Doh 2013-04-28 08:11:51

0

你的代碼是好的,但我建議你進行以下改進。

  1. 不要使用charAt()的字符串。在循環之前使用toCharArray()從字符串獲取char數組,然後使用此數組。這是更可讀和更有效。
  2. 結構

    if (sequenceX.charAt(x) == sequenceY.charAt(y)) { 
         a += 0; 
        } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) { 
         a += 1; 
        } 
    

    看起來是多餘的。將其修復爲: if(sequenceX.charAt(x)== sequenceY.charAt(y)){ a + = 0; } else { a + = 1; }

而且考慮到,我建議您使用陣列工作,它更改爲類似賬號:

a += seqx[x] == seqY[x] ? 0 : 1

更少的代碼更少的錯誤...

編輯: @radai提到你完全不需要if/else結構:將0添加到a是多餘的。

+0

「不要使用字符串的charAt()。在循環前使用toCharArray()從字符串中獲取字符數組,然後使用這個數組,這更加可讀和更有效」 - >當你有即時編譯?我的意思是我沒有自己測試過它,但是我想這個charAt會被優化掉。 – 2013-04-29 19:21:49

5

從我的觀點如下實施將是確定的:

public static int getHammingDistance(String sequence1, String sequence2) { 
    char[] s1 = sequence1.toCharArray(); 
    char[] s2 = sequence2.toCharArray(); 

    int shorter = Math.min(s1.length, s2.length); 
    int longest = Math.max(s1.length, s2.length); 

    int result = 0; 
    for (int i=0; i<shorter; i++) { 
     if (s1[i] != s2[i]) result++; 
    } 

    result += longest - shorter; 

    return result; 
} 
  1. 使用數組,有什麼可避免二方法(的charAt)對於需要進行比較每個單個字符的調用;
  2. 避免一個字符串長於另一個字符串時的異常。
1
public static int getHammingDistance(String sequenceX, String sequenceY) { 
    int a = 0; 
    // String sequenceX = sequence1.toLowerCase(); 
    //String sequenceY = sequence2.toLowerCase(); 
    if (sequenceX.length() != sequenceY.length()) { 
     return -1; //input strings should be of equal length 
    } 

    for (int i = 0; i < sequenceX.length(); i++) { 
     if (sequenceX.charAt(i) != sequenceY.charAt(i)) { 
      a++; 
     } 
    } 
    return a; 
}