From 1f8feb3971ee6bb234fa42971ca2255474d44a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Dobrovoljc?= Date: Sat, 18 May 2024 00:11:46 +0200 Subject: [PATCH] DN09 - Naloga 5 WIP --- src/DN09.java | 173 +++++++++++++++++++++++++++++++++----------- src/DN09Test05.java | 123 +++++++++++++++++++++++++++++++ 2 files changed, 254 insertions(+), 42 deletions(-) create mode 100644 src/DN09Test05.java diff --git a/src/DN09.java b/src/DN09.java index 730ca82..593341a 100644 --- a/src/DN09.java +++ b/src/DN09.java @@ -1,7 +1,8 @@ import java.io.File; import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Scanner; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class DN09 { public static void main(String[] args) { @@ -10,6 +11,15 @@ public class DN09 { return; } + if (args[0].equals("pobratene")) { + ZgodovinaTekmovanj zgodovinaTekmovanj = ZgodovinaTekmovanj.izDatotek(args[1], args[2]); + assert zgodovinaTekmovanj != null; + + zgodovinaTekmovanj.izpisiPobrateneDrzave(Integer.parseInt(args[3])); + + return; + } + Tekmovanje tekmovanje = Tekmovanje.izDatotek(args[1], args[2]); assert tekmovanje != null; @@ -21,7 +31,7 @@ public class DN09 { break; case "izpisiTocke": - tekmovanje.izpisiGlasove(); + tekmovanje.izpisiTocke(); break; case "najboljse": @@ -306,49 +316,128 @@ class UtezeniKriterij implements Kriterij { } } +class Leto { + ArrayList tekmovalci = new ArrayList<>(); + HashMap> glasovi = new LinkedHashMap<>(); +} + class ZgodovinaTekmovanj { - private ArrayList seznamTekmovanj; + ArrayList seznamTekmovanj; + ZgodovinaTekmovanj(ArrayList seznamTekmovanj) { this.seznamTekmovanj = seznamTekmovanj; } -// public static ZgodovinaTekmovanj izDatotek(String datotekaTekmovalci, String datotekaGlasovi) { -// Scanner scannerTekmovalci, scannerGlasovi; -// -// try { -// scannerTekmovalci = new Scanner(new File(datotekaTekmovalci)); -// scannerGlasovi = new Scanner(new File(datotekaGlasovi)); -// } catch (FileNotFoundException e) { -// return null; -// } -// -// scannerTekmovalci.nextLine(); -// scannerGlasovi.nextLine(); -// -// ArrayList seznamTekmovalcev = new ArrayList<>(); -// while (scannerTekmovalci.hasNextLine()) { -// String[] fields = scannerTekmovalci.nextLine().split(";"); -// seznamTekmovalcev.add(new Tekmovalec(fields[1], fields[2], fields[3])); -// } -// -// ArrayList seznamGlasov = new ArrayList<>(); -// while (scannerGlasovi.hasNextLine()) { -// String[] fields = scannerGlasovi.nextLine().split(";"); -// switch (fields.length) { -// case 5: -// seznamGlasov.add(new Glas(fields[2], fields[3], Integer.parseInt(fields[4]))); -// break; -// case 6: -// seznamGlasov.add(new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]), -// Integer.parseInt(fields[5]), 0)); -// break; -// case 7: -// seznamGlasov.add(new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]), -// Integer.parseInt(fields[5]), Integer.parseInt(fields[6]))); -// break; -// } -// } -// } - + public static ZgodovinaTekmovanj izDatotek(String datotekaTekmovalci, String datotekaGlasovi) { + Scanner scannerTekmovalci, scannerGlasovi; + + try { + scannerTekmovalci = new Scanner(new File(datotekaTekmovalci)); + scannerGlasovi = new Scanner(new File(datotekaGlasovi)); + } catch (FileNotFoundException e) { + return null; + } + + scannerTekmovalci.nextLine(); + scannerGlasovi.nextLine(); + + Map leta = new LinkedHashMap<>(); + + while (scannerGlasovi.hasNextLine()) { + String[] fields = scannerGlasovi.nextLine().split(";"); + Glas glas = switch (fields.length) { + case 7 -> new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]), + Integer.parseInt(fields[5]), Integer.parseInt(fields[6])); + case 6 -> new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]), + Integer.parseInt(fields[5]), 0); + default -> new Glas(fields[2], fields[3], Integer.parseInt(fields[4])); + }; + + if (!leta.containsKey(fields[0])) { + leta.put(fields[0], new Leto()); + } + Map> glasovi = leta.get(fields[0]).glasovi; + + if (!glasovi.containsKey(fields[1])) { + glasovi.put(fields[1], new ArrayList<>()); + } + glasovi.get(fields[1]).add(glas); + } + + while (scannerTekmovalci.hasNextLine()) { + String[] fields = scannerTekmovalci.nextLine().split(";"); + Tekmovalec tekmovalec = new Tekmovalec(fields[1], fields[2], fields[3]); + + leta.get(fields[0]).tekmovalci.add(tekmovalec); + } + + ArrayList tekmovanja = new ArrayList<>(); + + for (String leto : leta.keySet()) { + for (String krog : leta.get(leto).glasovi.keySet()) { + tekmovanja.add(new Tekmovanje(leta.get(leto).tekmovalci, leta.get(leto).glasovi.get(krog))); + } + } + + return new ZgodovinaTekmovanj(tekmovanja); + } + + + public int getSkupnoSteviloTock(String drzava) { + int tocke = 0; + for (Tekmovanje tekmovanje : seznamTekmovanj) { + tocke += tekmovanje.steviloTock(drzava); + } + return tocke; + } + + public float povprecnaUvrstitev(String drzava) { + int sum = 0, count = 0; + for (Tekmovanje tekmovanje : seznamTekmovanj) { + int mesto = tekmovanje.getMesto(drzava); + if (mesto == -1) continue; + sum += tekmovanje.getMesto(drzava); + + count++; + } + return (float) sum / count; + } + + public int najboljsaUvrstitev(String drzava) { + int min = Integer.MAX_VALUE; + for (Tekmovanje tekmovanje : seznamTekmovanj) { + int mesto = tekmovanje.getMesto(drzava); + if (mesto == -1) continue; + if (mesto < min) { + min = mesto; + } + } + return min; + } + + public void izpisiPobrateneDrzave(int topN) { + System.out.println("Drzave z najvec medsebojnih glasov:"); + + Map tocke = new LinkedHashMap<>(); + for (Tekmovanje tekmovanje : seznamTekmovanj) { + for (Glas glas : tekmovanje.getSeznamGlasov()) { + String key = Stream.of(glas.getOdDrzave(), glas.getZaDrzavo()).sorted().collect(Collectors.joining(":")); + tocke.put(key, tocke.getOrDefault(key, 0) + glas.getStTock()); + } + } + + Map sortirane = tocke.entrySet().stream() + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .limit(Math.min(topN, tocke.size())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new)); + + int n = 1; + for (String key : sortirane.keySet()) { + int t = sortirane.get(key); + String[] drzave = key.split(":"); + System.out.printf("%d. %s <-(%dt)-> %s\n", n, drzave[0], t, drzave[1]); + n++; + } + } } \ No newline at end of file diff --git a/src/DN09Test05.java b/src/DN09Test05.java new file mode 100644 index 0000000..a0aa21d --- /dev/null +++ b/src/DN09Test05.java @@ -0,0 +1,123 @@ +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; + +public class DN09Test05 { + + Tekmovanje miniTekmovanje; + Tekmovanje praznoTekmovanje; + + ZgodovinaTekmovanj miniZgodovinaTekmovanj; + + + @Before + public void init() { + ArrayList seznamTekmovalcev = new ArrayList<>(Arrays.asList( + new Tekmovalec("Češka", "Vesna", "My Sister's Crown"), + new Tekmovalec("Armenija", "Brunette", "Future Lover"), + new Tekmovalec("Islandija", "Diljá", "Power") + )); + + ArrayList seznamGlasov = new ArrayList<>(Arrays.asList( + new Glas("Češka", "Islandija", 6), + new Glas("Armenija", "Islandija", 6), + new Glas("Armenija", "Češka", 4), + new Glas("Islandija", "Češka", 0) + )); + + miniTekmovanje = new Tekmovanje(seznamTekmovalcev, seznamGlasov); + + // Prazno tekmovanje + praznoTekmovanje = new Tekmovanje(new ArrayList<>(), new ArrayList<>()); + + + } + + @Test + public void testConstructor() { + //Testira razred zgodovinaTekmovanj + // Konstruktor mora ustrezno nastaviti zgodovino tekmovanj + miniZgodovinaTekmovanj = new ZgodovinaTekmovanj(new ArrayList<>(Arrays.asList(miniTekmovanje, miniTekmovanje))); + Assert.assertNotNull(miniZgodovinaTekmovanj); + } + + @Test + public void testBranjePodatkov() { + // Testira branje podatkov + // Metoda izDatotek mora ustrezno delovati + ZgodovinaTekmovanj zgodovinaTekmovanj = ZgodovinaTekmovanj.izDatotek("viri/tekmovalci_sample.csv", "viri/glasovi_sample.csv"); + Assert.assertEquals(zgodovinaTekmovanj.seznamTekmovanj.get(0).getSeznamTekmovalcev().get(0).getDrzava(), "Švedska"); + Assert.assertEquals(zgodovinaTekmovanj.seznamTekmovanj.get(2).getSeznamTekmovalcev().get(5).getDrzava(), "Ukrajina"); + } + + @Test + public void testSkupnoSteviloTock() { + // Testira skupno število točk + miniZgodovinaTekmovanj = new ZgodovinaTekmovanj(new ArrayList<>(Arrays.asList(miniTekmovanje, miniTekmovanje))); + Assert.assertEquals(miniZgodovinaTekmovanj.getSkupnoSteviloTock("Islandija"), 24); + Assert.assertEquals(miniZgodovinaTekmovanj.getSkupnoSteviloTock("Armenija"), 0); + + ZgodovinaTekmovanj zgodovinaTekmovanj = ZgodovinaTekmovanj.izDatotek("viri/tekmovalci_sample.csv", "viri/glasovi_sample.csv"); + Assert.assertEquals(zgodovinaTekmovanj.getSkupnoSteviloTock("Islandija"), 146); + Assert.assertEquals(zgodovinaTekmovanj.getSkupnoSteviloTock("Armenija"), 156); + } + + @Test + public void testPovprecnaUvrstitev() { + // Testira povprečno uvrstitev + miniZgodovinaTekmovanj = new ZgodovinaTekmovanj(new ArrayList<>(Arrays.asList(miniTekmovanje, miniTekmovanje))); + Assert.assertEquals(miniZgodovinaTekmovanj.povprecnaUvrstitev("Islandija"), 1, 0.01); + Assert.assertEquals(miniZgodovinaTekmovanj.povprecnaUvrstitev("Armenija"), 3, 0.01); + Assert.assertEquals(miniZgodovinaTekmovanj.povprecnaUvrstitev("Češka"), 2, 0.01); + + ZgodovinaTekmovanj zgodovinaTekmovanj = ZgodovinaTekmovanj.izDatotek("viri/tekmovalci_sample.csv", "viri/glasovi_sample.csv"); + Assert.assertEquals(zgodovinaTekmovanj.povprecnaUvrstitev("Islandija"), 22, 0.01); + Assert.assertEquals(zgodovinaTekmovanj.povprecnaUvrstitev("Armenija"), 15, 0.01); + Assert.assertEquals(zgodovinaTekmovanj.povprecnaUvrstitev("Češka"), 22, 0.01); + } + + @Test + public void testNajboljsaUvrstitev() { + // Testira najboljšo uvrstitev + miniZgodovinaTekmovanj = new ZgodovinaTekmovanj(new ArrayList<>(Arrays.asList(miniTekmovanje, miniTekmovanje))); + Assert.assertEquals(miniZgodovinaTekmovanj.najboljsaUvrstitev("Islandija"), 1); + Assert.assertEquals(miniZgodovinaTekmovanj.najboljsaUvrstitev("Armenija"), 3); + Assert.assertEquals(miniZgodovinaTekmovanj.najboljsaUvrstitev("Češka"), 2); + + ZgodovinaTekmovanj zgodovinaTekmovanj = ZgodovinaTekmovanj.izDatotek("viri/tekmovalci_sample.csv", "viri/glasovi_sample.csv"); + Assert.assertEquals(zgodovinaTekmovanj.najboljsaUvrstitev("Islandija"), 2); + Assert.assertEquals(zgodovinaTekmovanj.najboljsaUvrstitev("Armenija"), 14); + Assert.assertEquals(zgodovinaTekmovanj.najboljsaUvrstitev("Češka"), 10); + } + + + @Test + public void testPobrateneDrzave() { + // Testira pobratene države + PrintStream orig = System.out; + final ByteArrayOutputStream myOut = new ByteArrayOutputStream(); + System.setOut(new PrintStream(myOut)); + + ZgodovinaTekmovanj zgodovinaTekmovanj = ZgodovinaTekmovanj.izDatotek("viri/tekmovalci_sample.csv", "viri/glasovi_sample.csv"); + + zgodovinaTekmovanj.izpisiPobrateneDrzave(5); + + final String stdOut = myOut.toString(); + System.setOut(orig); + + String expected = "Drzave z najvec medsebojnih glasov:\n" + + "1. Norveška <-(74t)-> Švedska\n" + + "2. Estonija <-(59t)-> Švedska\n" + + "3. Belgija <-(54t)-> Švedska\n" + + "4. Hrvaška <-(53t)-> Slovenija\n" + + "5. Islandija <-(51t)-> Švedska\n"; + + Assert.assertEquals(stdOut.trim().replace("\r", ""), expected.trim().replace("\r", "")); + } + +} \ No newline at end of file