Array-operationer i Java

1. Oversigt

Enhver Java-udvikler ved, at det ikke altid er let at producere en ren, effektiv løsning, når man arbejder med array-operationer. Alligevel er de et centralt stykke i Java-økosystemet - og vi bliver nødt til at håndtere dem ved flere lejligheder.

Af denne grund er det godt at have et 'snydeark' - et resumé af de mest almindelige procedurer, der hjælper os med at tackle puslespillet hurtigt. Denne vejledning vil være praktisk i disse situationer.

2. Arrays og hjælperklasser

Før du fortsætter, er det nyttigt at forstå, hvad der er et array i Java, og hvordan man bruger det. Hvis det er første gang du arbejder med det i Java, foreslår vi at se på dette tidligere indlæg, hvor vi dækkede alle grundlæggende begreber.

Bemærk, at de grundlæggende operationer, som en matrix understøtter, på en bestemt måde er begrænsede. Det er ikke ualmindeligt at se komplekse algoritmer til at udføre relativt enkle opgaver, når det kommer til arrays.

Af denne grund bruger vi for de fleste af vores operationer hjælperklasser og metoder til at hjælpe os: Arrays klasse leveret af Java og Apache's ArrayUtils en.

For at inkludere sidstnævnte i vores projekt skal vi tilføje Apache Commons afhængighed:

 org.apache.commons commons-lang3 3.8.1 

Vi kan tjekke den nyeste version af denne artefakt på Maven Central.

3. Få det første og sidste element i en matrix

Dette er en af ​​de mest almindelige og enkle opgaver takket være arrays adgang til indeks-karakter.

Lad os starte med at erklære og initialisere en int array, der vil blive brugt i alle vores eksempler (medmindre vi angiver andet):

int [] array = new int [] {3, 5, 2, 5, 14, 4};

At vide, at det første element i en matrix er knyttet til indeksværdien 0, og at den har en længde attribut, som vi kan bruge, så er det nemt at finde ud af, hvordan vi kan få disse to elementer:

int firstItem = array [0]; int lastItem = array [array.length - 1];

4. Få en tilfældig værdi fra en matrix

Ved hjælp af java.util. tilfældighed objekt kan vi nemt få enhver værdi fra vores array:

int anyValue = array [new Random (). nextInt (array.length)];

5. Føj et nyt element til en matrix

Som vi ved, har arrays en fast størrelse af værdier. Derfor kan vi ikke bare tilføje en vare og overskride denne grænse.

Vi bliver nødt til at starte med at erklære et nyt, større array og kopiere elementerne i base array til det andet.

Heldigvis er Arrays klasse giver en praktisk metode til at replikere værdierne i en matrix til en ny struktur i anden størrelse:

int [] newArray = Arrays.copyOf (array, array.length + 1); newArray [newArray.length - 1] = newItem;

Eventuelt, hvis ArrayUtils klasse er tilgængelig i vores projekt, kan vi gøre brug af det tilføj metode (eller dens tilføjAlle alternativ) for at nå vores mål i en erklæring på en linje:

int [] newArray = ArrayUtils.add (array, newItem);

Som vi kan forestille os, ændrer denne metode ikke originalen array objekt; vi er nødt til at tildele dets output til en ny variabel.

6. Indsæt en værdi mellem to værdier

På grund af dets tegn på indekserede værdier er det ikke et trivielt job at indsætte et element i en matrix mellem to andre.

Apache betragtede dette som et typisk scenario og implementerede en metode i dets ArrayUtils klasse for at forenkle løsningen:

int [] largerArray = ArrayUtils.insert (2, array, 77);

Vi skal specificere det indeks, hvor vi vil indsætte værdien, og output vil være et nyt array, der indeholder et større antal elementer.

Det sidste argument er et variabelt argument (aka vararg) således kan vi indsætte et vilkårligt antal elementer i arrayet.

7. Sammenlign to arrays

Selvom arrays er Objekts og giver derfor en lige med metode, bruger de standardimplementeringen af ​​den, idet de kun stoler på reference lighed.

Vi kan alligevel påberåbe os java.util.Arrayslige med metode til at kontrollere, om to array-objekter indeholder de samme værdier:

boolske areEqual = Arrays.equals (array1, array2);

Bemærk: denne metode er ikke effektiv til takkede arrays. Den passende metode til at kontrollere flerdimensionelle strukturer 'lighed er Arrays.deepEquals en.

8. Kontroller, om en matrix er tom

Dette er en ukompliceret opgave med tanke på, at vi kan bruge længde attribut for arrays:

boolsk isEmpty = array == null || array.length == 0;

Desuden har vi også en nul-sikker metode i ArrayUtils hjælperklasse, som vi kan bruge:

boolsk isEmpty = ArrayUtils.isEmpty (array);

Denne funktion afhænger stadig af længden af ​​datastrukturen, som også betragter nuller og tomme underarrays som gyldige værdier, så vi bliver nødt til at holde øje med disse kantsager:

// Disse er tomme arrays Heltal [] array1 = {}; Heltal [] array2 = null; Heltal [] array3 = nyt heltal [0]; // Alle disse betragtes IKKE som tomme Heltal [] array3 = {null, null, null}; Heltal [] [] array4 = {{}, {}, {}}; Heltal [] array5 = nyt heltal [3];

9. Sådan blandes elementerne i en matrix

For at blande elementerne i en matrix kan vi bruge ArrayUtil'S funktion:

ArrayUtils.shuffle (array);

Dette er en ugyldig metode og fungerer på matrixens faktiske værdier.

10. Box og Unbox Arrays

Vi støder ofte på metoder, der kun understøtter Objekt-baserede arrays.

Igen ArrayUtils hjælperklasse er praktisk til at få en boksversion af vores primitive array:

Heltal [] liste = ArrayUtils.toObject (array);

Den omvendte operation er også mulig:

Heltal [] objectArray = {3, 5, 2, 5, 14, 4}; int [] array = ArrayUtils.toPrimitive (objectArray);

11. Fjern duplikater fra en matrix

Den nemmeste måde at fjerne dubletter på er ved at konvertere arrayet til en Sæt implementering.

Som vi måske ved, Kollektions bruger Generics og understøtter derfor ikke primitive typer.

Af denne grund, hvis vi ikke håndterer objektbaserede arrays som i vores eksempel, skal vi først sætte vores værdier i boks:

// Box Integer [] list = ArrayUtils.toObject (array); // Fjern dubletter Sæt sæt = nyt HashSet (Arrays.asList (liste)); // Opret array og afkryds retur ArrayUtils.toPrimitive (set.toArray (nyt heltal [set.size ()]));

Bemærk: vi kan bruge andre teknikker til at konvertere mellem en matrix og en Sæt objekt også.

Også, hvis vi har brug for at bevare rækkefølgen af ​​vores elementer, skal vi bruge en anden Sæt implementering, såsom en LinkedHashSet.

12. Sådan udskrives en matrix

Samme som med lige med metode, array's toString -funktionen bruger standardimplementeringen fra Objekt klasse, hvilket ikke er særlig nyttigt.

Begge Arrays og ArrayUtils klasser leveres med deres implementeringer for at konvertere datastrukturer til en læsbar Snor.

Bortset fra det lidt forskellige format, de bruger, er den vigtigste forskel, hvordan de behandler multidimensionelle objekter.

Java Util's klasse indeholder to statiske metoder, vi kan bruge:

  • toString: fungerer ikke godt med takkede arrays
  • deepToString: understøtter enhver Objekt-baserede arrays, men kompileres ikke med primitive array argumenter

På den anden side, Apache's implementering tilbyder en enkelt toString metode, der fungerer korrekt under alle omstændigheder:

String arrayAsString = ArrayUtils.toString (array);

13. Kortlæg en matrix til en anden type

Det er ofte nyttigt at anvende operationer på alle matrixelementer og muligvis konvertere dem til en anden type objekt.

Med dette mål i tankerne vi prøver at skabe en fleksibel hjælpemetode ved hjælp af Generics:

offentlig statisk U [] mapObjectArray (T [] array, Funktionsfunktion, Class targetClazz) {U [] newArray = (U []) Array.newInstance (targetClazz, array.length); for (int i = 0; i <array.length; i ++) {newArray [i] = function.apply (array [i]); } returner newArray; }

Hvis vi ikke bruger Java 8 i vores projekt, kan vi kassere Fungere argument, og opret en metode til hver kortlægning, som vi skal udføre.

Vi kan nu genbruge vores generiske metode til forskellige operationer. Lad os oprette to testsager for at illustrere dette:

@Test offentligt ugyldigt når MapArrayMultiplyingValues_thenReturnMultipliedArray () {Integer [] multipliedExpectedArray = new Integer [] {6, 10, 4, 10, 28, 8}; Heltal [] output = MyHelperClass.mapObjectArray (array, værdi -> værdi * 2, Integer.class); assertThat (output) .containsExactly (multiplierExpectedArray); } @Test offentlig ugyldig når MapDividingObjectArray_thenReturnMultipliedArray () {Double [] multiplierExpectedArray = new Double [] {1.5, 2.5, 1.0, 2.5, 7.0, 2.0}; Dobbelt [] output = MyHelperClass.mapObjectArray (array, værdi -> værdi / 2.0, Double.class); assertThat (output) .containsExactly (multiplierExpectedArray); }

For primitive typer skal vi først sætte vores værdier i boks.

Som et alternativ kan vi henvende os til Java 8s Streams for at udføre kortlægningen for os.

Vi bliver nødt til at omdanne arrayet til en Strøm af Objekts første. Vi kan gøre det med Arrays.stream metode.

For eksempel hvis vi vil kortlægge vores int værdier til en brugerdefineret Snor repræsentation, vi implementerer dette:

String [] stringArray = Arrays.stream (array) .mapToObj (værdi -> String.format ("Value:% s", value)) .toArray (String [] :: new);

14. Filtrer værdier i en matrix

Filtrering af værdier fra en samling er en almindelig opgave, som vi muligvis skal udføre i mere end en lejlighed.

Dette skyldes, at vi på det tidspunkt, hvor vi opretter det array, der modtager værdierne, ikke kan være sikre på dets endelige størrelse. Derfor, vi stoler på Strøms tilgang igen.

Forestil dig, at vi vil fjerne alle ulige tal fra en matrix:

int [] evenArray = Arrays.stream (array) .filter (værdi -> værdi% 2 == 0) .toArray ();

15. Andre almindelige matrixoperationer

Der er selvfølgelig mange andre array-operationer, som vi muligvis skal udføre.

Bortset fra dem, der er vist i denne vejledning, har vi omfattende dækket andre operationer i de dedikerede stillinger:

  • Kontroller, om en Java Array indeholder en værdi
  • Sådan kopieres en matrix i Java
  • Fjernelse af det første element i en matrix
  • Find Min og Max i en matrix med Java
  • Find sum og gennemsnit i en Java Array
  • Sådan inverteres en matrix i Java
  • Deltag og del arrays og samlinger i Java
  • Kombination af forskellige typer samlinger i Java
  • Find alle par numre i en matrix, der udgør en given sum
  • Sortering i Java
  • Effektiv ordfrekvensberegner i Java
  • Indsættelse Sorter i Java

16. Konklusion

Arrays er en af ​​kernefunktionaliteterne i Java, og derfor er det virkelig vigtigt at forstå, hvordan de fungerer, og at vide, hvad vi kan og ikke kan gøre med dem.

I denne vejledning lærte vi, hvordan vi kan håndtere array-operationer korrekt i almindelige scenarier.

Som altid er den fulde kildekode for arbejdseksemplerne tilgængelig på vores Github repo.


$config[zx-auto] not found$config[zx-overlay] not found