代码之家  ›  专栏  ›  技术社区  ›  agusgambina

网格中的Scala组元素

  •  1
  • agusgambina  · 技术社区  · 6 年前

    我正在尝试将一个序列的元素分组到网格中。我有81个元素。

    |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |
    |  9  | 10  | 11  | 12  | 13  | 14  | 15  | 16  | 17  |
    | 18  | 19  | 20  | 21  | 22  | 23  | 24  | 25  | 26  |
    | 27  | 28  | 29  | 30  | 31  | 32  | 33  | 34  | 35  |
    | 36  | 37  | 38  | 39  | 40  | 41  | 42  | 43  | 44  |
    | 45  | 46  | 47  | 48  | 49  | 50  | 51  | 52  | 53  |
    | 54  | 55  | 56  | 57  | 58  | 59  | 60  | 61  | 62  |
    | 63  | 64  | 65  | 66  | 67  | 68  | 69  | 70  | 71  |
    | 72  | 73  | 74  | 75  | 76  | 77  | 78  | 79  | 80  |
    

    我想把它们按3x3的网格这样分组

    |  0  |  1  |  2  |
    |  9  | 10  | 11  |
    | 18  | 19  | 20  |
    

    我正在测试这个,我有一个输入

    val input = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80"
    

    然后我分析输入

    val parsed = input.split(",").toList.map { x => x.trim }
    

    然后我将元素分组

    val groups = parsed.grouped(3).toList
    

    val grids1 = groups.sliding(1,3).toList.grouped(3).toList.flatten.flatten.grouped(3).toList
    

    但是我不知道怎么才能得到其他的专栏

    3 回复  |  直到 6 年前
        1
  •  1
  •   Raman Mishra    6 年前
    object solution extends App{
    
      val input = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, " +
        "28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55," +
        " 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80"
    
      val inputList = input.split(",").toList.grouped(9).toList
    .map(_.grouped(3).toList)
    .transpose.flatMap(_.grouped(3).toList)
    
    inputList.foreach(println)
    }
    

    我想你是在找这个。

    //output:
    
        List(List(List(0,  1,  2), List( 9,  10,  11), List( 18,  19,  20)), List(List( 27,  28,  29), List( 36,  37,  38), List( 45,  46,  47)), List(List( 54,  55,  56), List( 63,  64,  65), List( 72,  73,  74)))
    List(List(List( 3,  4,  5), List( 12,  13,  14), List( 21,  22,  23)), List(List( 30,  31,  32), List( 39,  40,  41), List( 48,  49,  50)), List(List( 57,  58,  59), List( 66,  67,  68), List( 75,  76,  77)))
    List(List(List( 6,  7,  8), List( 15,  16,  17), List( 24,  25,  26)), List(List( 33,  34,  35), List( 42,  43,  44), List( 51,  52,  53)), List(List( 60,  61,  62), List( 69,  70,  71), List( 78,  79,  80)))
    

    如果您想要这样的输出:

    List(0,  1,  2,  9,  10,  11,  18,  19,  20)
    List( 27,  28,  29,  36,  37,  38,  45,  46,  47)
    List( 54,  55,  56,  63,  64,  65,  72,  73,  74)
    List( 3,  4,  5,  12,  13,  14,  21,  22,  23)
    List( 30,  31,  32,  39,  40,  41,  48,  49,  50)
    List( 57,  58,  59,  66,  67,  68,  75,  76,  77)
    List( 6,  7,  8,  15,  16,  17,  24,  25,  26)
    List( 33,  34,  35,  42,  43,  44,  51,  52,  53)
    List( 60,  61,  62,  69,  70,  71,  78,  79,  80)
    

    您可以使用:

    inputList.map(_.flatten).foreach(println)
    
        2
  •  1
  •   Xavier Guihot    6 年前

    val input = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80)
    

    然后您可以执行:

    input.zipWithIndex
      .map { case (d, i) => (i % 9 / 3, i / 27, d) } // 28 => (0, 1, 28)
      .groupBy { case (x, y, d) => (x, y) }
      .map { case ((x, y), values) => values.map(_._3) }
    

    List(List(54, 55, 56, 63, 64, 65, 72, 73, 74), List(0, 1, 2, 9, 10, 11, 18, 19, 20), List(6, 7, 8, 15, 16, 17, 24, 25, 26), List(30, 31, 32, 39, 40, 41, 48, 49, 50), List(60, 61, 62, 69, 70, 71, 78, 79, 80), List(27, 28, 29, 36, 37, 38, 45, 46, 47), List(57, 58, 59, 66, 67, 68, 75, 76, 77), List(33, 34, 35, 42, 43, 44, 51, 52, 53), List(3, 4, 5, 12, 13, 14, 21, 22, 23))
    

    管道每一步的细节:

    • zipWithIndex 以获取每个元素的索引(如果元素与索引不同)
    • 对于每个元素,通过(通过模和整数除法)获取其“main column”(列)来准备其集群 0 2 main column 1 ,列 3 5 成为 main column 2 ,…)使用 i % 9 / 3 39 % 9 / 3 = 1 )对于“主要行”使用相同的方法 i / 27 ( 39 / 27 = 1 ).
    • groupBy .
    • 最后我们去掉了“主列/行” (x, y) 只保留带有final的值的信息 map .

    sortBy .

        3
  •  0
  •   curious    6 年前

    这可以通过使用 sliding List

    scala> input.sliding(9, 9).map(_.sliding(3,3).toList).foreach(println)
    List(List(0, 1, 2), List(3, 4, 5), List(6, 7, 8))
    List(List(9, 10, 11), List(12, 13, 14), List(15, 16, 17))
    List(List(18, 19, 20), List(21, 22, 23), List(24, 25, 26))
    List(List(27, 28, 29), List(30, 31, 32), List(33, 34, 35))
    List(List(36, 37, 38), List(39, 40, 41), List(42, 43, 44))
    List(List(45, 46, 47), List(48, 49, 50), List(51, 52, 53))
    List(List(54, 55, 56), List(57, 58, 59), List(60, 61, 62))
    List(List(63, 64, 65), List(66, 67, 68), List(69, 70, 71))
    List(List(72, 73, 74), List(75, 76, 77), List(78, 79, 80))