2012-07-17 22 views
6

que tienen una serie de matrices de tipo String, que se ve algo como:Filtrado matrices vacías de matriz de matrices en Scala

[[""],["lorem ipsum", "foo", "bar"], [""], ["foo"]] 

Lo que me gustaría hacer es filtrar todos los elementos de la matriz que son en sí mismos una matriz vacía (donde en este caso, por "conjunto vacío", me refiero a las matrices que contienen sólo una cadena vacía), que me deje solo con:

[["lorem ipsum", "foo", "bar"], ["foo"]] 

Sin embargo estoy luchando para encontrar una forma de hacer esto (aún nueva para Scala), ¡cualquier ayuda muy apreciada!

Gracias.

+5

Pero ellos no están vacías; contienen una cadena de –

+0

Disculpas, esa es mi mala redacción. Voy a enmendar mi pregunta para aclarar. –

Respuesta

16

Editar (con la simplificación de Rogach):

array.filterNot(_.forall(_.isEmpty)) 
+1

Creo que x.isEmpty no es necesario aquí - si 'x' está realmente vacío,' x.forall (_. IsEmpty) 'todavía devolverá verdadero. – Rogach

+0

Gracias por la pista, Rogach. Estás absolutamente en lo correcto. Incorporé tu sugerencia en la respuesta. –

0

En su descripción se pregunte cómo

filtran todos los elementos de la matriz que contienen ... simplemente una cadena vacía .

La respuesta aceptada actualmente hace esto, pero también filtra las matrices vacías, y las matrices que contienen múltiples cadenas vacías (es decir, no sólo [""], pero [] y ["", "", ""] etc., así. (De hecho, la primera parte es x.isEmpty || completamente redundante.) Traducción de su requerimiento, literalmente, si la matriz es xss, necesita

xss.filter(_ != Array("")) // does not work! 

Esto no funciona porque el método equals para arrays de Java doesn't work as you might expect. en cambio, al comparar matrices, utilice cualquiera sameElements o deep:

xss.filterNot(_ sameElements Seq("")) 

xss.filter(_.deep != Seq("")) 

En el código Scala idiomáticas no se utiliza de Array mucho, por lo que este no cultivo con demasiada frecuencia. Prefiera Vector o List.

-1

Usar la siguiente:

val a = Array(Array(), Array(), Array(3,1,2016), Array(1,2,3026)) 

a.filter(_.length>0) 
+0

Formatee su código de acuerdo con las directrices de este sitio (ya sea incluyéndolo en las comillas inversas o sangrándolo de un número adecuado de espacios) para que aparezca en una fuente de espacio simple sobre un fondo gris. Además, intente aplicar su solución a la entrada dada y demuestre que produce la salida deseada. Bienvenido a este sitio! – Dario

+0

muchas gracias, es mi primera vez para confirmar la respuesta, seré mejor la próxima vez; – tuitui

+0

@tuitui Puede editar su respuesta a través del pequeño texto de "edición" que se encuentra debajo. Haré esto por el momento, sin embargo. – AJFarmar

0

En su caso, podría utilizar:

array.filterNot(_.corresponds(Array("")){_ == _}) 
Cuestiones relacionadas