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
3 changes: 2 additions & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ repositories {
dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
implementation("org.jfree:jfreechart:1.5.6")
}

tasks.test {
Expand Down
19 changes: 8 additions & 11 deletions src/main/java/ru/urfu/Main.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
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.presenter.controller.Controller;
import ru.urfu.presenter.view.ConsoleView;
import ru.urfu.resolver.Resolver;

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);
}
final var resolver = new Resolver();
final var view = new ConsoleView();
final var controller = new Controller(view, resolver);
controller.start();
}
}
25 changes: 25 additions & 0 deletions src/main/java/ru/urfu/drawer/Drawer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ru.urfu.drawer;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.data.general.DefaultPieDataset;

import javax.swing.*;
import java.util.Map;

public class Drawer {
public static void drawPieChart(Map<String, Long> data) {
DefaultPieDataset<String> dataset = new DefaultPieDataset<>();
data.forEach(dataset::setValue);

var chart = ChartFactory.createPieChart("Распределение игроков по позициям",
dataset);
var chartPanel = new ChartPanel(chart);
var frame = new JFrame();
frame.setSize(800, 600);
frame.setContentPane(chartPanel);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}
15 changes: 15 additions & 0 deletions src/main/java/ru/urfu/mapper/Mapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.urfu.mapper;

import ru.urfu.model.Player;

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

public class Mapper {
public static Map<String, Long> playersByPositions(List<Player> players) {
return players.stream()
.collect(Collectors.groupingBy(player ->
player.position().inRussian(), Collectors.counting()));
}
}
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 nationality,
int transferCost,
int redCardsCount,
String team
) {
}
17 changes: 17 additions & 0 deletions src/main/java/ru/urfu/model/Position.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.urfu.model;

public enum Position {
GOALKEEPER,
DEFENDER,
MIDFIELD,
FORWARD;

public String inRussian() {
return switch (this) {
case GOALKEEPER -> "вратарь";
case DEFENDER -> "защитник";
case MIDFIELD -> "полузащитник";
case FORWARD -> "нападающий";
};
}
}
45 changes: 45 additions & 0 deletions src/main/java/ru/urfu/parser/CsvParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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) {
var path = Paths.get(pathString);
var 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]),
Integer.parseInt(cells[11]),
cells[1]
);
}

private static Scanner getScanner(Path path) {
try {
return new Scanner(path);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
89 changes: 89 additions & 0 deletions src/main/java/ru/urfu/presenter/controller/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package ru.urfu.presenter.controller;

import ru.urfu.drawer.Drawer;
import ru.urfu.mapper.Mapper;
import ru.urfu.model.Player;
import ru.urfu.parser.CsvParser;
import ru.urfu.presenter.view.Command;
import ru.urfu.presenter.view.IView;
import ru.urfu.resolver.IResolver;

import java.util.ArrayList;

public class Controller {
IView view;
IResolver resolver;
ArrayList<Player> players;

public Controller(IView view, IResolver resolver) {
this.view = view;
this.resolver = resolver;
players = null;
view.setCallOnCommand(Command.OPEN_FILE, this::onOpenFile);
view.setCallOnCommand(Command.SHOW_COUNT_WITHOUT_AGENCY,
this::onShowCountWithoutAgency);
view.setCallOnCommand(Command.SHOW_MAX_DEFENDER_GOALS_COUNT,
this::onShowMaxDefenderGoalsCount);
view.setCallOnCommand(Command.SHOW_THE_EXPENSIVE_GERMAN_PLAYER_POSITION,
this::onShowTheExpensiveGermanPlayerPosition);
view.setCallOnCommand(Command.SHOW_THE_RUDEST_TEAM, this::onShowTheRudestTeam);
view.setCallOnCommand(Command.SHOW_PLAYERS_BY_POSITIONS_CHART,
this::onShowPlayersByPositionsChart);
view.setCallOnCommand(Command.EXIT, this::onExit);
var filename = "C:\\projects\\java_projects\\Java2025_2\\src\\main\\resources\\fakePlayers.csv";
openFile(filename);
}

public void start() {
view.start();
}

private void openFile(String path)
{
players = CsvParser.parseCsvToList(path);
resolver.setPlayers(players);
}

private void onOpenFile() {
openFile(view.selectFile());
}

private void onShowCountWithoutAgency() {
if (emptyPlayersError()) return;
view.showCountWithoutAgency(resolver.getCountWithoutAgency());
}

private void onShowMaxDefenderGoalsCount() {
if (emptyPlayersError()) return;
view.showMaxDefenderGoalsCount(resolver.getMaxDefenderGoalsCount());
}

private void onShowTheExpensiveGermanPlayerPosition() {
if (emptyPlayersError()) return;
view.showTheExpensiveGermanPlayerPosition(
resolver.getTheExpensiveGermanPlayerPosition()
);
}

private void onShowTheRudestTeam() {
if (emptyPlayersError()) return;
view.showTheRudestTeam(resolver.getTheRudestTeam());
}

private void onShowPlayersByPositionsChart() {
if (emptyPlayersError()) return;
Drawer.drawPieChart(Mapper.playersByPositions(players));
}

private boolean emptyPlayersError() {
if (players == null || players.isEmpty()) {
view.showPlayersError();
return true;
}
return false;
}

private void onExit() {
view.terminate();
}
}
21 changes: 21 additions & 0 deletions src/main/java/ru/urfu/presenter/view/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.urfu.presenter.view;

public enum Command {
OPEN_FILE,
SHOW_COUNT_WITHOUT_AGENCY,
SHOW_MAX_DEFENDER_GOALS_COUNT,
SHOW_THE_EXPENSIVE_GERMAN_PLAYER_POSITION,
SHOW_THE_RUDEST_TEAM,
SHOW_PLAYERS_BY_POSITIONS_CHART,
EXIT;

int index() {
for (int i = 0; i < values().length; ++i) {
if (this == Command.values()[i]) {
return i;
}
}
assert false : "Should be unreachable";
return -1;
}
}
Loading