TDDBC仙台03/課題

TDDBC仙台03課題:整数の区間

課題1 整数の閉区間 (closed range)

【例】
[3,8]
-> 下端点 (lower endpoint) が3, 上端点 (upper endpoint) が8 である整数閉区間
-> 3 と 8 は区間に含まれます

課題1−1

  • 下端点と上端点を与えて閉区間を生成しよう
  • 閉区間から下端点と上端点を取得しよう
  • 閉区間から文字列表記を取得しよう
【例】
// [3,8] を生成
ClosedRange c3to8 = new ClosedRange(3,8);
// [3,8] の下端点は 3
int lowerEndpoint = c3to8.getLowerEndpoint(); // => 3
// [3,8] の上端点は 8
int upperEndpoint = c3to8.getUpperEndpoint(); // => 8
// [3,8] の文字列表記は "[3,8]"
String notation = c3to8.toString(); // => "[3,8]"
// [8,3] は生成出来ない
ClosedRange c8to3 = new ClosedRange(8,3); // => エラー

課題1−2

  • 閉区間が指定した整数を含むか (contains) 判定しよう
【例】
// [3,8] は 5 を含む
c3to8.contains(5); // => true
// [3,8] は -1 を含まない
c3to8.contains(-1); // => false

課題1−3

  • 閉区間が別の閉区間と等しいか (equals) 判定しよう
  • 閉区間が別の閉区間と接続しているか (isConnectedTo) 判定しよう
【例】
// [3,8] は [3,8] と等しい
c3to8.equals(new ClosedRange(3, 8)); // => true
// [3,8] は [1,6] と等しくない
c3to8.equals(c1to6); // => false
// [3,8] は [1,6] と接続している
c3to8.isConnectedTo(c1to6); // => true
// [3,8] は [8,15] と接続している
c3to8.isConnectedTo(c8to15); // => true
// [3,8] と [9,12] は接続していない
c3to8.isConnectedTo(c9to12); // => false

課題2 整数の開区間 (open range)

 【例】
 (3,8)
-> 下端点 (lower endpoint) が3, 上端点 (upper endpoint) が8 である開区間
-> 3 と 8 は区間に含まれない

課題2−1

  • 下端点と上端点を与えて開区間を生成しよう
  • 開区間の下端点と上端点を取得しよう
  • 開区間の文字列表記を取得しよう

課題2−2

  • 開区間が指定した整数を含むか (contains) 判定しよう

課題2−3

  • 開区間が別の開区間と等しいか (equals) 判定しよう
  • 開区間が別の開区間と接続しているか (isConnectedTo) 判定しよう

課題3 閉区間と開区間

課題3−1

  • 閉区間と開区間と等しいか (equals) 判定しよう

課題3−2

  • 閉区間と開区間と接続しているか (isConnectedTo) 判定しよう

課題4 閉区間/開区間への機能追加

課題4−1

  • 指定した全ての整数を含むか (containsAll) 判定しよう
  • 閉区間と別の閉区間との共通集合 (intersection) を取得しよう
【例】
// [3,8] は 4, 7, 3 を全て含む
c3to8.containsAll(Arrays.asList(4,7,3)); // => true
// [3,8] は 6, -1 のいずれかを含まない
c3to8.containsAll(Arrays.asList(6,-1)); // => false
 // [3,8] と [4, 10] の共通集合は [4,8]
c3to8.getIntersection(c4to10); // => [4,8]
// [3,8] と [9,12] は共通集合を持たない
c3to8.getIntersection(c9to12); // => エラー

課題4−2

  • 文字列表記を解析して (parse) 区間を生成しよう
【例】
// 文字列 "[3,8]" をパースすると閉区間 [3,8] を生成する
ClosedRange c3to8 = ClosedRange.parse("[3,8]") // => [3,8] を表すオブジェクト

課題5 半開区間 (open closed range)

左閉右開区間 (left-closed right-open range)
-> [a,b) = {x | a<=x<b}
左開右閉区間 (left-open right-closed range)
-> (a,b] = {x | a<x<=b}

(補足) [a,a) , (a,a] = Φ (空区間)

課題5−1

  • 閉区間/開区間と同等の機能を実装しよう

課題6 無限区間 (infinite range)

以上 (at least)
-> [a,+∞) = {x | a<=x}
より大きい (greater than)
-> (a,+∞) = {x | a<x}
以下 (at most)
-> (-∞,b] = {x | x<=b}
未満 (less than)
-> (-∞,b) = {x | x<b}
整数全体 (all)
-> (-∞,+∞) = {x}

課題6−1

  • 閉区間/開区間/半開区間と同等の機能を実装しよう

課題7 区間を使ったコレクション操作

課題7−1

  • 整数コレクションの各要素を区間でフィルタリング (filter) しよう
【例】
// 9,4,0,7,5,-8 の内、[3,8] に含まれる要素は 4,7.5
Collection<Integer> integers = Arrays.asList(9,4,0,5,7,-8);
Collection<Integer> filtered = Ranges.filter(integers, c3to8); // => 4,7,5

課題8 整数以外の比較可能なオブジェクトを扱う区間(例:日付、文字列 等)

課題8−1

  • 整数の区間と同等の機能を実装しよう
Last modified:2016/12/06 14:41:09
Keyword(s):
References:[TDDBC]