MatchAnalysis Deel5
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 5: Klasse Graph
Download de interface IGraph
.
- Definieer de klasse Graph als implementatie van de interface IGraph.
- Voeg de instantievariabele ‘proximityLists’ toe zoals beschreven in het bovenstaande klassendiagram.
- Definieer de constructors zoals beschreven in het bovenstaande klassendiagram. De constructor zonder parameters initialiseert de instantievariabele als een lege HashMap, terwijl de andere constructor de instantievariabele initialiseert met de meegegeven parameter.
- Overschrijf de methode getNodes (van IGraph) die geen parameters heeft. De methode geeft een lijst terug met alle nodes die bijgehouden worden in het Graph object.
- Voeg de methode getNrOfNodes toe die geen parameters heeft. De methode geeft het aantal nodes terug die bijgehouden worden in het Graph object.
- Voeg de methode getNrOfEdges toe die geen parameters heeft. De methode geeft het aantal unieke edges terug die bijgehouden worden in het Graph object.
- Voeg de methode getNode toe die een String als parameter heeft. De methode zoekt de node met de gegeven naam. Indien er een node bijgehouden wordt in het Graph object met deze naam, zal deze node teruggegeven worden. Indien deze node niet gevonden kan worden, zal er een GraphQueryException gegooid worden met naam van de node.
- Voeg de methode getEdgesWithHigherWeight toe die een int als parameter heeft. De methode geeft een set terug met alle edges met een gewicht hoger dan de meegegeven ‘threshold’. Indien er geen edges gevonden kunnen worden, zal een lege set teruggegeven worden.
- Overschrijf de methode containsNode (van IGraph) die een INode als parameter heeft. De methode geeft ‘true’ terug indien de gegeven node bijgehouden worden in het Graph object.
- Overschrijf de methode containsEdge (van IGraph) die een IEdge als parameter heeft. De methode geeft ‘true’ terug indien de gegeven edge bijgehouden worden in het Graph object.
- Overschrijf de methode addNode (van IGraph) die een INode als parameter heeft. De methode voegt de gegeven node toe aan de ‘proximityLists’ variabele, met als waarde een lege lijst. Indien de gegeven node al bijgehouden wordt door het Graph object, zal een GraphAdditionException gegooid worden met de gegeven node.
- Overschrijf de methode addEdge (van IGraph) die een IEdge als parameter heeft. De methode voegt de gegeven edge toe aan de ‘proximityLists’ variabele. Indien de start node of de eind node van de gegeven edge nog niet bijgehouden worden of de edge al begehouden werd al bijgehouden, zal een GraphAdditionException gegooid worden met de gegeven edge.
- Overschrijf de methode calculateInStrenghtOfNode (van IGraph) die een INode als parameter heeft. De methode geeft de som terug van alle gewichten van alle bijgehouden edges waarvan de eind node gelijk is aan de meegegeven node. Indien de node niet bijgehouden wordt in het Graph object, zal een GraphQueryException gegooid worden met de gegeven node.
- Overschrijf de methode calculateOutStrenghtOfNode (van IGraph) die een INode als parameter heeft. De methode geeft de som terug van alle gewichten van alle bijgehouden edges waarvan de start node gelijk is aan de meegegeven node. Indien de node niet bijgehouden wordt in het Graph object, zal een GraphQueryException gegooid worden met de gegeven node.
- Overschrijf de methode exportDataFile (van IGraph) die een File als parameter heeft. De methode schrijft de inhoud van de variabele ‘proximityLists’ weg naar het meegegeven bestand in de vorm van een data bestand en gooit een mogelijke IOException door indien nodig.
TIP: Het is dus niet de bedoeling dat je een CSV-bestand probeert aan te maken! Indien je niet weet wat met een data bestand bedoeld wordt, zoek het dan eerste eens op in je cursus.
- Voeg de statische methode importDataFile toe die een File als parameter heeft. De methode leest het meegegeven data bestand in en maakt een nieuw Graph object aan met de ingelezen data als de inhoud van diens ‘proximityLists’ variabele. Het nieuwe wordt daarna teruggegeven. Indien het gegeven bestand niet bestaat of corrupt is, zal de methode null teruggeven.
TIP: Ook hier gaat het dus over een data bestand en niet over een CSV-bestand!
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).
- test05constructor_HashMap: test of de constructor met een HashMap als parameter het gewenste effect heeft.
- test06methodsPresent: test of de verwachte methodes aanwezig zijn in de ingediende klasse en of de methode definities overeenkomen met de verwachte definities (= test geen effect!).
- test07accessorsMutators: test of de ingediende klasse de al dan niet verwachte accessor- en mutatormethodes definieert en of deze het verwachte effect hebben.
- test08getNodes: test de getNodes-methode.
- test09getNrOfNodes: test de getNrOfNodes-methode.
- test10getNrOfEdges: test de getNrOfEdges-methode.
- test11getNode: test de getNode-methode.
- test12getNode_zonderException: test de getNode-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.
- test13getEdgesWithHigherWeight: test de getEdgesWithHigherWeight-methode.
- test14containsNode: test de containsNode-methode.
- test15containsEdge: test de containsEdge-methode.
- test16addNode: test de addNode-methode.
- test17addNode_zonderException: test de addNode-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.
- test18addEdge: test de addEdge-methode.
- test19addEdge_zonderException: test de addEdge-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.
- test20calculateInStrenghtOfNode: test de calculateInStrenghtOfNode-methode.
- test21calculateInStrenghtOfNode_zonderException: test de calculateInStrenghtOfNode-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.
- test22calculateOutStrenghtOfNode: test de calculateOutStrenghtOfNode-methode.
- test23calculateOutStrenghtOfNode_zonderException: test de calculateOutStrenghtOfNode-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.
- test24exportDataFile: test de exportDataFile-methode.
- test25exportDataFile_zonderExceptions: test de exportDataFile-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.
- test26importDataFile: test de importDataFile-methode.
- test27importDataFile_enkelExceptions: test de importDataFile-methode. Er worden enkel scenario’s getest waarin exceptions verwacht worden.
- test28importDataFile_enkelExceptions_zonderClassNotFoundException: test de importDataFile-methode. Er worden enkel scenario’s getest waarin exceptions verwacht worden, maar geen scenario’s waarin een ClassNotFoundException gegooid zou worden.
- test29importDataFile_zonderExceptions: test de importDataFile-methode. Er worden geen scenario’s getest waarin exceptions verwacht worden.