Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Како дел од вашиот систем за водење двојно сметководство имплементирајте класа
- Transactions за обработка на податоци за трансакции. Во оваа класа треба да ги
- имплементирате следните методи:
- • Transactions() - default конструктор
- • List<String> readData(InputStream inputStream) – метод кој ги вчитува податоците за
- трансакциите кои се во следниот формат:
- yyyy/mm/dd;[value];[currency], пример 2003/02/14;1795;USD
- Некои од датумите не се валидни, односно денот за одреден месец го надминува
- максималниот за тој месец (пример 02/30 ). Исто така, водете сметка и за престапните
- години. Сите датуми кои не се валидни треба да ги вратите во листата од стрингови
- (секој датум како посебен стринг) како резултат од методот.
- • void writeData(int year, OutputStream outputStream) – метод за запишување на сите
- трансакции во одредена година подредени според датумот/вредноста во растечки
- редослед. Сите елементи се разделени со едно празно место, а вредноста се печати со
- 10 места од кои 2 децимални. На крајот запишете го балансот (сумата) на сите
- трансакции во денари. Деновите во месеците како и вредностите на валутите за
- конверзија ви се дадени како константи во класата Constants.
- Почетен код:
- public class TransactionsTest {
- public static void main (String [] args) {
- Transactions transactions = new Transactions();
- System.out.println(transactions.getClass());
- List<String> invalid = transactions.readData(System.in);
- System.out.println("=== INVALID DATES ===");
- for (String s : invalid) {
- System.out.println(s);
- }
- System.out.println("=== TRANSACTIONS 2001 ===");
- transactions.writeData(2001, System.out);
- System.out.println("=== TRANSACTIONS 2007 ===");
- transactions.writeData(2007, System.out);
- System.out.println("=== TRANSACTIONS 2013 ===");
- transactions.writeData(2013, System.out);
- }
- }
- class Constants {
- static final float USD = 50;
- static final float EUR = 61.5f;
- static final int [] DAYS = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
- }
- Решение:
- import java.io.*;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class TransactionsTest {
- public static void main (String [] args) {
- Transactions transactions = new Transactions();
- System.out.println(transactions.getClass());
- List<String> invalid = transactions.readData(System.in);
- System.out.println("=== INVALID DATES ===");
- for (String s : invalid) {
- System.out.println(s);
- }
- System.out.println("=== TRANSACTIONS 2001 ===");
- transactions.writeData(2001, System.out);
- System.out.println("=== TRANSACTIONS 2007 ===");
- transactions.writeData(2007, System.out);
- System.out.println("=== TRANSACTIONS 2013 ===");
- transactions.writeData(2013, System.out);
- }
- }
- class Constants {
- static final float USD = 50;
- static final float EUR = 61.5f;
- static final int [] DAYS = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
- }
- class Transactions {
- List<Transaction> transactions;
- Transactions () {
- this.transactions = new ArrayList<>();
- }
- List<String> readData(InputStream inputStream) {
- List<String> result = new ArrayList<>();
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
- String line;
- try {
- while ((line = bufferedReader.readLine()) != null) {
- String [] parts = line.split(";");
- String [] dateParts = parts[0].split("/");
- int year = Integer.parseInt(dateParts[0]);
- int month = Integer.parseInt(dateParts[1]);
- int day = Integer.parseInt(dateParts[2]);
- double value = Double.parseDouble(parts[1]);
- String currency = parts[2];
- Transaction t = new Transaction(year, month, day, value, currency);
- this.transactions.add(t);
- if (isLeapYear(year)) {
- if (month == 2 && day > 29)
- result.add(parts[0]);
- else if (day > Constants.DAYS[month])
- result.add(parts[0]);
- }
- else if (day > Constants.DAYS[month])
- result.add(parts[0]);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
- private boolean isLeapYear(int year) {
- return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
- }
- void writeData(int year, OutputStream outputStream) {
- PrintWriter printWriter = new PrintWriter(outputStream);
- this.transactions.stream()
- .sorted()
- .filter(it -> it.year == year)
- .forEach(printWriter::println);
- /*Collections.sort(transactions);
- for (Transaction t : transactions)
- if (t.year == year)
- printWriter.println(t);*/
- printWriter.flush();
- }
- }
- class Transaction implements Comparable<Transaction> {
- int year;
- int month;
- int day;
- double value;
- String currency;
- Transaction(int year, int month, int day, double value, String currency) {
- this.year = year;
- this.month = month;
- this.day = day;
- this.value = value;
- this.currency = currency;
- }
- @Override
- public int compareTo(Transaction o) {
- if (year != o.year)
- return Integer.compare(year, o.year);
- else if (month != o.month)
- return Integer.compare(month,o.month);
- else if (day != o.day)
- return Integer.compare(day, o.day);
- else
- return Double.compare(value, o.value);
- }
- @Override
- public String toString() {
- return String.format("%d %d %d %10.2f %s", year, month, day, value, currency);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement