最頻値を求めるコード
勉強しなくてはいけないことはわかっているのに、何をすべきかはっきりしない。そんな気分でしたので、最頻値を求めるコードを書いてみました。
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); } } }
別になんてこともないコードではありますが、以前から思っていた「趣味で各コードでもテストクラスを書いたほうがいいよね……」を初めて実行に移せたことが自分の中ではよかったのかなあ、と、いう風に思います。