#1 Laky
Tak mi to nedalo a při večeři jsem něco zkusil vymyslet, nevim jestli to nějak pomůže (aspoň jako inspirace), ale aspoň jsem se zabavil na chvíli :-)
Zadání je celkem volný, takže jsem si udělal jednoduchou "tabulku" texťáku (viz. níže) a tu si jen načetl, vyseparoval hodnoty a vložil do objektů. Základní operace vypiš všechno, součet toho a toho...
Jedná se o kovárnu (nenapadlo mě nic jinýho v tu chvíli), který vyrábí zbraně/štíty za stejné ceny (neuvěřitelné! - mohl bych doplnit i rozšíření, ale asi by to bylo nad rámec zadání). A tato kovárna ma nějaké roční a měsíční vyrobené kusy.
Datový soubor, který načítám (všimni si, že není úplný, chybí některé měsíce a některé jsou přeházené:
Rok;Měsíc;Prodaných zbraní
2010;1;45
2010;2;22
2010;8;64
2010;4;78
2011;5;36
2010;6;50
2010;7;18
2010;3;25
2010;9;94
2010;10;102
2010;11;0
2010;12;81
2011;1;25
2011;2;52
2011;3;74
2010;5;26
2011;6;60
2011;7;28
2011;8;75
2011;9;64
2011;10;2
2011;11;99
2011;12;72
Dále tu máme kód.. pro splnění jednoho *.java souboru jsem to taky nacpal do jednho (normálně bych to rozdělil pro přehlednost, ale zas tak dlouhý to neni - není problém si to rozdělit)
Něco jsem se pokusil okomentovat a udělat nějaké "základní" ošetření... není problém to rozšířit o další práci s načtenýmy daty.
Nevím, co všechno jste na cviku braly a nebraly, ale v zásadě to je jedno ;-)
joo.. a očekávám teda těch 300kč na účet :-P
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import cz.demo.Smithy.Calculation.MonthData;
/* Kovárna a její vyrobené a prodané kusy mečů, palcátů, štítů apod. */
public class Smithy
{
private String name; // název kovárny
private Calculation calculation; // hromadná kalkulace za X let
/* Kalkulace roků, měsíců z datového souboru */
public static class Calculation
{
public static final int PRICE_FOR_PIECE = 20; // cena za jeden kus výrobku
private Map<Short, MonthData[]> yearsData = new HashMap<Short, MonthData[]>(); // data za všechna léta
private int totalUnitsSold; // počet všech prodaných kusů
private int totalSales; // cena za všechny prodané kusy
/* Konstruktor :-O */
public Calculation(String fileDataName) throws FileNotFoundException
{
List<MonthData> dataList = prepareData(fileDataName);
applyDataList(dataList);
calculateTotalData();
}
/* Připraví data z datového souboru (převede data do objektů) a vrátí všechny měsíce všech let */
private List<MonthData> prepareData(String fileName) throws FileNotFoundException
{
File file = new File(fileName);
List<MonthData> dataList = new ArrayList<MonthData>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
int lineCounter = 0; // stačil by bool, ale je to fu*k
while ((line = br.readLine()) != null) {
// první řádek je název sloupců, ten nás těžce nezajímá..
if (lineCounter > 0) {
String[] tokens = line.split(";"); // delimiter
// vytvoříme objekt jednoho měsíce, protože pracujeme s měsíci
MonthData data = new MonthData();
data.year = Short.valueOf(tokens[0]);
data.month = Month.getByIndex(Byte.valueOf(tokens[1]));
data.unitsSold = Integer.valueOf(tokens[2]);
dataList.add(data);
}
lineCounter++;
}
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
e.printStackTrace();
}
return dataList;
}
/* Vytvoří pole měsíců jednoho roku */
private MonthData[] prepareYearMonths(short year)
{
MonthData[] data = new MonthData[12];
for (byte i = 0; i < 12; i++) {
MonthData md = new MonthData();
md.year = year;
md.month = Month.getByIndex((byte) (i + 1)); // získáme si Enum, protože práce s čísly je nezajímavá
data[i] = md;
}
return data;
}
/* Aplikuje výstupní seznam všech měsíců všech let do mapy kalkulace */
private void applyDataList(List<MonthData> dataList)
{
Collections.sort(dataList); // je potřeba seřadit data podle roku a měsíců pro snažší práci
yearsData.clear();
for (MonthData md : dataList) {
if (yearsData.containsKey(md.year)) {
yearsData.get(md.year)[md.month.number - 1] = md;
} else {
MonthData[] arr = prepareYearMonths(md.year);
arr[md.month.number - 1] = md;
yearsData.put(md.year, arr);
}
}
}
/* Vypočte celkové přijmy a prodané kusy */
private void calculateTotalData()
{
for (Entry<Short, MonthData[]> entry : yearsData.entrySet()) {
for (MonthData md : entry.getValue()) {
totalUnitsSold += md.unitsSold;
totalSales += md.unitsSold * PRICE_FOR_PIECE;
}
}
}
/* Informace pro tržby jednoho měsíce. Je to reprezentace jenoho řádku v datovém souboru */
public static class MonthData implements Comparable<MonthData>
{
private short year;
private Month month;
private int unitsSold;
@Override
public String toString()
{
return String.format("%d - %s - %d", year, month, unitsSold);
}
@Override
public int compareTo(MonthData o)
{
// seřadí podle roku
if (o.year > year) {
return 1;
} else if (o.year < year) {
return -1;
}
// seřadí podle měsice
if (o.month.number > month.number) {
return -1;
} else if (o.month.number < month.number) {
return 1;
}
return 0;
}
}
/* Enum mesíců, protože práce s indexy (1-12) je na prd... */
public enum Month
{
JANUARY(1, "Leden"),
FEBRUARY(2, "Únor"),
MARCH(3, "Březen"),
APRIL(4, "Duben"),
MAY(5, "Květen"),
JUNE(6, "Červen"),
JULY(7, "Červenec"),
AUGUST(8, "Srpen"),
SEPTEMBER(9, "Září"),
OCTOBER(10, "Říjen"),
NOVEMBER(11, "Listopad"),
DECEMBER(12, "Prosinec");
private byte number;
private String alias;
private Month(int number, String alias)
{
this.number = (byte) number;
this.alias = alias;
}
/* Získá podle indexu měsíce Enum měsíce */
public static Month getByIndex(byte number)
{
for (Month m : values()) {
if (m.number == number) {
return m;
}
}
throw new IllegalArgumentException("Invalid month (" + number + ") number!");
}
/* Budeme používat náš alias a né name(), který vrací název fieldu */
@Override
public String toString()
{
return alias;
}
}
}
/* Super hustej konstruktor kovárny ;-D */
public Smithy(String name)
{
this.name = name;
}
/* Načte datový soubor a vypočte kalkulaci */
private boolean loadDataFile(String fileDataName)
{
try {
calculation = new Calculation(fileDataName);
return true;
} catch (FileNotFoundException e) {
System.out.println("Jéje, soubor " + fileDataName + " nebyl nalezen :-(");
}
return false;
}
/* Hlavní metoda main() */
@SuppressWarnings("resource")
public static void main(String[] args)
{
// scanner pro čtení z konzole.. wau!
Scanner sc = new Scanner(System.in);
// vytvoříme si kovárnu a nějak jí pojmenujem
Smithy smithy = new Smithy("Kovárna U Tří bratří");
System.out.print("Zadej cestu k datovému souboru: ");
// načte datový soubor a vypočte kalkulaci
if (smithy.loadDataFile(sc.nextLine())) {
// vypíšem nějaký info o kovárně a kalkulaci
System.out.println("\nVítejte v kovárně: " + smithy.name);
System.out.println("Náše bilance za poslední " + smithy.calculation.yearsData.size() + " roky je:");
System.out.println(" - Počet prodaných kusů: " + smithy.calculation.totalUnitsSold);
System.out.println(" - Celkový příjem: " + smithy.calculation.totalSales + " Kč\n");
// projdeme všechny roky a měsíce pro výpis dat
for (Entry<Short, MonthData[]> entry : smithy.calculation.yearsData.entrySet()) {
System.out.println("Rok: " + entry.getKey());
for (MonthData md : entry.getValue()) {
System.out.printf(" - %s - %d => %d Kč%n", md.month, md.unitsSold, md.unitsSold
* Calculation.PRICE_FOR_PIECE);
}
System.out.println();
}
}
System.out.println("by ingiraxo");
}
}
Hmm možná jsem to mohl dát jako odkaz... :o)