最頻値を求めるコード

勉強しなくてはいけないことはわかっているのに、何をすべきかはっきりしない。そんな気分でしたので、最頻値を求めるコードを書いてみました。

Mode.java

public class Mode {
	public static Integer mode(List<Integer> list) {
		if (list.size() <= 0) {
			throw new IllegalArgumentException();
		}

		Map<Integer,Integer> modeMap = new HashMap<Integer, Integer>();

		list.stream()
		.forEach(x -> {
			if( modeMap.containsKey(x) ){
				modeMap.put(x, modeMap.get(x)+1);
			} else {
				modeMap.put(x, 1);
			}
		});

		int maxValue = 0;
		int maxKey = 0;

		for (Entry<Integer, Integer> entry : modeMap.entrySet()) {
			if (maxValue < entry.getValue()) {
				maxValue = entry.getValue();
				maxKey = entry.getKey();
			}
		}

		return maxKey;
	}
}

そしてテストクラス

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.TestCase;

public class ModeTest extends TestCase {

	public void testMode() {
		List<Integer> list = Arrays.asList(1,2,3,4,5,6,6,7,8,9);

		assertEquals(new Integer(6), Mode.mode(list));
	}

	public void testException() {
		List<Integer> list = new ArrayList<Integer>();

		try {
			Mode.mode(list);
			fail("exception is not thrown");
		} catch (IllegalArgumentException e){
			assertTrue(true);
		}
	}
}

別になんてこともないコードではありますが、以前から思っていた「趣味で各コードでもテストクラスを書いたほうがいいよね……」を初めて実行に移せたことが自分の中ではよかったのかなあ、と、いう風に思います。