// Oppgave 2a abstract class Aktivitet implements Comparable { int tid; // OK om det ikke er noen konstruktor og at starttid alltid er null Aktivitet(int startTid) { if (startTid >= 0) tid = startTid; else throw new RuntimeException(" Starttid kan ikke vaere negativ"); } Aktivitet neste = null; Aktivitet forrige = null; public int compareTo(Aktivitet a) { return (this.tid - a.tid); } // Bare simulatoren skal kalle denne metoden abstract void handling(); } // Oppgave 2b class PrioKo { Aktivitet forste = null; Aktivitet siste = null; public void settInn(Aktivitet a) { if (forste == null) { forste = siste = a; a.neste = a.forrige = null; } else { Aktivitet leter = siste; while (leter != null && leter.compareTo(a) > 0) { leter = leter.forrige; } if (leter == siste) { // setter inn sist siste.neste = a; a.forrige = siste; siste = a; siste.neste = null; } else if (leter == null) { // sett inn forst a.neste = forste; forste.forrige = a; forste = a; forste.forrige = null; } else { // sett inn inne i mellom, bak leter a.neste = leter.neste; a.forrige = leter; leter.neste.forrige = a; leter.neste = a; } } } public Aktivitet hentUt( ) { if (forste == null) return null; Aktivitet temp = forste; if (forste == siste) { forste = siste = null; } else { forste = forste.neste; forste.forrige = null; } return temp; } } // Oppgave 2c class Simulator { PrioKo hendelser = new PrioKo(); int globaltid = 0; Simulator(Aktivitet[] alle) { for (Aktivitet tg: alle) hendelser.settInn(tg); } public void simuler(int t) { while (globaltid < t) { Aktivitet lpg = hendelser.hentUt(); globaltid = lpg.tid; lpg.handling(); hendelser.settInn(lpg); } } } // Oppgave 2d class Turgaaer extends Aktivitet { int hastighet; Kryss mittKryss; // Her jeg er eller settes til neste kryss av gaaVidere public Turgaaer(Kryss k, int hastighet) { super(0); // Alle starter med tid lik 0 mittKryss = k; ; this.hastighet = hastighet; } @Override public void handling() { // Jeg er naa kommet frem til et nytt kryss og // jeg skal gaa videre: Sti lp = mittKryss.hentTilfeldigSti(); // Tilfeldig sti videre mittKryss = lp.finnAndreEnde(mittKryss); // Dette er krysset jeg kommer til tid = tid+lp.beregnGaaTid(hastighet); } } // Oppgave 2e public class TestSimulator { public static void main(String[] args) { final int ANTKRYSS = 10; final int ANTSTIER = 20; final int ANTTRG = 4; // Antall turgaaere Skog nordmarka = new Skog(ANTKRYSS,ANTSTIER); Aktivitet[] alleAkt = new Aktivitet[ANTTRG]; for (int ind = 0; ind < ANTTRG; ind++) { alleAkt[ind] = new Turgaaer(nordmarka.hentTilfeldigStart(), Trekk.trekkInt(20,200)); } // Lager simulator og setter turgaaerene inn: Simulator sim = new Simulator(alleAkt); sim.simuler(Trekk.trekkInt(30,480)); } } // Oppgave 2f abstract class Aktivitet2 implements Comparable { private int tid; // Kan ikke akseseres utenfor denne klassen protected Aktivitet2(int startTid) { // Bare subklasser kan kalle denne konstruktoren if (startTid >= 0) tid = startTid; else throw new RuntimeException(" Starttid kan ikke vaere negativ"); } Aktivitet2 neste = null; // Disse to pekerne skal brukes i samme pakke Aktivitet2 forrige = null; // Metoden setNyTid er protected saa bare subklasser av // aktivitet kan sette ny tid. Disse kan vaere i en annen pakke/mappe protected void setNyTid(int nyTid) { if (nyTid <= tid) throw new RuntimeException(" Tiden skal gaa framover"); tid = nyTid; } // Subklasser maa kunne hente ut egen tid protected int minTid() { return tid; } // Simulatoren (i samme pakke) maa kunne hente ut tiden int hentTid() { return tid; } public int compareTo(Aktivitet2 a) { return (this.tid - a.tid); } // Bare simulatoren (i samme pakke) skal kalle denne metoden abstract void handling(); }