DN09 - Naloga 5 WIP
This commit is contained in:
parent
3702347f5d
commit
1f8feb3971
171
src/DN09.java
171
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<Tekmovalec> tekmovalci = new ArrayList<>();
|
||||
HashMap<String, ArrayList<Glas>> glasovi = new LinkedHashMap<>();
|
||||
}
|
||||
|
||||
class ZgodovinaTekmovanj {
|
||||
private ArrayList<Tekmovanje> seznamTekmovanj;
|
||||
ArrayList<Tekmovanje> seznamTekmovanj;
|
||||
|
||||
|
||||
ZgodovinaTekmovanj(ArrayList<Tekmovanje> 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<Tekmovalec> seznamTekmovalcev = new ArrayList<>();
|
||||
// while (scannerTekmovalci.hasNextLine()) {
|
||||
// String[] fields = scannerTekmovalci.nextLine().split(";");
|
||||
// seznamTekmovalcev.add(new Tekmovalec(fields[1], fields[2], fields[3]));
|
||||
// }
|
||||
//
|
||||
// ArrayList<Glas> 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<String, Leto> 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<String, ArrayList<Glas>> 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<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
123
src/DN09Test05.java
Normal 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", ""));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user