🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

3回答

4276閲覧

【Java8】ArrayListのsortについて

astro_taaka

総合スコア3

Java

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

0グッド

0クリップ

投稿2020/12/18 05:04

編集2020/12/18 05:44

ArrayListを降順にソートしたい

発生している問題・エラーメッセージ

ランダムに生成された、10個の数をListに格納し表示するコードを書いています。
MyDataクラスでデータの生成番号と値を格納後、Prog4Lec04Sub2MainクラスでListに格納し、
sort機能で降順に並び替えを実施後、Printしたいのですが、以下のエラーが発生します。
sort機能で並べ替えを実施する場合、何らかの型にキャストしなければならないのでしょうか。

初歩的な質問で恐縮ですが、よろしくお願いします。

Exception in thread "main" java.lang.ClassCastException: MyData cannot be cast to java.lang.Comparable at java.util.Collections$ReverseComparator.compare(Collections.java:5108) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.util.TimSort.sort(TimSort.java:220) at java.util.Arrays.sort(Arrays.java:1512) at java.util.ArrayList.sort(ArrayList.java:1462) at java.util.Collections.sort(Collections.java:175) at Prog4Lec04Sub2Main.main(Prog4Lec04Sub2Main.java:16)

###Prog4Lec04Sub2Main

java

1import java.util.ArrayList; 2import java.util.Collections; 3import java.util.List; 4 5public class Prog4Lec04Sub2Main { 6 7 public static void main(String[] args) { 8 9 List<MyData> list = new ArrayList<>(); 10 11 for(int i=0; i<10; i++) { 12 MyData d = new MyData(i, Math.random()); 13 list.add(d); 14 } 15 16 Collections.sort(list, Collections.reverseOrder()); 17 18 for(int i=0; i<10; i++) { 19 System.out.println(list.get(i)); 20 } 21 } 22}

###MyData

java

1public class MyData { 2 public int index; 3 public double data; 4 5 MyData(int index, double data){ 6 this.index = index; 7 this.data = data; 8 } 9 10 public String toString() { 11 return "[" + index + "] = " + data; 12 } 13}

試したこと

Prog4Lec04Sub2Mainにて、Collections.sort(list, Collections.reverseOrder());を試しましがが、
上記の通り、エラーが発生しました。

実行結果として、以下のような実行結果を得たいです:
[9]=0.8395040403659793
[8]=0.8189062091743063
[7]=0.6705154302473527
[6]=0.8107981435059656
[5]=0.7808639306636846
[4]=0.4486541177871155
[3]=0.46994453864506025
[2]=0.6628052688710216
[1]=0.20142499070903008
[0]=0.5939917583832581

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

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

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

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

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

dodox86

2020/12/18 05:39

マークダウン記法でコードを記載するときは、 ```プログラミング言語名 ``` です。(先の質問では正しく"Java"となっていたのに、何故?)
astro_taaka

2020/12/18 05:43

すみません、入力ミスでした。 修正いたしました。
guest

回答3

0

ベストアンサー

単純なListの順序を逆に並び替えする場合は'sort'ではなく'reverse'ですね。
配列(リスト)を逆順に並び替えるには

**sort(List<T> list, Comparator<? super T> c)**で自作のクラスを並び替えたい場合は、並び替えの条件を
**Comparator<T>**インターフェースを実装したクラスで定義してください。(これも自作です。)

例えばMyDataクラスのdataの値で昇順にしたい場合は、

Java

1public class MyDataComparator implements Comparator<MyData> { 2 @Override 3 public int compare(MyData o1, MyData o2) { 4 return o1.data < o2.data ? -1 : 1; 5 } 6}

のようなクラスを作って

Java

1Collections.sort(list, new MyDataComparator());

とすることでlistの中身をMyDataクラス内のdataの値でソートしたりできます。

投稿2020/12/18 06:41

k_n_h_r

総合スコア58

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

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

astro_taaka

2020/12/18 06:51

丁寧にご教授頂きありがとうございました。 別途、比較用のクラスを教示頂いた内容で作成し、降順で並び替えることができました。
guest

0

MyData の比較方法を教えてやらないとソートできません。

diff

1- Collections.sort(list, Collections.reverseOrder()); 2+ Collections.sort(list, Collections.reverseOrder( 3+ new Comparator<MyData>() { 4+ public int compare(MyData a, MyData b) { 5+ return a.data < b.data ? -1 : a.data > b.data ? 1 : 0; 6+ } 7+ } 8+ ));

追記
自前の比較関数 compare を実装するのだから、reverseOrder は不要でした。
比較結果の 1 と -1 を逆にするだけ。

diff

1+import java.util.Comparator; 2 3- Collections.sort(list, Collections.reverseOrder()); 4+ Collections.sort(list, 5+ new Comparator<MyData>() { 6+ public int compare(MyData a, MyData b) { 7+ return a.data < b.data ? 1 : a.data > b.data ? -1 : 0; 8+ } 9+ } 10+ );

投稿2020/12/18 06:32

編集2020/12/18 06:40
kazuma-s

総合スコア8224

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

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

astro_taaka

2020/12/18 06:53

丁寧にご教授頂きありがとうございました。 おかげさまで、理解出来ました。(コードも記載することができました)
guest

0

エラーメッセージ

MyData cannot be cast to java.lang.Comparable

は、Comparableにキャストできない=実装されていないという意味です。

独自クラスのソートは標準クラスではできません。
今回のケースだと、indexでソートするのか、dataでソートするのか
昇順か降順のどちらでソートするのかわからないです。

java.lang.Comparable インターフェースをMyDataに実装するか
Collections.reverseOrder()の代わりにjava.util.Comparatorの実装クラス(匿名クラスで良いです)
を指定する必要があります。


Comparatorの実装が提示済みなので、Comparableの例を追記

java

1public class MyData implements Comparable<MyData> { 2 public int index; 3 public double data; 4 5 MyData(int index, double data) { 6 this.index = index; 7 this.data = data; 8 } 9 10 public String toString() { 11 return "[" + index + "] = " + data; 12 } 13 14 @Override 15 public int compareTo(MyData o) { 16 if(this.index == o.index) return 0; 17 return this.index > o.index ? 1 : -1; 18 } 19}

投稿2020/12/18 06:08

編集2020/12/18 09:48
momon-ga

総合スコア4826

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

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

astro_taaka

2020/12/18 06:54

独自クラスのコードに関しては、標準クラスでは扱えないのですね。 参考になりました。ご回答頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問