From 11f74837ba9f7bfed62e0fa31b16ef73f668b38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Thu, 10 Aug 2023 00:44:56 +0300 Subject: [PATCH] =?UTF-8?q?K=C3=A4yt=C3=A4=20joukkoja=20tuntien=20luokkien?= =?UTF-8?q?=20ja=20opettajien=20mallintamiseen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- käyttöliittymä.js | 4 +-- tietomalli.js | 67 ++++++++++++++++++++--------------------------- tietotyypit.js | 53 ++++++++++++++++++++++++++++--------- 3 files changed, 72 insertions(+), 52 deletions(-) diff --git a/käyttöliittymä.js b/käyttöliittymä.js index 3df82b1..3638925 100644 --- a/käyttöliittymä.js +++ b/käyttöliittymä.js @@ -268,8 +268,8 @@ function luoTuntiLista() { for (let [_, tunti] of tunnit.järjestyksessä()) { let tuntiListassa = document.createElement('li'); let nimi = tunti.nimi; - let luokat = tunti.luokat.join(', '); - let opettajat = tunti.opettajaLyhenteet.join(', '); + let luokat = tunti.luokat.alkiot().join(', '); + let opettajat = tunti.opettajaLyhenteet.alkiot().join(', '); let kertaaViikossa = tunti.kertaaViikossa; let teksti; if (kertaaViikossa === 1) { diff --git a/tietomalli.js b/tietomalli.js index a2e0c54..08ce5fd 100644 --- a/tietomalli.js +++ b/tietomalli.js @@ -45,15 +45,13 @@ function suorita(tyyppi, ...argumentit) { let [poistettuAste] = argumentit; luokkaAsteet.poista(poistettuAste); // Poista poistettujen luokka-asteiden luokat tunneista - for (let [id, tunti] of tunnit.tunnit) { - let luokat = []; - for (let luokka of tunti.luokat) { + for (let [_, tunti] of tunnit.tunnit) { + for (let luokka of tunti.luokat.alkiot()) { let luokanAste = parseInt(luokka[0]); - if (luokanAste !== poistettuAste) { - luokat.push(luokka); + if (luokanAste === poistettuAste) { + tunti.luokat.poista(luokka); } } - tunnit.tunnit.get(id).luokat = luokat; } break; case tapahtumaTyypit.muutaAste: @@ -61,18 +59,15 @@ function suorita(tyyppi, ...argumentit) { let [vanhaAste, uusiAste] = argumentit; luokkaAsteet.muuta(vanhaAste, uusiAste); // Muuta muutetut luokka-asteet tunneissa - for (let [id, tunti] of tunnit.tunnit) { - let luokat = []; - for (let luokka of tunti.luokat) { + for (let [_, tunti] of tunnit.tunnit) { + for (let luokka of tunti.luokat.alkiot()) { let luokanAste = parseInt(luokka[0]); if (luokanAste === vanhaAste) { - let luokanLuokka = luokka.slice(1); - luokat.push(`${uusiAste}${luokanLuokka}`); - } else { - luokat.push(luokka); + let uusiLuokka = `${uusiAste}${luokka.slice(1)}`; + tunti.luokat.poista(luokka); + tunti.luokat.lisää(uusiLuokka); } } - tunnit.tunnit.get(id).luokat = luokat; } break; @@ -85,14 +80,12 @@ function suorita(tyyppi, ...argumentit) { let [aste] = argumentit; luokkaAsteet.asteet[aste].poista(); // Poista luokka jota ei enää ole asteella tunneista - for (let [id, tunti] of tunnit.tunnit) { - let luokat = []; - for (let luokka of tunti.luokat) { - if (luokkaAsteet.luokat().indexOf(luokka) !== -1) { - luokat.push(luokka); + for (let [_, tunti] of tunnit.tunnit) { + for (let luokka of tunti.luokat.alkiot()) { + if (luokkaAsteet.luokat().indexOf(luokka) === -1) { + tunti.luokat.poista(luokka); } } - tunnit.tunnit.get(id).luokat = luokat; } break; @@ -105,14 +98,12 @@ function suorita(tyyppi, ...argumentit) { let [poistettuOpettaja] = argumentit; opettajat.poista(poistettuOpettaja); // Poista opettaja joita ei enää ole tunneista - for (let [id, tunti] of tunnit.tunnit) { - let opettajaLyhenteet = []; - for (let opettajaLyhenne of tunti.opettajaLyhenteet) { - if (opettajaLyhenne !== poistettuOpettaja) { - opettajaLyhenteet.push(opettajaLyhenne); + for (let [_, tunti] of tunnit.tunnit) { + for (let opettajaLyhenne of tunti.opettajaLyhenteet.alkiot()) { + if (opettajaLyhenne === poistettuOpettaja) { + tunti.opettajaLyhenteet.poista(poistettuOpettaja); } } - tunnit.tunnit.get(id).opettajaLyhenteet = opettajaLyhenteet; } break; @@ -300,24 +291,24 @@ testi('tuntien käsittely', () => { assertEq('lisättyä pituus', tunnit.järjestyksessä().length, 3); suorita(tapahtumaTyypit.poistaAste, 1); - assertEq('aste poistettua 0', tunnit.järjestyksessä()[0][1].luokat, ['5B']); - assertEq('aste poistettua 1', tunnit.järjestyksessä()[1][1].luokat, ['5A']); - assertEq('aste poistettua 2', tunnit.järjestyksessä()[2][1].luokat, []); + assertEq('aste poistettua 0', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['5B']); + assertEq('aste poistettua 1', tunnit.järjestyksessä()[1][1].luokat.alkiot(), ['5A']); + assertEq('aste poistettua 2', tunnit.järjestyksessä()[2][1].luokat.alkiot(), []); suorita(tapahtumaTyypit.muutaAste, 5, 6); - assertEq('aste muutettua 0', tunnit.järjestyksessä()[0][1].luokat, ['6B']); - assertEq('aste muutettua 1', tunnit.järjestyksessä()[1][1].luokat, ['6A']); - assertEq('aste muutettua 2', tunnit.järjestyksessä()[2][1].luokat, []); + assertEq('aste muutettua 0', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['6B']); + assertEq('aste muutettua 1', tunnit.järjestyksessä()[1][1].luokat.alkiot(), ['6A']); + assertEq('aste muutettua 2', tunnit.järjestyksessä()[2][1].luokat.alkiot(), []); suorita(tapahtumaTyypit.poistaLuokka, 6); - assertEq('luokka poistettua 0', tunnit.järjestyksessä()[0][1].luokat, []); - assertEq('luokka poistettua 1', tunnit.järjestyksessä()[1][1].luokat, ['6A']); - assertEq('luokka poistettua 1', tunnit.järjestyksessä()[2][1].luokat, []); + assertEq('luokka poistettua 0', tunnit.järjestyksessä()[0][1].luokat.alkiot(), []); + assertEq('luokka poistettua 1', tunnit.järjestyksessä()[1][1].luokat.alkiot(), ['6A']); + assertEq('luokka poistettua 1', tunnit.järjestyksessä()[2][1].luokat.alkiot(), []); suorita(tapahtumaTyypit.poistaOpettaja, 'KV'); - assertEq('opettaja poistettua 0', tunnit.järjestyksessä()[0][1].opettajaLyhenteet, []); - assertEq('opettaja poistettua 1', tunnit.järjestyksessä()[1][1].opettajaLyhenteet, ['MM']); - assertEq('opettaja poistettua 2', tunnit.järjestyksessä()[2][1].opettajaLyhenteet, ['AS']); + assertEq('opettaja poistettua 0', tunnit.järjestyksessä()[0][1].opettajaLyhenteet.alkiot(), []); + assertEq('opettaja poistettua 1', tunnit.järjestyksessä()[1][1].opettajaLyhenteet.alkiot(), ['MM']); + assertEq('opettaja poistettua 2', tunnit.järjestyksessä()[2][1].opettajaLyhenteet.alkiot(), ['AS']); suorita(tapahtumaTyypit.poistaTunti, 0); assertEq('poistettua pituus', tunnit.järjestyksessä().length, 2); diff --git a/tietotyypit.js b/tietotyypit.js index 5df1971..33ac0a3 100644 --- a/tietotyypit.js +++ b/tietotyypit.js @@ -112,8 +112,8 @@ class Opettajat { class Tunti { constructor(nimi, luokat, opettajaLyhenteet, kertaaViikossa) { this.nimi = nimi; - this.luokat = luokat; - this.opettajaLyhenteet = opettajaLyhenteet; + this.luokat = new Joukko(luokat); + this.opettajaLyhenteet = new Joukko(opettajaLyhenteet); this.kertaaViikossa = kertaaViikossa; } } @@ -146,11 +146,11 @@ class Tunnit { let tulos = vertaa(a[1].nimi, b[1].nimi); // TODO: Korjaa niin, että osaa verrata okein listoja if (tulos === 0) { - tulos = vertaa(a[1].luokat, b[1].luokat); + tulos = vertaa(a[1].luokat.alkiot(), b[1].luokat.alkiot()); } // TODO: Korjaa niin, että osaa verrata okein listoja if (tulos === 0) { - tulos = vertaa(a[1].opettajaLyhenteet, b[1].opettajaLyhenteet); + tulos = vertaa(a[1].opettajaLyhenteet.alkiot(), b[1].opettajaLyhenteet.alkiot()); } if (tulos === 0) { tulos = vertaa(a[1].kertaaViikossa, b[1].kertaaViikossa); @@ -164,6 +164,35 @@ class Tunnit { } } +class Joukko { + #alkiot = new Map(); + + constructor(alkiot) { + if (alkiot !== undefined) { + for (let alkio of alkiot) { + this.#alkiot.set(alkio, true); + } + } + } + + alkiot() { + let alkiot = []; + for (let [alkio, _] of this.#alkiot) { + alkiot.push(alkio); + } + alkiot.sort(); + return alkiot; + } + + lisää(alkio) { + this.#alkiot.set(alkio, true); + } + + poista(alkio) { + this.#alkiot.delete(alkio); + } +} + function vertaa(a, b) { if (a < b) { return -1; @@ -299,12 +328,12 @@ testi('tuntien lisääminen', () => { assertEq('historia', tunnit.lisää('Historia', '5B', 'KV', 1), 0); assertEq('äidinkieli', tunnit.lisää('Äidinkieli', '1A', 'AS', 3), 1); assertEq('historia nimi', tunnit.tunnit.get(0).nimi, 'Historia'); - assertEq('historia luokat', tunnit.tunnit.get(0).luokat, ['5B']); - assertEq('historia opettajat', tunnit.tunnit.get(0).opettajaLyhenteet, ['KV']); + assertEq('historia luokat', tunnit.tunnit.get(0).luokat.alkiot(), ['5B']); + assertEq('historia opettajat', tunnit.tunnit.get(0).opettajaLyhenteet.alkiot(), ['KV']); assertEq('historia viikossa', tunnit.tunnit.get(0).kertaaViikossa, 1); assertEq('äidinkieli nimi', tunnit.tunnit.get(1).nimi, 'Äidinkieli'); - assertEq('äidinkieli luokat', tunnit.tunnit.get(1).luokat, ['1A']); - assertEq('äidinkieli opettajat', tunnit.tunnit.get(1).opettajaLyhenteet, ['AS']); + assertEq('äidinkieli luokat', tunnit.tunnit.get(1).luokat.alkiot(), ['1A']); + assertEq('äidinkieli opettajat', tunnit.tunnit.get(1).opettajaLyhenteet.alkiot(), ['AS']); assertEq('äidinkieli viikossa', tunnit.tunnit.get(1).kertaaViikossa, 3); }); @@ -326,10 +355,10 @@ testi('tuntien järjestys', () => { tunnit.lisää('Äidinkieli', '1B', 'AS', 3); assertEq('aluksi', tunnit.järjestyksessä()[0][1].nimi, 'Historia'); tunnit.tunnit.get(1).nimi = 'Historia'; - assertEq('sama nimi', tunnit.järjestyksessä()[0][1].luokat, ['1B']); - tunnit.tunnit.get(0).luokat = ['1B']; - assertEq('sama luokka', tunnit.järjestyksessä()[0][1].opettajaLyhenteet, ['AS']); - tunnit.tunnit.get(0).opettajaLyhenteet = ['AS']; + assertEq('sama nimi', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['1B']); + tunnit.tunnit.get(0).luokat = new Joukko(['1B']); + assertEq('sama luokka', tunnit.järjestyksessä()[0][1].opettajaLyhenteet.alkiot(), ['AS']); + tunnit.tunnit.get(0).opettajaLyhenteet = new Joukko(['AS']); assertEq('sama opettaja', tunnit.järjestyksessä()[0][1].kertaaViikossa, 1); tunnit.tunnit.get(1).kertaaViikossa = 1; assertEq('yhtä monta kertaa viikossa', tunnit.järjestyksessä()[0][0], 0);