平成29年秋期午後問11(d)(e)

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
初学者さん  
(No.1)
https://www.fe-siken.com/kakomon/29_aki/pm11.html

TableSorterクラスのcompareメソッド内の変数orderはどのような役割をもっているのでしょうか?
この変数が何を示しているのか分からず、解説の意味が理解できません。
なぜ降順の時に-を付ける(符号を逆転させる)のかも分かりません。
ご回答いただけると大変うれしいです。
2022.11.03 18:02
jjon-comさん 
FE ゴールドマイスター
(No.2)
> 〔プログラム2〕
> TableSorter sorter = new TableSorter();
> 省略
> sorter.sort(data, new TableSorter.OrderBy("lex", 0),
>                   new TableSorter.OrderBy("num", 1, true));

というコードから、
TableSorterクラスのsort()メソッドでdataを整列していることが分かります。

> 〔プログラム1〕
> public static class OrderBy {
> 省略

の内容と対応させると、

第1整列キーは、
フィールド key は "lex" と名付けており、
フィールド col は 0列目が整列対象、
フィールド isReversed は false(昇順を表す)となっています。

第2整列キーは、
フィールド key は "num" と名付けており、
フィールド col は 1列目が整列対象、
フィールド isReversed は true(降順を表す)となっています。

--------
> 〔プログラム1〕
> 省略
> public class TableSorter {
> 省略
>   public void sort(String[][] table, final OrderBy... orderBys) {
>     Arrays.sort(table, new Comparator<String[]>() {
>       public int compare(String[] s1, String[] s2) {
> 省略

というコードから、
TableSorterクラスのsort()メソッド内ではArrays.sort()を呼び出していること、
さらにその中で、
Comparatorインタフェースのcompare()メソッドの中身の処理を実装していることが分かります。

java.util.Arrays および java.util.Comparetor のリファレンスマニュアルはこちら。
https://www.fe-siken.com/pdf/29_aki/java.pdf

このリファレンスマニュアルに定義してあるとおり、
Comparatorインタフェースのcompare()メソッドは、次の戻り値を返す義務があります。

> o1とo2の大きさが等しいときは0
> o1がo2より小さいときは負の値
> o1がo2より大きいときは正の値

また、Arraysクラスのsort()メソッドにはこう書かれており、

> 指定された配列を、指定されたコンパレータの
> メソッドcompareが返す大小関係に従って、昇順に並び替える。

降順に並び替える機能は無い点に注意してください。

--------
これでご質問への回答の前提が揃いました。

次のコードを実行してorderに格納されるint値は、0、負の値、正の値、のいずれかです。(【空欄a】の正解より、orderMap.get(orderBy.key)で得られるのはComparetor<String>型のオブジェクトなので)

> int order = orderMap.get(orderBy.key).compare(s1[orderBy.col], s2[orderBy.col]);【空欄c】

Arraysクラスのsort()メソッドは、
Comparatorインタフェースを実装したcompare()メソッドの戻り値を基にして自動的に整列をおこなってしてくれるのですが、
「戻り値が負なら前方に、戻り値が正なら後方に」という基本的な昇順整列の機能があるだけで、
昇順以外の整列をしたい場合や、自分なりに整列規則を決めたい場合は、戻り値を独自にコーディングする必要があります。

> if (order != 0) {【空欄d】
>   return orderBy.isReversed ? -order : order;【空欄e】
> }

は、降順が指定された第2整列キーの場合にはcompare()メソッドの戻り値の正負を逆にして「大きい値なら前方に、小さい値なら後方に」となるよう独自規則をコーディングしています。
2022.11.04 01:14

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop