変態アドベントカレンダーが止まってしまいそうなので支援します。
最近、勤務先の会社で、アルバイト希望の学生に試験を出したりしているのですが、Comparatorが書ける子いないので、(ある意味)模範例のつもりで颯爽と書いてみたいと思います。(いえーい!みんな見てるー?w)
どんなときでも"hentai"または"HENTAI"が先頭に来るコンパレーターです。
import java.util.Comparator;
public class HentaiComparator implements Comparator<String> {
public int compare(String o1, String o2) {
if ("hentai".equalsIgnoreCase(o1)) {
if ("hentai".equalsIgnoreCase(o2)) {
return o1.compareTo(o2);
}
return -1;
} else if ("hentai".equalsIgnoreCase(o2)) {
return 1;
}
if (o1 == null) {
if (o2 == null) {
return 0;
}
return 1;
}
if (o2 == null) {
return -1;
}
return o1.compareTo(o2);
};
}
ついでにユニットテストも書いてみましょう。
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.util.Iterator;
import java.util.TreeSet;
import org.junit.Test;
public class HentaiCompareTest {
@Test
public void 並び順テスト() {
TreeSet<String> hentaiSet = new TreeSet<String>(new HentaiComparator());
hentaiSet.add("susumuis");
hentaiSet.add("hoge");
hentaiSet.add("HENTAI");
hentaiSet.add("fuga");
hentaiSet.add(null);
hentaiSet.add("hentai");
Iterator<String> iter = hentaiSet.iterator();
assertThat(iter.hasNext(), is(true));
assertThat(iter.next(), is("HENTAI"));
assertThat(iter.hasNext(), is(true));
assertThat(iter.next(), is("hentai"));
assertThat(iter.hasNext(), is(true));
assertThat(iter.next(), is("fuga"));
assertThat(iter.hasNext(), is(true));
assertThat(iter.next(), is("hoge"));
assertThat(iter.hasNext(), is(true));
assertThat(iter.next(), is("susumuis"));
assertThat(iter.hasNext(), is(true));
assertThat(iter.next(), nullValue());
assertThat(iter.hasNext(), is(false));
}
}
注意:このコードを参考にして弊社の試験を落ちても何の保証もできません。