Sammenligning av matriser i Java

1. Oversikt

I denne opplæringen skal vi ta en titt på forskjellige måter å sammenligne matriser i Java. Vi vil dekke konvensjonelle metoder, og vi vil også se noen eksempler som bruker lambdauttrykkene.

2. Sammenligning av matriser

Vi skal sammenligne matriser i Java, og som vi vet er dette objekter. La oss derfor oppdatere noen grunnleggende konsepter:

  • Objekter har referanser og verdier
  • To like referanser skal peke på samme verdi
  • To forskjellige verdier skal ha forskjellige referanser
  • To like verdier har ikke nødvendigvis de samme referansene
  • Primitive verdier blir bare sammenlignet per verdi
  • Strenglitteratur blir bare sammenlignet per verdi

2.1. Sammenligne objektreferanser

Hvis vi har to referanser som peker på samme matrise, bør vi alltid få et resultat ekte i en lik sammenligning med == operatør.

La oss se på et eksempel:

Streng [] plan1 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Streng [] plan2 = plan1;

Først opprettet vi en rekke flymodeller som det refereres til fly1. Vi lager da fly2, hvilke referanser fly1. Ved å gjøre dette, er vi det lage to referansertil samme matrise i minnet. derfor “Plan1 == planes2” uttrykk vil komme tilbake ekte.

For arrays, den er lik() metoden er den samme som == operatoren. Så, planes1.equals (planes2) returnerer ekte fordi begge referansene refererer til det samme objektet. Generelt sett array1.eqauls (array2) vil returnere ekte hvis og bare hvis uttrykket array1 == array2 ″ returnerer ekte.

La oss hevde om de to referansene er de samme:

assertThat (plan1) .isSameAs (plan2);

La oss nå være sikre på at verdiene det refereres til fly1 er faktisk de samme som de det refereres til fly2. Derfor kan vi endre matrisen det refereres til fly2, og sjekk om endringene har noen innvirkning på matrisen det refereres til fly1:

planes2 [0] = "747";

For å endelig se at dette fungerer, la oss gjøre våre påstander:

assertThat (plan1) .isSameAs (plan2); assertThat (plan2 [0]). erEqualTo ("747"); assertThat (plan1 [0]). er EqualTo ("747");

Med denne enhetstesten klarte vi å sammenligne to matriser ved referanse.

Imidlertid har vi bare bevist det en referanse, en gang tildelt verdien til en annen, vil referere til den samme verdien.

Vi oppretter nå to forskjellige matriser med de samme verdiene:

Streng [] plan1 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Streng [] plan2 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"};

Siden de er forskjellige objekter, vet vi med sikkerhet at de ikke er de samme. Vi kan derfor sammenligne dem:

assertThat (plan1) .isNotSameAs (plan2);

For å oppsummere har vi i dette tilfellet to matriser i minnet som inneholder det samme String verdier i nøyaktig samme rekkefølge. Imidlertid er ikke bare de refererte matriser forskjellige i innhold, men referansene i seg selv er også forskjellige.

2.2. Sammenligning av matriselengder

Arrangementets lengde kan sammenlignes uansett av elementtypene, eller om verdiene deres er fylt ut eller ikke.

La oss lage to matriser:

endelig streng [] plan1 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; siste Heltall [] mengder = nytt Heltall [] {10, 12, 34, 45, 12, 43, 5, 2};

Dette er to forskjellige matriser med forskjellige elementtyper. I dette datasettet registrerer vi, som et eksempel, hvor mange fly av hver modell som er lagret på lageret. La oss nå kjøre enhetstester på dem:

assertThat (plan1) .hasSize (8); assertThat (mengder) .hasSize (8);

Med dette har vi bevist at begge matriser har åtte elementer og at lengde eiendom returnerer riktig antall elementer for hver matrise.

2.3. Sammenligning av arrays med Arrays.equals

Så langt sammenlignet vi bare matriser basert på deres objektidentitet. På den andre siden, for å sjekke om to matriser er like når det gjelder innholdet, gir Java Arrays. Like statisk metode. Denne metoden vil gjentas gjennom matriser, per posisjon parallelt, og bruke == operatoren,for hvert par elementer.

La oss lage to forskjellige matriser med det samme String bokstaver i nøyaktig samme rekkefølge:

Streng [] plan1 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Streng [] plan2 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"};

La oss nå hevde at de er like:

assertThat (Arrays.quals (plan1, plan2)). isTrue ();

Hvis vi endrer rekkefølgen på verdiene til den andre matrisen:

Streng [] plan1 = ny streng [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Streng [] plan2 = ny streng [] {"B738", "A320", "A321", "A319", "B77W", "B737", "A333", "A332"}; 

Vi får et annet resultat:

assertThat (Arrays.quals (plan1, plan2)). isFalse ();

2.4. Sammenligning av arrays med Arrays.deepEquals

Bruker == operatøren er enkel hvis vi bruker enkle typer i Java. Dette kan være primitive typer eller String bokstavelige. En sammenligning mellom matriser av Gjenstands kan være mer komplisert. Årsaken bak dette er fullstendig forklart i vår Arrays.deepEquals artikkel. La oss se et eksempel.

Først, la oss starte med en Fly klasse:

public class Plane {private final Strengnavn; privat slutt Strengmodell; // getters og setters}

Og la oss implementere hashCode og er lik metoder:

@ Overstyr offentlig boolsk er lik (Objekt o) hvis (dette == o) returnerer sant; hvis (o == null @ Override public int hashCode () {return Objects.hash (navn, modell);}

For det andre, la oss lage følgende to-element matriser:

Fly [] [] plan1 = nytt fly [] [] {nytt fly [] {nytt fly ("fly 1", "A320")}, nytt fly [] {nytt fly ("fly 2", "B738") }}; Plane [] [] planes2 = new Plane [] [] {new Plane [] {new Plane ("Plane 1", "A320")}, new Plane [] {new Plane ("Plane 2", "B738") }}; 

La oss nå se om de er sanne, dypt like matriser:

assertThat (Arrays.deepEquals (plan1, plan2)). isTrue ();

For å sikre at sammenligningen vår fungerer som forventet, la oss nå endre rekkefølgen på den siste matrisen:

Fly [] [] plan1 = nytt fly [] [] {nytt fly [] {nytt fly ("fly 1", "A320")}, nytt fly [] {nytt fly ("fly 2", "B738") }}; Plane [] [] planes2 = new Plane [] [] {new Plane [] {new Plane ("Plane 2", "B738")}, new Plane [] {new Plane ("Plane 1", "A320") }};

Til slutt, la oss teste om de ikke er like lenger:

assertThat (Arrays.deepEquals (planes1, planes2)). er Falsk ();

2.5. Sammenligning av matriser med forskjellige ordrer av elementer

For å sjekke om matriser er like, uavhengig av rekkefølgen på elementene, må vi definere hva som gjør en forekomst av vår Fly unik. For vårt tilfelle er et annet navn eller en annen modell nok til å bestemme at ett plan er forskjellig fra et annet. Vi har etablert dette ved å ha implementert begge deler hashCode og er lik metoder. Dette innebærer at før vi kan sammenligne våre matriser, bør vi sortere dem. For det trenger vi en Komparator:

Comparator planeComparator = (o1, o2) -> {if (o1.getName (). Tilsvarer (o2.getName ())) {return o2.getModel (). CompareTo (o1.getModel ()); } returner o2.getName (). CompareTo (o1.getName ()); };

I dette Komparator, vi prioriterer navnet. Hvis navnene er like, løser vi tvetydigheten ved å se på modellen. Vi sammenligner strenger ved å bruke sammenligne med metode av typen String.

Vi ønsker å kunne finne ut om matriser er like uavhengig av sorteringsrekkefølge. For å gjøre det, la oss nå sortere matriser:

Arrays.sort (plan1 [0], planeComparator); Arrays.sort (plan2 [0], planeComparator);

Og til slutt, la oss teste dem:

assertThat (Arrays.deepEquals (plan1, plan2)). isTrue ();

Etter å ha sortert matriser i samme rekkefølge først, tillater vi deepEquals metode for å finne ut om disse to matriser er like.

3. Konklusjon

I denne opplæringen har vi sett forskjellige måter å sammenligne matriser på. For det andre så vi forskjellen mellom å sammenligne referanser og verdier. I tillegg har vi sett på hvordan vi kan sammenligne matriser dypt. Til slutt så vi forskjellen mellom en normal sammenligning og en dyp sammenligning ved hjelp av er lik og deepEquals, henholdsvis.

Som alltid er hele kildekoden for eksemplene tilgjengelig på GitHub.


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