明解 Javaによるアルゴリズムとデータ構造 7-1_集合とは

7-1_集合とは

部分集合と真部分集合

真部分集合 proper subset

  • 集合 A のすべての要素が集合Bの要素であって、集合AとBが等しくない

その他気付き

  • ユニットテストメソッドがグリーンにならなかったため調べると、||演算子の挙動を正しく理解していなかった。

条件OR演算子||の評価について

実行時には,左辺オペランド式を最初に評価する。その値がtrueならば,条件ORの値をtrueとし,右辺オペランド式は評価しない。左辺オペランドの値がfalseならば,右辺オペランド式を評価し,その値を条件OR式の値とする。この方法で,||はbooleanオペランド上で|と同じ結果を計算する。右辺オペランド式を常にではなくむしろ条件的に評価するという点だけが異なるものとする。

  • 作ったメソッドがまさにこれに該当し、|| 演算子以降のaddメソッドが実行されていなかった

テスト対象メソッド

package algorithm.ch07;

public class IntSet {
    private int max;
    private int num;
    private int[] set;

    public IntSet(int capacity) {
        num = 0;
        max = capacity;
        try {
            set = new int[max];

        } catch (OutOfMemoryError e) {
            max = 0;
        }
    }

    public boolean add(int n) {
        if (num >= max || contains(n) == true) {
            return false;
        } else {
            set[num++] = n;
            return true;
        }
    }

    public boolean add(IntSet s) {
        boolean changeFlg = false;
        for (int e: s.set) {
            changeFlg = changeFlg || add(e);
        }
        return changeFlg;
    }
}

テストクラス

package algorithm.ch07;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;

@RunWith(Enclosed.class)
public class IntSetTest {

    public static class 操作対象の集合が空の場合 {
        IntSet sut;
        IntSet s;
        
        @Before
        public void setUp(){
            sut = new IntSet(10);
            s = new IntSet(10);
            s.add(10);
            s.add(15);
            s.add(20);
        }
        
        @Test
        public void 別の集合をaddすると和集合が得られること() {
            sut.add(s);
            String actual = sut.toString();
            String expected = s.toString();
            assertThat(actual, is(expected));
        }
        
        @Test
        public void addした際に元の集合から変化があるとtrueを返すこと() {
            boolean actual = sut.add(s);
            boolean expected = true;
            assertThat(actual, is(expected));
        }
    }
}

修正メソッド

   public boolean add(IntSet s) {
        boolean changeFlg = false;
        for (int i = 0; i < s.num; i++) {
            changeFlg = add(s.set[i]) || changeFlg;
        }
        return changeFlg;
    }
  • 2点修正。
    1. addメソッドを||演算子の前に配置。
      • そもそもオペランドの右だろうが左だろうが、問題のない記述にしたいな…どうすればええんやろ。
    2. 拡張for文ではおもらしするので、マーカー仕様のfor文にした。
      • 初期化後の配列10個に対してループしてたのがダメだった。

 

明解 Javaによるアルゴリズムとデータ構造

明解 Javaによるアルゴリズムとデータ構造

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)