使用for循环获得2个字符串之间的汉明距离

时间:2013-04-28 07:41:11

标签: java string for-loop compare equals

在这个任务中,我需要在两个字符串sequence1和sequence2之间获得汉明距离(两个相等长度的字符串之间的汉明距离是相应符号与维基百科不同的位置数)。

首先,我制作了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;
}

那么代码看起来是否良好且功能足够?我能修复或优化代码的任何东西?提前致谢。我是一个巨大的菜鸟,如果我问任何愚蠢的话,请原谅我

4 个答案:

答案 0 :(得分: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. 使用数组,避免为每个需要比较的单个char调用两个方法(charAt);
  2. 当一个字符串比另一个字符串长时,避免异常。

答案 1 :(得分:3)

你的代码完全关闭了。 就像你自己说的那样,距离是字符串不同的地方数 - 所以你应该只有一个循环,一次遍历两个字符串。相反,你有2个嵌套循环,它们将字符串a中的每个索引与字符串b中的每个索引进行比较。

另外,编写导致a+=0的if条件是浪费时间。

试试这个:

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

另外,这仍然是一种天真的方法,它可能不适用于复杂的unicode字符(其中2个字符在逻辑上相同但不具有相同的字符代码)

答案 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;
}

答案 3 :(得分: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;         }

  3. 此外,考虑到我建议您使用数组将其更改为:

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

    减少代码减少错误...

    编辑:正如@radai所提到的,您根本不需要if/else结构:将0添加到a是多余的。