🔰初めての基本情報処理試験💦 午後試験対策 Java編 平成２９年度秋期 解説👓

## 対象読者
- 基本情報処理試験の受験者
- プログラム初学者
- Java初学者
- 午後試験のソフトウェア開発設問でJavaを受けようと考えている

## 本記事の概要
本記事では「午後試験のソフトウェア開発設問でJavaを受けようと考えている」方を対象に基本情報処理試験での下記の実際に出題された設問の解説を行います。
**実行できるプログラムコードを記載しました。eclipse等で実際に実行して確認ください。**

> 「出典：平成29年度 秋期 FE試験区分 午後 問11 設問1~2」

[試験問題の使用に関する注意（IPAより）](https://www.jitec.ipa.go.jp/1_09faq/_index_faq.html)


<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43321845905/in/dateposted-public/" title="キャプチャ"><img src="https://farm2.staticflickr.com/1869/43321845905_41faaf6e30_z.jpg" width="601" height="397" alt="キャプチャ"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

## ご挨拶
こんにちわ :smiley: 
社内の若手育成で情報処理試験対策を行っていますが、午後試験のソフトウェア開発の問題は解答を見るだけでは理解が不十分だと感じ執筆することにしました。
業務でJavaを利用していますが、細かい言語仕様を十分に理解している自信は正直ありません:anguished: 私なりにできるだけ、わかりやすい解説を執筆したく考えています。勉強しなおす部分も多いので、ご指摘あれば書き込んでいただけると助かります。
今回は自信がなかったので、、、**実行できるプログラムコードを記載しました。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

#### 問題説明と解答群
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43596850404/in/dateposted-public/" title="1"><img src="https://farm2.staticflickr.com/1851/43596850404_1ea2b2fa9f.jpg" width="431" height="500" alt="1"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/30446640458/in/dateposted-public/" title="2"><img src="https://farm2.staticflickr.com/1867/30446640458_d56f7b3996.jpg" width="483" height="500" alt="2"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43596850324/in/dateposted-public/" title="3"><img src="https://farm2.staticflickr.com/1848/43596850324_e95b153dcc.jpg" width="334" height="500" alt="3"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/29377912857/in/dateposted-public/" title="5"><img src="https://farm2.staticflickr.com/1848/29377912857_9aa6e8edc8.jpg" width="413" height="500" alt="5"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
### 平成29年度 秋期 FE試験区分 午後 問11 設問1 解説
#### 「a」,「b」,「c」,「d」,「e」
解答：ウ,ウ,エ,ア,ウ
解説：以下のプログラムコードを確認ください。問題にある正解の解答群と誤りの例をコメントで記載しています。
　　　eclipse等で `TableSorter.java ` のファイル名で作成して貼り付けて確認いただけます。

```java:「a」
	// 解答 「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<String> order)]が型となります。

```java:「b」「c」

				// 解答 「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クラスのメンバへアクセスするためには、上記記述が必要。

```java:「d」「e」

					// 解答 「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 ` のファイル名で作成して貼り付けて確認いただけます。

```java: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
#### 問題説明と解答群
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/30446640108/in/dateposted-public/" title="6"><img src="https://farm2.staticflickr.com/1879/30446640108_47299303de.jpg" width="436" height="500" alt="6"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43596850204/in/dateposted-public/" title="7"><img src="https://farm2.staticflickr.com/1888/43596850204_26ac585637.jpg" width="477" height="500" alt="7"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

### 平成29年度 秋期 FE試験区分 午後 問11 設問2 解説
解答：イ
解説：以下のプログラムコードと実行結果を確認ください。
　　　eclipse等で `TableSorterTester.java ` のファイル名で作成して貼り付けて確認いただけます。

```java:設問3　α部分　
		//設問２ α部分　並び替え処理の実行
		sorter.sort(data, new TableSorter.OrderBy("lex", 2),
				new TableSorter.OrderBy("lex", 0));
```

- 並び順の1番目が2列目「"1,000"、"300"」などを:point_up_tone3:文字列（辞書順）で並び替え
- 並び順の2番目が0列目「"apple"、"cherry"」などを:point_up_tone3:文字列（辞書順）で並び替え

```bash:実行結果

実行結果　設問２・・・１行目に注目>>
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 ` のファイル名で作成して貼り付けて確認いただけます。

```java:設問3　α部分　
		//設問3　α部分　並び替え処理の実行
		sorter.sort(data, new TableSorter.OrderBy("numC", 2),
				new TableSorter.OrderBy("lex", 0));
```

- 並び順の1番目が2列目「"1,000"、"300"」などを:point_up_tone3:カンマを考慮した数値順で並び替え
- 並び順の2番目が0列目「"apple"、"cherry"」などを:point_up_tone3:文字列（辞書順）で並び替え

```bash:実行結果

実行結果　設問3・・・３行目！に注目>>
apple 2 300 
banana 1 300 
apple 3 1,000 
cherry 1 1,000 
banana 2 2,000 

```

`プログラム2` eclipse等で `TableSorterTester.java ` のファイル名で作成して貼り付けて確認いただけます。

```java: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" },
		};
		//プログラム１のインスタンス
		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("実行結果　図２>>");

		//α部分　並び替え処理の実行結果を表示
		for (String[] row : data) {
			for (String col : row) {
				//col 列の情報を出力
				System.out.printf("%s ", col);
			}
			//row 行の末尾なので改行を出力
			System.out.println();
		}

		/**
		 * 設問２
		 */
		System.out.println();

		//設問２ α部分　並び替え処理の実行
		sorter.sort(data, new TableSorter.OrderBy("lex", 2),
				new TableSorter.OrderBy("lex", 0));

		System.out.println("実行結果　設問２・・・１行目に注目>>");

		//設問２ α部分　並び替え処理の実行結果を表示
		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　α部分　並び替え処理の実行結果を表示
		for (String[] row : data) {
			for (String col : row) {
				//col 列の情報を出力
				System.out.printf("%s ", col);
			}
			//row 行の末尾なので改行を出力
			System.out.println();
		}

	}
}

```

```bash:実行結果

実行結果　図２>>
apple 3 1,000 
apple 2 300 
banana 2 2,000 
banana 1 300 
cherry 1 1,000 

実行結果　設問２・・・１行目に注目>>
apple 3 1,000 
cherry 1 1,000 
banana 2 2,000 
apple 2 300 
banana 1 300 

実行結果　設問3・・・３行目！に注目>>
apple 2 300 
banana 1 300 
apple 3 1,000 
cherry 1 1,000 
banana 2 2,000 


```

以上です。


## まとめ

- 可変長引数のパラメータを利用する際のプログラム１、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
- コンストラクタのオーバーロード※１参照


```java:※１　プログラム１抜粋
		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編 平成３０年度春期 解説👓]
(https://qiita.com/HideakiSaito/items/87b64077c40edcee6e86)

[Qiita - 🔰初めての基本情報処理試験💦 午後試験対策 Java編 平成２９年度秋期 解説👓](https://qiita.com/HideakiSaito/items/071c21af430a6dd59ec5)