【问题标题】:Dart String ComparatorDart 字符串比较器
【发布时间】:2013-04-21 18:14:35
【问题描述】:

在 Dart 中比较字符串的最佳方法是什么? String 类不包含equals 方法。推荐==吗?

例如:

String rubi = 'good';
String ore = 'good';

rubi == ore;

【问题讨论】:

  • 我意识到将生成的字符串作为变量放在引号中时可以很好地进行比较'$rubi' == '$ore';

标签: dart


【解决方案1】:

是的,== 是测试两个字符串是否相等(仅包含相同的字符序列)的方法。代码的最后一行计算结果为 true

【讨论】:

    【解决方案2】:

    字符串是不可变的对象,这意味着您可以创建它们但不能更改它们。你当然可以用其他字符串构建一个新的字符串,但是一旦创建,字符串的内容就固定了。

    这是一种优化,因为两个相同字符的字符串,顺序相同,可以是同一个对象。

    String rubi = 'good';
    String ore = 'good';
    
    print(rubi == ore); // true, contain the same characters
    print(identical(rubi, ore)); // true, are the same object in memory
    

    【讨论】:

    • === 已替换为内置函数identical()
    【解决方案3】:

    Java 不同,Dart 允许覆盖 == 等运算符。因此,您可以为此运算符定义自己的测试来检查相等性。您还可以使用indentical function 来检查两个引用是否指向同一个对象(在Java 中的对象上相当于==)。

    对于Strings,有点特别。根据您实例化 String 的方式,您可以使用 DartVM 获得不同的结果:

    main() {
      final s = "test";
    
      printTests(s, "test");
      // displays '==' => true    'identical' => true
    
      printTests(s, "$s");
      // displays '==' => true    'identical' => false
    
      printTests(s, new String.fromCharCodes(s.codeUnits));
      // displays '==' => true    'identical' => false
    }
    
    printTests(String s1, String s2) {
      print("'==' => ${s1 == s2}    'identical' => ${identical(s1, s2)}");
    }
    

    如您所见,identical 仅针对第一种情况返回 true== 始终返回 true。但这并不总是正确的。如果您在 dart2js 编译后在 javascript 中运行此代码,identical== 总是返回 true

    在大多数情况下,您想要比较 String 的值而不是它们的引用,因此您应该使用 ==

    【讨论】:

    • 注意当前 printTests(s, "$s");打印 == 的 true 和相同的,因为 "$s" 也被解释为常量文字。
    【解决方案4】:

    (为了完整起见,这里是比较两个字符串的另一种方法。)

    Dart 中的String 实现了Comparable 接口。您可以使用compareTo 来比较字符串。

    String rubi = 'good';
    String ore = 'good';
    
    rubi.compareTo(ore) == 0;
    

    您需要检查 NULL 值。

    【讨论】:

      【解决方案5】:

      有几种方法可以比较字符串。根据您的需要,您应该选择合适的解决方案:

      1. 使用运算符str1 == str2:如果str1 等于str2,则运算符返回true。否则,它返回 false。 当您要确定字符串是否具有相同的代码单元序列时,此运算符很有用。
      2. 使用 str1.compareTo(str2) 方法:如果 str1 在 str2 之前排序,该方法返回负值 (-1),如果 str1 在 str2 之后排序,则返回正值 (1),或者如果 str1 和 str2 相等,则为零。 如果要对字符串集合进行排序,此方法很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-06
        • 1970-01-01
        • 2011-11-08
        • 2022-12-05
        • 2019-08-13
        • 2011-07-06
        • 1970-01-01
        相关资源
        最近更新 更多