ruby - Ruby uniq 是否保留顺序?

标签 ruby

文档对此没有任何说明(http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-uniq)。

此外,它是使用简单的 O(n^2) 搜索还是其他类似 hashmap 的东西?在后一种情况下,我是否应该理解我的元素必须具有 hasheql 的正确实现? 当我想将它们统一化时?

最佳答案

给定 Array#uniq 的代码(C 语言)

rb_ary_uniq(VALUE ary)
{
    VALUE hash, uniq, v;
    long i;

    if (RARRAY_LEN(ary) <= 1)
        return rb_ary_dup(ary);
    if (rb_block_given_p()) {
        hash = ary_make_hash_by(ary);
        uniq = ary_new(rb_obj_class(ary), RHASH_SIZE(hash));
        st_foreach(RHASH_TBL(hash), push_value, uniq);
    }
    else {
        hash = ary_make_hash(ary);
        uniq = ary_new(rb_obj_class(ary), RHASH_SIZE(hash));
        for (i=0; i<RARRAY_LEN(ary); i++) {
            st_data_t vv = (st_data_t)(v = rb_ary_elt(ary, i));
            if (st_delete(RHASH_TBL(hash), &vv, 0)) {
                rb_ary_push(uniq, v);
            }
        }
    }
    ary_recycle_hash(hash);

    return uniq;
}

在一般情况下(else block ),它从数组中创建一个散列(在不保持顺序的情况下统一键)。然后它创建一个具有正确大小的新空数组。最后它遍历第一个数组,当它在散列中找到键时,它删除该键并将其推送到空数组。

因此顺序保持不变。

我会说复杂度是 O(complexity(ary_make_hash) + N) 在时间上,这可能是 O(N)

关于ruby - Ruby uniq 是否保留顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28113933/

相关文章:

ruby-on-rails - 如何在 jQuery.ui.autocomplete 中的自动完成弹出窗口下方添加所有搜索的链接?

javascript - 带有 node.js 的 Ruby 子进程

c++ - 如何将 SWIG 用于 STL map ?

ruby-on-rails - RSpec let方法不生成变量

ruby-on-rails - 如何将临时文件编写为二进制文件

css - 带有嵌入式 ruby​​ 的 Bootstrap 中的媒体对象

ruby - 样式/条件分配 : Use the return of the conditional for variable assignment and comparison

ruby - 在 Centos 6.2 上使用 RVM 1.9.3 安装 nokogiri 时遇到问题

ruby - ruby 的 CSV.foreach 枚举器的解释?

ruby-on-rails - 查询哪个 Controller 将用于 URL