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

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

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

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

Thymeleaf

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Spring Boot

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

Q&A

解決済

1回答

4389閲覧

JavaのstreamingでgroupuingByしたものをKeyでSortしたい

K-actus

総合スコア22

Java

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

Thymeleaf

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Spring Boot

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

1グッド

0クリップ

投稿2021/09/02 09:19

編集2021/09/02 09:23

こんにちは。
Spring Bootについて初学者なので拙いところもあると思いますが、よろしくお願いします。

実現したいこと

あるModelをControllerでグループ化(Collectors.groupingBy)して、そのグループごとにHTMLで表示しようとしたのですが、そのグループの表示順が想定と違っていました。
具体的に言うと、StringであるKeyをABC順にしてHTMLで表示したいです。
###例
例として以下のような名前と出身地のデータがあり、出身地でグループ化して50音で並べたいとします。

Idnamehometown
1YamadaTokyo
2NaritaAomori
3NakayamaTokyo
4IguchiKagawa
5TsurumiKagawa
6TanakaWakayama

この場合
●青森

  • 成田

●香川

  • 井口
  • 鶴見

●東京

  • 中山
  • 山田

●和歌山

  • 田中

という順番になります。(名前は順不同)

###コード
Model

Java

1package com.example.demo.Test; 2 3import java.time.LocalDateTime; 4 5import javax.persistence.Column; 6import javax.persistence.Entity; 7import javax.persistence.GeneratedValue; 8import javax.persistence.GenerationType; 9import javax.persistence.Id; 10import javax.persistence.Table; 11 12import lombok.Getter; 13import lombok.Setter; 14 15@Getter 16@Setter 17@Entity 18@Table(name="HogeList") 19public class HogeList { 20 21 @Id 22 @GeneratedValue(strategy=GenerationType.IDENTITY) 23 private int Id; 24 25 @Column(name="name") 26 private String Name; 27 28 @Column(name="hometown") 29 private String Hometown; 30}

Repository

Java

1package com.example.demo.Test; 2 3import org.springframework.data.jpa.repository.JpaRepository; 4 5public interface HogeRepository extends JpaRepository<HogeList, Integer> { 6}

Controller

Java

1package com.example.demo.Test; 2 3import java.util.ArrayList; 4import java.util.HashMap; 5import java.util.List; 6import java.util.Map; 7import java.util.stream.Collectors; 8 9import org.springframework.beans.factory.annotation.Autowired; 10import org.springframework.stereotype.Controller; 11import org.springframework.ui.Model; 12import org.springframework.web.bind.annotation.GetMapping; 13import org.springframework.web.bind.annotation.PostMapping; 14import org.springframework.web.bind.annotation.RequestParam; 15 16 17@Controller 18public class HogeController { 19 20 @Autowired 21 private HogeRepository hogeRepository; 22 23 @GetMapping("/hoge") 24 public String getHogeList(Model model) { 25        List<HogeList> HogeList = hogeRepository.findAll(); 26 //Hometownごとに分ける sortしたい 27 Map<String, List<HogeList>> HogeMap = HogeList 28 .stream() 29 .collect(Collectors.groupingBy(x -> x.getHometown())); 30 31 model.addAttribute("HogeList", HogeList); 32 33 return "hoge"; 34 } 35}

View

Thymeleaf

1<table class="table"> 2 <tr> 3         <!--ここの順番をアルファベット順でソートしたい--> 4 <th th:each="group: ${HogeMap}" th:text="|【${group.value[0].Hometown}】|"></th> 5 </tr> 6 <tr> 7 <td th:each="group: ${HogeMap}"> 8 <th:block th:each="item: ${group.value}"> 9 <div th:text="${item.Name}"></div> 10 </th:block> 11 </td> 12 </tr> 13</table>

###その他
調べてたらこの記事が出たんですけど、
https://teratail.com/questions/256132
これの2番目の回答がやりたいことに近いです。
しかし今回の場合のEnumの定義とその書き方がわかりませんでした・・・。

不明瞭な点もあるかと思いますが、回答よろしくお願いします。

補足情報

Eclipse 2020 Java FullEdition
AmazonCorretto jdk15.0.2_7
SpringBoot 2.4.3
MySQL 8.0.23
Windows10 Pro 20H2

swordone👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Enumは最初からキーの種類がある程度限定されていれば効果的ですが、
都道府県でやるにしても47種類もあり、「ABC順」というのも決まっているなら使うメリットは薄そうです。

通常のgroupingByで得られるMapは、順番の保証がなされません。
そのため、生成するMapの型を、キーの順番保証をしてくれるものに指定しましょう。
引数3つ取るgroupingBy(Function, Supplier, Collector)なら、第2引数で使うMap型を指定できます。
キーの自然順序(アルファベットの場合、ABC順)でソートしてくれるTreeMapを使ってみましょう。

java

1 @GetMapping("/hoge") 2 public String getHogeList(Model model) { 3        List<HogeList> HogeList = hogeRepository.findAll(); 4 Map<String, List<HogeList>> HogeMap = HogeList 5 .stream() 6 .collect(Collectors.groupingBy(x -> x.getHometown(), TreeMap::new, Colllectors.toList()));

投稿2021/09/02 18:15

swordone

総合スコア20651

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

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

K-actus

2021/09/03 01:29

解決しました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問