【问题标题】:Equality of All Elements in A Range范围内所有元素的相等性
【发布时间】:2013-10-08 21:15:28
【问题描述】:

我应该使用什么 Phobos 算法来检查一个范围内的所有元素是否相等?我查看了std.algorithm,发现最接近的是equal,但它需要两个范围作为参数。我也找不到申请reduce 来解决这个问题的方法。

【问题讨论】:

    标签: algorithm range d equality


    【解决方案1】:

    很好,亚当。更多可能性:

    foo.empty || foo.equal(repeat(foo.front, foo.length))
    

    foo.empty || repeat(foo.front).startsWith(foo)
    

    foo.findAdjacent!("a != b").empty
    

    【讨论】:

    • 哦,我喜欢最后一个。空也是一个好点,我使用的长度不适用于普通输入范围。
    • 还有:mismatch(foo, foo)[0].emptyuniq(foo).walkLength() == 1group(foo).walkLength() == 1uniq 假定已排序,但无论如何它都可以在这里工作)
    • 生活中的所有这些选择;)顺便说一句:空数组的返回值应该是什么——真、假或异常?也许没关系……
    • @Nordlöw 这取决于您要做什么,但是如果两个数组都是空的,则它们被认为是相等的。将两个范围与equal 进行比较时也是如此。从技术上讲,空范围内的每个元素都等于其他所有元素(当然,从技术上讲,每个元素也不等于每个元素)。但我会选择true
    【解决方案2】:

    一种选择是使用 canFind:

    import std.algorithm;
    import std.range;
    
    void main() {
        int[] foo = [1,1,2];
        if(!foo.empty) {
          if(!canFind!"a != b"(foo, foo.front))
               // they are equal
          else
                // not equal
        } else { /* nothing to compare against */ }
    }
    

    这里的逻辑是,如果它们都相等,那么它应该能够找到不等于第一个项目的项目。

    Andrei 的回答还有几个选择!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 2017-02-24
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多