JavaRush /Java-Blog /Random-DE /Arrays-Klasse und ihre Verwendung

Arrays-Klasse und ihre Verwendung

Veröffentlicht in der Gruppe Random-DE
Hallo wieder! :) In der letzten Lektion haben wir uns mit einer Datenstruktur wie einem Array (Java-Array) vertraut gemacht, gelernt, wie man Arrays erstellt, sie mit Daten füllt und auch gelernt, wie sie im Speicher gespeichert werden. Heute schauen wir uns einige Aufgaben und Beispiele für die Arbeit mit Arrays an, denen Sie in der Praxis häufig begegnen. Stellen Sie sich zum Beispiel diese Situation vor: Wir haben ein Array mit 10 Zahlen, die in zufälliger Reihenfolge geschrieben sind.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Unsere Aufgabe besteht darin, dieses Array in aufsteigender Reihenfolge zu sortieren: von der kleinsten zur größten Zahl. Am Ende sollte es so aussehen:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Wie machen wir das? Die Aufgabe ist nicht trivial, das haben wir noch nie gemacht :/ Irgendwelche Ideen? Versuchen zu erraten. Folgendes können wir zum Beispiel tun:
  • Durchlaufen Sie alle Elemente des Arrays. Vergleichen Sie jedes Element mit dem nächsten ( [0]with [1], [1]with [2], [2]with [3]usw.). Wenn das aktuelle Array-Element größer als das nächste ist, tauschen wir sie aus und fahren mit dem nächsten Element fort. Wenn nicht, lassen Sie es so wie es ist und machen Sie weiter.

  • Somit liegt nach dem ersten Durchlauf durch die Elemente des Arrays der größte Wert (167) garantiert in der letzten Zelle.

  • Gehen wir nun noch einmal alle Elemente des Arrays durch, beginnend mit dem Element mit dem Index [0], bis hin zum vorletzten Element (die größte Zahl steht bereits an ihrer Stelle) und führen die gleichen Vergleiche und Vertauschungen durch. 
    Am Ende haben wir in der vorletzten Zelle den zweithöchsten Wert (99).

  • Wiederholen wir diese Arbeit so oft, wie wir minus eins Elemente im Array haben.
Arrays-Klasse und ihre Verwendung - 2Wir hatten die Idee, jetzt muss nur noch der Code geschrieben werden. Es wird so aussehen:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Vergleiche die Elemente paarweise.
             Wenn sie in der falschen Reihenfolge sind,
             dann vertausche sie */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Äh... Sieht etwas kompliziert aus -_- Auch wenn das allgemeine Funktionsprinzip klar ist, muss man ziemlich viel Code schreiben, um eine so scheinbar einfache Aufgabe zu lösen. Okay, vielleicht haben wir uns einfach überschätzt? Wahrscheinlich ist die Aufgabe, die wir übernommen haben, bisher zu schwierig für uns. Versuchen wir, etwas Einfacheres zu tun. Nehmen wir zum Beispiel dasselbe Zahlenarray.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Unsere Aufgabe besteht darin, seinen Inhalt in ein anderes Array zu kopieren.
int [] numbersCopy = new int[10];
Überlegen Sie, wie Sie dies tun würden, indem Sie Ihr bereits vorhandenes Wissen über Arrays nutzen? Sie können beispielsweise ein Array durchlaufen numbersund seine Elemente einzeln schreiben in numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Nun, wir haben es mehr oder weniger geschafft! Das Problem scheint gelöst zu sein, aber noch einmal: Wenn es häufig ausgeführt werden muss, enthält der Code eine Reihe identischer Schleifen. Tatsächlich wurden diese und andere Probleme von den Entwicklern von Java schon lange gelöst, und wir müssen nicht „das Rad neu erfinden“ und Code für unsere eigene Lösung schreiben.

Java-Arrays-Klasse

Eine spezielle Java-Klasse hilft Ihnen bei der Lösung typischer Probleme bei der Arbeit mit Arrays – Arrays. Dieser Klasse wurden Methoden hinzugefügt, um die häufigsten Probleme zu lösen, auf die Java-Programmierer bei ihrer Arbeit stoßen. Beispielsweise lässt sich die Aufgabe, ein Array zu sortieren, für die wir selbst versucht haben, Lösungen zu finden, in einer Zeile lösen:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Die Methode Arrays.sort()sortiert das Array. Darüber hinaus macht der darin eingebettete Algorithmus dies viel effizienter als den Code, den wir geschrieben haben. Konsolenausgabe:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Bitte beachten Sie: Um das Array in einen String umzuwandeln, haben wir eine andere Klassenmethode verwendet ArraysArrays.toString(). Java-Arrays selbst überschreiben die toString(). Also wenn du einfach schreibst
System.out.println(numbers.toString());
toString()Die Klassenmethode wird aufgerufen Object. Im Fall von Arrays sieht die Ausgabe etwa so aus:

[I@4554617c
Jetzt werden wir nicht im Detail darauf eingehen, warum die Schlussfolgerung so ist; die Hauptsache ist, dass dies eindeutig nicht das ist, was wir brauchen. Aber Arrays.toString() hat getan, was wir wollten. Unser Problem mit dem Kopieren lässt sich übrigens auch leicht im Unterricht lösen Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
An die Methode Arrays.copyOf()übergeben wir unser ursprüngliches Array (von dem wir die Werte kopieren müssen) und die Länge des neuen Arrays, in das wir die Daten kopieren. In diesem Fall haben wir die Länge angegeben numbers.length, weil Wir wollen das gesamte Array kopieren. Wenn wir nur die ersten Elemente kopieren möchten, können wir eine kleinere Länge für das neue Array angeben:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Hier haben wir die Länge des neuen Arrays mit 4 angegeben. Dementsprechend numberswerden nur die ersten 4 Elemente in das neue Array kopiert. Konsolenausgabe:

[167, -2, 16, 99]
Übrigens, wenn Sie einen Teil eines Arrays kopieren müssen, aber nicht von Anfang an, sondern „von der Mitte“, Arrayskönnen Sie auch Folgendes tun:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Abschluss:

[16, 99, 26, 92]
Die Zahlen aus den Zellen zwei ( einschließlich ) bis sechs ( nicht einschließlich ) wurden in das neue Array kopiert. Darüber hinaus müssen wir möglicherweise zwei Arrays miteinander vergleichen. Genau wie bei der Methode toString()überschreiben Arrays selbst die Methode nicht equals(). Wenn wir also versuchen, sie so zu vergleichen:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
wir bekommen das Ergebnis false. Schließlich heißt die Methode Object.equals(), die Links vergleicht . Und natürlich sind sie unterschiedlich! Aber wir müssen die Inhalte der Arrays vergleichen, nicht die Links. Die Klasse Arraysenthält eine überschriebene Methode equals(), die genau das tut, was wir brauchen:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Abschluss:

true
Die Klasse funktioniert übrigens Arraysnicht nur erfolgreich mit gewöhnlichen Arrays, sondern auch mit zweidimensionalen:
public class Main {

   public static void main(String[] args) {

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

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println(„Sind diese zweidimensionalen Arrays einander gleich?“);
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Abschluss:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Wie Sie sehen, kam die Methode Arrays.copyOf()mit dem Kopieren eines zweidimensionalen Arrays zurecht. Bitte beachten Sie, dass es in diesem Fall beim Kopieren eines zweidimensionalen Arrays zu einer sogenannten „flachen Kopie“ kommt. Und für den Vergleich zweidimensionaler Arrays und deren Ausgabe auf der Konsole stehen spezielle Methoden zur Verfügung – deepEqualsund deepToString(); In Zukunft werden Sie mehr als einmal sehen (und sich darüber freuen), dass die Entwickler von Java viele typische Situationen, denen Programmierer bei der Arbeit begegnen, vorhergesehen und vorgefertigte Lösungen für sie in der Sprache implementiert haben. Die Nutzung dieser Lösungen ist viel einfacher und bequemer, als das Rad neu zu erfinden, oder? :) Lesen Sie unbedingt die Klassendokumentation Arraysauf der Oracle- Website . Viel Erfolg beim Studium!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION