平成16年 春期 基本情報技術者 午後 問12(Java)

Print Friendly, PDF & Email

ここでは、当社の新人研修受講者に向けて、基本情報のJavaの過去問を掲載しています。

想定しているのは、NetBeansなどのIDEにコピー・ペーストしたうえで、自分の正しいと思う答えを埋めて動作を確認するという使い方です。


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

〔プログラムの説明〕

 インタフェース CharIterator は,データ構造に依存せずに そのインスタンスから文字(char)を順番に取り出すための操作を定義する。 CharIterator には,次のメソッドが定義されている。

 public char next()

次の文字があればそれを返し,なければ java.util.NoSuchElementException を投げる。例えば,この CharIterator インスタンスが文字を n 個もっているとき,最初の呼出しで 1番目の文字を返し,2 回目の呼出しで2番目の文字を返し,…というように, n 回目の呼出しまで文字を順番に返していく。 n +1回目以降の呼出しでは, NoSuchElementException を投げる。

なお,NoSuchElementException は java.lang.RuntimeException のサブクラスである。

 public boolean hasNext()

次の文字があれば true を返し,なければ false を返す。

クラス CharIteratorFactory は,引数に指定したデータ型に一致した CharIterator を返すメソッドを定義する。 CharIteratorFactory には,次のクラスメソッドが定義されている。

 public static CharIterator getCharIterator(String data)

引数に指定した String から文字を順番に取り出す CharIterator を返す。 引数に null が指定されたときは,NullPointerException を投げる。

 public static CharIterator getCharIterator(char[][] data)

引数に指定した char を要素型とする配列の配列(2次元の文字配列) から文字を順番に取り出す CharIterator を返す。引数に null が指定されたときは,NullPointerException を投げる。 文字を取り出す順序は,文字配列とその配列のそれぞれのインデックス値の小さい順とする。すなわち,char[][] 型の m に対し,その要素 m[i][j] を i の小さい順, 同じ i に対しては j の小さい順に取り出す。

クラス CharIteratorTest は,CharIteratorFactory で 定義されたメソッドをテストするためのプログラムである。 メソッド main を実行すると,図の実行結果が得られる。

図

[プログラム1]

public interface CharIterator {
   public boolean hasNext();
   public char next();
}

[プログラム2]

import java.util.NoSuchElementException;
public class CharIteratorFactory {
   public static CharIterator getCharIterator(String data) {
      if (data == null)
         throw new NullPointerException();
      // Stringデータから文字を順番に返すCharIteratorのインスタンス
      // を生成して返す。
      return /* a */;
   }
   public static CharIterator getCharIterator(char[][] data) {
      if (data == null)
         throw new NullPointerException();
      // 2次元の文字配列から文字を順番に返すCharIteratorのインスタンス
      // を生成して返す。
      return /* b */;
   }
}
class StringCharIterator implements CharIterator {
   private String data;
   private int index = 0;
   StringCharIterator(String data) {
      this.data = data;
   }
   // dataに次の文字があるかどうかをチェックする。
   public boolean hasNext() {
      return /* c */;
   }
   public char next() {
      // 次の文字がないときは,NoSuchElementExceptionを投げる。
      if (index >= data.length())
         throw new NoSuchElementException();
      // dataの次の文字を返し,インデックス値を更新する。
      return /* d */;
   }
}
class Char2DArrayCharIterator implements CharIterator {
   private char[][] data;
   private int index1 = 0, index2 = 0;
   Char2DArrayCharIterator(char[][] data) {
      this.data = data;
   }
   public boolean hasNext() {
      // data[index1][index2]の要素があればtrueを返し,なければ次
      // に定義されている要素を探す。次の要素がなければfalseを返す。
      for (; index1 < data.length; index1++) {
         if (data[index1] != null
              && index2 < data[index1].length) {
            return true;
         }
         /* e */;
      }
      return false;
   }
   public char next() {
      // メソッドhasNextを呼び出して次の要素があるかどうかを調べ,
      // あればその要素を返し,インデックス値を更新する。なければ,
      // NoSuchElementExceptionを投げる。
      if (hasNext()) {
         return data[index1][index2++];
      }
      throw new NoSuchElementException();
   }
}

[プログラム3]

public class CharIteratorTest {
   public static void main(String[] args) {
      CharIterator itr = 
            CharIteratorFactory.getCharIterator("H16");
      printIterator(itr);
      itr = CharIteratorFactory.getCharIterator(
                new char[][] {{ '2' },
                              { '0' },
                              null,
                              { '0', '4' }});
      printIterator(itr);
   }
   private static void printIterator(CharIterator itr) {
      while (itr.hasNext()) {
         System.out.print("'" + itr.next() + "' ");
      }
      System.out.println();
   }
}

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

a,b に関する解答群

ア getCharIterator((char[][]) data)

イ getCharIterator((String) data)

ウ new Char2DArrayCharIterator()

エ new Char2DArrayCharIterator(data)

オ new StringCharIterator()

カ new StringCharIterator(data)

c に関する解答群

ア index < data.length()     イ index <= data.length()

ウ index >= data.length()     エ index++ < data.length()

オ index++ <= data.length()   カ index++ >= data.length()

d に関する解答群

ア data.charAt(++index)    イ data.charAt(--index)

ウ data.charAt(index + 1)    エ data.charAt(index++)

オ data.charAt(index--)      カ data.charAt(index)

e に関する解答群

ア index1 = 0         イ index1 = data.length

ウ index1 = index2       エ index2 = 0

オ index2 = data.length    カ index2 = index1

f に関する解答群

ア data[index1++][index2++]    イ data[index1++][index2]

ウ data[index1][++index2]      エ data[index1][--index2]

オ data[index1][index2 + 1]      カ data[index1][index2++]