2016-04-17 7 views
-2

hypergraphを実装しようとしています。私はハッシュのキーとして(フリーズした)セットを使用したいと思います。私は次のようなことやそれに似たものをしたいと思います。値のリスト/セット/配列をハッシュキーとして使用する

set_a = Set.new(["a","b","c"]) 
set_b = Set.new(["a","b","d"]) 
set_c = Set.new(["a","b"]) 
set_d = Set.new(["a","b","e","f"]) 

set_a.freeze 
set_b.freeze 
set_c.freeze 
set_d.freeze 

data = { 
    set_a => [list of vertices], 
    set_b.freeze => [list of vertices], 
    set_c.freeze => [list of vertices], 
    set_d.freeze => [list of vertices] 
} 

しかし、それほどうまくいきません。行うこと:

data[some_set.freeze] 

エラーの原因と思われます。

+1

'( "A"、 "B"、 "C")' Rubyで有効なデータ構造ではありません。Setであなたの実装は、次のようになります。あなたは何を使いたいですか( 'Array'、' Set')? – spickermann

+0

あなたの質問は何ですか? – sawa

+0

'(" a "、" b "、" c ")'についての公正点は、実行可能コードよりも多くの例として提供されています。ただし、タプル(python)は単なる不変のリストです。私は、一意性/注文/標準化の懸念に対処することを避けることを念頭に置いていました。実際にはリテラルではなく、ここで変数を使用しました。 – Nuclearman

答えて

1

dataアレイを公開したり共有したりしない限り、フリーズする理由はありません。

Arrayのインスタンスをキーとして使用できます。

data = { 
    ['a', 'b', 'c']  => [1, 2, 3], 
    ['a', 'b', 'd']  => [1, 2, 4], 
    ['a', 'b']   => [1, 2], 
    ['a', 'b', 'e', 'f'] => [1, 2, 5, 6] 
} 

data[['a', 'b']] 
#=> [1, 2] 

やコメントで述べた澤のように:しかし、あなたは配列が全て同じようにソートされていることを確認する必要がありますそれはdataハッシュを使用する前に、配列を注文避けるためにSetを使用しても意味があります。

require 'set' 

data = { 
    Set.new(['a', 'b', 'c'])  => [1, 2, 3], 
    Set.new(['a', 'b', 'd'])  => [1, 2, 4], 
    Set.new(['a', 'b'])   => [1, 2], 
    Set.new(['a', 'b', 'e', 'f']) => [1, 2, 5, 6] 
} 

data[Set.new(['b', 'a'])] # Note that the order doesn't match 
#=> [1, 2] 
+0

おそらく、セットを使用するOPの意図は、要素の順序付けから解放されることです。あなたが配列でそれをするとき、何らかの方法でそれを正規化しなければなりません;おそらくそれを並べ替えることは一つの方法です。 – sawa

+0

@sawa、良い点。 – spickermann

+0

ええ、私の問題はそれを過ぎて考えているようです。 Pythonは、オブジェクトがハッシュされるかどうかについてオブジェクトが不変か変更可能かを考慮する必要があります。リストはできませんが、タプルはできます。セットは固定セットではできません。 – Nuclearman

関連する問題