From c25ef5a517fc5a7d20d86669d67d8e434d1ec1b6 Mon Sep 17 00:00:00 2001
From: koz01 <koz01@PCCPIT1V203-040.msad.vsb.cz>
Date: Wed, 1 Dec 2021 09:33:19 +0100
Subject: [PATCH] lab10-solution
---
src/main/java/cz/jezek/lab11/Match.java | 15 ++++-
src/main/java/cz/jezek/lab11/Oponents.java | 8 ++-
src/main/java/cz/jezek/lab11/Player.java | 5 +-
src/main/java/cz/jezek/lab11/StreamMain.java | 64 ++++++++++++++++++--
src/main/java/cz/jezek/lab11/Tournament.java | 53 +++++++++++++---
src/main/java/module-info.java | 3 +-
6 files changed, 130 insertions(+), 18 deletions(-)
diff --git a/src/main/java/cz/jezek/lab11/Match.java b/src/main/java/cz/jezek/lab11/Match.java
index 00f2851..5b16674 100644
--- a/src/main/java/cz/jezek/lab11/Match.java
+++ b/src/main/java/cz/jezek/lab11/Match.java
@@ -1,11 +1,18 @@
package cz.jezek.lab11;
+import java.io.Serializable;
import java.util.Objects;
-public class Match {
+public class Match implements Serializable{
+
+
+ private static final long serialVersionUID = 1L;
+
private Oponents oponents;
+
private int player1Scorel;
+
private int player2Scorel;
public Match(Player player1, int player1Scorel, Player player2, int player2Scorel) {
@@ -22,7 +29,7 @@ public class Match {
}
throw new IllegalArgumentException("Player is not participant of this match.");
}
-
+
public Oponents getOponents() {
return oponents;
}
@@ -34,6 +41,10 @@ public class Match {
public int getPlayer2Scorel() {
return player2Scorel;
}
+
+ public int getTotalScore() {
+ return getPlayer1Scorel() + getPlayer2Scorel();
+ }
@Override
public String toString() {
diff --git a/src/main/java/cz/jezek/lab11/Oponents.java b/src/main/java/cz/jezek/lab11/Oponents.java
index 1de0f68..afc5a80 100644
--- a/src/main/java/cz/jezek/lab11/Oponents.java
+++ b/src/main/java/cz/jezek/lab11/Oponents.java
@@ -1,9 +1,15 @@
package cz.jezek.lab11;
+import java.io.Serializable;
import java.util.Objects;
-public class Oponents {
+public class Oponents implements Serializable{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
private Player player1;
private Player player2;
diff --git a/src/main/java/cz/jezek/lab11/Player.java b/src/main/java/cz/jezek/lab11/Player.java
index e31b539..f708162 100644
--- a/src/main/java/cz/jezek/lab11/Player.java
+++ b/src/main/java/cz/jezek/lab11/Player.java
@@ -1,7 +1,10 @@
package cz.jezek.lab11;
-public class Player {
+import java.io.Serializable;
+public class Player implements Serializable{
+
+ private static final long serialVersionUID = 1L;
private String firstName;
private String lastName;
diff --git a/src/main/java/cz/jezek/lab11/StreamMain.java b/src/main/java/cz/jezek/lab11/StreamMain.java
index ea4babc..621ce3a 100644
--- a/src/main/java/cz/jezek/lab11/StreamMain.java
+++ b/src/main/java/cz/jezek/lab11/StreamMain.java
@@ -1,15 +1,36 @@
package cz.jezek.lab11;
+import static java.util.Comparator.comparingInt;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Optional;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.Marshaller;
+
+
+
public class StreamMain {
public static void main(String[] args) {
- Tournament tournament = Tournament.generate();
+ Tournament tournament = loadTournament();
+ if (tournament == null) {
+ tournament = Tournament.generate();
+ }
printStatAboutTournament(tournament);
saveTournament(tournament);
- loadTournament();
- }
+ }
+
+
public static void printStatAboutTournament(Tournament tournament) {
System.out.println(tournament);
@@ -18,9 +39,15 @@ public class StreamMain {
System.out.println(player);
System.out.print("Number of matches: ");
//TODO 3.a Show the number of matches played by a given player (using Streams)
+ System.out.println(tournament.getMatches().stream().filter(m -> m.getOponents().contains(player)).count());
System.out.print("Goals scored: ");
//TODO 3.b Show the number of goals scored by a given player (help Streams)
+ System.out.println(tournament.getMatches().stream()
+ .filter(m -> m.getOponents().contains(player))
+ .mapToInt( m -> m.getScoreForPlayer(player))
+ .sum());
+
Oponents oponents = new Oponents(tournament.getRandomPlayer(),
tournament.getRandomPlayer());
@@ -28,17 +55,42 @@ public class StreamMain {
System.out.print("Matches: ");
//TODO 4.a List the matches played between the given players (using the stream)
+ tournament.getMatches().stream().filter(m -> m.getOponents().equals(oponents)).forEach(System.out::println);
+
System.out.print("Number of mathes: ");
//TODO 4.b Print the number of matches played between the given players (using the stream)
+
+
System.out.print("Match with the largest total number:");
//TODO 4.c Show match with the largest total number (sum of both players) scored goals between relevant players (help Streams)
+ Optional<Match> maxMatch =
+ tournament.getMatches()
+ .stream()
+ .filter(m -> m.getOponents().equals(oponents))
+ //.reduce((a,b) -> a.getPlayer1Scorel() + a.getPlayer2Scorel() < b.getPlayer1Scorel() + b.getPlayer2Scorel() ? b : a);
+ .max(comparingInt(Match::getTotalScore));
+ System.out.println(maxMatch.map(Object::toString).orElse("N/A"));
}
- public static void loadTournament() {
- //TODO 5.b Load a serialized tournament from a file
+
+
+public static Tournament loadTournament() {
+ try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("tournament.obj"))) {
+ return (Tournament) ois.readObject();
+ } catch (IOException | ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ return null;
+
}
public static void saveTournament(Tournament tournament) {
//TODO 5.a Save the tournament to a file using object serialization.
+ try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tournament.obj"))) {
+ oos.writeObject(tournament);
+ } catch ( IOException e) {
+ e.printStackTrace();
+ }
}
-}
+
+ }
diff --git a/src/main/java/cz/jezek/lab11/Tournament.java b/src/main/java/cz/jezek/lab11/Tournament.java
index 3f22efc..20042b1 100644
--- a/src/main/java/cz/jezek/lab11/Tournament.java
+++ b/src/main/java/cz/jezek/lab11/Tournament.java
@@ -1,28 +1,67 @@
package cz.jezek.lab11;
-import java.util.Collections;
+import static cz.jezek.lab11.RandomGenarator.selectRandom;
+
+import java.io.Serializable;
import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
-public class Tournament {
+public class Tournament implements Serializable{
+
+ private static final long serialVersionUID = 0L;
+
private List<Player> players;
private List<Match> matches;
+
+
+ private String name = "turnaj";
+
+ private static Random rnd = new Random();
+
+ public static Match generateRandomMatch(List<Player> player) {
+ return new Match(selectRandom(player), rnd.nextInt(11), selectRandom(player), rnd.nextInt(11));
+ }
+
public static Tournament generate() {
// TODO 1.a Generate a list of 10 random players using the stream and then filter so that it does not contain players with the same name
- List<Player> players = Collections.emptyList();
+ List<Player> players =
+ Stream.generate(Player::generateRandom)
+ .distinct()
+ .limit(10)
+ .collect(Collectors.toList());
// TODO 1.b Use the stream to generate a list of 50 matches between random players (from the list of players) with a random result. Make sure the player does not play with himself.
- List<Match> matches = Collections.emptyList();
-
+ List<Match> matches =
+ Stream.generate(() -> generateRandomMatch(players))
+ .filter(m -> m.getOponents().getPlayer1() != m.getOponents().getPlayer2())
+ .limit(250)
+ .collect(Collectors.toList());
+
return new Tournament(players, matches);
}
+ public Tournament() {
+ }
+
public Tournament(List<Player> players, List<Match> matches) {
this.players = players;
this.matches = matches;
}
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
public List<Player> getPlayers() {
return players;
@@ -45,11 +84,11 @@ public class Tournament {
builder.append("\n\nPlayers:\n");
// TODO 2.a Use the stream to add a listing of all players to the builder. Individual players are separated by a "\ n" character
- builder.append(/* list of all players */"");
+ builder.append(players.stream().map(Object::toString).collect(Collectors.joining("\n")));
builder.append("\n\nMatches:\n");
// TODO 2.b Use the stream to add a listing of all entries to the builder. Individual matches are separated by a "\ n" character
- builder.append(/* list of all matches */"");
+ builder.append(matches.stream().map(Object::toString).collect(Collectors.joining("\n")));
return builder.toString();
}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index edc025f..59a012f 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,6 +1,7 @@
module cz.jezek.lab10 {
requires transitive javafx.controls;
requires javafx.fxml;
- opens cz.jezek.lab11 to javafx.fxml;
+ requires jakarta.xml.bind;
+ opens cz.jezek.lab11;
exports cz.jezek.lab11;
}
\ No newline at end of file
--
GitLab