総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成28年度春 基本情報技術者試験午後 過去問11 ソフトウェア開発(Java) 設問1 合格率アップ!動画付き解説

TOP :

問11 ソフトウェア開発(Java)

次のJavaプログラムの説明及びプログラムを読んで、設問1、2に答えよ。

〔プログラムの説明〕

 "すべきこと"(以下、ToDo という)を管理するプログラムである。

(1) クラス ToDo は ToDo を表すクラスであり、コンストラクタで主題、期限、重要度を指定する。期限は、年月日を表す8桁又は年月日時分を表す12桁の数字から成る文字列(以下、日時という)であり、例えば、2016年4月16日を表す文字列は"2O16O416"、2016年4月16日午後1時0分を表す文字列は"2O16O41613OO"である。ここで、日時に誤りはないものとする。

 主題、期限、重要度を取得する各メソッドと、状態を設定及び取得するメソッド、ToDo を識別するフィールド id をもつ。

 列挙 Priority は ToDo の重要度を表す列挙であり、重要度が低い順に LOW、MIDDLE、HIGH である。

 列挙 State は ToDo の状態を表す列挙であり、NOT_YET_STARTED は未着手、STARTED は着手済み、DONE は完了を表す。

(2) クラス ToDoList は ToDo のリストを保持するクラスである。

 リスト中に、フィールド id の値が同じ ToDo を複数個含まないことを保証する。

 ToDo を追加するメソッド add と、ToDo の更新を行うメソッド update、条件に合う ToDo のリストを返すメソッド select をもつ。

 メソッド add の引数に、既にリストに保持されている ToDo を指定したとき、及びメソッド update の引数に、リストにない ToDo を指定したときは何もしない。

 メソッド setect の引数には、条件を0個以上指定できる。条件を指定したときは、全ての条件に合致する ToDo から成るリストを返す。条件を指定しないときは、保持する全ての ToDo から成るリストを返す。

(3) インタフェース Condition は、ToDo を選択する際の条件を表すクラスが実装するインタフェースである。メソッド test は条件に合致するときに true を返す。

(4) クラス ToDoListTester は、テスト用のクラスである。

[プログラム1]

import fava.util.UUID;

public class ToDo {
   public enum Priority { LOW, MIDDLE, HIGH }
   public enum State { NOT_YET_STARTED, STARTED, DONE }
   
   // 8桁又は12桁の数字から成る文字列と一致する正規表現
   private staric final String DEADLINE_PATTERN = "\\d{8}|\\d{12}";
   private final String id;
   private String subject;
   private String deadline;
   private Priority priority;
   private State state;
   
   private ToDo(String subject, String deadline, Priority priority, String id, State state) {
      if(!deadLine.matches(DEADLINE_PATTERN)) {
         throw new IllegalArgumentException();
      }
      this.subject = subject;
      this.deadline = deadline;
      this.priority = priority;
      this.id = id;
      this.state = state;
   }
   
   public ToDo(String subject, String deadline, Priority priority) {
      this(subject, deadline, priority,
         UUID.randomUUID().toString(), State.NOT_YET_STARTED);
   }
   
   public ToDo(ToDo todo) {
      this(todo.subject, todo.deadline, todo.priority, todo.id, todo.state);
   }
   
   public String getSubject() { return subject; }
   public String getDeadLine() { return deadline; }
   public Priority getPriority() { return priority; }
   public State getState() { return state; }
   public void setState(State state) { this.state = state; }
   public int hashCode() { return id.hashCode(); }
   
   public boolean equals(Object o) {
      return o instanceof ToDo && a;
   }
   
   public String toString() {
      return String.format("主題: %s, 期限: %s, 優先度: %s, 状態: %s",
                           subject, deadline, priority, state);
   }
}

[プログラム2]

import java.util.ArrayList;
import java.util.List;

public class ToDoList {
   private List<todo> todoList = new ArrayList<todo>();
   
   public void add(ToDo todo) {
      if(b) {
         todoList.add(new ToDo(todo));
      }
   }
   
   public void update(ToDo todo) {
      int index = todoList.indexOf(todo);
      if (index c) {
         todoList.set(index, todo);
      }
   }
   
   public List<todo> select(Condition... conditions) {
      List result = new ArrayList<todo>();
      for (ToDo todo : todoList) {
         d;
         for (Conditon condition : conditions) {
            selected e condition.test(todo);
            if (!selected) break;
         }
         if (selected) {
            result.add(new ToDo(todo));
         }
      }
      return result;
   }
}

[プログラム3]

public interface Condition {
    boolean test(ToDo todo);
}

[プログラム4]

public class ToDoListTester {
    public static void main(String[] args) {
       ToDoList list = new ToDoList();
       list.add(new ToDo("メール送信","201604181500", ToDo.Priority.HIGH));
       list.add(new ToDo("ホテル予約","20160420", ToDo.Priority.LOW));
       list.add(new ToDo("チケット購入","20160430", ToDo.Priority.MIDDLE));
       list.add(new ToDo("報告書作成","20160428", ToDo.Priority.HIGH));
       list.add(new ToDo("会議室予約","201605301200", ToDo.Priority.HIGH));
       list.update(new ToDo("PC購入","20160531", ToDo.Priority.HIGH));
       
       for (ToDo todo : list.select()) {
          todo.setState(ToDo.State.STARTED);
          list.update(todo);
       }
       
       Condition condition1 = new Condition() {
          public boolean test(ToDo todo) {
             return todo.getDeadline().compareTo("20160501") < 0;
          }
       };
       
       Condition condition2 = new Condition() {
          public boolean test(ToDo todo) {
             return todo.getPriority().equals(ToDo.Priority.HIGH);
          }
       };
       
       for (ToDo todo : list.select(condition1, condition2)) {
          System.out.println(todo)
       }
    }
}

設問1

プログラム中の に入れる正しい答えを、解答群の中から選べ。

a に関する解答群

  1. ((ToDo) o).id.equals(id)
  2. (ToDo) o.id.equals(id)
  3. id.equals(id)
  4. o.id.equals(id)

b に関する解答群

  1. !todoList.contains(todo)
  2. !todoList.isEmpty()
  3. todoList.contains(todo)
  4. todoList.isEmpty()

c に関する解答群

  1. != -1
  2. < todoList.size()
  3. == -1
  4. >= todoList.size()

d に関する解答群

  1. boolean selected = false
  2. boolean selected = true
  3. int selecte = 0
  4. int selected = todoList.size()

e に関する解答群

  1. +=
  2. =
  3. ==
  4. |=

解説

aの解説

[プログラム1]

aには「ア ((ToDo) o).id.equals(id)」が入ります!

   public boolean equals(Object o) {
      return o instanceof ToDo && ((ToDo) o).id.equals(id);
   }

equalsメソッドは引数のオブジェクトが"ToDo"であることと、idを検査しています。

"id"は"ToDo"のフィールドです。型を指定する際に「((ToDo) o).id.equals(id)」と書きます。

これは、"o"の型が"ToDo"であることを明示的にしています。

bの解説

問題文に「メソッド add の引数に、既にリストに保持されている ToDo を指定したとき、は何もしない。」とあります。

プログラム2をみると、todoListは配列です。上記は「配列に同じToDoがなければリストに追加する」とも言い換えることが可能です。

選択肢には「ア !todoList.contains(todo)」があります。containsメソッドは配列に同じ型のオブジェクトがあるかどうかを検査するメソッドで、「配列に同じToDoがなければ」なので否定の"!"をつけます。

cの解説

問題文に、「メソッド update の引数に、リストにない ToDo を指定したときは何もしない。」とあります。

プログラムをみると、cの前に「int index = todoList.indexOf(todo)」という記述があり、todoListに変数"todo"があるかどうかを探します。もしなければ"-1"を返します。

"index = -1"の場合は、ToDoはリストにないことになるのでcには「ア != -1」が入ります。

deの解説

問題文より「メソッド setect の引数には、条件を0個以上指定できる。条件を指定したときは、全ての条件に合致する ToDo から成るリストを返す。条件を指定しないときは、保持する全ての ToDo から成るリストを返す。」

プログラムのselectメソッドのconditionに注目します。

ToDoリストをループで回し引数で入力されたcondition(条件)に一致するものを探します。「もし、見つかったら」配列に登録しています。

「もし、みつかったら」は、condtion.test(ToDo todo)の結果がtrueのときです。

従って、dには「イ boolean selected = true」がeには「イ =」が入ります。

事前にboolean型の変数を用意して"true"とし、testの結果が"true"となれば、条件に一致しているので配列にToDoを追加します。

[プログラム2]

import java.util.ArrayList;
import java.util.List;

public class ToDoList {
   private List<todo> todoList = new ArrayList<todo>();
   
   // 問題文よりメソッド add の引数に、既にリストに保持されている ToDo を指定したとき、は何もしない。
   public void add(ToDo todo) {
      if(!todoList.contains(todo)) {
         todoList.add(new ToDo(todo));
      }
   }

   // メソッド update の引数に、リストにない ToDo を指定したときは何もしない。
   public void update(ToDo todo) {
      int index = todoList.indexOf(todo);
      if (index != -1) {
         todoList.set(index, todo);
      }
   }

   // メソッド setect の引数には、条件を0個以上指定できる。
   // 条件を指定したときは、全ての条件に合致する ToDo から成るリストを返す。
   // 条件を指定しないときは、保持する全ての ToDo から成るリストを返す。
   public List<todo> select(Condition... conditions) {
      List result = new ArrayList<todo>();
      for (ToDo todo : todoList) {
         boolean selected = true;
         for (Conditon condition : conditions) {
            selected = condition.test(todo);
            if (!selected) break;
         }
         if (selected) {
            result.add(new ToDo(todo));
         }
      }
      return result;
   }

}

平成28年度春 基本情報技術者試験午後 目次

TOP :

タグ: ,

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説