Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ repositories {
}

dependencies {
implementation("org.jfree:jfreechart:1.5.6")
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
Expand Down
4 changes: 4 additions & 0 deletions jfreechart-1.5.6.zip:Zone.Identifier
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://github.com/jfree/jfreechart/releases/
HostUrl=https://codeload.github.com/jfree/jfreechart/zip/refs/tags/v1.5.6
14 changes: 3 additions & 11 deletions src/main/java/ru/urfu/Main.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
package ru.urfu;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
import ru.urfu.console.Communicator;

public class Main {
public static void main(String[] args) {
//TIP Press <shortcut actionId="ShowIntentionActions"/> with your caret at the highlighted text
// to see how GIGA IDE suggests fixing it.
System.out.printf("Hello and welcome!");

for (int i = 1; i <= 5; i++) {
//TIP Press <shortcut actionId="Debug"/> to start debugging your code. We have set one <icon src="AllIcons.Debugger.Db_set_breakpoint"/> breakpoint
// for you, but you can always add more by pressing <shortcut actionId="ToggleLineBreakpoint"/>.
System.out.println("i = " + i);
}
Communicator.runChampionship();
}
}
42 changes: 42 additions & 0 deletions src/main/java/ru/urfu/console/Communicator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package ru.urfu.console;

import java.util.Scanner;
import java.util.stream.Collectors;

import ru.urfu.graphics.Graphic;
import ru.urfu.model.Player;
import ru.urfu.parser.CsvParser;
import ru.urfu.resolver.Resolver;

public class Communicator {
public static void runChampionship() {
var scanner = new Scanner(System.in);
System.out.print("Введите файл для анализа: ");
String filePath = "/home/pavloxes/Java2025_2/src/main/resources/fakePlayers.csv";
//String fileName = scanner.nextLine();
var players = CsvParser.parseCsvToList(filePath);

var resolver = new Resolver(players);

System.out.print("Количество игроков, интересы которых не представляет агентство: ");
System.out.println(resolver.getCountWithoutAgency());

System.out.print("Автор наибольшего числа голов из числа защитников: ");
System.out.println(resolver.getDefenderWithMaxGoalsName());

System.out.print("Наибольшее число голов, забитых защитником: ");
System.out.println(resolver.getMaxDefenderGoalsCount());

System.out.print("Русское название позиции самого дорогого немецкого игрока: ");
System.out.println(resolver.getTheExpensiveGermanPlayerPosition());

System.out.print("Команда с наибольшим средним числом красных карточек на одного игрока: ");
System.out.println(resolver.getTheRudestTeam());

var graphic = new Graphic();

graphic.drawDiagramPlayersByPosition( players.stream()
.collect(Collectors.groupingBy(Player::position, Collectors.counting())));

}
}
42 changes: 42 additions & 0 deletions src/main/java/ru/urfu/graphics/Graphic.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package ru.urfu.graphics;

import java.awt.Color;
import java.text.DecimalFormat;
import java.util.Map;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

import ru.urfu.model.Position;

public class Graphic {
public void drawDiagramPlayersByPosition(Map<Position, Long> positionsCount) {
DefaultPieDataset<String> dataset = new DefaultPieDataset<>();

String title = "Распределение позиций среди игроков";

positionsCount.forEach((pos, count) ->
dataset.setValue(pos.getTitleRu(), count)
);

JFreeChart chart = ChartFactory.createPieChart(title, dataset, true, true, false);

PiePlot plot = (PiePlot) chart.getPlot();
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}: {1} ({2})",
new DecimalFormat("0"),
new DecimalFormat("0.00%")
));

plot.setLabelBackgroundPaint(Color.WHITE);

ChartFrame frame = new ChartFrame(title, chart);
frame.pack();
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}
}
13 changes: 13 additions & 0 deletions src/main/java/ru/urfu/model/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.urfu.model;

public record Player(
String name,
Position position,
String agency,
int goals,
String nation,
int cost,
String team,
int redCards
) {
}
19 changes: 19 additions & 0 deletions src/main/java/ru/urfu/model/Position.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.urfu.model;

public enum Position {
GOALKEEPER("Вратарь"),
DEFENDER("Защитник"),
MIDFIELD("Полузащитник"),
FORWARD("Нападающий");

private final String titleRu;

Position(String title){
this.titleRu = title;
}

public String getTitleRu(){
return this.titleRu;
}

}
47 changes: 47 additions & 0 deletions src/main/java/ru/urfu/parser/CsvParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ru.urfu.parser;

import ru.urfu.model.Player;
import ru.urfu.model.Position;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Scanner;

public class CsvParser {

public static ArrayList<Player> parseCsvToList(String pathString) {
Path path = Paths.get(pathString);
Scanner scanner = getScanner(path);
var list = new ArrayList<Player>();
scanner.nextLine();
while (scanner.hasNextLine()) {
list.add(parsePlayerRow(scanner.nextLine()));
}

return list;
}

private static Player parsePlayerRow(String row) {
var cells = row.split(";");
return new Player(
cells[0],
Position.valueOf(cells[3]),
cells[5],
Integer.parseInt(cells[8]),
cells[4],
Integer.parseInt(cells[6]),
cells[1],
Integer.parseInt(cells[11])
);
}

private static Scanner getScanner(Path path) {
try {
return new Scanner(path);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
3 changes: 3 additions & 0 deletions src/main/java/ru/urfu/resolver/IResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ public interface IResolver {
// Выведите количество игроков, интересы которых не представляет агентство.
int getCountWithoutAgency();

// Выведите защитника с максимальным числом голов.
String getDefenderWithMaxGoalsName();

// Выведите максимальное число голов, забитых защинтником.
int getMaxDefenderGoalsCount();

Expand Down
72 changes: 72 additions & 0 deletions src/main/java/ru/urfu/resolver/Resolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package ru.urfu.resolver;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import ru.urfu.model.Player;
import ru.urfu.model.Position;


public class Resolver implements IResolver {

private final List<Player> players;

public Resolver(List<Player> players) {
this.players = players;
}

@Override
public int getCountWithoutAgency() {
// int count = 0;
// for (Player player : players) {
// if (player.agency().isEmpty()) {
// count++;
// }
// }
// return count;
return (int) players.stream()
.filter(player -> player.agency().isEmpty())
.count();
}

@Override
public String getDefenderWithMaxGoalsName() {
return players.stream()
.filter(player -> player.position() == Position.DEFENDER)
.max(Comparator.comparingInt(Player::goals))
.map(Player::name)
.orElse("Нет защитников");
}

@Override
public int getMaxDefenderGoalsCount() {
return players.stream()
.filter(player -> player.position() == Position.DEFENDER)
.mapToInt(Player::goals)
.max()
.orElse(0);
}

@Override
public String getTheExpensiveGermanPlayerPosition() {
return players.stream()
.filter(player -> player.nation().equals("Germany"))
.max(Comparator.comparing(Player::cost))
.map(Player::position)
.map(Position::getTitleRu)
.orElse("Немецких игроков не найдено");
}

@Override
public String getTheRudestTeam() {
return players.stream()
.collect(Collectors.groupingBy(Player::team, Collectors.averagingDouble(Player::redCards)))
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse("Нет команд");
}

}
104 changes: 104 additions & 0 deletions src/test/java/ru/urfu/ResolverTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package ru.urfu;

import java.util.Collections;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

import ru.urfu.model.Player;
import ru.urfu.model.Position;
import ru.urfu.resolver.Resolver;

public class ResolverTest {

@Test
void getCountWithoutAgencyTest() {
List<Player> players = List.of(
new Player("Iva Streich", Position.MIDFIELD, "D'Amore LLC", 19, "Colombia", 75012006, "Nevada whales", 7),
new Player("Miss Buck Bradtke", Position.DEFENDER, "D'Amore LLC", 26, "Brazil", 33850831, "Nevada whales", 9),
new Player("Everette Kovacek MD", Position.DEFENDER, "Walker and Sons", 11, "Palau", 64396675, "Wisconsin prophets", 5),
new Player("Ms. Adolph Hartmann", Position.FORWARD, "", 10, "Croatia", 52944545, "North Carolina dolphins", 8),
new Player("Kenyetta Emard", Position.GOALKEEPER, "D'Amore LLC", 24, "Ecuador", 94715977, "Mississippi witches", 7),
new Player("Mrs. Celina Abshire", Position.GOALKEEPER, "D'Amore LLC", 4, "Qatar", 41436703, "Massachusetts enchanters", 0),
new Player("Dr. Royal King", Position.GOALKEEPER, "Walker and Sons", 6, "Ecuador", 50056961, "Florida tigers", 4),
new Player("Terry Hegmann", Position.DEFENDER, "", 11, "Germany", 7294362, "Wisconsin prophets", 8)
);
Resolver resolver = new Resolver(players);
assertEquals(2, resolver.getCountWithoutAgency());

List<Player> emptyPlayers = Collections.emptyList();
Resolver resolverEmpty = new Resolver(emptyPlayers);
assertEquals(0, resolverEmpty.getCountWithoutAgency());
}

@Test
void getMaxDefenderGoalsCountTest() {
List<Player> players = List.of(
new Player("Iva Streich", Position.MIDFIELD, "D'Amore LLC", 19, "Colombia", 75012006, "Nevada whales", 7),
new Player("Miss Buck Bradtke", Position.DEFENDER, "D'Amore LLC", 26, "Brazil", 33850831, "Nevada whales", 9),
new Player("Everette Kovacek MD", Position.DEFENDER, "Walker and Sons", 11, "Palau", 64396675, "Wisconsin prophets", 5),
new Player("Ms. Adolph Hartmann", Position.FORWARD, "", 10, "Croatia", 52944545, "North Carolina dolphins", 8),
new Player("Kenyetta Emard", Position.GOALKEEPER, "D'Amore LLC", 24, "Ecuador", 94715977, "Mississippi witches", 7),
new Player("Mrs. Celina Abshire", Position.GOALKEEPER, "D'Amore LLC", 4, "Qatar", 41436703, "Massachusetts enchanters", 0),
new Player("Dr. Royal King", Position.GOALKEEPER, "Walker and Sons", 6, "Ecuador", 50056961, "Florida tigers", 4)
);
Resolver resolver = new Resolver(players);
assertEquals(26, resolver.getMaxDefenderGoalsCount());

List<Player> emptyPlayers = Collections.emptyList();
Resolver resolverEmpty = new Resolver(emptyPlayers);
assertEquals(0, resolverEmpty.getMaxDefenderGoalsCount());
}

@Test
void getTheExpensiveGermanPlayerPositionTest() {
List<Player> players = List.of(
new Player("Iva Streich", Position.MIDFIELD, "D'Amore LLC", 19, "Colombia", 75012006, "Nevada whales", 7),
new Player("Miss Buck Bradtke", Position.DEFENDER, "D'Amore LLC", 26, "Brazil", 33850831, "Nevada whales", 9),
new Player("Everette Kovacek MD", Position.DEFENDER, "Walker and Sons", 11, "Palau", 64396675, "Wisconsin prophets", 5),
new Player("Ms. Adolph Hartmann", Position.FORWARD, "", 10, "Croatia", 52944545, "North Carolina dolphins", 8),
new Player("Kenyetta Emard", Position.GOALKEEPER, "D'Amore LLC", 24, "Ecuador", 94715977, "Mississippi witches", 7),
new Player("Mrs. Celina Abshire", Position.GOALKEEPER, "D'Amore LLC", 4, "Qatar", 41436703, "Massachusetts enchanters", 0),
new Player("Dr. Royal King", Position.GOALKEEPER, "Walker and Sons", 6, "Ecuador", 50056961, "Florida tigers", 4),
new Player("Lorinda Labadie", Position.MIDFIELD, "Price-Hirthe", 13, "Germany", 33413181, "Utah nemesis", 4),
new Player("Ms. Erwin Hoeger", Position.DEFENDER, "Fadel LLC", 28, "Qatar", 71207725, "Minnesota giants", 1),
new Player("Terry Hegmann", Position.DEFENDER, "Graham-Powlowski", 11, "Germany", 7294362, "Wisconsin prophets", 8)
);
Resolver resolver = new Resolver(players);
assertEquals("Полузащитник", resolver.getTheExpensiveGermanPlayerPosition());

List<Player> noGermanPlayers = List.of(
new Player("Iva Streich", Position.MIDFIELD, "D'Amore LLC", 19, "Colombia", 75012006, "Nevada whales", 7),
new Player("Miss Buck Bradtke", Position.DEFENDER, "D'Amore LLC", 26, "Brazil", 33850831, "Nevada whales", 9),
new Player("Everette Kovacek MD", Position.DEFENDER, "Walker and Sons", 11, "Palau", 64396675, "Wisconsin prophets", 5),
new Player("Ms. Adolph Hartmann", Position.FORWARD, "", 10, "Croatia", 52944545, "North Carolina dolphins", 8),
new Player("Kenyetta Emard", Position.GOALKEEPER, "D'Amore LLC", 24, "Ecuador", 94715977, "Mississippi witches", 7),
new Player("Mrs. Celina Abshire", Position.GOALKEEPER, "D'Amore LLC", 4, "Qatar", 41436703, "Massachusetts enchanters", 0)
);
Resolver resolverNoGerman = new Resolver(noGermanPlayers);
assertEquals("Немецких игроков не найдено", resolverNoGerman.getTheExpensiveGermanPlayerPosition());
}

@Test
void getTheRudestTeamTest() {
List<Player> players = List.of(
new Player("Iva Streich", Position.MIDFIELD, "D'Amore LLC", 19, "Colombia", 75012006, "Nevada whales", 7),
new Player("Miss Buck Bradtke", Position.DEFENDER, "D'Amore LLC", 26, "Brazil", 33850831, "Nevada whales", 9),
new Player("Everette Kovacek MD", Position.DEFENDER, "Walker and Sons", 11, "Palau", 64396675, "Wisconsin prophets", 5),
new Player("Ms. Adolph Hartmann", Position.FORWARD, "", 10, "Croatia", 52944545, "North Carolina dolphins", 8),
new Player("Kenyetta Emard", Position.GOALKEEPER, "D'Amore LLC", 24, "Ecuador", 94715977, "Mississippi witches", 7),
new Player("Mrs. Celina Abshire", Position.GOALKEEPER, "D'Amore LLC", 4, "Qatar", 41436703, "Massachusetts enchanters", 0),
new Player("Dr. Royal King", Position.GOALKEEPER, "Walker and Sons", 6, "Ecuador", 50056961, "Florida tigers", 4),
new Player("Lorinda Labadie", Position.MIDFIELD, "Price-Hirthe", 13, "Germany", 33413181, "Utah nemesis", 4),
new Player("Ms. Erwin Hoeger", Position.DEFENDER, "Fadel LLC", 28, "Qatar", 71207725, "Minnesota giants", 1),
new Player("Terry Hegmann", Position.DEFENDER, "Graham-Powlowski", 11, "Germany", 7294362, "Wisconsin prophets", 8)
);
Resolver resolver = new Resolver(players);
assertEquals("Nevada whales", resolver.getTheRudestTeam());

List<Player> emptyPlayers = Collections.emptyList();
Resolver resolverEmpty = new Resolver(emptyPlayers);
assertEquals("Нет команд", resolverEmpty.getTheRudestTeam());
}
}
Loading