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

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

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

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

Q&A

解決済

2回答

967閲覧

基本情報技術者午後29年秋の言語問題(Java)

Exception

総合スコア14

Java

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

0グッド

0クリップ

投稿2019/03/19 10:27

基本情報技術者午後29年秋のソースコードについて質問させてください
第二引数で新しくインスタンスを作成し中にメソッドが入っているこの構文が何をしているのか理解できません。
compareメソッドはどこで実行されているのでしょうか?

sorter.putSortOrder("lex", new Comparator<String>(){
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});

sorter.putSortOrder("num", new Comparator<String>(){ public int compare(String o1, String o2) { return new Integer(o1).compareTo(new Integer(o2)); } }); public void sort(String[][] table, final OrderBy... orderBys) { Arrays.sort(table, new Comparator<String[]>(){ public int compare(String[] s1, String[] s2) { for(OrderBy orderBy: orderBys) { int order = orderMap.get(orderBy.key).compare(s1[orderBy.col],s2[orderBy.col]); if(order != 0) { return orderBy.isResersed ? -order : order; } } return 0; } }); }

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

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

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

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

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

guest

回答2

0

ベストアンサー

中にメソッドが入っているこの構文が何をしているのか理解できません。

匿名クラスのインスタンスを作っています。次のように書いているのと意味は同じです。

Java

1class AnonymousComparator implements Comparator<String> { 2 public int compare(String o1, String o2) { 3 return o1.compareTo(o2); 4 } 5} 6 7... 8 9 sorter.putSortOrder("lex", new AnonymousComparator());

compareメソッドはどこで実行されているのでしょうか?

ソート時に呼び出されます。
putSortOrderはおそらくコンパレータのセッターでしょう。

サンプル

Java

1import java.util.ArrayList; 2import java.util.Comparator; 3import java.util.List; 4 5 6class AnonymousComparator implements Comparator<String> { 7 @Override 8 public int compare(String s1, String s2) { 9 return s1.compareTo(s2); 10 } 11} 12 13class Main { 14 public static void main(String[] args) { 15 var names = List.of("Tom", "Bob", "Steve"); 16 17 // 匿名クラスを利用 18 { 19 var lst = new ArrayList<>(names); 20 21 lst.sort(new Comparator<String>() { 22 @Override 23 public int compare(String s1, String s2) { 24 return s1.compareTo(s2); 25 } 26 }); 27 System.out.println(lst); 28 } 29 30 // 外部クラスを利用 31 { 32 var lst = new ArrayList<>(names); 33 34 lst.sort(new AnonymousComparator()); 35 System.out.println(lst); 36 } 37 38 // ラムダ式を利用 39 { 40 var lst = new ArrayList<>(names); 41 42 lst.sort((s1, s2) -> s1.compareTo(s2)); 43 System.out.println(lst); 44 } 45 46 // 自然順ならこれでも良し 47 { 48 var lst = new ArrayList<>(names); 49 50 lst.sort(Comparator.naturalOrder()); 51 System.out.println(lst); 52 } 53 } 54}

実行結果 Wandbox

[Bob, Steve, Tom] [Bob, Steve, Tom] [Bob, Steve, Tom] [Bob, Steve, Tom]

Comparator.naturalOrder はじめいくつかコンパレータが用意されていることを考えると、
そのオブジェクトのcompareToメソッドを呼び出すだけのコンパレータを作る意義はあまり無いです。

文字数順だとか、ちょっと捻ったソートを試した方が学びは深いでしょう。

まぁ、ラムダ式を利用できる状況なら匿名クラスにはあまり出番がありませんが...

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
Java

投稿2019/03/19 10:41

編集2019/03/19 11:12
LouiS0616

総合スコア35660

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

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

0

提示頂いているコードはどれも定義とメソッドの呼び出しのみで, 実際に使用している部分ではありません.
察しますに, 各メソッド内で第二引数を Comparator<String> もしくは Comparator<String[]> として受け取り(保存し), ソート中に compare メソッドを呼び出しているものと思います.

投稿2019/03/19 10:37

jimbe

総合スコア12659

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問