从Ruby

时间:2017-08-21 10:41:39

标签: arrays ruby

我正在使用Ruby 1.9.3,我想从一个出现多次的数组中删除值。我有以下内容:

arr = [1,2,2,3,4,5,6,6,7,8,9]

,结果应为:

arr = [1,3,4,5,7,8,9].

实现这一目标的最简单,最短的Ruby代码是什么?

5 个答案:

答案 0 :(得分:2)

正如@Sergio Tulentsev所提到的,group_by和select的组合将起到作用 你去吧

arr.group_by{|i| i}.select{|k, v| v.count.eql?(1)}.keys

答案 1 :(得分:2)

我们可以通过数组webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url); select方法

来实现这一目标
count

答案 2 :(得分:0)

def find_duplicates(elements)
    encountered = {}

    # Examine all elements in the array.
    elements.each do |e|
        # If the element is in the hash, it is a duplicate.
        if encountered[e]
            #Remove the element
        else
            # Record that the element was encountered.
            encountered[e] = 1
        end
    end
end

答案 3 :(得分:0)

  

我想从多次出现的数组中删除值。

下面是一个例子:

> arr.delete_if{|e| arr.count(e) > 1}
#=> [1, 3, 4, 5, 7, 8, 9]

<强>选项2:

> arr.group_by{|e| e}.delete_if{|_,v| v.size > 1}.keys
#=> [1, 3, 4, 5, 7, 8, 9]

首先你需要自己对元素进行分组(它将返回键,值对),然后删除出现多次(值)的元素,并使用keys

答案 4 :(得分:0)

我倾向于使用计算哈希

<强>代码

def single_instances(arr) 
  arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.
      select { |_,v| v == 1 }.
      keys
end

示例

single_instances [1,2,2,3,4,5,6,6,7,8,9]
  #=> [1, 3, 4, 5, 7, 8, 9]

<强>解释

步骤如下。

arr = [1,2,2,3,4,5,6,6,7,8,9]

f = Hash.new(0)
  #=> {}
使用方法Hash::new创建

f,参数为零。这意味着,如果f没有密钥k,则f[k]将返回零(并且不会更改f)。

enum = arr.each_with_object(f)
  #=> #<Enumerator: [1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9]:each_with_object({})>
h = enum.each { |e,h| h[e] += 1 }
  #=> {1=>1, 2=>2, 3=>1, 4=>1, 5=>1, 6=>2, 7=>1, 8=>1, 9=>1}
g = h.select { |_,v| v == 1 }
  #=> {1=>1, 3=>1, 4=>1, 5=>1, 7=>1, 8=>1, 9=>1}
g.keys
  #=> [1, 3, 4, 5, 7, 8, 9]

在计算g时,Hash#select(返回哈希值),而不是Enumerable#select(返回数组),执行。我在第一个块变量(h中的一个键)中使用了下划线来表示它未在块计算中使用。

让我们更仔细地看一下h的计算。第一个值由枚举器enum生成并传递给块,块变量使用名为消歧分解的过程分配值。

e, h = enum.next
  #=> [1, {}]
e #=> 1
h #=> {}

所以块计算是

h[e] += 1
  #=> h[e] = h[e] + 1 => 0 + 1 => 1
在相等的右侧的

h[e](使用方法Hash#[],与相等左侧的Hash#[]=形成对比),返回1因为{ {1}}没有密钥h

e #=> 1的下两个元素将传递给块,并执行以下计算。

enum

请注意e, h = enum.next #=> [2, {1=>1}] h[e] += 1 #=> h[e] = h[2] + 1 => 0 + 1 => 1 已更新。

h

这一次,因为e, h = enum.next #=> [2, {1=>1, 2=>1}] h[e] += 1 #=> h[e] = h[e] + 1 => h[2] + 1 => 1 + 1 => 2 h #=> {1=>1, 2=>2} 已经有一个键h,所以不使用哈希的默认值。

其余的计算方法类似。

使用e #=> 2代替

更简单的方法是使用方法[Array#difference]

Array#difference

假设

class Array
  def difference(other)
    h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
    reject { |e| h[e] > 0 && h[e] -= 1 }
  end
end

请注意添加第三个arr = [1,2,2,3,4,2,5,6,6,7,8,9]

2

这三个步骤如下。

arr - arr.difference(arr.uniq)
  # => [1, 3, 4, 5, 7, 8, 9]

我建议a = arr.uniq #=> [1, 2, 3, 4, 5, 6, 7, 8, 9] b = arr.difference(a) #=> [2, 2, 6] (elements that appear more than once) arr - b # => [1, 3, 4, 5, 7, 8, 9] added to the Ruby core,但似乎没有兴趣这样做。