Вы попали на полпути туда.На самом деле, мне было трудно понять, как сделать то, что ты уже сделал.Я немного разбил твой код, чтобы было легче следовать.Кроме того, я сделал array2D
a List
, чтобы мне было проще играть с кодом.: -)
val input = "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25"
val intArray = (input split " " map (_.toInt) toList)
val array2D = (intArray grouped 5 toList)
val sliced = array2D.map(row => row.sliding(3, 1).toList).sliding(3, 1).toList
Итак, у вас есть несколько списков, каждый из которых похож на этот:
List(List(List( 1, 2, 3), List( 2, 3, 4), List( 3, 4, 5)),
List(List( 6, 7, 8), List( 7, 8, 9), List( 8, 9, 10)),
List(List(11, 12, 13), List(12, 13, 14), List(13, 14, 15)))
И вы хотите, чтобы они были такими:
List(List(List(1, 2, 3), List(6, 7, 8), List(11, 12, 13)),
List(List(2, 3, 4), List(7, 8, 9), List(12, 13, 14)),
List(List(3, 4, 5), List(8, 9, 10), List(13, 14, 15)))
Это тебе кажется правильным?Каждый из трех подсписков - это отдельная матрица:
List(List(1, 2, 3), List(6, 7, 8), List(11, 12, 13))
- это
01 02 03
06 07 08
11 12 13
Итак, в основном, вы хотите транспонировать их.Следующий шаг:
val subMatrices = sliced map (_.transpose)
Тип этой вещи List[List[List[Seq[Int]]]]
.Давайте рассмотрим немного ... 2D матрица представлена последовательностью последовательности, поэтому List[Seq[Int]]
соответствует матрице.Скажем:
type Matrix = Seq[Seq[Int]]
val subMatrices: List[List[Matrix]] = sliced map (_.transpose)
Но вам нужен один список матриц, поэтому вы можете сгладить это:
type Matrix = Seq[Seq[Int]]
val subMatrices: List[Matrix] = (sliced map (_.transpose) flatten)
Но, увы, map
плюс flatten
- этоa flatMap
:
type Matrix = Seq[Seq[Int]]
val subMatrices: List[Matrix] = sliced flatMap (_.transpose)
Теперь вам нужны уникальные подматрицы.Это достаточно просто: это набор.
val uniqueSubMatrices = subMatrices.toSet
Или, если вы хотите сохранить результат в виде последовательности,
val uniqueSubMatrices = subMatrices.distinct
И все.Полный код, чтобы проиллюстрировать:
type Matrix = Seq[Seq[Int]]
val input = "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25"
val intArray = (input split " " map (_.toInt) toList)
val array2D: Matrix = (intArray grouped 5 toList)
val sliced: List[List[Matrix]] = (array2D map (row => row sliding 3 toList) sliding 3 toList)
val subMatrices: List[Matrix] = sliced flatMap (_.transpose)
val uniqueSubMatrices: Set[Matrix] = subMatrices.toSet
Его можно записать как одно выражение, но если вы не разбите его на функции, читать его будет ужасно.И вам придется либо использовать прямой канал (|>
, а не в стандартной библиотеке), либо неявно добавить эти функции к типам, на которые они действуют, иначе все равно будет трудно читать.