Snijpunt van twee lijsten in Java

1. Overzicht

In deze zelfstudie leren we hoe u de kruising van twee kunt ophalen Lijsts.

Net als veel andere dingen is dit veel eenvoudiger geworden dankzij de introductie van streams in Java 8.

2. Snijpunt van twee lijsten met strings

Laten we er twee maken Lijsts van Draads met enige kruising - beide hebben enkele gedupliceerde elementen:

List list = Arrays.asList ("rood", "blauw", "blauw", "groen", "rood"); List otherList = Arrays.asList ("rood", "groen", "groen", "geel");

En nu we bepalen het snijpunt van de lijsten met behulp van stream-methoden:

Stel resultaat = lijst.stream () .distinct () .filter (otherList :: bevat) .collect (Collectors.toSet ()); Set commonElements = new HashSet (Arrays.asList ("rood", "groen")); Assert.assertEquals (commonElements, resultaat);

Eerst verwijderen we de gedupliceerde elementen met onderscheiden. Vervolgens gebruiken we de filter om de elementen te selecteren die ook in het andereLijst.

Ten slotte converteren we onze uitvoer met een Verzamelaar. Het snijpunt mag elk gemeenschappelijk element slechts één keer bevatten. De volgorde zou er dus niet toe doen toSet is de meest eenvoudige keuze, maar we kunnen ook gebruiken toList of een andere verzamelmethode.

Raadpleeg onze gids voor Java 8's Collectors voor meer informatie.

3. Snijpunt van lijsten met aangepaste klassen

Wat als onze Lijsts bevatten geen Draads maar eerder instanties van een aangepaste klasse die we hebben gemaakt? Zolang we Java's conventies volgen, werkt de oplossing met stream-methoden prima voor onze aangepaste klasse.

Hoe doet de bevat methode bepalen of een specifiek object in een lijst voorkomt? Gebaseerd op de is gelijk aan methode. We moeten dus de is gelijk aan methode en zorg ervoor dat het twee objecten vergelijkt op basis van de waarden van de relevante eigenschappen.

Twee rechthoeken zijn bijvoorbeeld gelijk als hun breedte en hoogte gelijk zijn.

Als we het is gelijk aan methode gebruikt onze klas de is gelijk aan implementatie van de bovenliggende klasse. Aan het eind van de dag, of liever gezegd, de erfenisketen, de Voorwerp klasse' is gelijk aan methode wordt uitgevoerd. Twee gevallen zijn alleen gelijk als ze verwijzen naar exact hetzelfde object op de heap.

Voor meer informatie over het is gelijk aan methode, zie ons artikel over Java is gelijk aan () en hashCode () Contracten.

4. Conclusie

In dit korte artikel hebben we gezien hoe we streams kunnen gebruiken om de kruising van twee lijsten te berekenen. Er zijn veel andere bewerkingen die vroeger behoorlijk vervelend waren, maar vrij eenvoudig zijn als we de weg kennen in de Java Stream API. Bekijk hier onze verdere tutorials met Java-streams.

Codevoorbeelden zijn beschikbaar op GitHub.


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