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

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

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

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

Q&A

1回答

1940閲覧

Mapで自作クラスをValueにした場合の代入と取得方法について

pontaq

総合スコア31

Java

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

0グッド

0クリップ

投稿2019/01/08 11:02

前提・実現したいこと

外部ファイルから取得した情報をクラスで保持します。

以下の情報を保持するためのクラスです。
MainSubファイル
Sub.area/Main.id/Main.type
1/1/A
2/1/B
3/1/B
4/1/C
5/1/X
6/2/A
7/3/B
8/4/X
9/5/A
10/5/B
11/5/B...

1つのMain.idに複数のSub.areaがつく形です。削除データもあるので、連番とは限りません

SubSub2ファイル
Sub.area/Sub2.no/Sub2.name
1/1/佐藤
2/1/山田
3/1/高橋
4/1/鈴木
6/1/高木
7/1/吉田1
7/2/吉田2
7/3/吉田3
7/4/吉田4
9/1/小野...

MainSubと違って、複数のSub.areaの可能性があります。
両ファイルとも、1行まるまる同じデータになることはないです。

保持した後、取得するときに

・Main.idは全部取得
・Sub.areaはMain.idに紐づくものを取得(Main.id=1の場合、Sub.areaの1~5)したい
・またSub2の情報をSub.areaと紐づくもので保持したい

両ファイルとも1行ずつのデータを取得し、入れていく形になりますが、
今のままだと同じMain.idで別のSub.areaを入れたときに、上書きされるでしょうか。

最終的にやりたいのは、2つのファイルから取得したデータを、
別画面に表示するためのクラス作成です。

Javaに関しては初心者のため、アドバイスいただきたいです。よろしくお願いします。

該当のソースコード

Java

1 2public class Main{ 3 4 private int id; 5 private String type; // 6 7 Map<Integer, Sub> subMap; 8 9 public Main() 10 { 11 } 12 13 public Main(int id, String type) 14 { 15 setId(id); 16 setType(type); 17 } 18 19 // getter/setter 20} 21 22public class Sub{ 23 24 private int area; // ユニーク 25 26 Map<Integer, Sub2> sub2Map; 27 28 public Sub() 29 { 30 } 31 32 // getter/setter 33} 34 35public class Sub2{ 36 37 private int no; 38 private String name; 39 40 public Sub2() 41 { 42 } 43 44 public Sub2(int no, String name) 45 { 46 setNo(no); 47 setName(name); 48 } 49 50 // getter/setter 51} 52 53public class Root{ 54 55 private static final Root INSTANCE = new Root(); 56 private Map<Integer, Main> mainMap = new LinkedHashMap<Integer, Main>(); 57 58 // private constructor 59 60 public static Root getInstance() 61 { 62 return INSTANCE; 63 } 64 65 // Main.idの全行を取得したい 66 public Main getMain() 67 { 68 // mainMapのMain.idのみを取得 69 } 70 71 public void setMain(int id, String type) 72 { 73 Main main = mainMap.get(id); 74 if (main == null) 75 { 76 main = new Main(id, type); 77 mainMap.put(id, main); 78 } 79 } 80 81 public Sub getSub(int id) 82 { 83 for (Main main : mainMap.values()) 84 { 85 if (main.subMap.containsKey(id)) 86 { 87 return main.subMap.get(id); 88 } 89 } 90 91 return null; 92 } 93 94 public void setSub(int id, int area) 95 { 96 Main main = mainMap.get(id); 97 if (main == null) 98 { 99 main = new Main(); 100 main.setId(id); 101 main.subMap = new LinkedHashMap<Integer, Sub>(); 102 mainMap.put(id, main); 103 } 104 105 Sub sub = new Sub(); 106 sub.setArea(area); 107 main.subMap.put(id, sub); 108 } 109 110 111 // 引数はSub.areaの値 112 public Sub2 getSub2() 113 { 114 115 } 116 117 public void setSub2() 118 { 119 // ここがよくわからない 120 // 引数指定できるものはSub.area/Sub2.no/Sub2.nameのみ 121 } 122} 123

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

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

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

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

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

guest

回答1

0

素直に3つの情報を持つクラスを2つ作ったほうが早そうです。
(getterとかsetterとか面倒なのでpublic finalで手抜きします。)

java

1public class Main { 2 public final int main; 3 public final int subArea; 4 public final String type; 5 public Main (int main, int sub, String type) { 6 this.main = main; 7 this.subArea = sub; 8 this.type = type; 9 } 10} 11 12public class Sub { 13 public final int area; 14 public final int no; 15 public final String name; 16 public Sub (int area, int no, String name) { 17 this.area = area; 18 this.no = no; 19 this.name = name; 20 } 21}

で、使う側でファイル読み込みなんかでインスタンスを作成して、Map<Integer, List<Main>>のような形で扱えばいいです。

投稿2019/01/08 16:31

swordone

総合スコア20649

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

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

pontaq

2019/01/08 23:54

有難うございます。3つのクラス作成は指示で変えることは出来ないです。申し訳ないです。 使う側でというのは呼び出し側でしょうか?読み込んだ順番を保持したいため、LinkedHashMapで作成しています。全く検討違いのことを言っていたらすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問