Có phương pháp API thư viện Scala (và nếu không, một cách thành ngữ) để lấy danh sách tất cả các chỉ mục cho chuỗi con (đích) trong chuỗi lớn hơn (nguồn)? Tôi đã cố gắng xem qua ScalaDoc, nhưng không thể tìm thấy bất cứ điều gì rõ ràng. Có rất nhiều phương pháp làm rất nhiều điều hữu ích, tôi đoán tôi chỉ không gửi các cụm từ tìm kiếm phù hợp. Ví dụ: nếu tôi có một chuỗi nguồn "tên: Yo, tên: Jim, tên: tên, tên: bozo" và tôi sử dụng chuỗi đích của "name:", tôi muốn quay lại Liệt kê [Int] của Danh sách (0, 8, 17, 27).Trả về tất cả các chỉ mục của một chuỗi con cụ thể
Dưới đây là hack nhanh chóng của tôi để giải quyết vấn đề:
def indexesOf(source: String, target: String, index: Int = 0, withinOverlaps: Boolean = false): List[Int] = {
def recursive(index: Int, accumulator: List[Int]): List[Int] = {
if (!(index < source.size)) accumulator
else {
val position = source.indexOf(target, index)
if (position == -1) accumulator
else {
recursive(position + (if (withinOverlaps) 1 else target.size), position :: accumulator)
}
}
}
if (target.size <= source.size) {
if (!source.equals(target)) {
recursive(0, Nil).reverse
}
else List(0)
}
else Nil
}
Bất kỳ hướng dẫn bạn có thể cho tôi thay thế này với một điểm vào thư viện tiêu chuẩn thích hợp sẽ được đánh giá rất nhiều.
CẬP NHẬT 2014/Jul/22:
Lấy cảm hứng từ câu trả lời Siddhartha Dutta, tôi tighted lên mã của tôi. Nó bây giờ trông như thế này:
def indexesOf(source: String, target: String, index: Int = 0, withinOverlaps: Boolean = false): List[Int] = {
@tailrec def recursive(indexTarget: Int, accumulator: List[Int]): List[Int] = {
val position = source.indexOf(target, indexTarget)
if (position == -1) accumulator
else
recursive(position + (if (withinOverlaps) 1 else target.size), position :: accumulator)
}
recursive(index, Nil).reverse
}
Thêm vào đó, nếu tôi có một chuỗi nguồn "aaaaaaaa" và tôi sử dụng một chuỗi mục tiêu của "aa", tôi muốn theo mặc định để lấy lại một danh sách [Int] của Danh sách (0, 2, 4, 6) bỏ qua tìm kiếm bắt đầu bên trong chuỗi con tìm thấy. Mặc định có thể được ghi đè bằng cách chuyển "true" cho tham số withinOverlaps trong trường hợp "aaaaaaaa"/"aa" sẽ trả về Danh sách (0, 1, 2, 3, 4, 5, 6).
Không, đó không phải là "một [chuẩn] phương pháp". Ngoài ra, vì đây là mã hoạt động, nó * có thể * phù hợp hơn để xem xét mã. – user2864740
@ chaotic3quilibrium Bất kỳ cách nào bạn có thể BSD cấp phép phương pháp đó để ông chủ không giận tôi nếu tôi sao chép/điều chỉnh nó? :) – ericpeters
@ericpeters Đó là sự hiểu biết của tôi rằng bất kỳ đoạn mã được đăng ở đây trên StackOverflow có thể được giả định về cơ bản là miền công cộng; tức là không bị cản trở bởi bất kỳ ràng buộc giấy phép nào hạn chế khả năng cắt/dán/sửa đổi/tùy chỉnh đoạn mã của bạn thành bất kỳ ngữ cảnh nào bạn cần. – chaotic3quilibrium