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

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

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

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

Q&A

解決済

2回答

2114閲覧

The other approach to Using Comparator

MilagrosS

総合スコア7

Java

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

0グッド

0クリップ

投稿2020/04/23 07:56

前提・実現

<前提>
修飾子は変更しない
Grade-classインナークラスとして作成。
java.util.List<Score>)フィールドを作成として
individual grade listsをconstructorでinitialize。
<実現>
[Name」「Total_Score」を降順で表示
<質問>
降順で表示するために自然順序付してくれるtreeMapで実現しましたが、他の方法で効率的に実現可能であれば教えてください。

該当のソースコード

Java

1 2import java.util.ArrayList; 3import java.util.Comparator; 4import java.util.List; 5import java.util.Map; 6import java.util.TreeMap; 7 8public class Test1 { 9 10 public static void main(String[] args) { 11 12 System.out.println("<Grades>"); 13 14 List<Score> scoreList = new ArrayList<Score>(); 15 16 //individual grade lists 17 18 scoreList.add(new Test1.Score("Alex", 99, 50, 89)); 19 scoreList.add(new Test1.Score("Sara", 45, 78, 90)); 20 scoreList.add(new Test1.Score("Luca", 92, 85, 63)); 21 scoreList.add(new Test1.Score("Camila", 69, 95, 71)); 22 scoreList.add(new Test1.Score("Ben", 77, 90, 47)); 23 24 execute(scoreList); 25 } 26 27 private static void execute(List<Score> list) { 28 29 Map<Integer, String> map = new TreeMap<>(new Comparator<Integer>() { 30 public int compare(Integer k1, Integer k2) { 31 return k2.compareTo(k1); 32 } 33 }); 34 35 for (Test1.Score l : list) { 36 map.put(l.getBiology() + l.getEnglish() + l.getPhysics(), l.getName()); 37 } 38 39 40 for (Integer i : map.keySet()) { 41 System.out.println(map.get(i) + " : " + i); 42 } 43 44 } 45 46 //Grades-class 47 48 private static class Score { 49 50 51 private String name; 52 53 private int biology; 54 55 private int english; 56 57 private int physics; 58

試したこと

以下のサイトで検索してみましたが、treemapで実現した方が楽にソート出来た。
Comparator.NaturalOrder
TreeMap Comparator

補足情報(FW/ツールのバージョンなど)

Programing Language:Java

Version:8.0

エディター:eclipse Version: 1.14.102.201911250848

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

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

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

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

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

guest

回答2

0

ベストアンサー

swordoneさんの既回答にあるとおり、mapを使った実装は、以下のような場合に失敗します。

java

1scoreList.add(new Test1.Score("Alex", 99, 50, 89)); 2scoreList.add(new Test1.Score("Sara", 45, 78, 90)); 3scoreList.add(new Test1.Score("Luca", 92, 85, 63)); 4scoreList.add(new Test1.Score("Camila", 69, 95, 71)); 5scoreList.add(new Test1.Score("Ben", 77, 90, 47)); 6scoreList.add(new Test1.Score("Deen", 47, 77, 90)); // Data Lost Ben

他の方法で効率的に実現可能であれば

効率的というのが実装の楽さでいうなら
Listのsortメソッドを、そのまま使う。
Comparetorは昇順なので、判定を逆に実装するのが楽かな

java

1 list.sort(new Comparator<Test1.Score>() { 2 @Override 3 public int compare(Score o1, Score o2) { 4 // 比較対象を逆にする 5 Integer s2 = o2.getTotalScore(); 6 return s2.compareTo(o1.getTotalScore()); 7 } 8 }); 9

comapreの実装が通常と異なるのがイヤであれば以下の実装でも可能です。

java

1 list.sort( 2 Comparator.comparingInt( 3 new ToIntFunction<Score>() { 4 @Override 5 public int applyAsInt(Score s) { 6 return -1 * (s.getBiology() + s.getEnglish() + s.getPhysics()); 7 } 8 }));

効率というか後々のことを考えれば合計点を返すメソッドを用意した方が楽でしょう。

java

1 public int getTotalScore() { 2 return biology + english + physics; 3 } 4

そうすればListの中身を表示するときも簡単です。

java

1 for (Score score : list) { 2 System.out.println(score.getName() + " : " + score.getTotalScore()); 3 }

投稿2020/04/23 11:37

編集2020/04/23 11:58
momon-ga

総合スコア4826

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

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

MilagrosS

2020/04/23 13:44

ありがとうございました。 同点の生徒を2人以上入れられないということをしらなったので大変勉強になりました。 ありがとうございました。
guest

0

総得点をキーにしたMapの場合、**同点の生徒を2人以上入れられません。**同点の生徒がいた場合、あとから入ったほうで上書きされます。
そもそもListとMapでは目的が異なることを認識してください。

投稿2020/04/23 08:44

編集2020/04/23 08:46
swordone

総合スコア20669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問