một chút dài dòng, nhưng nó hoạt động:
KHÔNG DÙNG NỮA VERSION: (nó có lỗi, hãy để lại lỗi ở đây vì bạn đã chấp nhận câu trả lời)
def f(s: String, l: List[String], g: (String, List[String]) => Int) = {
for {
t <- l
if (s.contains(t))
w = s.drop(s.indexOf(t) + t.length)
} yield (t, w.dropRight(w.length - g(w, l)))
}
def h(s: String, x: String) = if (s.contains(x)) s.indexOf(x) else s.length
def g(s: String, l: List[String]): Int = l match {
case Nil => s.length
case x :: xs => math.min(h(s, x), g(s, xs))
}
val l = List("Car", "Red", "Boo", "Foo")
val s = "Car foerjfpoekrfopekf Red ezokdpzkdpoedkzopke dekpzodk Foo azdkpodkzed"
đầu ra:
f(s, l, g).foreach(println)
> (Car, foerjfpoekrfopekf)
> (Red, ezokdpzkdpoedkzopke dekpzodk)
> (Foo, azdkpodkzed)
nó trả Array[String]
thay vì danh sách. nhưng bạn cũng có thể làm như vậy: f(s, l, g).toList
CHỈNH SỬA: chỉ nhận thấy mã này là tốt nếu dấu phân tách chỉ xuất hiện một lần trong chuỗi. nếu đã xác định s
như sau:
val s = "Car foerjfpoekrfopekf Red ezokdpzkdpoedkzopke dekpzodk Foo azdkpodkzed Car more..."
tôi vẫn nhận được kết quả tương tự, thay vì cặp khác ("Car"," more...")
EDIT # 2: BUGLESS VERSION đây là đoạn cố định:
def h(s: String, x: String) = if (s.contains(x)) s.indexOf(x) else s.length
def multiSplit(str: String, delimiters: List[String]): List[(String, String)] = {
val del = nextDelimiter(str, delimiters)
del._1 match {
case None => Nil
case Some(x) => {
val tmp = str.drop(x.length)
val current = tmp.dropRight(tmp.length - nextDelIndex(tmp,delimiters))
(x, current) :: multiSplit(str.drop(x.length + current.length), delimiters)
}
}
}
def nextDelIndex(s: String, l: List[String]): Int = l match {
case Nil => s.length
case x :: xs => math.min(h(s, x), nextDelIndex(s, xs))
}
def nextDelimiter(str: String, delimiters: List[String]): (Option[String], Int) = delimiters match {
case Nil => (None, -1)
case x :: xs => {
val next = nextDelimiter(str, xs)
if (str.contains(x)) {
val i = str.indexOf(x)
next._1 match {
case None => (Some(x), i)
case _ => if (next._2 < i) next else (Some(x), i)
}
} else next
}
}
đầu ra:
multiSplit(s, l).foreach(println)
> (Car, foerjfpoekrfopekf)
> (Red, ezokdpzkdpoedkzopke dekpzodk)
> (Foo, azdkpodkzed)
> (Car, more...)
và bây giờ nó hoạt động :)
cảm ơn bạn rất nhiều! đây là chính xác những gì tôi đã cố gắng để làm – Roch
không có vấn đề ...Tôi thực sự thích nó :) –
đó là khủng khiếp để đọc và - như đã được chứng minh - lỗi dễ bị –