- Liittynyt
- 27.04.2017
- Viestejä
- 36
Javan kirjastot ei ole tuttuja, mutta jos tavoitteena on rekursiivinen lista niin olettaisin, että myös tietomallin olisi hyvä olla rekursiivinen.Välillä jotain muuta kuin JavaScriptiä.
Kielenä Java ja ongelmana seuraava. Kyseisistä oliosta pitäisi rakentaa hierarkinen puu. Jokaisella oliolla on ylemmän tason organisaation id tiedossa.
Organisaatiorakenne on tässä esimerkissä seuraavanlainen
Koodi:[1] [2] [3] [4] [5] [6] [7]
Itse organisaatio-luokka näyttää tältä:
Java:public class Organisation { Long id; String organisation_name; Long parent_organisation_id; public Organisation(Long id, String organisation_name, Long parent_organisation_id) { this.id = id; this.organisation_name = organisation_name; this.parent_organisation_id = parent_organisation_id; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getOrganisation_name() { return organisation_name; } public void setOrganisation_name(String organisation_name) { this.organisation_name = organisation_name; } public Long getParent_organisation_id() { return parent_organisation_id; } public void setParent_organisation_id(Long parent_organisation_id) { this.parent_organisation_id = parent_organisation_id; } @Override public String toString() { return "Organisation{" + "id=" + id + ", organisation_name='" + organisation_name + '\'' + ", parent_organisation_id=" + parent_organisation_id + '}'; } }
Muutama olio luotuna:
Java:Organisation organisation1 = new Organisation(1L, "A", null); Organisation organisation2 = new Organisation(2L, "B", 1L); Organisation organisation3 = new Organisation(3L, "C", 1L); Organisation organisation4 = new Organisation(4L, "D", 1L); Organisation organisation5 = new Organisation(5L, "E", 2L); Organisation organisation6 = new Organisation(6L, "F", 3L); Organisation organisation7 = new Organisation(7L, "G", 4L); List<Organisation> orgs = Arrays.asList(organisation1, organisation2, organisation3, organisation4, organisation5, organisation6, organisation7);
Kokeilin hieman Javan Stream API:a, muttei tuo ole ihan sitä mitä haetaan.
Java:orgs.stream().collect(groupingBy(o -> o.getParent_organisation_id() != null ? o.getParent_organisation_id() : o.getId()));
Tulos:
JSON:{ "1": [ { "id": 1, "organisation_name": "A", "parent_organisation_id": null }, { "id": 2, "organisation_name": "B", "parent_organisation_id": 1 }, { "id": 3, "organisation_name": "C", "parent_organisation_id": 1 }, { "id": 4, "organisation_name": "D", "parent_organisation_id": 1 } ], "2": [ { "id": 5, "organisation_name": "E", "parent_organisation_id": 2 } ], "3": [ { "id": 6, "organisation_name": "F", "parent_organisation_id": 3 } ], "4": [ { "id": 7, "organisation_name": "G", "parent_organisation_id": 4 } ] }
Lopputuloksen olisi tarkoitus olla kuitenkin jotain vastaavaa:
JSON:[ { id: 1, organisation_name: "A", child: [ { id: 2, organisation_name: "B", child: [ { id: 5, organisation_name: "E" } ] }, { id: 3, organisation_name: "C", child: [ { id: 6, organisation_name: "F" } ] }, { id: 4, organisation_name: "D", child: [ { id: 7, organisation_name: "G" } ] } ] } ];
Onko tuota edes mahdollista parsia Stream API:n avulla tuollaiseksi hierarkiseksi puuksi vai vaatiiko tämä muutoksia tuohon itse organisaatio-luokkaan?
Olisiko siitä mitään apua, jos pelkän parentin idn sijaan lisäät organisaatiolle viittauksen parentin organisaatioinstanssiin. Tai toisinpäin lisäät organisaatioluokalle listan kaikista sen aliorganisaatioista. Sitten kun luot organisaatioita niin linkität ne keskenään tyyliin organisaatio1.addChild(organisaatio2);
Kun linkitykset on saatu kohdilleen niin pitäisi olla triviaalia tulostaa ne halutussa muodossa.


