【问题标题】:What is the easiest way to compare two string except one character?除了一个字符之外,比较两个字符串的最简单方法是什么?
【发布时间】:2014-11-27 16:02:20
【问题描述】:

我是 Java 新手。

谁能告诉我这是比较两个字符串(除了一个字符)最简单的方法吗?

喜欢:

'test' 'text'  //only one character different

应该返回真

================================

喜欢输入:

'test' 'txxt' //two character different return false

应该返回 false

我知道我们可以与 for 循环进行比较。有没有其他方法可以做到这一点? 谢谢你的帮助。 :)

【问题讨论】:

  • 如果字符串长度不同,我们应该如何处理? (测试与测试)
  • 如果它们的长度相同,则只需循环遍历每个字符并在找到第二个差异时停止。如果长度可以不同,那么它可能会更棘手。
  • 我只知道使用 Levenshtein distance 来做到这一点,但对于您正在寻找的东西可能有点矫枉过正。
  • @JeffFerland 这个字符串的长度是一样的。
  • 嗨@AdrianoRepetti 谢谢你的回答。就像我说的,我知道我们可以与 for 循环进行比较。我想知道的是,还有其他更简单的方法吗?

标签: java string


【解决方案1】:

假设字符串大小相同,这是一个解决方案。对于不均匀的字符串长度,此解决方案需要稍作更改

boolean compareStrings(String str1, String str2) {
    if (str1.length() != str2.length())
        return false;
    int differences = 0;
    for (int i = 0; i < str1.length(); i++) {
        if(str1.charAt(i) != str2.charAt(i))
            if(++differences > 1)
                return false;
    }
    //if the execution is here, then there are 0, or 1 differences, so return true
    return true;
}

【讨论】:

  • 这绝对是一个可行的解决方案,许多人会对此感到满意(但代码应该更改:如果长度相差 1,那么它们可能被认为是相等的)。也就是说,未来的读者必须意识到这不是 UNICODE 感知的。这可能不是问题(如果字符串仅包含 ASCII 字符),但每个使用字符串的程序员都应该注意其他问题。
  • 让我快速总结一下您应该注意的事项:1) 在 UNICODE 中有重复项,例如 à 可能是单个 Character 或由两个代理 ( a 和尾随重音的低位代理项)。如果您将CharacterCharacter 进行比较,那么您将无法处理。
  • 2) Java 的 String 是 UTF-16 编码的,每个代码点是 2 个字节,但 UTF-16 不是固定长度的编码,那么一个 character 可以编码为两个Characters(类型名称绝对具有误导性,它们不是字符而是代码点)。对于大多数西方语言来说这不是问题,但您会看到远东语言的不同之处。
  • 3) 并非每种文化都有相同的字符定义。例如,捷克语中的“ch”逻辑上被计为一个字符,历史上是一个二合字母,但它经常被写成(因为计算机键盘)两个单独的字符。更明显的是:想想韩语音节(两个或多个字母组合成一个字符 - 一个音节 - 具有 UNICODE 中的特定代码点)。此处的逐字符比较不起作用(即使使用像 UTF-32 这样的固定长度编码)。
  • 4) 这可能不是问题,但如果比较不区分大小写,则会出现更多问题:更多小写字符可能等于单个大写字符,并且并非所有 UNICODE 实现都能正常工作(两个示例:想想德语中的“ß”和“ss”)。
【解决方案2】:

试试这个方法。 它应该适用于每个字符串组合,但根据使用情况,可能需要进行性能调整。

public static boolean compare(String s1, String s2) {
    if((s1 != null && s2==null) || (s1 == null && s2!=null)){
        //exact one is null
        return false;
    }
    if((s1 == null && s2==null) ||  s1.equals(s2)){
        //both are null or equal
        return true;
    }
    if(Math.abs(s1.length() - s2.length()) > 1){
        //A different length of more than one is more than one difference, right ?
        return false;
    }
    //Here you have two different strings. Maybe one is a character larger than the other.
    if(s1.length() != s2.length()) {
        //They differ in length, so they must be equal in the first minLen charcaters. 
        int minLen = Math.min(s1.length(), s2.length());
        return s1.substring(0,minLen).equals(s2.substring(0,minLen));
    }

    //Here you have two different strings of the same length.
    int diff = 0;
    for(int i = 0; i < s1.length() && diff < 2; i++){
        if(s1.charAt(i) != s2.charAt(i)){
            diff++;
        }
    }
    return diff < 2;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多