Ich versuche, ein int-Array in Java umzukehren.
Diese Methode kehrt das Array nicht um.
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
Was ist daran falsch?
Antworten:
Um ein int-Array umzukehren, tauschen Sie Elemente wie folgt aus, bis Sie den Mittelpunkt erreichen:
So wie Sie es tun, tauschen Sie jedes Element zweimal aus, sodass das Ergebnis mit der ursprünglichen Liste übereinstimmt.
quelle
validData.length / 2
Teil außerhalb der for-Schleife platzieren.validData.length >> 1
. Das ist gleichwertig und schneller, aber es verwirrt viele Programmierer und jeder gute Compiler wird das automatisch tun.validData.length - i - 1
und in einer Variablen speichern.Mit Commons.Lang können Sie einfach verwenden
In den meisten Fällen ist es schneller und fehlerfreier, sich an leicht verfügbare Bibliotheken zu halten, die bereits auf Einheiten getestet und vom Benutzer getestet wurden, wenn sie sich um Ihr Problem kümmern.
quelle
quelle
int
in diesem Fall) in ihre jeweiligen Umbruchzeichen (Integer
in diesem Fall) eingeschlossen und in die Liste aufgenommen. Sie sehen,Integer
s sind Objekte. @ Tomint[]
ist anders alsInteger[]
. Probieren Sie es aus :Integer[] array = new int[5]
. Sie erhalten einen Kompilierungsfehler. Aus diesem GrundArrays
definiert die Java- Klasse eine Reihe von Methoden für die Arbeit mit primitiven Arrays. Der Versuch, eineint[]
an die obige Methode zu übergeben, führt zu so etwas wieThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip - Ein In-Place-Algorithmus benötigt weniger Speicher und läuft schneller.Arrays.asList()
verweist weder auf das ursprüngliche Array noch auf das zurückgegebene Array. Dies ist eines der Probleme bei dieser Methode: Sie verwendet den dreifachen Speicher und verdreifacht die Arbeit als In-Place-Algorithmus.int[]
dieser Methode einfach kein Argument übergeben ( "inkompatible Typen: int [] kann nicht in Object [] konvertiert werden" ).java.util.Collections.reverse()
kannjava.util.List
s umkehren undjava.util.Arrays.asList()
gibt eine Liste zurück, die das spezifische Array umschließt, das Sie an es übergeben, und wird daheryourArray
nach dem Aufruf von umgekehrtCollections.reverse()
.Die Kosten sind nur die Erstellung eines Listenobjekts und es sind keine zusätzlichen Bibliotheken erforderlich.
Eine ähnliche Lösung wurde in der Antwort von Tarik und ihren Kommentatoren vorgestellt, aber ich denke, diese Antwort wäre prägnanter und leichter zu analysieren.
quelle
int[]
an übergeben,asList(...)
wird nicht einList<Integer>
, sondern ein a zurückgegebenList<int[]>
, das ein Element enthält. Es gibt AFAICS keine einfache integrierte Möglichkeit, einint[]
in ein zu konvertierenInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
oderArrays.stream(arr).boxed().toArray(Integer[]::new)
Ich denke, es ist ein bisschen einfacher, der Logik des Algorithmus zu folgen, wenn Sie explizite Variablen deklarieren, um die Indizes zu verfolgen, die Sie bei jeder Iteration der Schleife austauschen.
Ich denke auch, dass es besser lesbar ist, dies in einer while-Schleife zu tun.
quelle
Hier gibt es bereits viele Antworten, die sich hauptsächlich auf die Änderung des Arrays vor Ort konzentrieren. Der Vollständigkeit halber gibt es hier einen anderen Ansatz, bei dem Java-Streams verwendet werden, um das ursprüngliche Array beizubehalten und ein neues umgekehrtes Array zu erstellen:
quelle
Mit Guave:
quelle
asList
Methoden wird eine Ansicht erstellt , die direkt in das Hintergrundarray (primitiv) schreibt. Ich denke, der Down-Wähler hier hat fälschlicherweise gedacht, dass dies eine Box-Liste oder so etwas zurückgibt.Collections.reverse
ist eine ungültige Methode. Dies funktioniert direkt an einer internen Guava-Klasse, die eine umschließtint[]
(Da darin niemals eine Liste von BoxenInteger
gespeichert wird, würde ich die Klasse nicht als "Boxed List", sondern als "Listenansicht eines Arrays" bezeichnen). Aber ja, es funktioniert über eine Schnittstelle, dieInteger
Objekte weitergibt, so dass dies, wie erwähnt, eine Menge temporärer Objektabwanderung und Boxen verursachen würde. Probieren Sie eineIntStream
oder eine Bibliothek mit primitiven Sammlungen aus, um herauszufinden, wo Leistung wichtig ist. (Trove, Koloboke, Eclipse Collections, ...)Im Fall von Java 8 können wir
IntStream
das Array von Ganzzahlen auch wie folgt umkehren:quelle
Einfach für Schleife!
quelle
start <= end
zustart < end
Das wird dir helfen
quelle
quelle
So würde ich es persönlich lösen. Der Grund für die Erstellung der parametrisierten Methode besteht darin, dass jedes Array sortiert werden kann - nicht nur Ihre Ganzzahlen.
Ich hoffe du lernst etwas daraus.
quelle
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
ist nur ein Wrapper um das Array, daher wird das ursprüngliche Array umgekehrt.Ihr Programm funktioniert nur für
length = 0, 1
. Du kannst es versuchen :quelle
Wenn Sie mit Daten arbeiten, die primitiver sind (z. B. char, byte, int usw.), können Sie einige unterhaltsame XOR-Operationen ausführen.
quelle
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Am effizientesten ist es, das Array einfach rückwärts zu iterieren.
Ich bin mir nicht sicher, ob Aarons Lösung dies tut.
Collections.reverse(list);
Weiß jemand Bescheid?quelle
quelle
quelle
Wäre es nicht viel unwahrscheinlicher, dies auf diese Weise zu tun?
quelle
Lösung mit o (n) Zeitkomplexität und o (1) Raumkomplexität.
quelle
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 Möglichkeiten, ein Array umzukehren.
Verwenden Sie die For-Schleife und tauschen Sie die Elemente bis zum Mittelpunkt mit der Zeitkomplexität von O (n / 2) aus.
}}
Verwenden der integrierten Funktion (Collections.reverse ())
}}
Ausgabe: [6, 5, 4, 3, 2, 1]
quelle
Ints
?Unten finden Sie das vollständige Programm, das auf Ihrem Computer ausgeführt werden soll.
Für Programme auf Matrix, die Arrays verwenden, ist dies die gute Quelle. Gehen Sie über den Link.
quelle
Wenn Sie die XOR-Lösung verwenden, um die temporäre Variable zu vermeiden, sollte Ihr Code aussehen
Siehe diesen Link für eine bessere Erklärung:
http://betterexplained.com/articles/swap-two-variables-using-xor/
quelle
quelle
Hier ist eine einfache Implementierung zum Umkehren eines Arrays eines beliebigen Typs sowie vollständige / teilweise Unterstützung.
Hier ist der entsprechende Unit Test
quelle
Folgendes habe ich mir ausgedacht:
quelle
Es gibt zwei Möglichkeiten, eine Lösung für das Problem zu finden:
1. Kehren Sie ein Array im Raum um.
Schritt 1. Tauschen Sie die Elemente am Anfangs- und am Endindex aus.
Schritt 2. Inkrementieren Sie den Startindex. Verringern Sie den Endindex.
Schritt 3. Wiederholen Sie Schritt 1 und Schritt 2 bis zum Startindex <Endindex
Hierzu beträgt die zeitliche Komplexität O (n) und die räumliche Komplexität O (1).
Der Beispielcode zum Umkehren eines Arrays im Raum lautet wie folgt:
2. Kehren Sie ein Array mit einem Hilfsarray um.
Schritt 1. Erstellen Sie ein neues Array mit einer Größe, die dem angegebenen Array entspricht.
Schritt 2. Fügen Sie Elemente ab dem Startindex und ab dem Endindex in das neue Array ein.
Hierzu beträgt die zeitliche Komplexität O (n) und die räumliche Komplexität O (n).
Der Beispielcode zum Umkehren eines Arrays mit einem Hilfsarray lautet wie folgt:
Dazu können wir auch die Collections-API von Java verwenden.
Die Collections-API verwendet intern denselben Reverse-in-Space-Ansatz.
Der Beispielcode für die Verwendung der Collections-API lautet wie folgt:
quelle
quelle
quelle
quelle
Es gibt einige großartige Antworten oben, aber so habe ich es gemacht:
quelle