2010-04-20 32 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]] 

余留的练习。