2012-07-17 42 views
6

Tôi có một mảng của mảng kiểu String, mà trông giống như sau:lọc mảng trống từ mảng của mảng trong Scala

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

Những gì tôi muốn làm là lọc ra tất cả các yếu tố trong mảng mà bản thân một mảng rỗng (nơi trong trường hợp này, bởi "mảng trống rỗng", ý tôi là mảng có chứa chỉ là một chuỗi rỗng) là, để lại cho tôi chỉ với:

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

Tuy nhiên tôi đang đấu tranh để tìm thấy một cách để làm điều này (vẫn còn mới để Scala) - bất kỳ giúp đỡ nhiều đánh giá cao!

Cảm ơn.

+5

Nhưng họ không rỗng; chúng chứa một chuỗi các lời xin lỗi là –

+0

, đó là cách nói sai lầm của tôi về nó. Tôi sẽ sửa đổi câu hỏi của mình để làm rõ. –

Trả lời

16

Chỉnh sửa (với đơn giản hóa Rogach của):

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

Tôi tin rằng x.isEmpty là không cần thiết ở đây - nếu 'x' thực sự là rỗng,' x.forall (_. IsEmpty) 'vẫn sẽ trả về true. – Rogach

+0

Cảm ơn gợi ý, Rogach. Bạn hoàn toàn đúng. Tôi kết hợp đề xuất của bạn trong câu trả lời. –

0

Trong mô tả của bạn, bạn hỏi làm thế nào để

lọc ra tất cả các yếu tố trong mảng đó ... chỉ chứa một chuỗi rỗng .

Câu trả lời hiện đang chấp nhận thực hiện điều này, mà còn lọc ra các mảng trống rỗng, và mảng chứa nhiều chuỗi rỗng (tức là không chỉ [""], nhưng []["", "", ""] vv cũng. (Trong thực tế, phần đầu tiên x.isEmpty || là hoàn toàn không cần thiết.) Dịch yêu cầu của bạn theo nghĩa đen, nếu mảng của bạn là xss, bạn cần

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

này không làm việc vì các phương pháp equals cho mảng Java doesn't work as you might expect. Thay vào đó, khi so sánh mảng, sử dụng hoặc 0.123.hoặc deep:

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

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

Trong mã Scala idomatic bạn không sử dụng Array nhiều, vì vậy điều này không nảy sinh quá thường xuyên. Ưu tiên Vector hoặc List.

-1

Sử dụng như sau:

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

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

Vui lòng định dạng mã của bạn accroding theo nguyên tắc của trang web này (bao gồm nó trong backquotes hoặc indenting nó của một số thích hợp của không gian) để nó xuất hiện trong một phông chữ monospaced trên một nền màu xám. Ngoài ra, hãy thử áp dụng giải pháp của bạn cho đầu vào đã cho và cho thấy rằng nó tạo ra kết quả mong muốn. Chào mừng bạn đến với trang web này! – Dario

+0

cảm ơn rất nhiều , đây là lần đầu tiên tôi thực hiện câu trả lời , tôi sẽ tốt hơn vào lần sau; – tuitui

+0

@tuitui Bạn có thể chỉnh sửa câu trả lời của mình thông qua văn bản "chỉnh sửa" nhỏ bên dưới. Tôi sẽ làm điều này cho thời điểm này, tuy nhiên. – AJFarmar

0

Trong trường hợp của bạn, bạn có thể sử dụng:

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