2012-07-17 16 views
6

Ho un array di array di tipo String, che sembra qualcosa di simile:Filtraggio vuoti array di array di array a Scala

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

Quello che mi piacerebbe fare è filtrare tutti gli elementi della matrice che sono a loro volta una matrice vuota (dove in questo caso, da "array vuoto", voglio dire le matrici che contengono solo una stringa vuota), mi lascia solo con:

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

Comunque io sto lottando per trovare un modo per farlo (ancora nuovo per Scala) - qualsiasi aiuto molto apprezzato!

Grazie.

+5

Ma non sono vuote; contengono uno scuse –

+0

di stringa, quello è il mio povero fraseggio di esso. Modificherò la mia domanda per chiarire. –

risposta

16

Edit (con la semplificazione del Rogach):

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

Credo che x.isEmpty non sia necessario qui - se 'x' è effettivamente vuoto,' x.forall (_. IsEmpty) 'restituirebbe true. – Rogach

+0

Grazie per il suggerimento, Rogach. Hai assolutamente ragione. Ho incorporato il tuo suggerimento nella risposta. –

0

Nella descrizione si chiedono come

filtro fuori tutti gli elementi della matrice che ... contengono solo una stringa vuota .

La risposta attualmente accettato fa questo, ma filtra anche matrici vuote e matrici contenenti più stringhe vuote (cioè non solo [""], ma [] e ["", "", ""] ecc pure. (In realtà, la prima parte è x.isEmpty || completamente ridondante.) Tradurre il vostro requisito letteralmente, se la matrice è xss, è necessario

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

Questo non funziona perché il metodo equals per gli array Java doesn't work as you might expect. al contrario, quando si confrontano array, utilizzare uno 0.123.o deep:

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

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

Nel codice Scala idomatic non si utilizza Array molto, quindi questo non affiorano troppo spesso. Preferire Vector o List.

-1

Usa la seguente:

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

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

Si prega di formattare il codice seguendo le linee guida di questo sito (includendolo in backquote o indentandolo di un numero appropriato di spazi) in modo che appaia in un carattere a spaziatura fissa su uno sfondo grigio. Inoltre, prova ad applicare la tua soluzione all'input dato e mostra che produce l'output desiderato. Benvenuti in questo sito! – Dario

+0

grazie mille, è la prima volta che impegna la risposta, sarò migliore la prossima volta; – tuitui

+0

@tuitui È possibile modificare la risposta tramite il piccolo testo "modifica" sotto di esso. Lo farò per il momento, comunque. – AJFarmar

0

Nel tuo caso, è possibile utilizzare:

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