Kryss av to lister i Java

1. Oversikt

I denne opplæringen lærer vi hvordan du kan hente krysset mellom to Listes.

Som mange andre ting har dette blitt mye lettere takket være introduksjonen av strømmer i Java 8.

2. Skjæringspunkt mellom to lister over strenger

La oss lage to Listes av Strings med noe kryss - begge har noen dupliserte elementer:

Listeliste = Arrays.asList ("rød", "blå", "blå", "grønn", "rød"); Liste otherList = Arrays.asList ("rød", "grønn", "grønn", "gul");

Og nå Vi bestemmer krysset mellom listene ved hjelp av strømmetoder:

Sett resultat = list.stream () .distinct () .filter (otherList :: inneholder) .collect (Collectors.toSet ()); Set commonElements = new HashSet (Arrays.asList ("red", "green")); Assert.assertEquals (commonElements, result);

Først fjerner vi de dupliserte elementene med distinkt. Deretter bruker vi filter for å velge elementene som også er inneholdt i otherList.

Til slutt konverterer vi produksjonen vår med en Samler. Krysset skal inneholde hvert felles element bare en gang. Ordren skal ikke ha noe å si å sette er det mest enkle valget, men vi kan også bruke å liste opp eller en annen samlermetode.

For mer informasjon, se vår guide til Java 8’s Collectors.

3. Kryss av lister over egendefinerte klasser

Hva om vår Listes inneholder ikke Strings men heller forekomster av en tilpasset klasse vi har opprettet? Vel, så lenge vi følger Javas konvensjoner, vil løsningen med strømmetoder fungere bra for vår tilpassede klasse.

Hvordan fungerer det inneholder metode bestemme om et bestemt objekt vises i en liste? Basert på er lik metode. Dermed må vi overstyre er lik metode og sørg for at den sammenligner to objekter basert på verdiene til de aktuelle egenskapene.

For eksempel er to rektangler like hvis bredden og høyden er lik.

Hvis vi ikke overstyrer er lik metode, bruker klassen vår er lik implementering av foreldreklassen. På slutten av dagen, eller rettere sagt, arvekjeden, den Gjenstand klasse' er lik metoden blir utført. Da er to tilfeller bare like hvis de refererer til nøyaktig samme objekt på dyngen.

For mer informasjon om er lik metode, se vår artikkel om Java er lik() og hashCode () Kontrakter.

4. Konklusjon

I denne raske artikkelen har vi sett hvordan du bruker strømmer til å beregne skjæringspunktet mellom to lister. Det er mange andre operasjoner som pleide å være ganske kjedelige, men som er ganske greie hvis vi kjenner oss rundt Java Stream API. Ta en titt på våre videre opplæringsprogrammer med Java-strømmer her.

Kodeeksempler er tilgjengelig på GitHub.


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