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

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

group = "ru.urfu"
Expand All @@ -10,10 +15,21 @@ repositories {
}

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

tasks.test {
useJUnitPlatform()
}
testLogging {
events("passed", "skipped", "failed")
}
}

tasks.named<JavaExec>("run") {
standardInput = System.`in`
}
18 changes: 6 additions & 12 deletions src/main/java/ru/urfu/Main.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
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.*;
import ru.urfu.parser.*;
import ru.urfu.model.*;

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();
}
}
}
32 changes: 32 additions & 0 deletions src/main/java/ru/urfu/console/Communicator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ru.urfu.console;

import ru.urfu.parser.*;
import ru.urfu.resolver.*;
import ru.urfu.graphics.*;

import java.util.Scanner;

public class Communicator {
public static void runChampionship() {
var scanner = new Scanner(System.in);
System.out.println("Введите файл для анализа из директории src/main/resources: ");
String fileName = scanner.nextLine();

var players = CSVParser.parseCSVToList(fileName);
var resolver = new Resolver(players);

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

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

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

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

Graphics.showGraphics(Graphics.makeMapping(players));
}
}
72 changes: 72 additions & 0 deletions src/main/java/ru/urfu/graphics/Graphics.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package ru.urfu.graphics;

import ru.urfu.model.*;

import javax.swing.JPanel;
import javax.swing.JFrame;

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

import java.awt.*;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Map;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Graphics {
public static Map<Position, Long> makeMapping(List<Player> players) {
return players
.stream()
.collect(Collectors.groupingBy(Player::position, Collectors.counting()));
}

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

public static void showGraphics(Map<Position, Long> positionsCount) {
DefaultPieDataset<String> dataset = new DefaultPieDataset<>();

positionsCount.forEach((pos, cnt) ->
dataset.setValue(posToStr(pos), cnt)
);

JFreeChart chart = ChartFactory.createPieChart("Распределение по позициям", dataset, true, true, false);

ChartPanel chartPanel = new ChartPanel(chart);
JFrame frame = new JFrame();

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


frame.setSize(800, 600);
frame.setContentPane(chartPanel);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
14 changes: 14 additions & 0 deletions src/main/java/ru/urfu/model/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.urfu.model;

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

public enum Position {
GOALKEEPER,
DEFENDER,
MIDFIELD,
FORWARD
}
48 changes: 48 additions & 0 deletions src/main/java/ru/urfu/parser/CSVParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package ru.urfu.parser;

import ru.urfu.model.*;

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

public class CSVParser {
public static ArrayList<Player> parseCSVToList(String filename) {
var list = new ArrayList<Player>();
var scanner = getScanner(Paths.get(System.getProperty("user.dir") + "/src/main/resources/" + filename));

scanner.nextLine();
while (scanner.hasNextLine()) {
list.add(parsePlayerRow(scanner.nextLine()));
}

return list;
}

public static Player parsePlayerRow(String row) {
var cells = row.split(";");
return new Player(
cells[0],
cells[1],
cells[2],
Position.valueOf(cells[3]),
cells[4],
cells[5],
Integer.parseInt(cells[6]),
Integer.parseInt(cells[8]),
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);
}
}
}
77 changes: 77 additions & 0 deletions src/main/java/ru/urfu/resolver/Resolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package ru.urfu.resolver;

import ru.urfu.model.*;

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

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

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

@Override
public int getCountWithoutAgency() {
return (int)players.stream()
.filter(p -> p.agency().isEmpty())
.count();
}

@Override
public int getMaxDefenderGoalsCount() {
return players.stream()
.filter(p -> p.position().equals(Position.DEFENDER))
.max(Comparator.comparing(p -> p.goals()))
.map(p -> p.goals())
.orElse(-1);
}

@Override
public String getTheExpensiveGermanPlayerPosition() {
return players.stream()
.filter(p -> p.nationality().equals("Germany"))
.max(Comparator.comparing(p -> p.cost()))
.map(p -> {
switch (p.position()) {
case (Position.GOALKEEPER):
return "Вратарь";
case (Position.DEFENDER):
return "Защитник";
case (Position.MIDFIELD):
return "Полузащитник";
default:
return "Нападающий";
}
})
.orElse("Ошибка: немецких игроков не найдено");
}

@Override
public String getTheRudestTeam() {
var teams = players
.stream()
.collect(Collectors.groupingBy(p -> p.team()));

var maxEntry = teams
.entrySet()
.stream()
.max(Comparator.comparing(entry ->
entry
.getValue()
.stream()
.mapToDouble(Player::rCards)
.average()
.orElse(0)
))
.orElse(null);

if (maxEntry == null) {
return "Ошибка: команд не найдено";
}
return maxEntry.getKey();
}
}
37 changes: 37 additions & 0 deletions src/test/java/ru/urfu/graphics/MappingTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.urfu.graphics;

import ru.urfu.graphics.*;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

import ru.urfu.model.*;
import ru.urfu.parser.*;

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

public class MappingTest {
@Test
void testMakeMapping() {
List<Player> players = List.of(
CSVParser.parsePlayerRow("Randall Hilpert;North Carolina dolphins;Tennessee;DEFENDER;Ghana;Bahringer-Larson;54202579;21;2;13;8;0"),
CSVParser.parsePlayerRow("Connie Hegmann;North Carolina dolphins;Tennessee;DEFENDER;Ecuador;Bogisich-Rempel;97729347;2;8;28;4;5"),
CSVParser.parsePlayerRow("Leda Orn III;Nevada whales;South Carolina;MIDFIELD;Ghana;;53608367;19;5;18;2;0"),
CSVParser.parsePlayerRow("Thomas Howell DVM;Mississippi witches;Virginia;FORWARD;Colombia;;32821305;2;27;26;2;7"),
CSVParser.parsePlayerRow("Sherril Jacobs DDS;Massachusetts enchanters;Connecticut;MIDFIELD;Germany;Hauck Inc;39373848;20;16;21;2;1"),
CSVParser.parsePlayerRow("Antonina Reinger DVM;Hawaii oxen;Oklahoma;FORWARD;Ghana;Walker and Sons;99974008;4;27;18;8;4"),
CSVParser.parsePlayerRow("Lourdes Schoen;Minnesota giants;Washington;DEFENDER;Croatia;Graham-Powlowski;87664016;13;29;13;5;2"),
CSVParser.parsePlayerRow("Lilli Pagac;North Carolina dolphins;Tennessee;FORWARD;Qatar;Jakubowski and Sons;44568969;8;16;29;3;5"),
CSVParser.parsePlayerRow("Mitsuko Fadel;Wisconsin prophets;Vermont;FORWARD;Qatar;Price-Hirthe;47975979;4;16;0;0;6")
);

Map<Position, Long> playersByPosition = Graphics.makeMapping(players);

assertEquals(3L, playersByPosition.get(Position.DEFENDER));
assertEquals(2L, playersByPosition.get(Position.MIDFIELD));
assertEquals(4L, playersByPosition.get(Position.FORWARD));
}

}
Loading