基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成28年 春期 基本情報技術者 午後 問11
問11   Java

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

 

〔プログラムの説明〕
 “すべきこと”(以下,ToDo という)を管理するプログラムである。

(1) クラス ToDo は ToDo を表すクラスであり,コンストラクタで主題,期限,重要度を指定する。 期限は,年月日を表す8桁又は年月日時分を表す 12 桁の数字から 成る文字列(以下,日時という)であり,例えば,2016 年4月 16 日を表す文字列は“2Ø16Ø416”, 2016 年4月 16 日午後1時0分を表す文字列は“2Ø16Ø41613ØØ”である。ここで, 日時に誤りはないものとする。
 主題,期限,重要度を取得する各メソッドと,状態を設定及び取得するメソッド, 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 java.util.UUID;

public class ToDo {
   public enum Priority { LOW, MIDDLE, HIGH }
   public enum State { NOT_YET_STARTED, STARTED, DONE }

   // 8桁又は12桁の数字から成る文字列と一致する正規表現
   private static 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 &&  ;
   }

   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 (  ) {
         todoList.add(new ToDo(todo));
      }
   }

   public void update(ToDo todo) {
      int index = todoList.indexOf(todo);
      if (index ) {
         todoList.set(index, todo);
      }
   }

   public List<ToDo> select(Condition... conditions) {
      List<ToDo> result = new ArrayList<ToDo>();
      for (ToDo todo : todoList) {
         
         for (Condition condition : conditions) {
            selected  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("メール送信", "2Ø16Ø41815ØØ", ToDo.Priority.HIGH));
      list.add(new ToDo("ホテル予約", "2Ø16Ø42Ø", ToDo.Priority.LOW));
      list.add(new ToDo("チケット購入", "2Ø16Ø43Ø", ToDo.Priority.MIDDLE));
      list.add(new ToDo("報告書作成", "2Ø16Ø428", ToDo.Priority.HIGH));
      list.add(new ToDo("会議室予約", "2Ø16Ø53Ø12ØØ", ToDo.Priority.HIGH));
      list.update(new ToDo("PC購入", "2Ø16Ø531", 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("2Ø16Ø5Ø1") < Ø;
         }
      };

      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 に関する解答群 ア ((ToDo) o).id.equals(id)      イ (ToDo) o.id.equals(id)

ウ id.equals(id)             エ o.id.equals(id)

 

b に関する解答群 ア !todoList.contains(todo)         イ !todoList.isEmpty()

ウ todoList.contains(todo)         エ todoList.isEmpty()

 

c に関する解答群 ア != -1       イ < todoList.size()

ウ == -1       エ >= todoList.size()

 

d に関する解答群 ア boolean selected = false       イ boolean selected = true

ウ int selected = Ø           エ int selected = todoList.size()

 

e に関する解答群 ア +=       イ =       ウ ==       エ |=

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます

基本情報技術者試験


設問2   プログラム4の実行結果を図1に示す。 に入れる正しい答えを, 解答群の中から選べ。


図1 プログラム4の実行結果

 

解答群 ア 主題:PC 購入,期限:2Ø16Ø531, 優先度:HIGH

イ 主題:会議室予約, 期限:2Ø16Ø53Ø12ØØ, 優先度:HIGH

ウ 主題:チケット購入, 期限:2Ø16Ø43Ø, 優先度:MIDDLE

エ 主題:報告書作成, 期限:2Ø16Ø428, 優先度:HIGH

オ 主題:ホテル予約, 期限:2Ø16Ø42Ø, 優先度:LOW

カ 主題:メール送信, 期限:2Ø16Ø41815ØØ, 優先度:HIGH

解答 f ←クリックすると正解が表示されます

解答 g ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]