2010-04-20 79 views
0

我有一個數組:查找在多維陣列的子陣列中的每個字的位置

tokens = [["hello","world"],["hello","ruby"]] 
all_tokens = tokens.flatten.uniq # all_tokens=["hello","world","ruby"] 

現在我需要創建對應於all_tokens,其中第一陣列將包含每個的位置的兩個陣列在令牌的子陣列中的單詞。即輸出:

[[0,0],[1],[1]] # (w.r.t all_tokens) 

要清楚它讀取,的「你好」是在令牌的2子陣列0和0的索引。

而第二陣列包含每個單詞w.r.t tokens.I.E輸出的索引:

[[0,1],[0],[1]] 

要清楚它讀取,的你好0,1索引。 I.E「hello」位於索引0和1的令牌數組中。

乾杯!

回答

1

您的方法聽起來很難維護。如果您保持目前的狀態,最終將得到您的tokens數組陣列,一組獨特的令牌(all_tokens),然後再添加兩個陣列陣列以跟蹤唯一令牌的位置在原始tokens結構內。

另一種方法是以最自然的方式來存儲唯一令牌:散列。在該散列內,您還可以存儲位置信息。那樣,所有的信息一起傳播。

有可能是實現這一目標的巧妙方式,但這裏有一個簡單的實現:

tokens = [["hello","world"],["hello","ruby"]] 

token_info  = {} 
ordered_tokens = [] 

tokens.each_with_index do |group, i| 
    group.each_with_index do |t, j| 
     unless token_info.has_key?(t) 
      token_info[t] = {:i => [], :j => []} 
      ordered_tokens.push(t) 
     end 
     token_info[t][:i].push(i) 
     token_info[t][:j].push(j) 
    end 
end 

ordered_tokens.each do |t| 
    p t, token_info[t] 
end 
0

我與FM同意,但是這將創建第一個數組:

tokens = [["hello","world"],["hello","ruby"]] 
all_tokens = tokens.flatten.uniq 

sublist_indices = all_tokens.collect do |token| 
    tokens.inject([]) do |indices, list| 
    indices += list.each_with_index.select {|pair| pair[0] == token}.map {|pair| pair[1]} 
    end 
end # => [[0, 0], [1], [1]] 

餘留的練習。