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

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

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

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

3回答

1438閲覧

Javaのコードの標準化がうまくできない

moshi

総合スコア90

Java

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/08/24 03:42

編集2020/08/24 05:26

前提・実現したいこと

Springboot + ThymeleafでWebページを作成したいです。
Thymeleafで表示したい項目にJavaのTreeNodeを使用したものがあるのですが
その標準化がうまくできません。

試したこと

日付を親ノード、ファイル名を子ノードとするTreeNodeを作成したいです。
試してみて固定値を適当に入れた場合下記のような記述でTreeNode[] nodeが作成されることが分かりました。

TreeNode[] node = { new TreeNode("20200101", new TreeNode[] { new TreeNode("aaa.txt"), new TreeNode("bbb.txt") }), new TreeNode("20200301", new TreeNode[] { new TreeNode("ccc.txt") }) };

上記のサンプルコードだと固定の値しか入れられないので親の日付をkeyにしてファイル名のリストをValueとしてMapで値を持つようにしてみたのですが

Map<String, List<String>> map = new HashMap<String, List<String>>(); List<String> fileList1 = new ArrayList<String>(); fileList1.add("aaa.txt"); fileList1.add("bbb.txt"); map.put("20200101", fileList1); List<String> fileList2 = new ArrayList<String>(); fileList2.add("ccc.txt"); map.put("20200301", fileList2);

mapにどんな値が入っていてもTreeNode[] nodeが作成できるような標準化をするにはどうすればよいかがわかりませんでした。
どなたかお力を貸していただきたいです。
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/08/24 05:17

> Springboot + ThymeleafでWebページを作成したいです。 とのことですがタグ「Java」だけで問題ないでしょうか。
moshi

2020/08/24 05:27

>m.ts10806さん ご指摘ありがとうございます。 タグを追加させていただきました。
guest

回答3

0

ベストアンサー

とりあえず一般的によく使われるMapへのマージ処理とTreeNodeへの変換を
Stream APIを使用、未使用の2パターン書いてみましたけど、
こういう物が欲しかったのでしょうか。

java

1public class Main { 2 3 public static void main(String[] args) { 4 // 入力引数 5 String[][] nodeStr = { 6 {"20200101", "aaa.txt"}, 7 {"20200101", "bbb.txt"}, 8 {"20200301", "ccc.txt"}, 9 }; 10 11 // Streamを使った方法 12 // Mapのマージ処理 13 Map<String, List<String>> map = new TreeMap<String, List<String>>(); 14 for (String[] lNode : nodeStr) { 15 // mergeメソッドでキーによる追加、変更を処理する 16 map.merge(lNode[0], new ArrayList<String>(Arrays.asList(lNode[1])), (v1, v2) -> { 17 v1.add(lNode[1]); 18 return v1; 19 }); 20 } 21 22 // MapをTreeNode[]に書き出し 23 TreeNode[] node = map.entrySet().stream() 24 .map(e -> new TreeNode(e.getKey(), 25 e.getValue().stream() 26 .map(v -> new TreeNode(v)) 27 .toArray(TreeNode[]::new) 28 )).toArray(TreeNode[]::new); 29 30 // 出力 31 Arrays.stream(node) 32 .flatMap(n -> Arrays.stream(n.getChildNode()) 33 .map(cn -> n.getNode() +":"+ cn.getNode())) 34 .forEach(System.out::println); 35 36 37 38 // Streamを使わない方法 39 // Mapのマージ処理 40 map = new TreeMap<String, List<String>>(); 41 for (String[] lNode : nodeStr) { 42 // 日次がMapに存在しない場合 43 if (!map.containsKey(lNode[0])) { 44 map.put(lNode[0], new ArrayList<String>(Arrays.asList(lNode[1]))); 45 } else { 46 List<String> list = map.get(lNode[0]); 47 list.add(lNode[1]); 48 } 49 } 50 51 // MapをTreeNode[]に書き出し 52 node = new TreeNode[map.size()]; 53 int i = 0; 54 for (Entry<String, List<String>> entry : map.entrySet()) { 55 List<String> nList = entry.getValue(); 56 TreeNode[] cNode = new TreeNode[nList.size()]; 57 for (int j = 0; j < nList.size(); j++) { 58 cNode[j] = new TreeNode(nList.get(j)); 59 } 60 node[i] = new TreeNode(entry.getKey(), cNode); 61 i++; 62 } 63 64 // 出力 65 for (TreeNode pNode : node) { 66 for (TreeNode cNode : pNode.getChildNode()) { 67 System.out.println(pNode.getNode() +":"+ cNode.getNode()); 68 } 69 } 70 } 71 72} 73 74class TreeNode { 75 public TreeNode(String node) { 76 this.node = node; 77 } 78 79 public TreeNode(String node, TreeNode[] childNode) { 80 this.node = node; 81 this.childNode = childNode; 82 } 83 84 private String node; 85 private TreeNode[] childNode; 86 87 public String getNode() { 88 return node; 89 } 90 91 public void setNode(String node) { 92 this.node = node; 93 } 94 95 public TreeNode[] getChildNode() { 96 return childNode; 97 } 98 99 public void setChildNode(TreeNode[] childNode) { 100 this.childNode = childNode; 101 } 102} 103

投稿2020/08/24 08:03

yureighost

総合スコア2183

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

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

moshi

2020/08/24 11:15

>yureighostさん ご回答ありがとうございます。 まさにこう言った処理がしたかったです。 こうして書いていただけるとそれを追って理解ができたのですが自分では思いつきませんでした。 大変助かりました。 ありがとうございます。
guest

0

それぞれの固定値のところに、文字列が入った変数を当てはめればどうなるんでしょうか

投稿2020/08/24 04:33

y_waiwai

総合スコア88042

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

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

moshi

2020/08/24 05:25

>y_waiwaiさん ご回答ありがとうございます。 固定値のところに変数を当てはめれば同じことができるのですが、 例えば一つ目の「20200101」のマップのValueのリストの要素にxxx.txtというものが加えられた場合、new TreeNode("xxx.txt")というのを追加しなければいけなくなります。 そのあたりをFor文などでうまく作りたいのですがやり方が思い浮かばなく質問させていただきました…
guest

0

「それぞれ引数で受け取ってそういうList/Mapを作る関数」を作れば良いのでは?

※動作未確認

Java

1Map<String, List<String>> createNodeList(String key ,String[] filenamelist ){ 2 Map<String, List<String>> nodelist = new Map<String, List<String>>(); 3 4 List<String> fileList = new ArrayList<String>(); 5 for(String filename : filenamelist ){ 6 fileList.add(filename); 7 } 8 nodelist.put(key ,fileList); 9 return nodelist; 10} 11

あとは、そのファイル名一覧とキーと日付がどのようにリクエストとしてくるか次第ですね。

投稿2020/08/24 05:45

編集2020/08/24 05:46
m.ts10806

総合スコア80875

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

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

moshi

2020/08/24 11:14

>m.ts10806さん ご回答ありがとうございます。 質問の仕方が悪く申し訳ありません。 「それぞれ引数で受け取ってそういうList/Mapを作る関数」は作れていたのですがそれをTreeNodeに変換する部分がわかりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問