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

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

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

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

Q&A

解決済

2回答

1766閲覧

Java Listの並べ替えについて

encho

総合スコア182

Java

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

0グッド

1クリップ

投稿2020/04/10 08:33

#Java Listの並べ替えについて

DBよりListを取り出しそのListを曜日順に並べたい(月曜日~日曜日)場合には
Listをどのように処理するのが適切なのでしょうか?
アルファベット順や文字の長さ順などは簡単にできると思うのですが、
自分が定めたルール今回だと曜日などはどのようにするべきなのでしょうか?

public class LessonMenu implements Serializable { @Column(name="user_id", insertable=false, updatable=false) private int userId; @Column(name="day_of_the_week") private String dayOfTheWeek; //getter setter }

DBから取り出したときは
ArrayList<LessonMenu>となっておりこれらを曜日順に並べたいと思っています。

day_of_the_weekには月曜日から日曜日の値がDBには収納されていますが、
取り出したときには曜日順にはなっていないためJavaのListで処理をしたいです。

何かアドバイスがありましたらいただけると幸いです。

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

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

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

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

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

jimbe

2020/04/10 11:39

> day_of_the_weekには月曜日から日曜日の値 具体的に, どのような値なのでしょうか. ("日","月","火",..等)
encho

2020/04/10 11:40

("月曜日","火曜日","水曜日"...."日曜日")の7種類の値です。 情報不足で申し訳ありませんでした
guest

回答2

0

ベストアンサー

アルファベット順や文字の長さ順などは簡単にできると思うのですが、
自分が定めたルール今回だと曜日などはどのようにするべきなのでしょうか?

独自のルールでソートしたい場合は、sort メソッドの引数に Comparator を指定します。

参考:ArrayList 要素のソートと Comparator - コレクション - Java 入門
https://java.keicode.com/lib/collections-sort.php

投稿2020/04/10 08:57

nskydiving

総合スコア6500

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

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

encho

2020/04/10 11:26

ご回答ありがとうございます。 提示していただいたリンクを参考にさせていただきました。 引数を二つ取りそれらを比べるということですが、 今回7つの曜日はどのように比較していくのが良いでしょうか? 7C2で21通りを総当たりで比べる。 なんていうのは悪手だとは思うのですが、良い方法はありますかね...?
jimbe

2020/04/10 11:49 編集

簡単には, 文字列を数値に置き換えた上で比較するのが定石かと思います. 例えば, List<String> DAY_OF_WEEK = Arrays.asList("月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"); という List を作っておくと, DAY_OF_WEEK.indexOf("火曜日") → 1 DAY_OF_WEEK.indexOf("日曜日") → 6 等と数値化出来ます.
encho

2020/04/10 11:49

replaceで置き換えてその後にソートするといった形でしょうか?
encho

2020/04/10 11:51

ありがとうございます。 上記を参考にしてやってみます。
jimbe

2020/04/10 11:58 編集

Comparator 内での話です. 二つの引数の曜日をそれぞれ数値化した後, 比較した結果を返すということです.
encho

2020/04/10 11:57

理解できました。ご丁寧な対応ありがとうございます。
Zuishin

2020/04/10 12:12

indexOf は要素数が増えるとパフォーマンスが悪くなるので HashMap がいいと思います。
encho

2020/04/10 12:15

曜日なので7つの要素でこれ以上増える余地はないですがHashMapの方がよろしいでしょうか?
Zuishin

2020/04/10 12:18 編集

indexOf と HashMap を比較した上であえて indexOf を選ぶという手もあるかもしれませんが、こういうときには HashMap を使うというのが定石なので、覚えておくと後々楽ができると思います。
jimbe

2020/04/10 12:23

私がお伝えしたかったのは "文字列を数値化して比較" ということですので, 実装に関しましては『こうでなければ』ということはありません. List#indexOf を例にしましたのは, コメント欄に書き易かったというのがあります^^;
encho

2020/04/10 12:32

わかりました。 大変参考になりました。ありがとうございます!
guest

0

以下のようにコンパレータクラスを作成して解決しました

Java

1public class DayOfTheWeekComparator implements Comparator<LessonMenu>{ 2 @Override 3 public int compare(LessonMenu lessonMenu1,LessonMenu lessonMenu2) { 4 String day1 = lessonMenu1.getDayOfTheWeek(); 5 String day2 = lessonMenu2.getDayOfTheWeek(); 6 Map<String,Integer> dayOfTheWeek = new HashMap<>(); 7 dayOfTheWeek.put("月曜日", 1); 8 dayOfTheWeek.put("火曜日", 2); 9 dayOfTheWeek.put("水曜日", 3); 10 dayOfTheWeek.put("木曜日", 4); 11 dayOfTheWeek.put("金曜日", 5); 12 dayOfTheWeek.put("土曜日", 6); 13 dayOfTheWeek.put("日曜日", 7); 14 return dayOfTheWeek.get(day1) < dayOfTheWeek.get(day2) ? -1:1; 15 } 16 17} 18

投稿2020/04/11 05:15

encho

総合スコア182

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

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

swordone

2020/04/11 05:21

これだと比較が発生するたびにMapを作成することになるので、効率が悪いです。 Mapをフィールド変数にして、最初の一回だけで済ませましょう。
encho

2020/04/11 05:47

アドバイスありがとうございます。 参考になりました。 Map<String,Integer> dayOfTheWeek = new HashMap<>(); 部分を外に出してフィールド変数にしてみます。
xebme

2020/04/11 07:09 編集

横から失礼します。Mapを使う方針から外れますが、以下の方法があります。 - LessonMenuクラスに曜日の整数値を返すメソッドを用意する Mapを使わなくてもswitchで十分早いと思います。 - LessonMenuクラスに余計なメソッドを追加できないのならヘルパーを用意するかラムダ式にする 失礼しました。
encho

2020/04/11 07:08

xebmeさま 初歩的な質問にもかかわらず多くの回答いただきありがたく思っています。 いただいたアドバイスですが、 LessonMenuの曜日の値に対してswitch文で整数値を返すメソッドを用意して それを比較するということでよろしいでしょうか?
xebme

2020/04/11 07:23 編集

return Integer.compare(a.get曜日整数値, b.get曜日整数値); public Integer get曜日整数値() { switch (dayOfTheWeek) { case "日曜日": return 7; case "月曜日": return 1; case "火曜日": return 2; case "水曜日": return 3; case "木曜日": return 4; case "金曜日": return 5; case "土曜日": return 6; default: return null; } }
encho

2020/04/11 08:08

ご丁寧にありがとうございます。 参考にさせていただきます。
jimbe

2020/04/11 12:48 編集

少々変種的ですが, enum を使うというテもあります. public enum DayOfTheWeek { 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日, 日曜日; } というものを用意し, LessonMenu クラスの getDayOfTheWeek メソッドを DayOfTheWeek getDayOfTheWeek() { return DayOfTheWeek.valueOf(dayOfTheWeek); } とします. すると DayOfTheWeekComparator クラスの compare メソッドは return lessonMenu1.getDayOfTheWeek().compareTo(lessonMenu2.getDayOfTheWeek()); となります. (並び順は enum 内の順になります.) データベースに入れる際にも曜日の列にはこの enum の文字列のみを使用するようにコード上で制限すれば, データベースのデータの一貫性を取り易くなると思います.
xebme

2020/04/12 00:05 編集

>jimbeさん変則的ではありません 自作enumは気がつきませんでした。java.text.DayOfWeekというenumがあります。試したところ、[日本語曜日名]から[数値]が引けませんでした(やり方があるかもしれません)。 問題の本質は「日本語曜日名の自然順序で整列することができない」ことですから、設計まで視野を広げて、データベースに、曜日マスターを用意して、個別テーブルの曜日は数値で持つ(SQLの整列も容易)、を考えたいです。この設計でも、自作enumは[数値]->[日本語曜日名]変換に役立ちます。 <説明不足を補います> enumは、[日本語曜日名] <-> [曜日順序] 変換を行う定数クラスである。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問