Печать конкретных выходных данных в Scala

#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