2016-04-09 8 views
0

ルービーで、特定のメトリックを使用して配列をグループ化する方法はありますか?私は方法があることを知っていますEnumerable#group_by。残念ながら、私はそれに1つの議論しか与えることができません。2つの引数でグループ化します。メトリックによるグループ化 - 「近い」項目

items.group_by do |x,y| 
    some_metric(x,y) < 1.23  # the two items are 'close' 
end 

このようなものに対処するにはどうすればいいですか?

[['a', 'b'], 
['c', 'd'], 
['e','f'], 
['a', 'b', 'c'], 
['c', 'd', 'z'], 
['a', 'b', 'k']] 

そして、私は2つの配列が同じであるか私に語ったメトリックを持っている:

は、私はアイテムを持って言うことができます。 ['a','b']['a', 'b', 'c']の配列は、['a', 'b']['e', 'f']よりはるかに近いはずです。 だから、理想的な出力は次のようなものになるだろう:あなたは完全にgroup_byにブロックを渡すことによってそれを行うことができます

[ 
    [['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'k'], 
    [['c', 'd'], ['c', 'd', 'z']], 
    [['e','f']] 
] 
+0

input/some_metric/outputの具体例を挙げることができますか?あなたが求めている行動がはっきりしていません。 – user12341234

+0

'items = [1,2,3]'とします。あなたの例でメトリックを使用するとき、どのようにグループ分けしたいのですか? ( "sth"は文字通りではなく、文字通りのためのものです)。 –

+0

コメントありがとう!私は入出力を提供しています。しかし、今私はもっと多くのことを考えています...私は銃を飛ばしたと思います。なぜなら、1ライナーの解決策があるとは思わないからです。私はルビに何とか比較する鍵が何であるかを伝える必要があります。私の場合、それはちょうどどんな要素でもあり得る。コレクションに一致するすべてのアイテムを取得してから削除し、再度ループします。 1つの要素を取る - >一致するすべての項目など... – NickyNick

答えて

0

arr = [[1,2],[3,4],[2,2],[6,8]] 
arr.group_by{|f,s| f%2==0 && s%2==0} 

ここで、arrは数字のタプルの配列です。 group_byを使用して、各タプルをチェックして、両方の数字が偶数であるかどうかを確認します。関数を渡すこともできます。

arr.group_by{|f,s| some_function(f,s)} 

より具体的な例は以下mught:

def proximity(arr) 
    alpha = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
    dis_arr = [] 
    arr.each_with_index do |e,i| 
    if i+1 < arr.length 
     dis = alpha.find_index(e) - alpha.find_index(arr[i+1]) 
     dis_arr << dis.abs 
    end 
    end 
    dis_arr.inject{ |sum, el| sum + el }.to_f/arr.size 
end 

test = 
[['a', 'b'], 
    ['c', 'd'], 
    ['e','f'], 
    ['a', 'b', 'c'], 
    ['c', 'd', 'z'], 
    ['a', 'b', 'k']] 

test.group_by{|arr| proximity(arr)} 

返す:

あなたが望んでいたまさにではなく、ハッシュを .group_by返し
{ 0.5 => [ 
    ["a","b" ],["c","d"],["e","f"] 
    ], 
    0.6666666666666666 => [ 
    [ "a","b","c"]], 
    7.666666666666667 => [ 
    ["c","d","z"] 
    ], 
    3.3333333333333335 => [ 
    ["a","b","k"] 
    ] 
} 

を。ニーズに合わせて配列に変換するのはそれほど難しいことではありません。

関連する問題