diff --git a/src/main/java/cz/jezek/lab11/Match.java b/src/main/java/cz/jezek/lab11/Match.java index 00f2851654a1d6d954cc57bb12c10c81111d72bd..f5b8bb6a79c557c031aeac1afc055ec2b8a08494 100644 --- a/src/main/java/cz/jezek/lab11/Match.java +++ b/src/main/java/cz/jezek/lab11/Match.java @@ -1,9 +1,15 @@ 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 = -7368303036334738923L; + private Oponents oponents; private int player1Scorel; private int player2Scorel; 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 2a27b1b969e9d93d8144da9ab23f330eb8d3c13b..f0fe5efc196935d90ed3619e710f863c20b53dd8 100644 --- a/src/main/java/cz/jezek/lab11/Player.java +++ b/src/main/java/cz/jezek/lab11/Player.java @@ -1,7 +1,13 @@ 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..4eb29ae114e3b2028807f29323aa34070721c460 100644 --- a/src/main/java/cz/jezek/lab11/StreamMain.java +++ b/src/main/java/cz/jezek/lab11/StreamMain.java @@ -1,14 +1,21 @@ package cz.jezek.lab11; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Comparator; +import java.util.stream.Collectors; + public class StreamMain { public static void main(String[] args) { - Tournament tournament = Tournament.generate(); + Tournament tournament = loadTournament(); printStatAboutTournament(tournament); saveTournament(tournament); - loadTournament(); } public static void printStatAboutTournament(Tournament tournament) { @@ -21,6 +28,11 @@ public class StreamMain { 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)) + .map(m -> m.getScoreForPlayer(player)) + .mapToInt(score -> score.intValue()) + .sum()); Oponents oponents = new Oponents(tournament.getRandomPlayer(), tournament.getRandomPlayer()); @@ -30,15 +42,40 @@ public class StreamMain { //TODO 4.a List the matches played between the given players (using the stream) 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:"); + final String tournamentName = tournament.getMatches().stream().filter(m -> m.getOponents().equals(oponents)) + .sorted(Comparator.<Match>comparingInt(m -> m.getPlayer1Scorel() + m.getPlayer2Scorel()).reversed()) + .map(Object::toString).findFirst().orElse("N/A"); + + System.out.println("Match with the largest total number: " + tournamentName); + + + //TODO 4.b Print the number of matches played between the given players (using the stream) + final String tournamentName2 = tournament.getMatches().stream().filter(m -> m.getOponents().equals(oponents)) + .collect(Collectors.maxBy(Comparator.comparingInt(m -> m.getPlayer1Scorel() + m.getPlayer2Scorel()))) + .map(Object::toString) + .orElse("N/A"); + + System.out.println("Match with the largest total number: " + tournamentName2); //TODO 4.c Show match with the largest total number (sum of both players) scored goals between relevant players (help Streams) + } - 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("data.obj"))) { + return (Tournament) ois.readObject(); + } catch (IOException e) { + e.printStackTrace(); + } catch (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("data.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..7831cdc0f3886306cf03b997d1c8426fc38c6999 100644 --- a/src/main/java/cz/jezek/lab11/Tournament.java +++ b/src/main/java/cz/jezek/lab11/Tournament.java @@ -1,19 +1,33 @@ package cz.jezek.lab11; -import java.util.Collections; +import static cz.jezek.lab11.RandomGenerator.random; +import static cz.jezek.lab11.RandomGenerator.selectRandom; + +import java.io.Serializable; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public class Tournament { +public class Tournament implements Serializable{ + private static final long serialVersionUID = 1L; + private List<Player> players; private List<Match> matches; 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(); + // TODO 1.b Use the stream to generate a list of 500 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 = Stream.generate(() -> generateRandomMatch(players)) + .filter(m -> m.getOponents().getPlayer1() != m.getOponents().getPlayer2()) + .limit(500) + .collect(Collectors.toList()); return new Tournament(players, matches); @@ -33,7 +47,7 @@ public class Tournament { } public Player getRandomPlayer() { - return RandomGenarator.selectRandom(players); + return RandomGenerator.selectRandom(players); } @Override @@ -45,13 +59,19 @@ 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 */""); + players.stream().map(Object::toString).forEach(name -> builder.append(name).append(",\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(); } + + + private static Match generateRandomMatch(List<Player> players) { + return new Match(selectRandom(players), random.nextInt(11), selectRandom(players), random.nextInt(11)); + } }