MatchAnalysis Deel6
Een graaf is een datastructuur dat heel veel wordt gebruikt in de computerwetenschappen. Een graaf bestaat uit een verzameling van knopen (i.e., nodes in het Engels) waarvan sommige verbonden zijn door lijnen of takken (i.e., edges in het Engels). Aan deze lijnen kunnen gewichten toegekend worden en dan spreekt men van een gewogen graaf. Indien de lijnen gericht zijn, dan spreekt men van pijlen en een gerichte graaf. Een veel voorkomende manier om een graaf te implementeren is door gebruik te maken van een nabijheidslijsten. Meer specifiek zal voor elke knoop een lijst worden bijgehouden met de takken waarmee hij verbonden is.
(de nodes zijn blauw en de edges zwart)
De MatchAnalysis oefening zal jullie een grafestructuur laten maken die gebruikt kan worden om sportwedstrijden te analyseren. We zijn namelijk geinteresseerd in het pasgedrag van een team. De grafestructuur maakt het mogelijk om voor een team of deel van het team de ‘pasintensiteit’ te berekenen. Dit geeft weer hoe goed een bepaald team of een bepaald deel van zijn spelers samenspelen.
Deel 6: Klasse MatchAnalysis
Download de interface IMatchAnalysis
.
- Definieer de klasse MatchAnalysis als implementatie van de interface IMatchAnalysis.
- Voeg de instantievariabelen toe zoals beschreven in het bovenstaande klassendiagram.
- Definieer de constructor zoals beschreven in het bovenstaande klassendiagram. Deze initialiseert de instantievariabelen met de overeenkomstige parameters.
- Voeg accessormethodes toe voor alle instantievariabelen en mutatormethodes voor de team naam en het balbezit.
- Voeg de statische methode readTeamInfo toe die een File als parameter heeft. De methode geeft het MatchAnalysis object terug dat opgeslagen is in het meegegeven CSV-bestand. Lees het bestand in, maak op basis van de ingelezen data een nieuw MatchAnalysis object aan en geef dat object terug. Indien het meegegeven bestand niet bestaat zal een boodschap van de volgende vorm geprint worden in de console:
Het bestand '[naam van het bestand]' bestaat niet!
. De placeholder zal vervangen worden door de naam van het bestand. Indien de data in het meegegeven CSV-bestand dezelfde node meermaals definieerd, zal de boodschap van de GraphAdditionException geprint worden in de console.
Om te testen kan je twee correct gedefinieerde voorbeeld bestanden downloaden: AtlMadrid.csv
en BMunchen.csv
. Je kan deze bestanden als tekstbestand openen om te zien hoe ze gedefinieerd zijn. Als je de methode zelf eens lokaal wil testen met deze bestanden, moet je de bestanden in de map van het project zetten op het zelfde niveau als de ‘src’-map (dus niet in die ‘src’-map). Bijvoorbeeld, in de map MatchAnalysis als je project die naam heeft. In je main moet je dan iets als volgt zetten: MatchAnalysis m = MatchAnalysis.readTeamInfo(new File("AtlMadrid.csv"));
.
Opmerking: in de matrix van het aantal passen van een bepaalde speler naar een andere speler staat soms 0. Er dient enkel een Pass object toegevoegd te worden aan de graaf indien de waarde in de matrix groter is dan 0.
- Voeg de methode calculateGroupIntensity toe die een array van INodes als parameter heeft. De methode berekent de pasintensiteit van de gegeven nodes volgens de volgende formule:
Indien de meegegeven variabele gelijk is aan ‘null’ of dit een lege array is, zal 0 terugegeven worden. Indien de meegegeven nodes een of meerdere nodes bevatten die niet in het MatchAnalysis object bijgehouden worden, zullen deze onbekende nodes genegeerd worden (= de berekening zelf gaat verder zonder rekening te houden met elk van deze onbekende nodes). In dit laatste geval zal voor elke onbekende node een boodschap uitgeprint worden in de console bestaande uit de boodschap van de gegooide GraphQueryException gevolgd door de boodschap Dus is deze node genegeerd.
.
- Overschrijf de methode calculateTeamIntensity die geen parameters heeft. De methode berekent de pasintensiteit van alle nodes die bijgehouden worden in dit MatchAnalysis object.
- Overschrijf de methode toString (van Object) die geen parameters heeft. De methode geeft het MatchAnalysis object weer als een String zoals in de volgende twee voorbeelden (de opgestelde spelers worden gesorteerd weergegeven volgens hun rugnummer):
Atletico de Madrid
--------------
Balbezit: 28.8%
Intensiteit: 5.486111111111111
Opgestelde Players:
Diego Godin (2)
Filipe Luis (3)
Koke (6)
Antoine Griezmann (7)
Fernando Torres (9)
Augusto Frenandez (12)
Jan Oblak (13)
Gabi (14)
Stafan Savic (15)
Saul Niguez (17)
JuanFran (20)
Yannick Carrasco (21)
Thomas Partey (22)
Joze Maria Gimenez (24)
Bayern Munchen
--------------
Balbezit: 61.2%
Intensiteit: 9.362745098039214
Opgestelde Players:
Manual Neuer (1)
Franck Ribery (7)
Javi Martinez (8)
Robert Lewandowski (9)
Douglas Costa (11)
Xabi Alonso (14)
Jerome Boateng (17)
Philip Lahm (21)
Arturo Vidal (23)
Thomas Muller (25)
David Alaba (27)
Kingsley Coman (29)
Hierbij nog wat uitleg over de Dodona-testen voor deze oefening:
- test00objectConcept: test of de ingediende klasse de verwachte de klasse definitie heeft (interface/abstracte klasse/klasse/enum/…).
- test01inheritance: test of de ingediende klasse de verwachte superklasse heeft en de verwachte interfaces implementeert.
- test02variables_presence: test of de ingediende klasse de verwachte instantievariabelen en statische variabelen definieert.
- test03variables_staticInitialValue: test of de statische variabelen van de klasse geinitialiseerd worden met de verwachte waarde (indien van toepassing).
- test04constructor: test of de constructor het gewenste effect heeft (indien van toepassing).
- test05methodsPresent: test of de verwachte methodes aanwezig zijn in de ingediende klasse en of de methode definities overeenkomen met de verwachte definities (= test geen effect!).
- test06accessorsMutators: test of de ingediende klasse de al dan niet verwachte accessor- en mutatormethodes definieert en of deze het verwachte effect hebben.
- test07readTeamInfo: test de readTeamInfo-methode.
- test08calculateGroupIntensity: test de calculateGroupIntensity-methode.
- test09calculateTeamIntensity: test de calculateTeamIntensity-methode.
- test10toString: test de toString-methode.
- test11toString_sysoutIpvReturn: test de toString-methode maar er worden ook oplossingen aanvaard die de gevraagde tekst naar de console uitprinten ipv teruggeven als String.