迭代嵌套地图会导致Scala错误

时间:2018-12-16 06:50:47

标签: scala

格式:(UserId->((Movie1Id,Rating),(Movie2Id,Rating)))

我想打印Movie1Id和Movie2Id。

以下代码可以正常工作:

<Window x:Class="OlodimStories.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OlodimStories"
        Title="Olodim Stories" 
        WindowState="Maximized"
        mc:Ignorable="d"
        ManipulationStarting="Window_ManipulationStarting"
        ManipulationDelta="Window_ManipulationDelta"
        ManipulationInertiaStarting="Window_InertiaStarting" Loaded="Window_Loaded">
    <Window.Resources>

        <MatrixTransform x:Key="InitialMatrixTransform">
            <MatrixTransform.Matrix>
                <Matrix OffsetX="200" OffsetY="200"/>
            </MatrixTransform.Matrix>
        </MatrixTransform>

    </Window.Resources>
    <Grid>
        <Canvas Name="rootCanvas" Background="Green" Grid.Row="1" Grid.Column="0"
                VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>

        <Menu Name="mainMenu" Height="24" VerticalAlignment="Top" HorizontalAlignment="Left" Background="Transparent" 
                  Grid.Row="0" Grid.Column="0">
            <MenuItem Header="Меню" FontSize="16">
                <MenuItem Header="Открыть" FontSize="16"></MenuItem>
                <MenuItem Header="Сохранить" FontSize="16" Click="MenuItem_Click"/>
                <MenuItem Name="addImageItem" FontSize="16" Header="Добавить изображение..." Click="AddImageItem_Click"/>
                <Separator />
                <MenuItem Name="exitApp" Header="Выход" FontSize="16"></MenuItem>
            </MenuItem>
        </Menu>


    </Grid>
</Window>

以下代码无效:

  user foreach (x => println (x._2._1))

错误:

 val col1 = Map(645-> ((1->3.5),(2->5.2)))
 println(col1._2._1)

2 个答案:

答案 0 :(得分:3)

如果您需要Map中的Map,则应写:

val col1 = Map(645-> Map(1->3.5,2->5.2), 644 -> Map(1->3.5,2->5.2))
col1 foreach (user => user._2 foreach (mov => println(mov._1)))

然后您的类型将为Map[Int, Map[Int, Double]]

否则,您的数据类型不是嵌套Map,而是嵌套Map的{​​{1}}中的Tuple,即`Map [Int,((Int,Double), (Int,Double))]。然后,您必须将内部元组转换为列表,以便对其进行迭代。

Tuple

输出:

val col1 = Map(645-> ((1->3.5),(2->5.2)), 644 -> ((1->3.5),(2->5.2)))
// one liner
col1 foreach (user => user._2.productIterator.map(_.asInstanceOf[(Int, Double)]).toList.foreach(mov => println(mov._1)))

// long version
col1 foreach (user => {
  // make list from tuple
  val movies = user._2.productIterator.map(_.asInstanceOf[(Int, Double)]).toList
  // iterate over list
  movies foreach(mov => println(mov._1))
})

针对您的reference

编辑:提取评分:

1
2
3
4

答案 1 :(得分:1)

因此,您具有这种荒谬的数据表示形式。

val col1 = Map(645-> ((1->3.5),(2->5.2)))

而且,由于某些无法解释的原因,您希望不使用Map循环等遍历foreach来打印 Rating 数据。

有两个选择。一种是直接使用已知的键值。

println(col1(645)._1._2 + ", " + col1(645)._2._2)  //3.5, 5.2

或者您可以选择head中的Map,因为在这种情况下,Map中只有一个元素。

println(col1.head._2._1._2 + ", " + col1.head._2._2._2)  //3.5, 5.2