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
17 changes: 14 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,19 +1,30 @@
plugins {
id("java")
id("application")
}

group = "ru.urfu"
version = "1.0-SNAPSHOT"

application {
mainClass = "ru.urfu.Main"
}

repositories {
mavenCentral()
}

dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
implementation("org.jfree:jfreechart:1.5.3")
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0")
testImplementation("org.junit.jupiter:junit-jupiter-params:5.10.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.0")
}

tasks.test {
useJUnitPlatform()
}
testLogging {
events("passed", "skipped", "failed")
}
}
16 changes: 4 additions & 12 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.solve();
}
}
}
30 changes: 30 additions & 0 deletions src/main/java/ru/urfu/console/Communicator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.urfu.console;

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

import java.util.Scanner;

public class Communicator {
public static void solve() {
String fileName = "src/main/resources/fakePlayers.csv";
var players = CsvParser.parseCsvToList(fileName);

var resolver = new Resolver(players);

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

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

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

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

Graphic.showGraphic(players);
}
}
50 changes: 50 additions & 0 deletions src/main/java/ru/urfu/csv/CsvParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package ru.urfu.parser;

import ru.urfu.model.Player;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.nio.file.Path;
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],
cells[1],
cells[2],
cells[3],
cells[4],
cells[5],
Integer.parseInt(cells[6]),
Integer.parseInt(cells[7]),
Integer.parseInt(cells[8]),
Integer.parseInt(cells[9]),
Integer.parseInt(cells[10]),
Integer.parseInt(cells[11])
);
}

private static Scanner getScanner(Path path) {
try {
return new Scanner(path);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
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 org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.xy.XYSeries;
import ru.urfu.model.Player;

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

public class Graphic {
static XYSeriesCollection createDataset(List<Player> players) {
XYSeries series = new XYSeries("Нападающие");
players
.stream()
.filter(player -> player.getPosition().equals("FORWARD"))
.forEach(p -> series.add(p.getTransferCost(), p.getGoals()));
return new XYSeriesCollection(series);
}

public static void showGraphic(List<Player> players) {
var dataset = createDataset(players);
JFreeChart chart = ChartFactory.createXYLineChart(
"Зависимость количества забитых голов от трансферной стоимости для нападающих",
"Трансферная стоимость",
"Голы",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
JFrame frame = new JFrame("Диаграмма зависимости количества забитых голов от трансферной стоимости для нападающих");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ChartPanel(chart));
frame.pack();
frame.setVisible(true);
}
}
57 changes: 57 additions & 0 deletions src/main/java/ru/urfu/model/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package ru.urfu.model;

public class Player {
private String name;
private String team;
private String city;
private String position;
private String nationality;
private String agency;
private int transferCost;
private int participations;
private int goals;
private int assists;
private int yellowCards;
private int redCards;

public Player(
String name,
String team,
String city,
String position,
String nationality,
String agency,
int transferCost,
int participations,
int goals,
int assists,
int yellowCards,
int redCards
) {
this.name = name;
this.team = team;
this.city = city;
this.position = position;
this.nationality = nationality;
this.agency = agency;
this.transferCost = transferCost;
this.participations = participations;
this.goals = goals;
this.assists = assists;
this.yellowCards = yellowCards;
this.redCards = redCards;
}

public String getName() { return name; }
public String getTeam() { return team; }
public String getCity() { return city; }
public String getPosition() { return position; }
public String getNationality() { return nationality; }
public String getAgency() { return agency; }
public int getTransferCost() { return transferCost; }
public int getParticipations() { return participations; }
public int getGoals() { return goals; }
public int getAssists() { return assists; }
public int getYellowCards() { return yellowCards; }
public int getRedCards() { return redCards; }
}
80 changes: 80 additions & 0 deletions src/main/java/ru/urfu/resolver/Resolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package ru.urfu.resolver;

import ru.urfu.model.Player;
import ru.urfu.graphics.Graphic;

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

public class Resolver implements IResolver {
private final List<Player> players;

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

private String translatePositionToRussian(String position) {
switch (position.toUpperCase()) {
case "GOALKEEPER": return "Вратарь";
case "DEFENDER": return "Защитник";
case "MIDFIELD": return "Полузащитник";
case "FORWARD": return "Нападающий";
default: return position;
}
}

@Override
public int getCountWithoutAgency() {
return (int) players
.stream()
.filter(player ->
player.getAgency() == null ||
player.getAgency().isEmpty() ||
player.getAgency().equals("-")
)
.count();
}

@Override
public int getMaxDefenderGoalsCount() {
return players
.stream()
.filter(player -> player.getPosition().equals("DEFENDER"))
.mapToInt(Player::getGoals)
.max()
.orElse(0);
}

@Override
public String getTheExpensiveGermanPlayerPosition() {
Player expensiveGerman = players
.stream()
.filter(player -> player.getNationality().equals("Germany"))
.max((p1, p2) -> Long.compare(p1.getTransferCost(), p2.getTransferCost()))
.orElse(null);

if (expensiveGerman != null) {
return translatePositionToRussian(expensiveGerman.getPosition());
}
return "Не найден";
}

@Override
public String getTheRudestTeam() {
Map<String, Double> teamRedCardsAvg = players
.stream()
.collect(Collectors.groupingBy(
Player::getTeam,
Collectors.averagingDouble(Player::getRedCards)
));

return teamRedCardsAvg
.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse("Не найдена");
}
}
Loading