Scala Ersatz für Arrays.binarysearch-Methode?
Gibt es einen Ersatz in der Scala für die Java int Arrays.binarySearch(Object[] array, object)
?
Das problem ist, dass Scala-Arrays sind keine kovariante, also müsste ich ließ meine stringArray: Array[String]
wie das erste:
stringArray.asInstanceOf[Array[Object]]
Gibt es eine bessere Lösung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es noch nichts gebaut, soweit ich weiß, aber Sie können die pimp-my-library-pattern dies zu erreichen, relativ leicht. Etwa so:
Können Sie die anderen
java.util.Arrays
Objekt-Methoden in der gleichen Klasse, wenn Sie brauchen Sie auch.Im Allgemeinen finde ich es eine gute Idee, um früher immer beim importieren einer Sammlung Ihrer Lieblings-Scala-Dienstprogramme. Es ist so leicht, die Funktionalität hinzufügen, wie diese, können Sie auch tun es in der Regel eher halten als Eingabe
.asInstanceOf[Array[AnyRef]]
, und mit ein wenig Mühe können Sie es sich deutlich produktiver.def indexOf (elem: A, from: Int) : Int
sollte dies nicht benehmen wie die binarysearch-Methode (obwohl vielleicht langsamer?)binarySearch
hängt davon ab, SchlüsselComparable
. Wenn ich mich Recht erinnere, Java gerade CASTET und gibt einen Laufzeit-Fehler, das ist nicht die Art von Sache, die wir wollen, aus der Scala. Außerdem funktioniert es nur auf Sammlungen, die sind bestellt, die, wieder, kann nicht statisch durchgesetzt, im moment, ohne eine explosion in der Anzahl der Klassen (es wurden Ideen).binarySearch
hängt davon ab, die ElementeComparable
, sollten wir nicht fügen Sie eine Einschränkung wieT <: Comparable[T]
?Scala 2.11 Hinzugefügt
scala.Sammlung.Suchen
der standard-Bibliothek. Es nutzt binäre Suche für indizierte Sequenzen und lineare Suche sonst.search
. Das ist, wenn man sich aufsearch
auf eine Sequenz, die nicht sortiert ist, sind die Ergebnisse undefiniert.Collections.binarySearch
(oderArrays.binarySearch
), wenn das element ist nicht vorhanden in der Sammlung. Java gibt-1 -insertionPoint
, während Scala gibt eine index - > 0. So, auf der Suche nach3
im[1, 2, 4, 5]
zurückkehren würde-3
in Java und2
im Scala. Ich persönlich bevorzuge die Java-return Wert, da ich unterscheiden kann zwischen dem element vorhanden vs nicht vorhanden in der Liste.SearchResult
zurückgegeben wird, ist entweder einFound
oder eineInsertionPoint
. Verwenden Sie einematch
zu sagen, welcher Fall es ist, und das in beiden Fällen wird explizit für jeden zu Lesen den code.Either
Typ wäre besser gewesen, IMO. Es ist auch nicht dokumentiert, was einem zurückgegeben wird, wenn es eine übereinstimmung gibt unter Duplikate. Nach einem Blick auf den source-code, es scheint willkürlich.Arrays sind lustige Tiere. Wenn Sie versuchen, den code in dem Beispiel mit 'ObjectArrayTools' mit diesem:
Erhalten Sie
Was ist Los mit Arrays in Scala finden Sie dieses Dokument. In jedem Fall können Sie diesen code verwenden, statt, obwohl es nutzt Seq anstelle von Array. Aber es hat den zusätzlichen bonus von mit einer Bestellung (das passiert einfach so, um auch ein Java-Komparator. So können Sie die bestellten Verhalten, wenn nötig.)
Einige Beispiele:
Collections.binarySearch
überprüft, ob die zur Verfügung gestellten Liste implementiert RandomAccess-Schnittstelle ("Wenn die angegebene Liste nicht implementiert das interface RandomAccess und ist groß, diese Methode wird eine iterator-basierte binäre Suche ausführt, die O(n) link traversalen und O(log n) element-Vergleiche."). Keiner der Listen, die zur Verfügung gestellt von JavaConverters die diese Schnittstelle implementiert. (docs.oracle.com/javase/7/docs/api/java/util/...)scala.collection.Searching
im 2.11. Also anstatt die Sie verwenden könnten:import scala.collection.Searching._; Array(1, 2, 3, 4, 5).search(3)
Es nicht schwer, nur schreiben Sie es in scala
Schon einige Jahre her, seit diese Frage stellte, dachte machen Sie einige Vergleich test, ich hoffe, es kann einigen helfen sich zu entscheiden:
Dem Ergebnis nach 3 Läufen (als Scala-compiler wirklich brauchen einige boost)
Im Allgemeine java-binäre Suche durchgeführt, so besser; während scala Suche habe ziemlich schlecht. Es war auch noch eine spürbare performance, es scheint, dass generische Typisierung implizit zieht die Leistung hier schlecht(vielleicht kann jemand helfen, fix der generische Typ)...aber, indirekt zeigt es eine große Auswirkung auf die Leistung.
@moshe-beeri
Wenn Sie im Begriff waren, es zu schreiben, in der Scala, warum würden Sie schreiben es in Java in Scala? Warum eigentlich nicht schreiben Sie es in Scala aus?