Ich habe für ein ähnliches Verfahren wie String.split in Scala Array suchen, aber ich habe nicht in der Lage gewesen, es zu finden.Scala: für eine schöne Art und Weise der Suche um ein Array zu spalten
Hallo alle, was ich tun möchte, ist ein Array durch ein Trennzeichen zu teilen.
beispielsweise die folgende Anordnung trennt:
val array = Array('a', 'b', '\n', 'c', 'd', 'e', '\n', 'g', '\n')
unter Verwendung des '\ n' Separators sollte ergeben:
List(Array(a, b), Array(c, d, e), Array(g))
Ich weiß, dass ich das Array String umwandeln kann, und Anwenden teilen dort:
array.mkString.split('\n').map(_.toArray)
aber ich würde es vorziehen, die Konvertierung zu überspringen.
Die Lösung, die ich bisher habe beinhaltet Spanne mit rekursiv und ist ein bisschen zu vorformulierten:
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
}
Ich bin sicher, dass es etwas in Scala sein muss ich fehle. Irgendeine Idee?
Dank, Ruben
Sind irgendwelche der gewundenen es wirklich wert angebotenen Lösungen umfassen die Erstellung der String Zwischen zu vermeiden ?? Zum Beispiel wird das Aufrufen von & ldquor; Schwanz "und dergleichen in einem Array bewirken, dass das Array über eine implizite Konvertierung und ein neues erzeugtes Array gewickelt wird. Jedes Funktionsliteral, das an einen HOF übergeben wird, erfordert das Laden und Instanziieren einer Klasse. Durch das Zippen zweier Sequenzen wird ein Tuple2 für jedes Elementelement erstellt. Ich bezweifle, dass eine der anderen Techniken wirklich weniger Overhead haben wird als die nette elegante 'array.mkString.split ('\ n'). Map (_. ToArray)'. –
Sicher, wenn das Array immer eine Reihe von Zeichen ist, ist das so gut wie es geht. Aber ich denke, die meisten Antworten gehen davon aus, dass ein generischer "Split" erwünscht ist. 'Array [Int]' für einen wird eindeutig mit 'mkString' brechen:' Array (123, 0, 10, 456, 20) .mkString.split ('0') ', und es zu reparieren ist verpflichtet, hacky zu sein. – Faiz
Vielen Dank für Ihre Antworten. Aus meiner Sicht ist die 'mkString.split'-Option die beste Option, aber, wie Faiz sagte, solange das Array eines von Strings (oder Chars) ist. Ansonsten sieht jede der hier geposteten Lösungen gut aus (außer meiner, die furchtbar schlecht funktioniert) – Ruben