我有一个整数哈希作为键和字符串数组作为值。我需要将其转换为一个新的哈希值,该哈希值将原始哈希值中的字符串数组中的每个项目反转为该关系,成为新哈希值中的一个键,每个原始键成为关联值。例如:
original.each { |k, v| new_hash[v] = k }
我正在努力从原始数组值中提取项目。这很容易做到
original.each { |k, v| new_hash[v.each { |i| i }] = k }
但这会将原始数组保留为新键。我尝试过像
这样的事情private void listViewContentChange(ListViewBase sender, ContainerContentChangingEventArgs args)
{
if (((Binding.Car)args.Item).GoodFH == "x")
{
args.ItemContainer.Background = (SolidColorBrush)Application.Current.Resources["Red"];
}
else
{
if (((Binding.Car)args.Item).Position == "x")
{
args.ItemContainer.Background =(SolidColorBrush)Application.Current.Resources["red"];
}
}
}
<DataTemplate x:DataType="data:Car">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal" Margin="20,20,0,0">
<TextBlock FontSize="18" Text="{x:Bind GoodFH}" HorizontalAlignment="Right" Height="20" Width="158"></TextBlock>
<TextBlock FontSize="18" Text="{x:Bind Position }" HorizontalAlignment="Right" Height="20" Width="78"></TextBlock>
<TextBlock FontSize="18" Text="{x:Bind PathFHfs}" HorizontalAlignment="Right" Height="20" Width="78"></TextBlock>
<TextBlock FontSize="18" Text="{x:Bind PathBHFlSp }" HorizontalAlignment="Right" Height="20" Width="78"></TextBlock>
但由于某种原因,这也会返回原始数组。
答案 0 :(得分:4)
另一个,来自Array#product
:
original.flat_map { |k, v| v.product([k]) }.to_h
#=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2}
答案 1 :(得分:2)
下面的代码片段将提供您想要的内容,但让我思考一个更易读,更优雅的解决方案。
newhash = {}
original.each do |k,v|
v.each do |v2|
newhash[v2] = k
end
end
#=> {1=>["a", "b", "c"], 2=>["g", "m", "z"]}
newhash
#=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2}
答案 2 :(得分:2)
original.flat_map { |k, vs| vs.map { |v| {v => k} } }.reduce(&:merge)
答案 3 :(得分:1)
你的方法很接近。在将新的键/值对分配给newHash时,您必须迭代值数组中的每个元素
newHash = {}
original.each { |k, v| v.each {|i| newHash[i] = k}}
答案 4 :(得分:1)
original.map { |number, ary| Hash[ary.map { |char| [char, number] }] }.reduce(&:merge)