#scala
Вопрос:
У меня есть следующий массив массивов, представляющий цикл на графике, который я хочу распечатать в приведенном ниже формате.
scalagt; result.collect Array[Array[Long]] = Array(Array(0, 1, 4, 0), Array(1, 5, 2, 1), Array(1, 4, 0, 1), Array(2, 3, 5, 2), Array(2, 1, 5, 2), Array(3, 5, 2, 3), Array(4, 0, 1, 4), Array(5, 2, 3, 5), Array(5, 2, 1, 5))
0:0-gt;1-gt;4; 1:1-gt;5-gt;2;1-gt;4-gt;0; 2:2-gt;3-gt;5;2-gt;1-gt;5; 3:3-gt;5-gt;2; 4:4-gt;0-gt;1; 5:5-gt;2-gt;3;5-gt;2-gt;1;
Как я могу это сделать? Я пытался выполнить цикл for с операторами if, как и на других языках кодирования, но ifs scala в циклах for предназначены для фильтрации и не могут использовать if/else для учета двух разных критериев.
пример кода на python
for (array,i) in enumerate(range(0,result.length)): if array[i] == array[i 1]: //print thing needed else: // print other thing
Я также попытался сделать result.groupBy, чтобы упростить печать, но это разрушает массивы.
Array[(Long, Iterable[Array[Long]])] = Array((4,CompactBuffer([J@3677a08a)), (0,CompactBuffer([J@695fd7e)), (1,CompactBuffer([J@50b0f441, [J@142efc4d)), (3,CompactBuffer([J@1fd66db2)), (5,CompactBuffer([J@36811d3b, [J@61c4f556)), (2,CompactBuffer([J@2eba1b7, [J@2efcf7a5)))
Есть ли способ красиво распечатать вывод, необходимый в Scala?
Ответ №1:
Это должно сделать это:
result .groupBy(_.head) .toArray .sortBy(_._1) .map { case (node, cycles) =gt; val paths = cycles.map { cycle =gt; cycle .init // drop last node .mkString("-gt;") } s"$node:${paths.mkString(";")}" } .mkString(";n")
Это выходные данные для предоставленного вами образца ввода:
0:0-gt;1-gt;4; 1:1-gt;5-gt;2;1-gt;4-gt;0; 2:2-gt;3-gt;5;2-gt;1-gt;5; 3:3-gt;5-gt;2; 4:4-gt;0-gt;1; 5:5-gt;2-gt;3;5-gt;2-gt;1