diff --git a/src/main/java/cz/jezek/lab11/Match.java b/src/main/java/cz/jezek/lab11/Match.java index 00f2851654a1d6d954cc57bb12c10c81111d72bd..5b16674d4baa46f5de28ec230e4f651b230d91f2 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 1de0f68f0823e939f4bde09bcc3b2f4ee84697cc..afc5a8012dcec5f6ac9078f50cb53c8faa5b8074 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 e31b539bfc6ff9556d2fee831c4d21d0cfcc2ee9..f7081622ac3a967f4813d7d7037a4fff5a348424 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 ea4babca284042d2a29e402e622abee1e01f3158..621ce3af19cc555892e975ddade5db2fa2dae470 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 3f22efc1ae9cdb5c4bf0d16abb112baf619cdc72..20042b1cde429a13e09c570f74a61c4145614ba5 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 edc025f5dc65bfa61c4deb40bcd470bf1e29c538..59a012f92744677dff3b9b6d973989626809dfe1 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