„Rishi, ich freue mich wirklich darauf, etwas über die restlichen Methoden des Arrays-Kurses zu lernen.

„Dieser Lerneifer kann Ihrem alten Lehrer nur gefallen! Aber wenn Sie wirklich alles herausfinden wollen, hilft Ihnen ein freundlicher Zauberer namens Google Tag und Nacht.“

"Äh..."

„Nur ein Scherz. Irgendwie. Natürlich werde ich alles besser erklären, aber wenn sich etwas ergibt, denken Sie an den guten Zauberer. Ich werde die heutige Lektion mit der Arrays.fillMethode beginnen

„Bei der Arbeit mit Arrays müssen Java-Programmierer das Array sehr oft mit demselben Wert füllen. Sie können natürlich eine Schleife schreiben und einfach jeder Zelle des Arrays in der Schleife einen Wert zuweisen:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

„Oder statt all dem können Sie die Arrays.fill()Methode aufrufen, die genau das Gleiche tut: Sie füllt das übergebene Array mit dem übergebenen Wert. So sieht es aus:

Arrays.fill(name, value)

Und der Code im obigen Beispiel kann noch etwas kompakter und übersichtlicher gestaltet werden:

int[] x = new int[100];
Arrays.fill(x, 999);

"Schön!"

„Sie können die Methode auch verwenden, Arrays.fill()um nicht das gesamte Array, sondern einen Teil davon mit einem Wert zu füllen:

Arrays.fill(name, first, last, value)

„Wobei first und last die Indizes der ersten und letzten zu füllenden Zellen sind.

Denken Sie gemäß der guten (oder schlechten) alten Tradition von Java daran, dass das letzte Element nicht im Bereich enthalten ist.

Beispiel:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

Wir füllen die Zellen x[3], x[4], x[5]und x[6]mit dem Wert 999. Zellen eines Arrays werden von Null beginnend nummeriert!

Die strVariable enthält den Wert
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

„Die Arrays.fill()Methode funktioniert nur mit eindimensionalen Arrays. Wenn Sie der Methode ein zweidimensionales Array übergeben, wird es als eindimensional behandelt, mit allen daraus resultierenden Konsequenzen.“

Arrays.copyOf()

„Amigo, sag mir bitte, wie ich die Größe eines Arrays ändern kann, nachdem es erstellt wurde?“

„Ähm... Das ist eine Fangfrage, oder? Ich bin nicht mehr so ​​unerfahren. Die richtige Antwort ist, dass das nicht geht! Man kann die Größe eines Arrays nicht ändern, nachdem es erstellt wurde.“

„Aber was ist, wenn du es wirklich willst?“

„Es ist immer noch unmöglich!

„Eigentlich, wenn du es wirklich willst, dann kannst du es! Mit Hilfe eines Programmiertricks:

  1. Zunächst erstellen Sie ein neues Array mit der gewünschten Länge
  2. Anschließend kopieren Sie alle Elemente aus dem ersten Array hinein.

„Dies sind die beiden Dinge, die die Arrays.copyOf()Methode tut. So sieht der Aufruf aus:

Type[] name2 = Arrays.copyOf(name, length);

„Diese Methode verändert nicht das bestehende Array , sondern erstellt stattdessen ein neues Array und kopiert die Elemente des alten Arrays hinein.“

„Was ist, wenn die Länge des neuen Arrays kleiner ist als die Länge des vorhandenen ?

„Gute Frage, Amigo! Wenn die Elemente nicht passen, werden die zusätzlichen Werte einfach ignoriert.“

„Und wenn es im Gegenteil zusätzliche Zellen gibt, was sind dann ihre Anfangswerte?

„Wenn die Länge des neuen Arrays größer ist als die Länge des alten, werden die Zellen mit Nullen gefüllt.

Beispiel:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


Die str2Variable enthält den Wert. Die Variable enthält den Wert
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

„Und was ist, wenn Sie ein Array der Länge 5 aus einem Array der Länge 10 erhalten möchten, es aber die letzten 5 Elemente und nicht die ersten 5 enthalten muss? In diesem Fall benötigen Sie eine andere Methode der Klasse. Das ist Arrayssie Arrays.copyOfRange(). So sieht der Aufruf aus:

Type[] name2 = Arrays.copyOfRange(name, first, last);

„Diese Methode erstellt ebenfalls ein neues Array, füllt es jedoch mit Elementen von einer beliebigen Stelle im ursprünglichen Array. Wobei „ first “ und „ last“ die Indizes des ersten und letzten Elements sind, die in das neue Array eingefügt werden sollen. Können Sie mir sagen, ob? ist das letzte Element in diesem Bereich enthalten?“

„Ha! Wie mein großer Lehrer immer sagte: ‚ Denken Sie gemäß Javas guter (oder schlechter) alter Tradition daran, dass das letzte Element nicht im Bereich enthalten ist ‘.“

„Amigo, du wächst direkt vor unseren Augen.

Beispiel:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


Die str2Variable enthält den Wert. Die Variable enthält den Wert
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

„Und schließlich habe ich die ... mmm ... angenehmste Methode zum Schluss gelassen: das Sortieren . Arrays werden in der Programmierung ziemlich oft sortiert. Hier sind die drei beliebtesten Aktionen beim Arbeiten mit Arrays:

  • Sortieren eines Arrays
  • Ermitteln des minimalen (oder maximalen) Elements eines Arrays
  • Bestimmen des Index eines Elements in einem Array (Suchen eines Elements in einem Array)

„Gut funktionierende Sortieralgorithmen sind, muss ich sagen, nicht so einfach zu schreiben. Genauer gesagt handelt es sich um eine Standardaufgabe, und als Student wird es einem nicht schaden, das Schreiben von Sortieralgorithmen ab und zu zu üben. Aber bei der Arbeit schon.“ Verschwenden Sie besser nicht Ihre Zeit damit, das Rad neu zu erfinden. Die Entwickler von Java haben die sort()Methode in die ArraysKlasse eingefügt. So sieht der Aufruf aus:

Arrays.sort(name);

Diese Methode sortiert das übergebene Array in aufsteigender Reihenfolge.

Beispiel:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


Die strVariable enthält den Wert
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

„Ausgezeichnet! Ich habe nur eine Methode aufgerufen und das Array ist sortiert. Ein wunderschönes Ding!“

„Übrigens kann man nicht nur das gesamte Array sortieren, sondern auch nur einen Teil davon. So sieht der Aufruf aus:

Arrays.sort(name, first, last);

„Wobei first und last die Indizes der ersten und letzten Zellen sind, die die Sortierung berühren soll. UND…

„Ich weiß bereits, was Sie sagen werden! ‚Denken Sie gemäß Javas guter (oder schlechter) alter Tradition daran, dass das letzte Element nicht im Bereich enthalten ist‘ .

Beispiel:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


Die strVariable enthält den Wert
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

„Um Arrays zu sortieren, verwendet Java den schnellsten Sortieralgorithmus – QuickSort . Seine Rechenkomplexität hängt von der Größe des Arrays ab und wird mit der Formel N log(N) berechnet.

„Das Sortieren eines Arrays aus 1000 Elementen erfordert etwa 10.000 Vergleiche von Array-Elementen. Das Sortieren eines Arrays aus einer Million Elementen erfordert etwa 20 Millionen Vergleiche.“

Nicht zu viele Vergleiche, wenn man die Anzahl der Elemente bedenkt!“

„Genau das meine ich. Der QuickSort- Algorithmus ist sehr effizient.

Arrays.binarySearch()

„Nun, und die letzte der interessantesten Methoden der ArraysKlasse ist in der Lage, nach einem bestimmten Wert in einem Array zu suchen. Dies ist keine gewöhnliche Suche – es ist die beliebte binäre Suche . Es läuft auf Folgendes hinaus:

  • Zunächst wird das Array sortiert.
  • Dann wird das mittlere Element des Arrays mit dem gesuchten verglichen.
  • Wenn das Element größer als das mittlere Element ist, wird die Suche in der rechten Hälfte des Arrays fortgesetzt.
  • Wenn das gesuchte Element kleiner als das mittlere Element ist, wird die Suche in der linken Hälfte des Arrays fortgesetzt.

„Da das Array sortiert ist, ist es möglich, die Hälfte davon in einem einzigen Vergleich zu eliminieren. Im nächsten Schritt werfen wir dann eine weitere Hälfte weg und so weiter.“

„Fantastisch! Wir kommen sehr schnell direkt zum Ziel!“

„Genau. In einem Array von einer Million (!) Elementen kann der binäre Suchalgorithmus den Index des gewünschten Elements in nur 20 Vergleichen finden. Das Manko des Algorithmus besteht darin, dass das Array zuerst sortiert werden muss, und das Sortieren benötigt auch Zeit.“

So sieht der Aufruf aus:

int index = Arrays.binarySearch(name, value);

„Wo nameist der Name des Arrays, das bereits sortiert übergeben werden muss (zum Beispiel mit der Arrays.sort()Methode). Und valueist das Element, nach dem wir im Array suchen. Das von der Methode zurückgegebene Ergebnis ist der Index des gewünschten Array-Elements .

Beispiele:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xis
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(Indizes 0und 2sind ebenfalls akzeptabel)
8
-7

„Was passiert, wenn das gewünschte Element mehrmals im Array vorkommt ?“

„Das ist eine berechtigte Frage, Amigo. In diesem Fall gibt der Algorithmus den Index eines dieser doppelten Elemente zurück (es gibt keine Garantie dafür, dass es beispielsweise das allererste oder umgekehrt – das allerletzte dieser doppelten Elemente) ist. ."

„Was ist, wenn das Array das gewünschte Element überhaupt nicht enthält?“

„In diesem Fall gibt der Algorithmus einen negativen Index zurück .

Dokumentation

„Alles ist klar, Rishi! Das war sehr interessant.“

„Wenn Sie das wirklich sehr interessant fanden, dann überfliegen Sie in aller Ruhe die offizielle Dokumentation der ArraysKlasse und ihrer Methoden auf der Oracle-Website . “

Arrays.mismatch()„Sie können sich zum Beispiel die und- Methoden genauer ansehen Arrays.compare(). Sie werden sie höchstwahrscheinlich gut anwenden können.“

„Und lassen Sie sich nicht von der Anzahl der Methoden verwirren. Jede Methode hat 5-10 Varianten, die sich nur in ihren Parametertypen unterscheiden.“