Tôi đã tìm kiếm một phương pháp tương tự như String.split trong Scala Array, nhưng tôi không thể tìm thấy nó.Scala: Tìm kiếm một cách tốt đẹp để tách mảng
Xin chào tất cả, điều tôi muốn làm là chia mảng bằng dấu phân cách.
Ví dụ, tách các mảng sau:
val array = Array('a', 'b', '\n', 'c', 'd', 'e', '\n', 'g', '\n')
bằng cách sử dụng '\ n' tách, nên kết quả trong:
List(Array(a, b), Array(c, d, e), Array(g))
tôi biết rằng tôi có thể chuyển đổi các Array String, và áp dụng chia ở đó:
array.mkString.split('\n').map(_.toArray)
nhưng tôi muốn bỏ qua chuyển đổi.
Các giải pháp tôi có cho đến nay liên quan đến việc sử dụng khoảng đệ quy và là một chút quá soạn sẵn:
def splitArray[T](array: Array[T], separator: T): List[Array[T]] = {
def spanRec(array: Array[T], aggResult: List[Array[T]]): List[Array[T]] = {
val (firstElement, restOfArray) = array.span(_ != separator)
if (firstElement.isEmpty) aggResult
else spanRec(restOfArray.dropWhile(_ == separator), firstElement :: aggResult)
}
spanRec(array, List()).reverse
}
Tôi chắc chắn phải có một cái gì đó trong Scala tôi đang thiếu. Bất kỳ ý tưởng?
cảm ơn, Ruben
Are bất kỳ trong những giải pháp phức tạp chìa thực sự giá trị nó để tránh tạo ra các chuỗi trung gian ?? Ví dụ, gọi 'đuôi' và như vậy trên một mảng sẽ làm cho mảng được bao bọc thông qua một chuyển đổi ngầm định và một mảng mới được tạo ra. Mỗi hàm hàm được truyền vào một HOF yêu cầu một lớp được nạp và khởi tạo. Việc nén hai chuỗi tạo một Tuple2 cho mỗi cặp phần tử. Tôi có xu hướng nghi ngờ bất kỳ kỹ thuật nào khác thực sự sẽ có ít chi phí hơn so với 'array.mkString.split ('\ n') thanh lịch đẹp đẽ' map (_. ToArray) '. –
Chắc chắn, nếu mảng luôn luôn là một loạt các ký tự, đó là tốt như nó được. Nhưng tôi nghĩ rằng hầu hết các câu trả lời đều giả định rằng một 'chia tách' chung là cần thiết. 'Array [Int]' cho một sẽ rõ ràng phá vỡ với 'mkString':' Array (123, 0, 10, 456, 20) .mkString.split ('0') ', và sửa chữa nó là ràng buộc để được hacky. – Faiz
Cảm ơn rất nhiều câu trả lời của bạn. Theo quan điểm của tôi, tùy chọn 'mkString.split' là tùy chọn tốt nhất, nhưng, như Faiz đã nói, miễn là Mảng là một trong các Chuỗi (hoặc Chars). Nếu không, bất kỳ giải pháp nào được đăng ở đây có vẻ đẹp (ngoại trừ của tôi, điều đó thực sự tệ hại) – Ruben