DN09 - Naloga 5 WIP

This commit is contained in:
Gašper Dobrovoljc 2024-05-18 00:11:46 +02:00
parent 3702347f5d
commit 1f8feb3971
No known key found for this signature in database
GPG Key ID: 0E7E037018CFA5A5
2 changed files with 254 additions and 42 deletions

View File

@ -1,7 +1,8 @@
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.ArrayList; import java.util.*;
import java.util.Scanner; import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DN09 { public class DN09 {
public static void main(String[] args) { public static void main(String[] args) {
@ -10,6 +11,15 @@ public class DN09 {
return; 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]); Tekmovanje tekmovanje = Tekmovanje.izDatotek(args[1], args[2]);
assert tekmovanje != null; assert tekmovanje != null;
@ -21,7 +31,7 @@ public class DN09 {
break; break;
case "izpisiTocke": case "izpisiTocke":
tekmovanje.izpisiGlasove(); tekmovanje.izpisiTocke();
break; break;
case "najboljse": case "najboljse":
@ -306,49 +316,128 @@ class UtezeniKriterij implements Kriterij {
} }
} }
class Leto {
ArrayList<Tekmovalec> tekmovalci = new ArrayList<>();
HashMap<String, ArrayList<Glas>> glasovi = new LinkedHashMap<>();
}
class ZgodovinaTekmovanj { class ZgodovinaTekmovanj {
private ArrayList<Tekmovanje> seznamTekmovanj; ArrayList<Tekmovanje> seznamTekmovanj;
ZgodovinaTekmovanj(ArrayList<Tekmovanje> seznamTekmovanj) { ZgodovinaTekmovanj(ArrayList<Tekmovanje> seznamTekmovanj) {
this.seznamTekmovanj = seznamTekmovanj; this.seznamTekmovanj = seznamTekmovanj;
} }
// public static ZgodovinaTekmovanj izDatotek(String datotekaTekmovalci, String datotekaGlasovi) { public static ZgodovinaTekmovanj izDatotek(String datotekaTekmovalci, String datotekaGlasovi) {
// Scanner scannerTekmovalci, scannerGlasovi; Scanner scannerTekmovalci, scannerGlasovi;
//
// try { try {
// scannerTekmovalci = new Scanner(new File(datotekaTekmovalci)); scannerTekmovalci = new Scanner(new File(datotekaTekmovalci));
// scannerGlasovi = new Scanner(new File(datotekaGlasovi)); scannerGlasovi = new Scanner(new File(datotekaGlasovi));
// } catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
// return null; return null;
// } }
//
// scannerTekmovalci.nextLine(); scannerTekmovalci.nextLine();
// scannerGlasovi.nextLine(); scannerGlasovi.nextLine();
//
// ArrayList<Tekmovalec> seznamTekmovalcev = new ArrayList<>(); Map<String, Leto> leta = new LinkedHashMap<>();
// while (scannerTekmovalci.hasNextLine()) {
// String[] fields = scannerTekmovalci.nextLine().split(";"); while (scannerGlasovi.hasNextLine()) {
// seznamTekmovalcev.add(new Tekmovalec(fields[1], fields[2], fields[3])); String[] fields = scannerGlasovi.nextLine().split(";");
// } Glas glas = switch (fields.length) {
// case 7 -> new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]),
// ArrayList<Glas> seznamGlasov = new ArrayList<>(); Integer.parseInt(fields[5]), Integer.parseInt(fields[6]));
// while (scannerGlasovi.hasNextLine()) { case 6 -> new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]),
// String[] fields = scannerGlasovi.nextLine().split(";"); Integer.parseInt(fields[5]), 0);
// switch (fields.length) { default -> new Glas(fields[2], fields[3], Integer.parseInt(fields[4]));
// case 5: };
// seznamGlasov.add(new Glas(fields[2], fields[3], Integer.parseInt(fields[4])));
// break; if (!leta.containsKey(fields[0])) {
// case 6: leta.put(fields[0], new Leto());
// seznamGlasov.add(new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]), }
// Integer.parseInt(fields[5]), 0)); Map<String, ArrayList<Glas>> glasovi = leta.get(fields[0]).glasovi;
// break;
// case 7: if (!glasovi.containsKey(fields[1])) {
// seznamGlasov.add(new LocenGlas(fields[2], fields[3], Integer.parseInt(fields[4]), glasovi.put(fields[1], new ArrayList<>());
// Integer.parseInt(fields[5]), Integer.parseInt(fields[6]))); }
// break; 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<Tekmovanje> 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<String, Integer> 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<String, Integer> 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++;
}
}
} }

123
src/DN09Test05.java Normal file
View File

@ -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<Tekmovalec> 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<Glas> 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", ""));
}
}