【问题标题】:Comparing Strings with BREAK LINES in Java在 Java 中比较字符串与断行
【发布时间】:2022-01-06 18:29:48
【问题描述】:

我有两个字符串如下:

String A = "Hello World";
String B = "Hello \n World";

字符串之间的唯一区别是换行符,我的问题是我们如何通过忽略换行符来比较这些字符串。

【问题讨论】:

  • 在使用 equals 方法比较它们之前,您需要使用 String.replace 从两个字符串中删除 `\n'。
  • 即使忽略换行符,它们仍然不同:A 有一个空格,B 有两个。

标签: java string


【解决方案1】:

我相信,以下字符串应该相等:"Hello World""Hello \nWorld"

最简单的方法是从两个字符串中删除\n,然后使用isEquals()

public static boolean isEquals(String one, String two) {
    one = one.replace("\n", "");
    two = two.replace("\n", "");
    return one.equals(two);
}

但它可能效率不高,因为这里我们有额外的字符串对象创建。幸运的是,您可以使用另一种方法。

public static boolean isEquals(String one, String two) {
    int i = 0;
    int j = 0;

    while (i < one.length() && j < two.length()) {
        if (one.charAt(i) == '\n')
            i++;
        else if (two.charAt(j) == '\n')
            j++;
        else if (one.charAt(i++) != two.charAt(j++))
            return false;
    }

    for (; i < one.length(); j++)
        if (one.charAt(i) != '\n')
            return false;

    for (; j < two.length(); j++)
        if (two.charAt(j) != '\n')
            return false;

    return true;
}

【讨论】:

    【解决方案2】:
    A.equals(B.replaceAll("\n","").replaceAll("  "," "));
    

    String String.replaceAll(字符串正则表达式,字符串替换)

    用给定的正则表达式替换此字符串中与给定正则表达式匹配的每个子字符串 替换。

    boolean String.equals(Object anObject)

    将此字符串与指定的对象进行比较。当且仅当参数为 不为 null 并且是一个 String 对象,表示与此对象相同的字符序列。 更细粒度的String比较,参考java.text.Collat​​or

    【讨论】:

      【解决方案3】:

      即使空格不同,您也不清楚 A 是否等于 B。如果您打算“A 等于 B”:- 使用正则表达式来忽略空格以及任何平台的换行符:

      Matcher m = Pattern.compile("(?:\\s|\\R)+").matcher("");
      boolean sameAB = m.reset(A).replaceAll(" ").equals(m.reset(B).replaceAll(" "));
      

      请注意,replaceAll 将空格和换行符替换为空格(不是空字符串),以便在与不带空格的字符串(例如 C = "HelloWorld")进行比较时可以区分。

      你也可以使用String.replaceAll,除了相同的正则表达式Pattern被编译两次:

      boolean sameAB = A.replaceAll("(?:\\s|\\R)+", " ").equals(B.replaceAll("(?:\\s|\\R)+", " "));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-20
        • 2010-10-06
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        相关资源
        最近更新 更多