質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

328閲覧

構造データのクラスの造りを簡素化したい

wwwww

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2020/10/12 03:59

編集2020/10/12 04:31

お世話になっております。

Javaでの作成中のプログラムにて、
都道府県ごとに当該インスタンスを作る形で、以下のようなデータを保持する必要があります。

★都道府県ごとインスタンス  ・都道府県名(ex.東京都):String  ■市区町村ごとデータ:String,List<List<List<String>>>   ・町字名(ex.大手町):String   ◆町字ごとデータ:String,List<List<String>>    ・丁名(ex.1丁目):String    ●丁ごとデータ:List<String>     ・番地名(ex.1番地):String

★都道府県ごとデータの中に、都道府県名(String)と、■市区町村データのList。
■市区町村データの中に、  町字名(String)と、  ◆町字データのList。
◆町字データの中に、    丁名(String)と、   ●丁ごとデータ:List<String>

現状、以下で実装し、問題なく動作することは確認できています。
◇町字ごとクラス が、String,List<String>  を持ち、
□市区町村ごとクラス が、String,List<◇町字ごとクラス> を持ち、
☆都道府県ごとクラス が、String,List<□市区町村ごとクラス> を持つクラス とした上で、これをnewする

が、上記以上に造りを綺麗に(簡素化)することはできないのか、と考え、質問させていただきました次第です。特に
・javaが1クラス1ファイルであることで、◇□それぞれでファイルが分かれているが、まとめられないか
・List~の構造が似ていることから、一まとまりにできないか
など考え調べてみたのですが、解決に至ることができませんでした。

以上、ご回答いただけますと幸甚でございます。
よろしくお願いいたします。

★追記

既存ツールへの改修対応が必要で、listデータでの保持は要件なため、DB実装に変える等のレベル感での変更は不可です。
※thymeleafというhtmlテンプレートへのデータ注入のプログラムで、listデータで渡す必要があります。

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/10/12 04:06

そもそも、全部を一度に参照する事があるんでしょうか? データベースに格納しておいて取り出せば良いだけでは? 性能が問題なら、キャッシュすれば良いでしょうし。
wwwww

2020/10/12 04:28

早速のご回答ありがとうございます! 記載なくお手数おかけいたしました。 既存ツールへの改修対応が必要で、DB実装は不可な現状なためです。 ※thymeleafというhtmlテンプレートへのデータ注入のプログラムで、listデータで渡す必要があります。(この旨追記しておきます。)
guest

回答4

0

単に木構造の階層データを持ちたいのであれば、以下のようなクラスで対応することができます。

java

1public class Node { 2 String name; 3 List<Node> children; 4} 5

ただ、このままですとインスタンスがどの階層なのかが分からなくなるので階層情報も追加すると良いかと思います。

投稿2020/10/12 13:38

nagise

総合スコア87

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/10/16 04:23

ご回答ありがとうございます! 今回は別方法で実装いたしますが、nodeで階層を持つ発想はなく、勉強になります!
guest

0

ベストアンサー

デザインパターンのコンポジットパターンを使えばいいんじゃないでしょうか。
ListはStringでなく作成するクラス(たとえば、Address)みたいなものにして
Addressの中にはList<Address>があるので、再帰的に格納できます。

詳しくは、コンポジットパターンで検索してみてください。
見れば、理解できると思います。

サンプルと呼ぶには雑ですが、雰囲気だけわかればよいかと。

java

1public class Address { 2 String name; 3 List<Address> data = new ArrayList<>(); 4 5 public Address(String name) { 6 this.name = name; 7 } 8 public static void main(String[] args) { 9 Address n1 = new Address("東京都"); 10 Address n2 = new Address("大手町"); 11 Address n3 = new Address("一丁目"); 12 Address n4a = new Address("一番地"); 13 n4a.data.add(new Address("xxxビル")); 14 Address n4b = new Address("二番地"); 15 16 n3.data.add(n4a); 17 n3.data.add(n4b); 18 n2.data.add(n3); 19 n1.data.add(n2); 20 21 n3 = new Address("二丁目"); 22 n2.data.add(n3); 23 24 n3.data.add(new Address("三番地")); 25 n3.data.add(new Address("四番地")); 26 27 n2 = new Address("御徒町"); 28 n1.data.add(n2); 29 30 n2.data.add(new Address("二丁目")); 31 n2.data.add(new Address("三丁目")); 32 33 System.out.println(n1); 34 } 35 36 public String toString() { 37 return toString(1); 38 } 39 40 private String toString(int nest) { 41 String s = name + "\n"; 42 for(Address a : data) { 43 s = s + "\t".repeat(nest) + a.toString(nest + 1); 44 } 45 return s; 46 } 47} 48

投稿2020/10/12 07:28

編集2020/10/12 08:00
momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/10/16 04:32

ご回答・具体例ご記載、ありがとうございます!参考にさせていただきます。 また、デザインパターンなるものは未知でしたため、そこまで追って学習しておきたいと思います。 (…Javaの抽象化手法・考え方をさらに抽象化(=パターン化して公開)する方々がいるとは…世の中頭の良い人たちがいるものなのですね…) ※(私の事象説明が至らぬ点を多々認識しておりますが…)問題解決に当たり、当ご教示方法が最も最適でしたため、学習のうえ、活用させていただきました。(伴い、ベストアンサーとさせていただきます。)
guest

0

都道府県(String, List<市区町村>)
市区町村(String, List<町字>)
町字(String, List<番地>)

のように、クラスを作ればいいのでは?

投稿2020/10/12 04:16

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/10/12 04:25

早速のご回答、ありがとうございます! ご記載いただいた通りで実装したのですが、クラスファイルが3つでき、StringとList<?>の構造は相似なので、1ファイル(1クラス)で作れた方が、造りとして綺麗だよな、と考えました次第です。 ※1つにまとめられないのであれば、結果的にそれはそれで知りたかった回答になります
guest

0

ネストした構造のクラスではなく、リレーションしてはどうでしょうか。
Javaオブジェクトモデリング
静的モデル:リレーションシップ(1)

投稿2020/10/12 04:11

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/10/16 04:26

ご回答ありがとうございます! リレーション…別回答いただいている方の、デザインパターンのコンポジットパターン(string+list<?>の抽象親クラスの転用)を指している、と理解しています。 今回はその上記方法で実装いたしますが、リレーション・動的静的クラスについては無知だったので、勉強しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問