Hallo igjen! :) I dagens leksjon skal vi snakke om Arrays-klassen i Java. I den siste leksjonen ble vi kjent med en slik datastruktur kalt en array. Vi lærte å lage dem og fylle dem med data. Og vi så på hvordan de er lagret i minnet. I dag skal vi se på noen oppgaver og eksempler på arbeid med arrays som du ofte vil se i ekte arbeid. Tenk deg for eksempel denne situasjonen: Vi har en matrise med 10 tilfeldige tall.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Vår oppgave er å sortere denne matrisen i stigende rekkefølge: fra minste til størst. Til slutt skal det se slik ut: [-234, -2, 16, 26, 35, 43, 92, 99, 167] Hvordan gjør vi det? Denne oppgaven er ikke triviell. Vi har aldri gjort dette før :/ Noen ideer? Prøv og gjett. Her er en løsning:
- Gå gjennom alle elementene i matrisen. Sammenlign hvert element med det neste ([0] med [1], [1] med [2], [2] med [3] osv.). Hvis det nåværende elementet er større enn det neste, bytter vi dem, og går deretter videre til neste element. Hvis ikke, la dem være som de er, og gå videre
- Dermed, etter den første passeringen gjennom elementene, er den største verdien (167) garantert i den siste cellen.
- Nå skal vi gå gjennom alle elementene på nytt, men denne gangen starter vi med indeksen [0] til det nest siste elementet (det største tallet er allerede på plass) og gjør de samme sammenligningene og byttene. Etter denne passeringen, i den nest siste cellen, vil vi ha den nest største verdien (99).
- Gjenta denne prosessen så mange ganger som vi har matriseelementer.
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;
}
}
}
}
}
Uh ... Det ser litt komplisert ut -_- Selv om det generelle prinsippet er forståelig, må vi fortsatt skrive ganske mye kode for å løse en så enkel oppgave. Ok, kanskje vi bare har overvurdert oss selv? Oppgaven vi har løst er sannsynligvis fortsatt for komplisert for oss. La oss prøve noe enklere. Ta for eksempel den samme tallmatrisen.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Vår oppgave er å kopiere innholdet til en annen array.
int [] numbersCopy = new int[10];
Tenk på hvordan du ville gjort det ved å bruke det du allerede vet om arrays? Du kan for eksempel gå gjennom tallarrayen i en løkke og sekvensielt skrive elementene 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];
}
}
}
Vel, eh, her har vi i grunnen gjort det! Det ser ut til at vi har løst problemet. Men hvis du trenger å gjøre dette ofte, vil koden din ha en haug med identiske løkker. Faktisk har disse (og andre) oppgavene lenge blitt løst av Javas skapere. Vi trenger ikke "finne opp hjulet på nytt" og kode vår egen løsning. Det er en spesiell statisk klasse ( Arrays ) som hjelper deg med å utføre vanlige oppgaver når du arbeider med arrays. Metoder for å utføre de vanligste oppgavene som Java-programmerere står overfor, er lagt til denne klassen. For eksempel er oppgaven med å sortere en matrise, som vi prøvde å 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 matrisen. Og algoritmen er mye mer effektiv enn koden vi skrev. Konsollutgang: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] Merk: For å konvertere matrisen til en streng, brukte vi en annen metode i Arrays- klassen: Arrays.toString() . Arrays i Java overstyrer ikke toString() -metoden alene. Så hvis du bare skriver
System.out.println(numbers.toString());
Object-klassens toString() vil bli kalt. For en matrise vil utgangen være omtrent slik: [I@4554617c Vi vil ikke gå i detalj nå om hvorfor akkurat dette er utgangen. Hovedsaken er at det tydeligvis ikke er det vi trenger. Men Arrays.toString() gjør akkurat det vi vil. Forresten, kopiering er også enkelt å utfø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 overfører til Arrays.copyOf() -metoden vår originale matrise (som vi ønsker å kopiere verdier fra) og lengden på den nye matrisen som vi kopierer data til. I dette tilfellet indikerte vi numbers.length som lengden, siden ønsker å kopiere hele matrisen. Hvis vi bare ønsket å kopiere de første par elementene, kan vi spesifisere lengden på en ny mindre matrise:
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 spesifiserte vi 4 som lengden på den nye matrisen. Følgelig vil bare de første 4 elementene i tall bli kopiert til den nye matrisen. Konsollutgang: [167, -2, 16, 99] Forresten lar Arrays deg også kopiere deler av en matrise fra midten i stedet for begynnelsen av matrisen:
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));
}
}
Utdata: [16, 99, 26, 92] Tall ble kopiert inn i den nye matrisen fra den andre matrisen fra det andre (inkluderende) til det sjette (ikke inkluderende) elementet. Vi må kanskje også sammenligne to matriser. Som med toString()- metoden, overstyrer ikke arrayene i seg selv equals() -metoden. Så hvis vi prøver å sammenligne dem slik
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));
}
}
da får vi falske. Dette er fordi Object.equals() , som sammenligner referanser, vil bli kalt. Og tydeligvis er de forskjellige! Men det vi trenger er å sammenligne matrisinnhold, ikke referanser. Arrays - klassen overstyrer equals()- metoden for å få den til å gjøre akkurat det 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));
}
}
Utdata: sant Forresten, Arrays- klassen fungerer ikke bare med vanlige arrays, men også med todimensjonale:
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));
}
}
Utgang: Er disse todimensjonale arrayene like? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Som du kan se, var Arrays.copyOf()- metoden i stand til å kopiere en todimensjonal matrise. Og klassen har spesielle metoder for å sammenligne og vise todimensjonale arrays: deepEquals og deepToString() . I fremtiden vil du gjentatte ganger se (og glede deg over det faktum at) at Javas skapere forutså mange situasjoner som ofte ble møtt av programmerere, og implementerte ferdige løsninger for dem på språket. Å bruke disse løsningene er mye enklere og mer praktisk enn å finne opp hjulet på nytt, ikke sant? :) Sørg for å lese dokumentasjonen for Arrays-klassen på Oracle- nettstedet. Lykke til i studiene!
GO TO FULL VERSION