2015-06-03 7 views
3

У меня есть вложенный массив: Array("AA", Array("BB", "CC"), "DD"). Как я могу преобразовать его в: Array("AA", "BB", "CC", "DD") в Scala?Как преобразовать вложенный массив в плоский массив?

Спасибо за помощь!

+0

Спасибо за все ответы! Я действительно ценю их. Я заметил, что сделал ошибку. Мои данные выглядят следующим образом: Array ((AA, Array (BB, CC), DD)). Приведенный ниже пример ответа (arr.flatMap) вызовет несоответствие типов. Извините, что я новичок в Scala. Он выглядит как массив кортежей, который содержит вложенный массив. В этом случае мне все еще нужен формат: Array ((AA, BB, CC, DD)). Есть идеи? Большое спасибо! – wdz

ответ

-4

Прокрутите через вложенный массив и добавьте все элементы внутри любого вложенного массива в новый плоский массив. затем удалите вложенные массивы и добавьте вновь созданный массив.

Для примера, который вы опубликовали. Прокрутите массив, и вы найдете вложенный массив, содержащий «BB» и «CC», поэтому добавьте «BB» и «CC» к новому массиву (позвоните на него array2). Затем удалите массив, содержащий «BB» и «CC» из исходного вложенного массива. Затем добавьте массив2. Надеюсь, что это помогает

+2

Noooooo, пожалуйста, нет. Это Скала, есть лучшие способы. –

+0

Это, вероятно, будет менее 10 строк кода. Вы также можете использовать каждый элемент вложенного массива как массив из 1 элемента, а затем присоединить каждый массив внутри большего массива. Кроме этого, я не в идеях. Я не знаю каких-либо библиотек, которые будут делать то, что вы хотите, хотя есть вероятность, что есть один из них. – GregH

2

Прежде всего проверить распознанный тип массива:

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) 

Но оба эти являются небезопасными и действительно унииоматическими.

0
array.flatMap { 
    case x: Array[_] => x 
    case y => List(y) 
} 
+0

Ух, я уже дал это точное решение (но без путаного смешивания 'List' и' Array'). –

+0

Это не идеальное решение, но определенно не так плохо, как -1.Правильное решение было бы без «List» –

+0

@TravisBrown, я не читал ваш ответ, прежде чем отвечать, он работает, это коротко, чтобы понизить его только потому, что вы написали что-то подобное, это не очень хорошо, это не гонка. –

-1

Вот моя версия, использующая 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) 
Смежные вопросы