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

平成19年 秋期 基本情報技術者 午後 問12
問12   Java

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

( Java プログラムで使用するAPIの説明は,この冊子の末尾を参照してください。)

〔プログラムの説明〕

 複数の文字列の並びから条件に合う文字列を抽出するプログラムである。

 例えば,文字列の並びから特定の文字列で始まるものを抽出することができる。 表に文字列の並びから条件に合う文字列を抽出する例を示す。

    表 文字列の並びから条件に合う文字列を抽出する例
   文字列の並び      条件     抽出結果  
"one", "two", "three",
"four", "five", "six",
"seven", "eight", "nine",
"ten"
 "t"で始まる文字列    "two", "three","ten"  

(1) プログラムは次のクラス及びインタフェースから構成される。

 @ クラス Extraction<E>
  条件に当てはまる型 E の要素を抽出する。

  コンストラクタの引数には,抽出元の要素の並びと抽出する条件を指定する。 要素の並びは,java.util.LinkedList などの java.lang.Iterableを 実装したクラスのインスタンスとして与える。

 メソッド iterator は,抽出結果を取得するための反復子を返す。

 A インタフェース Evaluator<E>
  型 E の要素の抽出条件を定義するインタフエースである。

 メソッド evaluate は,引数で指定された要素が抽出条件を満たしていれば true を, 満たしていなければ false を返す。

(2) (1) のクラス及びインタフェースをテストするために次のクラスを用意した。

 @ クラス StringStartsEvaluator
  指定された文字列で始まる文字列を抽出する条件を実装する。

 コンストラクタの引数には,抽出される文字列の先頭文字列を指定する。

 メソッド evaluate は,引数で指定された文字列が,コンストラクタで 指定された文字列で始まるならば true を,それ以外は false を返す。

 A クラス ExtractionTester
クラス StringStartsEvaluator を利用して,文字列の並びから"t" で始まる文字列を抽出し,表示する。

 ExtractionTester の実行結果を図に示す。

two      
three
ten

図 実行結果

〔プログラム1〕

import java.util.Iterator;
import java.util.NoSuchElementException;

public class Extraction<E> implements Iterable<E> {
   private final Iterable<E> target;
   private final Evaluator<E> evaluator;

   public Extraction(Iterable<E> target, Evaluator<E> evaluator) {
      this.target = target;
      this.evaluator = evaluator;
   }

   public Iterator<E> iterator() {
      return new ExtractionIterator();
   }

   // 抽出結果を取得するための反復子
   private class ExtractionIterator implements Iterator<E> {
      private final Iterator<E> iterator;
      private boolean found = false;
      private E element;

      private Extractionlterator() {
         iterator = target.iterator();
      }

      // メソッド next でまだ取得されていない,抽出すべき要素があれば,
      // true を返す。 
      public boolean hasNext() {
         // iterator.hasNext() が true ならば,抽出すべき要素が
         // まだあるかもしれない。
         while (!found  iterator.hasNext()) {
            // 抽出元の要素の並びから要素を一つ得る。
            element = iterator.next(); 
            // 要素が抽出条件に合うか否かを検査する。
            // 条件に合えば found は true になる。
            found = evaluator.evaluate(element); 
         }
         return ;
      }

      // 抽出された要素を一つずつ返す。
      // 返すべき要素がないときは,例外を投げる。
      public E next() {
         if (!hasNext()) {
            throw new NoSuchElementException();
         }
         // メソッド hasNext の次回の呼出しに備える。
         found = ; 
         return ;
      }

      // この操作は提供しない。
      public void remove() {
         throw new UnsupportedOperationException();
      }
   }
}

〔プログラム2〕 

public interface Evaluator<E> {
   public boolean evaluate(E e);
}


〔プログラム3〕

public class StringStartsEvaluator
                implements Evaluator<String> {
   private final String prefix;

   public StringStartsEvaluator(String prefix) {
      if (prefix == null) {
         throw new NullPointerException();
       }
       this.prefix = prefix;
   }

   public boolean evaluate(String s) {
      return s != null && s.startsWith(prefix);
   }
}

〔プログラム4〕
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class ExtractionTester {
   public static void main(String[] args) {
      List<String> target =
         Arrays.asList("One", "two", "three", "four", "five",
                       "six", "seven", "eight", "nine", "ten");
      Extraction<String> e = new Extraction<String>
                      (target, new StringStartsEvaluator("t"));
      for (String s : e) {
         System.out.println(s);
      }
   }
}
設問1 プログラム1中の に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア !=        イ &&        ウ ==        エ ||

b に関する解答群

ア !found            イ found
ウ element != null        エ element == null

c に関する解答群

ア false             イ hasNext()
ウ iterator.hasNext()       エ true

d に関する解答群

ア E              イ element
ウ iterator.next()       エ next()
解答 a ←クリックすると正解が表示されます

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

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

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

基本情報技術者試験


設問2 次のプログラム5に示す条件クラスを新たに作成した。この条件クラスで 抽出される文字列として正しい答えを,解答群の中から二つ選べ。

〔プログラム5〕

public class AnEvaluator implements Evaluator<String> {
   public boolean evaluate(String s) {
      if (s != null) {
         final int len = s.length();
         for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) {
               if (s.charAt(i) == s.charAt(j)) {
                  return true;
               }
            }
         }
      }
      return false;
   }
}
解答群 ア "one"       イ "two"       ウ "three"       エ "four"
オ "five"       カ "six"       キ "seven"       ク "eight"
解答 ←クリックすると正解が表示されます

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