CodeGym /Java blog /Tilfældig /Arrays klasse
John Squirrels
Niveau
San Francisco

Arrays klasse

Udgivet i gruppen
Hej igen! :) I dagens lektion vil vi tale om Arrays-klassen i Java. I den sidste lektion lærte vi en sådan datastruktur at kende, der kaldes et array. Vi lærte at oprette dem og fylde dem med data. Og vi så på, hvordan de er gemt i hukommelsen. I dag vil vi se på nogle opgaver og eksempler på arbejde med arrays, som du ofte vil se i rigtigt arbejde. Forestil dig for eksempel denne situation: Vi har en matrix med 10 tilfældige tal.

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Vores opgave er at sortere dette array i stigende rækkefølge: fra mindste til største. Til sidst skulle det se sådan ud: [-234, -2, 16, 26, 35, 43, 92, 99, 167] Hvordan gør vi det? Denne opgave er ikke triviel. Det har vi aldrig gjort før :/ Nogle ideer? Forsøge at gætte. Her er en løsning:
  • Gennemgå alle elementerne i arrayet. Sammenlign hvert element med det næste ([0] med [1], [1] med [2], [2] med [3] osv.). Hvis det nuværende element er større end det næste, bytter vi dem og går derefter videre til det næste element. Hvis ikke, så lad dem være som de er, og gå videre
  • Efter den første passage gennem elementerne er den største værdi (167) således garanteret i den sidste celle.
  • Nu gennemgår vi alle elementerne igen, men denne gang starter vi med indekset [0] til det næstsidste element (det største tal er allerede på sin plads) og foretager de samme sammenligninger og bytte. Efter dette pass, i den næstsidste celle, har vi den næststørste værdi (99).
  • Gentag denne proces så mange gange, som vi har array-elementer.
Vi har fået ideen. Nu mangler vi kun at skrive koden. Det ser sådan ud: Arrays-klassen og dens brug - 2

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++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Øh ... Det ser lidt kompliceret ud -_- Selvom det generelle princip er forståeligt, skal vi stadig skrive ret meget kode for at løse sådan en simpel opgave. Okay, måske har vi bare overvurderet os selv? Den opgave, vi har løst, er nok stadig for kompliceret for os. Lad os prøve noget enklere. Tag for eksempel det samme antal array.

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Vores opgave er at kopiere indholdet til et andet array.

int [] numbersCopy = new int[10];
Tænk på, hvordan du ville gøre det ved at bruge det, du allerede ved om arrays? For eksempel kan du gå gennem tal- arrayet i en løkke og sekventielt skrive dets elementer i 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];
       }

   }
}
Nå, øh, her har vi stort set gjort det! Det ser ud til, at vi har løst problemet. Men hvis du har brug for at gøre dette ofte, vil din kode have en masse identiske sløjfer. Faktisk er disse (og andre) opgaver længe blevet løst af Javas skabere. Vi behøver ikke "genopfinde hjulet" og kode vores egen løsning. Der er en særlig statisk klasse ( Arrays ) til at hjælpe dig med at udføre almindelige opgaver, når du arbejder med arrays. Metoder til at udføre de mest almindelige opgaver, som Java-programmører står over for, er blevet tilføjet til denne klasse. For eksempel er opgaven med at sortere et array, som vi forsøgte at håndtere, løst på en enkelt linje:

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));

   }
}
Metoden Arrays.sort () sorterer arrayet. Og dens algoritme er meget mere effektiv end den kode, vi skrev. Konsoloutput: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] Bemærk: For at konvertere arrayet til en streng brugte vi en anden metode i Arrays- klassen: Arrays.toString() . Arrays i Java tilsidesætter ikke toString() -metoden alene. Så hvis du bare skriver

System.out.println(numbers.toString());
Object-klassens toString() kaldes. For et array vil outputtet være noget som dette: [I@4554617c Vi vil ikke gå i detaljer nu om, hvorfor netop dette er outputtet. Det vigtigste er, at det tydeligvis ikke er det, vi har brug for. Men Arrays.toString() gør præcis, hvad vi vil. Kopiering er i øvrigt også let at udføre med Arrays -klassen:

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));

   }
}
Vi videregiver til Arrays.copyOf() -metoden vores originale array (hvorfra vi vil kopiere værdier) og længden af ​​det nye array, som vi kopierer data til. I dette tilfælde har vi angivet numbers.length som længden, da vi ønsker at kopiere hele arrayet. Hvis vi kun ville kopiere de første par elementer, kan vi angive længden af ​​en ny mindre matrix:

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));

   }
}
Her specificerede vi 4 som længden af ​​det nye array. Følgelig vil kun de første 4 elementer af tal blive kopieret til det nye array. Konsoloutput: [167, -2, 16, 99] Arrays lader dig forresten også kopiere en del af et array fra midten i stedet for begyndelsen af ​​arrayet:

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));

   }
}
Output: [16, 99, 26, 92] Tal blev kopieret ind i det nye array fra det andet array fra det andet (inklusive) til det sjette (ikke inklusive) element. Vi skal muligvis også sammenligne to arrays. Som med toString()- metoden tilsidesætter arrays selv ikke equals()- metoden. Så hvis vi prøver at sammenligne dem sådan her

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));
   }
}
så får vi falsk. Dette skyldes, at Object.equals() , som sammenligner referencer, vil blive kaldt. Og selvfølgelig er de forskellige! Men det, vi har brug for, er at sammenligne array-indhold, ikke referencer. Arrays - klassen tilsidesætter equals()- metoden for at få den til at gøre præcis, hvad vi vil:

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));
   }
}
Output: sand I øvrigt fungerer Arrays- klassen ikke kun med almindelige arrays, men også med todimensionelle:

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("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));
      
       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Output: Er disse todimensionelle arrays ens? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Som du kan se, var Arrays.copyOf() metoden i stand til at kopiere en todimensional matrix. Og klassen har specielle metoder til at sammenligne og vise todimensionelle arrays: deepEquals og deepToString() . I fremtiden vil du gentagne gange se (og glæde dig over det faktum), at Javas skabere forudså en masse situationer, som programmører ofte stod over for, og implementerede færdige løsninger til dem i sproget. At bruge disse løsninger er meget nemmere og mere bekvemt end at genopfinde hjulet, ikke? :) Sørg for at læse dokumentationen til Arrays-klassen på Oracle- webstedet. Held og lykke med dine studier!
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION