Ruby Hash Values是Array,需要转换为string

时间:2017-01-04 16:11:59

标签: arrays ruby hash

我有一个整数哈希作为键和字符串数组作为值。我需要将其转换为一个新的哈希值,该哈希值将原始哈希值中的字符串数组中的每个项目反转为该关系,成为新哈希值中的一个键,每个原始键成为关联值。例如:

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>

但由于某种原因,这也会返回原始数组。

5 个答案:

答案 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)