У меня есть вложенный массив: Array("AA", Array("BB", "CC"), "DD")
. Как я могу преобразовать его в: Array("AA", "BB", "CC", "DD")
в Scala?Как преобразовать вложенный массив в плоский массив?
Спасибо за помощь!
У меня есть вложенный массив: Array("AA", Array("BB", "CC"), "DD")
. Как я могу преобразовать его в: Array("AA", "BB", "CC", "DD")
в Scala?Как преобразовать вложенный массив в плоский массив?
Спасибо за помощь!
Прокрутите через вложенный массив и добавьте все элементы внутри любого вложенного массива в новый плоский массив. затем удалите вложенные массивы и добавьте вновь созданный массив.
Для примера, который вы опубликовали. Прокрутите массив, и вы найдете вложенный массив, содержащий «BB» и «CC», поэтому добавьте «BB» и «CC» к новому массиву (позвоните на него array2). Затем удалите массив, содержащий «BB» и «CC» из исходного вложенного массива. Затем добавьте массив2. Надеюсь, что это помогает
Noooooo, пожалуйста, нет. Это Скала, есть лучшие способы. –
Это, вероятно, будет менее 10 строк кода. Вы также можете использовать каждый элемент вложенного массива как массив из 1 элемента, а затем присоединить каждый массив внутри большего массива. Кроме этого, я не в идеях. Я не знаю каких-либо библиотек, которые будут делать то, что вы хотите, хотя есть вероятность, что есть один из них. – GregH
Прежде всего проверить распознанный тип массива:
scala> val arr = Array("AA", Array("BB", "CC"), "DD")
arr: Array[java.io.Serializable] = Array(AA, Array(BB, CC), DD)
коллекции в Scala имеют один тип для их элементов, так что если вы поставите как строку и массив строк (или массив массива строк) в массиве, вы получите массив с типом элемента, который является самым конкретным типом, который разделяют как String
, так и Array[String]
- в этом случае Serializable
, что довольно бесполезно, поскольку делать что-либо с элементами массива вам придется отдать их другому типу.
Так что лучше не попасть в эту ситуацию в первую очередь. Вы получите гораздо больше миль от системы типов, если вы не смешиваете несвязанные вещи в коллекциях. Тем не менее, если вы абсолютно должны сделать это, вы можете написать что-то вроде следующего:
def flattenStringArrays[A](arr: Array[A]): Array[String] =
arr.flatMap {
case s: String => Array(s)
case a: Array[_] => flattenStringArrays(a)
}
И потом:
scala> flattenStringArrays(arr)
res0: Array[String] = Array(AA, BB, CC, DD)
Или, если вы «знаете» вы будете только когда-либо один уровень от гнездования:
scala> arr.flatMap {
| case s: String => Array(s)
| case a: Array[String] => a
| }
res1: Array[String] = Array(AA, BB, CC, DD)
Но оба эти являются небезопасными и действительно унииоматическими.
array.flatMap {
case x: Array[_] => x
case y => List(y)
}
Ух, я уже дал это точное решение (но без путаного смешивания 'List' и' Array'). –
Это не идеальное решение, но определенно не так плохо, как -1.Правильное решение было бы без «List» –
@TravisBrown, я не читал ваш ответ, прежде чем отвечать, он работает, это коротко, чтобы понизить его только потому, что вы написали что-то подобное, это не очень хорошо, это не гонка. –
Вот моя версия, использующая foldLeft и некоторое соответствие шаблона: (Это не сохраняет исходный порядок)
$ scala
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val container = Array("AA", Array("BB", "CC"), "DD")
container: Array[java.io.Serializable] = Array(AA, Array(BB, CC), DD)
scala> container.foldLeft(Array.empty[String]) { (memo, next) =>
| next match {
| case s: String => s +: memo
| case arr: Array[_] => arr.map(_.toString) ++ memo
| }
| }
res0: Array[String] = Array(DD, BB, CC, AA)
Спасибо за все ответы! Я действительно ценю их. Я заметил, что сделал ошибку. Мои данные выглядят следующим образом: Array ((AA, Array (BB, CC), DD)). Приведенный ниже пример ответа (arr.flatMap) вызовет несоответствие типов. Извините, что я новичок в Scala. Он выглядит как массив кортежей, который содержит вложенный массив. В этом случае мне все еще нужен формат: Array ((AA, BB, CC, DD)). Есть идеи? Большое спасибо! – wdz