2013-01-24 38 views
11

Đây có phải là cách tiếp cận có thể chấp nhận được để xóa nhiều loại ký tự khỏi chuỗi hoặc có cách tốt hơn (hiệu quả hơn) không? Các "ilr".contains(_) bit cảm thấy một chút như gian lận xem xét nó sẽ được thực hiện cho mỗi và mọi nhân vật, nhưng sau đó một lần nữa, có lẽ đây là cách đúng. Có cách nào nhanh hơn hoặc hiệu quả hơn để thực hiện việc này không?Xóa nhiều loại ký tự khỏi một chuỗi

val sentence = "Twinkle twinkle little star, oh I wander what you are" 

val words = sentence.filter(!"ilr".contains(_)) 

// Result: "Twnke twnke tte sta, oh I wande what you ae" 

Trả lời

25

Sẽ không có sự khác biệt đáng kể vì chỉ có 3 ký tự để loại bỏ và không có chuỗi quá lớn để lọc, nhưng bạn có thể cân nhắc sử dụng Đặt cho mục đích này. Ví dụ.

val toRemove = "ilr".toSet 
val words = sentence.filterNot(toRemove) 
25

Tôi chỉ muốn sử dụng Java tốt cũ replaceAll (phải mất một regexp):

"Twinkle twinkle little star, oh I wander what you are" replaceAll ("[ilr]", "") 
// res0: String = Twnke twnke tte sta, oh I wande what you ae 

Ngược lại được làm việc với char s (như trong lọc một Seq[Char]), sử dụng biểu thức thông thường nên Unicode an toàn ngay cả khi bạn đang làm việc với các điểm mã bên ngoài mặt phẳng đa ngôn ngữ cơ bản. "There Ain't No Such Thing As Plain Text."

+1

+1 Cảm ơn, tôi vẫn quên cách Java đóng. – Jack

+0

Bạn có thể có một điểm trên "bên ngoài BMP". Nhưng nếu bạn quan tâm, bạn tốt hơn có được thử nghiệm bận rộn - có * gần như * không có điều như phần mềm Java an toàn BMP (http://stackoverflow.com/a/2533118/53974). May mắn thay, SDK rõ ràng là một ngoại lệ, nếu bạn sử dụng đúng API - và regexps nằm trong số các API được ưu tiên. http://www.oracle.com/us/technologies/java/supplementary-142654.html – Blaisorblade

Các vấn đề liên quan