Как реализовать код задачи?

339
25 июля 2022, 01:40

Нужно решить задачу, условие которой звучит так:

На входе имеется файл в формате json, содержащий информацию о каком-то количестве организаций, в т.ч. названия, адреса, номера телефонов, ИНН, ОГРН, а также о ценных бумагах, которыми владеет каждая компания. Необходимо сформировать на основе исходного файла коллекцию объектов без потери информации, где каждый объект представляет одну организацию. Для сформированной коллекции:

  • Вывести все имеющиеся компании в формате «Краткое название» – «Дата основания 17/01/98»;
  • Вывести все ценные бумаги (их код, дату истечения и полное название организации-владельца), которые просрочены на текущий день, а также посчитать суммарное число всех таких бумаг;
  • На запрос пользователя в виде даты «ДД.ММ.ГГГГ», «ДД.ММ,ГГ», «ДД/ММ/ГГГГ» и «ДД/ММ/ГГ» вывести название и дату создания всех организаций, основанных после введенной даты;
  • На запрос пользователя в виде кода валюты, например EU, USD, RUB и пр. выводить id и коды ценных бумаг, использующих заданную валюту.

Для решения задачи я создал Maven проект и подключил либу Gson и создал 4 класса Main, Security, Company, LocalDateAdapter.

Реализовал код, который получает массив ценных бумаг, массив компаний из Json файла и создает массив объектов компаний с параметрами и массивом принадлежащих ей ценных бумаг. Вроде бы на вид выглядит правильно. С первым пунктом вроде бы нет проблем, разве что если есть способ вывести название-дата основания с помощью .stream(). Но вот как программно реализовать остальные пункты задачи до меня не доходит. Кто сможет понять, прошу помочь разобраться.

Main.java

package com.json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.util.ArrayList;
public class Main {
    public static void main(String[] args) throws Exception {
        File file = new File("Company.json");
        BufferedReader brOur = new BufferedReader(new FileReader(file));
        String stOur = brOur.readLine();
        String jsonFile = "";
        while (stOur != null) {
            jsonFile += stOur;
            stOur = brOur.readLine();
        }
        Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, new LocalDateAdapter()).create();
        Type compListType = new TypeToken<ArrayList<Company>>(){}.getType();
        ArrayList<Company> companies = gson.fromJson(jsonFile, compListType);
        
        for (Company company: companies) {
            System.out.println("\"" + company.name + "\" - \"" + company.date_Osnovania + "\"");
            
        }
    }
}

Security.java

package com.json;
import java.time.LocalDate;
public class Security {
    int id;
    String code;
    String name_bum;
    LocalDate date_start;
    LocalDate  date_end;
    String currency;
    public int getId() {
        return id;
    }
    public String getCode() {
        return code;
    }
    public String getName_bum() {
        return name_bum;
    }
    public LocalDate getDate_start() {
        return date_start;
    }
    public LocalDate getDate_end() {
        return date_end;
    }
    public String getCurrency() {
        return currency;
    }

    @Override
    public String toString(){
        return "[id=\"" + id + "\", code=\"" + code + "\", name_bum=\""
                + name_bum + "\", date_start=\"" + date_start + "\", date_end=\"" + date_end + "\", currency=\"" + currency + "\"]";
    }
}

Company.java

package com.json;
import java.time.LocalDate;
import java.util.ArrayList;
public class Company {
    String name;
    String address;
    String telNumber;
    String inn;
    String ogrn;
    LocalDate date_Osnovania;
    ArrayList<Security> securities;
    public ArrayList<Security> getFilterSecurities(){
        LocalDate today = LocalDate.now();
        securities.stream()
                .filter(s->s.date_end.isBefore(today));
        return securities;
    }
    public String getName() {
        return name;
    }
    public String getAddress() {
        return address;
    }
    public String getTelNumber() {
        return telNumber;
    }
    public String getInn() {
        return inn;
    }
    public String getOgrn() {
        return ogrn;
    }
    public LocalDate getDate_Osnovania() {
        return date_Osnovania;
    }
    public ArrayList<Security> getSecurities() {
        return securities;
    }
    @Override
    public String toString(){
        return "[name=\"" + name + "\", address=\"" + address + "\", telNumber=\""
                + telNumber + "\", inn=\"" + inn + "\", ogrn=\"" + ogrn
                + "\", date_Osnovania=\"" + date_Osnovania + "\", securities=\"" + securities + "\"]";
    }
}

Ну и код для LocalDateAdapter.java он нужен для парсинга в LocalDate

package com.json;
import java.io.IOException;
import java.time.LocalDate;

import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
class LocalDateAdapter extends TypeAdapter<LocalDate> {
    @Override
    public void write(final JsonWriter jsonWriter, final LocalDate localDate) throws IOException {
        if (localDate == null) {
            jsonWriter.nullValue();
        } else {
            jsonWriter.value(localDate.toString());
        }
    }
    @Override
    public LocalDate read(final JsonReader jsonReader) throws IOException {
        if (jsonReader.peek() == JsonToken.NULL) {
            jsonReader.nextNull();
            return null;
        } else {
            return LocalDate.parse(jsonReader.nextString());
        }
    }
}

А также Json файлы:

Company.json

[
{
"name": "ЗАО Свербанк",
"address": "г. Москва, ул. Филатова, 5А",
"telNumber": "74952285651",
"inn": "7704407589",
"ogrn": "1177746415857",
"date_Osnovania": "1908-05-27",
"securities": [{ "id": 21,
                "code": "SBR",
                "name_bum": "Акции Свербанка",
                "date_start": "1993-05-28",
                "date_end": "2013-05-27",
                "currency": "RUB"},
                { "id": 76,
                "code": "BRS",
                "name_bum": "Акции Brazil Company",
                "date_start": "1953-05-27",
                "date_end": "2023-05-28",
                "currency": "USD"},
                { "id": 11,
                "code": "VKR",
                "name_bum": "Акции Газшпрота",
                "date_start": "1995-10-01",
                "date_end": "2018-05-10",
                "currency": "RUB"}]
},
{
"name": "ООО Макдоладс",
"address": "USA, NY, st. Wallstreet, 21",
"telNumber": "05321153113",
"inn": "6523485125",
"ogrn": "6512545658759",
"date_Osnovania": "1948-07-06",
"securities": [{ "id": 54,
                "code": "GYT",
                "name_bum": "акции Gym Center Traning",
                "date_start": "2009-11-15",
                "date_end": "2029-11-15",
                "currency": "USD"},
                { "id": 45,
                "code": "GT",
                "name_bum": "акции General Totors",
                "date_start": "1899-01-15",
                "date_end": "2009-05-05",
                "currency": "USD"},
                { "id": 95,
                "code": "GGM",
                "name_bum": "акции Germany Glock Migrante",
                "date_start": "2009-11-03",
                "date_end": "2049-11-15",
                "currency": "EUR"}]
},
{
"name": "ВТБ банк",
"address": "г. Москва, Калужское шоссе, 35",
"telNumber": "74952651362",
"inn": "7514745125",
"ogrn": "7541454523547",
"date_Osnovania": "1983-02-01",
"securities": [{ "id": 59,
                "code": "DDF",
                "name_bum": "Акции компании Дельта",
                "date_start": "1956-03-02",
                "date_end": "2006-05-31",
                "currency": "RUB"},
                { "id": 95,
                "code": "PUY",
                "name_bum": "Акции компании PumaC",
                "date_start": "1996-03-02",
                "date_end": "2036-05-31",
                "currency": "EUR"}]
},
{
"name": "ООО Яндекс",
"address": "г. Москва, ул. Ленина, 85А",
"telNumber": "74955652635",
"inn": "7541451221",
"ogrn": "7855723651545",
"date_Osnovania": "1999-05-31",
"securities": [{ "id": 23,
                "code": "YND",
                "name_bum": "Акции компании Яндекс",
                "date_start": "2000-05-25",
                "date_end": "2015-05-25",
                "currency": "RUB"},
                { "id": 22,
                "code": "AVT",
                "name_bum": "Акции компании AutoVaz",
                "date_start": "1985-05-25",
                "date_end": "2013-05-25",
                "currency": "RUB"},
                { "id": 17,
                "code": "GMC",
                "name_bum": "Акции компании ГватемалЦентр",
                "date_start": "2015-05-25",
                "date_end": "2040-05-25",
                "currency": "RUB"}]
}
]

Security.java

[{ "id": 21,
"code": "SBR",
"name_bum": "Акции Свербанка",
"date_start": "1993-05-28",
"date_end": "2013-05-27",
"currency": "RUB"
},
{ "id": 76,
"code": "BRS",
"name_bum": "Акции Brazil Company",
"date_start": "1953-05-27",
"date_end": "2023-05-28",
"currency": "USD"
},
{ "id": 11,
"code": "VKR",
"name_bum": "Акции Газшпрота",
"date_start": "1995-10-01",
"date_end": "2018-05-10",
"currency": "RUB"
},
{ "id": 54,
"code": "GYT",
"name_bum": "акции Gym Center Traning",
"date_start": "2009-11-15",
"date_end": "2029-11-15",
"currency": "USD"
},
{ "id": 45,
"code": "GT",
"name_bum": "акции General Totors",
"date_start": "1899-01-15",
"date_end": "2009-15-05",
"currency": "USD"
},
{ "id": 95,
"code": "GGM",
"name_bum": "акции Germany Glock Migrante",
"date_start": "2009-11-03",
"date_end": "2049-11-15",
"currency": "EUR"
},
{ "id": 59,
"code": "DDF",
"name_bum": "Акции компании Дельта",
"date_start": "1956-03-02",
"date_end": "2006-05-31",
"currency": "RUB"
},
{ "id": 95,
"code": "PUY",
"name_bum": "Акции компании PumaC",
"date_start": "1996-03-02",
"date_end": "2036-05-31",
"currency": "EUR"
},
{ "id": 23,
"code": "YND",
"name_bum": "Акции компании Яндекс",
"date_start": "2000-05-25",
"date_end": "2015-05-25",
"currency": "RUB"
},
{ "id": 22,
"code": "AVT",
"name_bum": "Акции компании AutoVaz",
"date_start": "1985-05-25",
"date_end": "2013-05-25",
"currency": "RUB"
},
{ "id": 17,
"code": "GMC",
"name_bum": "Акции компании ГватемалЦентр",
"date_start": "2015-05-25",
"date_end": "2040-05-25",
"currency": "RUB"
}]
Answer 1
import com.google.gson.annotations.SerializedName;
import java.time.LocalDate;
import java.util.List;
import lombok.Data;
@Data
public class Company {
    
    @SerializedName("name")
    private String name;
    @SerializedName("address")
    private String address;
    @SerializedName("telNumber")
    private String telNumber;
    @SerializedName("inn")
    private String inn;
    @SerializedName("ogrn")
    private String ogrn;
    @SerializedName("date_Osnovania")
    private LocalDate foundationDate;
    @SerializedName("securities")
    private List<Security> securities;
    
    @Override
    public String toString() {
        return "[name=\"" + name + "\", address=\"" + address + "\", telNumber=\""
                + telNumber + "\", inn=\"" + inn + "\", ogrn=\"" + ogrn
                + "\", date_Osnovania=\"" + foundationDate + "\", securities=\"" + securities + "\"]";
    }
    
}
import lombok.Data;
import java.time.LocalDate;
import com.google.gson.annotations.SerializedName;
@Data
public class Security {
    @SerializedName("id")
    private Integer id;
    @SerializedName("code")
    private String code;
    @SerializedName("name_bum")
    private String nameBum;
    @SerializedName("date_start")
    private LocalDate dateStart;
    @SerializedName("date_end")
    private LocalDate dateEnd;
    @SerializedName("currency")
    private String currency;
    @Override
    public String toString() {
        return "[id=\"" + id + "\", code=\"" + code + "\", name_bum=\""
                + nameBum + "\", date_start=\"" + dateStart + "\", date_end=\"" + dateEnd + "\", currency=\"" + currency + "\"]";
    }
    
}
import com.google.gson.TypeAdapter;
import java.io.IOException;
import java.time.LocalDate;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
class LocalDateAdapter extends TypeAdapter<LocalDate> {
    @Override
    public void write(final JsonWriter jsonWriter, final LocalDate localDate) throws IOException {
        if (localDate == null) jsonWriter.nullValue();
        else jsonWriter.value(localDate.toString());
    }
    @Override
    public LocalDate read(final JsonReader jsonReader) throws IOException {
        if (jsonReader.peek() == JsonToken.NULL) {
            jsonReader.nextNull();
            return null;
        } 
        else return LocalDate.parse(jsonReader.nextString());
    }
}
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDate;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
    public static void main(String[] args) throws IOException {
        try (JsonReader reader = new JsonReader(new BufferedReader(new InputStreamReader(new FileInputStream("Company.json"), "UTF-8")))) {
            Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, new LocalDateAdapter()).create();
            Company[] companies = gson.fromJson(reader, Company[].class);
            
            Stream.of(companies).forEach(company -> 
                    System.out.println(String.join("", "'", company.getName(), "' - '", company.getFoundationDate().toString(), "'"))
            );
            
            System.out.println("*********************************************");
            
            List<Security> securities = getFilteringSecurities(companies, s->s.getDateEnd().isBefore(LocalDate.now()));            
            System.out.println(securities.size());
            securities.forEach(System.out::println);
                   
            System.out.println("*********************************************");
            
            LocalDate foundationDate = LocalDate.now().minusYears(50);//user input
            List<Company> companiesByFoundationDate = getFilteringCompanies(companies, c->c.getFoundationDate().isAfter(foundationDate));
            companiesByFoundationDate.forEach(System.out::println);
        }
    }
    
    private static List<Security> getFilteringSecurities(Company[] companies, Predicate <Security> predicate) {
        return Stream.of(companies)
                .flatMap(c -> c.getSecurities().stream())
                .filter(predicate)
                .collect(Collectors.toList());
    }
    
    private static List<Company> getFilteringCompanies(Company[] companies, Predicate <Company> predicate) {
        return Stream.of(companies)
                .filter(predicate)
                .collect(Collectors.toList());
    }
    
}
       
READ ALSO
Некорректная работа SwitchButton в ViewHolder-e itemView в recyclerView. (Room)

Некорректная работа SwitchButton в ViewHolder-e itemView в recyclerView. (Room)

Почему-то SwitchButton-ы в item-ах в recyclerView работают некорректноПри переключении - иногда переключается не только тот, который переключаю, но и еще...

296
BottomNavigationView и Fragment. Как сохранить состояние?

BottomNavigationView и Fragment. Как сохранить состояние?

Есть BottomNavigationView и 3 Fragment'аФрагмент "Home" содержит ScrollView

346
Проблема с итерацией в цикле

Проблема с итерацией в цикле

Есть некоторая коллекция(исходник: Проблема с удалением переменных классов потомков):

373
Динамический выпадающий список с данными из mysql на php

Динамический выпадающий список с данными из mysql на php

Помогите реализовать задачу, иметься таблица в базе данных

407