Skip to main content
Dat 2. semester Bornholm
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Fredag

GOT

Denne øvelse kombinerer Lister, Sets, records, lambda‑udtryk, streams og datoer.

Opgavebeskrivelse

Målet: Øve records, List/Map, lambdas, Stream API og java.time på et dataset af Game of Thrones-karakterer. Alt koden her kan kopieres direkte ind i et projekt.

Datastruktur (record + enums)

import java.time.LocalDate;

enum House { STARK, LANNISTER, TARGARYEN, TULLY, MORMONT, WILDLING, NONE }
enum Role { KING, QUEEN, LORD, LADY, COMMANDER, ADVISOR, WARRIOR, ASSASSIN, MAESTER, SMUGGLER, PRIESTESS }
enum Allegiance { NORTH, CROWN, DAENERYS, FREEFOLK, FAITH, NIGHT_WATCH, NONE }

public record GoTCharacter(
        String name,
        House house,
        Role role,
        Allegiance allegiance,
        LocalDate born,
        boolean alive,
        int seasonsAppeared,
        int killCount,
        double notoriety // 0-10, hvor berømt/berygtet de er
) {}

Startdata (20 karakterer)

Sæt currentYear til 300 i dine beregninger for alder osv.

import java.util.List;
import static java.time.LocalDate.of;

List<GoTCharacter> characters = List.of(
    new GoTCharacter("Jon Snow",       House.STARK,     Role.COMMANDER, Allegiance.NORTH,       of(283,12,3),  true, 8, 45, 9.3),
    new GoTCharacter("Arya Stark",     House.STARK,     Role.ASSASSIN,  Allegiance.NORTH,       of(289,3,29),  true, 8, 65, 9.1),
    new GoTCharacter("Sansa Stark",    House.STARK,     Role.LADY,      Allegiance.NORTH,       of(286,2,20),  true, 8, 3,  8.6),
    new GoTCharacter("Ned Stark",      House.STARK,     Role.LORD,      Allegiance.NORTH,       of(263,2,11),  false,1, 5,  8.0),
    new GoTCharacter("Catelyn Stark",  House.TULLY,     Role.LADY,      Allegiance.NORTH,       of(264,5,10),  false,3, 2,  7.5),
    new GoTCharacter("Robb Stark",     House.STARK,     Role.KING,      Allegiance.NORTH,       of(283,11,23), false,3, 22, 8.4),
    new GoTCharacter("Bran Stark",     House.STARK,     Role.ADVISOR,   Allegiance.NORTH,       of(289,12,5),  true, 8, 0,  7.0),
    new GoTCharacter("Tyrion Lannister",House.LANNISTER,Role.ADVISOR,   Allegiance.DAENERYS,    of(273,1,1),   true, 8, 6,  9.2),
    new GoTCharacter("Jaime Lannister",House.LANNISTER, Role.WARRIOR,   Allegiance.CROWN,       of(266,2,14),  false,8, 45, 8.7),
    new GoTCharacter("Cersei Lannister",House.LANNISTER,Role.QUEEN,     Allegiance.CROWN,       of(266,11,30), false,8, 30, 9.0),
    new GoTCharacter("Tywin Lannister",House.LANNISTER, Role.LORD,      Allegiance.CROWN,       of(242,10,1),  false,4, 18, 8.3),
    new GoTCharacter("Daenerys Targaryen",House.TARGARYEN,Role.QUEEN,   Allegiance.DAENERYS,    of(284,7,12),  false,8, 200,9.5),
    new GoTCharacter("Jorah Mormont",  House.MORMONT,   Role.WARRIOR,   Allegiance.DAENERYS,    of(260,1,20),  false,8, 40, 8.1),
    new GoTCharacter("Brienne of Tarth",House.NONE,     Role.WARRIOR,   Allegiance.NORTH,       of(280,4,4),   true, 8, 20, 8.4),
    new GoTCharacter("Sandor Clegane", House.NONE,      Role.WARRIOR,   Allegiance.NONE,        of(270,6,17),  false,8, 50, 8.2),
    new GoTCharacter("Gregor Clegane", House.NONE,      Role.WARRIOR,   Allegiance.CROWN,       of(265,9,9),   false,8, 100,8.0),
    new GoTCharacter("Samwell Tarly",  House.NONE,      Role.MAESTER,   Allegiance.NIGHT_WATCH, of(283,10,2),  true, 8, 1,  7.8),
    new GoTCharacter("Davos Seaworth", House.NONE,      Role.SMUGGLER,  Allegiance.NORTH,       of(266,8,15),  true, 8, 4,  7.9),
    new GoTCharacter("Melisandre",     House.NONE,      Role.PRIESTESS, Allegiance.FAITH,       of(200,1,1),   false,8, 10, 8.1),
    new GoTCharacter("Tormund Giantsbane",House.WILDLING,Role.WARRIOR,  Allegiance.FREEFOLK,    of(270,3,3),   true, 8, 35, 8.3)
);

Opgaver

  1. Udskriv alle karakterer sorteret efter navn.
  2. Udskriv alle karakterer fra huset STARK.
  3. Hent top-3 mest berygtede (notoriety) der stadig er i live.
  4. Brug LocalDate og Period til at finde den ældste nulevende karakter.
  5. Lav et Map<Allegiance, List<GoTCharacter>> og udskriv antal pr. allegiance.
  6. Find samlet antal kills for karakterer født efter of(280, 1, 1).
  7. Transformér til Map<String, Integer> med navn → sæsoner, og filtrér kun dem med >5 sæsoner.
  8. Brug partitioningBy til at splitte levende/døde og udskriv gennemsnitlig notoriety for hver gruppe.
  9. Udpeg pr. House den karakter med højest killCount (maxBy inde i grouping).
  10. Lav en stream, der returnerer de roller (Role), der ikke optræder i nogen karakter (hint: EnumSet.allOf(Role.class) minus brugte). Indsæt evt. en ekstra rolle i Role-enum for at være sikker på at der er en rolle som ikke bruges.
  11. Find gennemsnitlig killCount pr. House (Collectors.groupingBy + averagingInt).

Find selv på interessante eller sjove opgaver ud fra datasættet! Du kan også udvide GoTCharacter-recorden med flere felter, hvis du har idéer til flere data at arbejde med.