対象読者
- 基本情報処理試験の受験者
- プログラム初学者
- Java初学者
- 午後試験のソフトウェア開発設問でJavaを受けようと考えている
本記事の概要
本記事では「午後試験のソフトウェア開発設問でJavaを受けようと考えている」方を対象に基本情報処理試験での下記の実際に出題された設問の解説を行います。
実行できるプログラムコードを記載しました。eclipse等で実際に実行して確認ください。
「出典:平成29年度 秋期 FE試験区分 午後 問11 設問1~2」
ご挨拶
こんにちわ
社内の若手育成で情報処理試験対策を行っていますが、午後試験のソフトウェア開発の問題は解答を見るだけでは理解が不十分だと感じ執筆することにしました。
業務でJavaを利用していますが、細かい言語仕様を十分に理解している自信は正直ありません 私なりにできるだけ、わかりやすい解説を執筆したく考えています。勉強しなおす部分も多いので、ご指摘あれば書き込んでいただけると助かります。
今回は自信がなかったので、、、実行できるプログラムコードを記載しました。eclipse等で実際に実行して確認ください。
1. 過去問題をダウンロード
IPAの下記サイトからダウンロードください。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29.html#29aki
2. 過去問題を解く
がんばってください。いろいろテクニックあると思いますが、私はいきなり設問と解答群見ました。説明文は必要に応じて読むようにしてみました。
3. 解答をダウンロード
IPAの下記サイトからダウンロードください。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29.html#29aki
4. 解説
平成29年度 秋期 FE試験区分 午後 問11 設問1
問題説明と解答群
平成29年度 秋期 FE試験区分 午後 問11 設問1 解説
「a」,「b」,「c」,「d」,「e」
解答:ウ,ウ,エ,ア,ウ
解説:以下のプログラムコードを確認ください。問題にある正解の解答群と誤りの例をコメントで記載しています。
eclipse等で TableSorter.java
のファイル名で作成して貼り付けて確認いただけます。
// 解答 「a」
private Map<String, Comparator<String>> orderMap = new HashMap<String, Comparator<String>>();
public void putSortOrder(String key, Comparator<String> order) {
//! ↓ここでorderMapに値を入れているので↑が型となります。
orderMap.put(key, order);
}
- 解答 「a」orderMap.put(key, order);ここでorderMapに値を入れているので[String key, Comparator order)]が型となります。
// 解答 「b」
for (OrderBy orderBy : orderBys) {
// 解答 「b」の誤り例 //後述する orderBy を利用するためには上記記述が必要。
//for (int i = 0; i< orderBys.length; i++) {
// 解答 「c」
int order = orderMap.get(orderBy.key).compare(s1[orderBy.col], s2[orderBy.col]);
- 解答 「b」orderBysの要素を、後述する orderBy として利用するためには上記記述が必要。
- 解答 「c」String[]の各要素へ s1[n]でアクセスが必要。
- 解答 「c」orderByクラスのメンバへアクセスするためには、上記記述が必要。
// 解答 「d」
if (order != 0) {
// 解答 「e」
return orderBy.isReversed ? -order:order;
}
- 解答 「d」「e」ここでは、orderBy.isReversed が true だった場合に降順(逆順)にしたいのでcomapreした結果を反転したい。
a compare b の演算結果は
a == b => 0
a > b => -1
a < b => 1
参考:https://www.sejuku.net/blog/19369
プログラム1
eclipse等で TableSorter.java
のファイル名で作成して貼り付けて確認いただけます。
package H29aki;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
/**
* H29秋基本情報処理試験午後Java プログラム1
* @author hsaito
*
*/
public class TableSorter {
// 解答 「a」
private Map<String, Comparator<String>> orderMap = new HashMap<String, Comparator<String>>();
public void putSortOrder(String key, Comparator<String> order) {
orderMap.put(key, order);
}
public void sort(String[][] table, final OrderBy... orderbys) {
Arrays.sort(table, new Comparator<String[]>() {
@Override
public int compare(String[] s1, String[] s2) {
// 解答 「b」
for (OrderBy orderBy : orderBys) {
// 解答 「b」の誤り例 //後述する orderBy を利用するためには上記記述が必要。
//for (int i = 0; i< orderBys.length; i++) {
// 解答 「c」
int order = orderMap.get(orderBy.key).compare(s1[orderBy.col], s2[orderBy.col]);
// 解答 「c」の誤り例 //colには直接アクセスできない
//order = orderMap.get(orderBy.key).compare(s1[col], s2[col]);
// 解答 「c」の誤り例 //Stringクラスにgetメソッドはない
//order = orderMap.get(orderBy.key).compare(s1.get(orderBy.col), s2.get(orderBy.col));
// 解答 「d」
if (order != 0) {
// 解答 「e」
return orderBy.isReversed ? -order:order;
}
}
return 0;
}
});
}
//並び順クラス
public static class OrderBy {
final String key;
final int col;
final boolean isReversed;
public OrderBy(String key, int col) {
this(key, col, false);
}
public OrderBy(String key, int col, boolean isReversed) {
this.key = key;
this.col = col;
this.isReversed = isReversed;
}
}
}
平成29年度 秋期 FE試験区分 午後 問11 設問2,3
問題説明と解答群
平成29年度 秋期 FE試験区分 午後 問11 設問2 解説
解答:イ
解説:以下のプログラムコードと実行結果を確認ください。
eclipse等で TableSorterTester.java
のファイル名で作成して貼り付けて確認いただけます。
//設問2 α部分 並び替え処理の実行
sorter.sort(data, new TableSorter.OrderBy("lex", 2),
new TableSorter.OrderBy("lex", 0));
- 並び順の1番目が2列目「"1,000"、"300"」などを文字列(辞書順)で並び替え
- 並び順の2番目が0列目「"apple"、"cherry"」などを文字列(辞書順)で並び替え
実行結果 設問2・・・1行目に注目>>
apple 3 1,000
cherry 1 1,000
banana 2 2,000
apple 2 300
banana 1 300
平成29年度 秋期 FE試験区分 午後 問11 設問3 解説
解答:イ
解説:以下のプログラムコードと実行結果を確認ください。
eclipse等で TableSorterTester.java
のファイル名で作成して貼り付けて確認いただけます。
//設問3 α部分 並び替え処理の実行
sorter.sort(data, new TableSorter.OrderBy("numC", 2),
new TableSorter.OrderBy("lex", 0));
- 並び順の1番目が2列目「"1,000"、"300"」などをカンマを考慮した数値順で並び替え
- 並び順の2番目が0列目「"apple"、"cherry"」などを文字列(辞書順)で並び替え
実行結果 設問3・・・3行目!に注目>>
apple 2 300
banana 1 300
apple 3 1,000
cherry 1 1,000
banana 2 2,000
プログラム2
eclipse等で TableSorterTester.java
のファイル名で作成して貼り付けて確認いただけます。
package H29aki;
import java.util.Comparator;
/**
* H29秋基本情報処理試験午後Java プログラム2
* @author hsaito
*
* 設問2, 設問3 の解説
*/
public class TableSorterTester {
public static void main(String... args) {
//並び替えの対象データ
String[][] data = new String[][] {
{ "apple", "3", "1,000" },
{ "cherry", "1", "1,000" },
{ "banana", "1", "300" },
{ "banana", "2", "2,000" },
{ "apple", "2", "300" },
};
//プログラム1のインスタンス
TableSorter sorter = new TableSorter();
//文字列として並び替える処理を追加
sorter.putSortOrder("lex", new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//並び例 "1" → "10" → "2"
return o1.compareTo(o2);
}
});
//数値変換して並び替える並び替える処理を追加
sorter.putSortOrder("num", new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//変換例 "300" → 300
//並び例 1 → 2 → 10
return new Integer(o1).compareTo(new Integer(o2));
}
});
//α部分 並び替え処理の実行
sorter.sort(data, new TableSorter.OrderBy("lex", 0),
new TableSorter.OrderBy("num", 1, true));
System.out.println("実行結果 図2>>");
//α部分 並び替え処理の実行結果を表示
for (String[] row : data) {
for (String col : row) {
//col 列の情報を出力
System.out.printf("%s ", col);
}
//row 行の末尾なので改行を出力
System.out.println();
}
/**
* 設問2
*/
System.out.println();
//設問2 α部分 並び替え処理の実行
sorter.sort(data, new TableSorter.OrderBy("lex", 2),
new TableSorter.OrderBy("lex", 0));
System.out.println("実行結果 設問2・・・1行目に注目>>");
//設問2 α部分 並び替え処理の実行結果を表示
for (String[] row : data) {
for (String col : row) {
//col 列の情報を出力
System.out.printf("%s ", col);
}
//row 行の末尾なので改行を出力
System.out.println();
}
/**
* 設問3
*/
System.out.println();
//設問3 カンマを考慮した数値変換して並び替える並び替える処理を追加
sorter.putSortOrder("numC", new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
//変換例 "1,000" → "1000" → 1000
//並び例 1 → 2 → 10
return new Integer(s1.replace(",", "")).
compareTo(new Integer(s2.replace(",", "")));
}
});
//設問3 α部分 並び替え処理の実行
sorter.sort(data, new TableSorter.OrderBy("numC", 2),
new TableSorter.OrderBy("lex", 0));
System.out.println("実行結果 設問3・・・3行目!に注目>>");
//設問3 α部分 並び替え処理の実行結果を表示
for (String[] row : data) {
for (String col : row) {
//col 列の情報を出力
System.out.printf("%s ", col);
}
//row 行の末尾なので改行を出力
System.out.println();
}
}
}
実行結果 図2>>
apple 3 1,000
apple 2 300
banana 2 2,000
banana 1 300
cherry 1 1,000
実行結果 設問2・・・1行目に注目>>
apple 3 1,000
cherry 1 1,000
banana 2 2,000
apple 2 300
banana 1 300
実行結果 設問3・・・3行目!に注目>>
apple 2 300
banana 1 300
apple 3 1,000
cherry 1 1,000
banana 2 2,000
以上です。
まとめ
-
可変長引数のパラメータを利用する際のプログラム1、args等の利用の仕方。参考:https://www.thekingsmuseum.info/entry/2016/06/12/231304
-
3項演算子
結果 = (式) ? trueの場合の値 : falseの場合の値;
-
辞書順の並び順
1,000
→2,000
→300
-
数値順(カン考慮)の並び順
300
→1,000
→2,000
-
Mapの使い方 参考:https://www.sejuku.net/blog/16067
-
コンストラクタのオーバーロード※1参照
public OrderBy(String key, int col) {
this(key, col, false);
}
public OrderBy(String key, int col, boolean isReversed) {
this.key = key;
this.col = col;
this.isReversed = isReversed;
}
関連記事
[Qiita - 🔰初めての基本情報処理試験💦 午後試験対策 Java編 平成30年度春期 解説👓]
(https://qiita.com/HideakiSaito/items/87b64077c40edcee6e86)