そんな日曜日の午後にコレクションを書くのが好きなので、
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
public class TopBottom {
public int[] top;
public int[] bottom;
public TopBottom(int size) {
top = new int[size];
Arrays.fill(top, Integer.MIN_VALUE);
bottom = new int[size];
Arrays.fill(bottom, Integer.MAX_VALUE);
}
public void add(int element) {
int n = Arrays.binarySearch(top, element);
if (n < -1) {
System.arraycopy(top, 1, top, 0, -2 - n);
top[-2 - n] = element;
}
int m = Arrays.binarySearch(bottom, element);
if (m < 0 && bottom.length >= -m) {
System.arraycopy(bottom, -1 - m, bottom, 0 - m, bottom.length + m);
bottom[-1 - m] = element;
}
}
public void add(int... elements) {
for (int each: elements) {
add(each);
}
}
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append('[');
for (int each: bottom) {
buf.append(each);
buf.append(", ");
}
for (int each: top) {
buf.append(each);
buf.append(", ");
}
buf.setLength(buf.length() - 2);
buf.append("]");
return buf.toString();
}
public static class Examples {
@Test
public void shouldHoldOnlyTopFiveAndBottomFive() {
TopBottom tp = new TopBottom(5);
tp.add(5, 15, 10, 1, 12, 8, 11, 2, 16, 14, 9, 3, 20, 7);
assertEquals("[1, 2, 3, 5, 7, 12, 14, 15, 16, 20]", tp.toString());
}
}
}
Arrays#binarySearch
要素が欠落している場合、(既存の要素を見つけることに加えて)ソートされたリストに挿入ポイントを返すメソッドを使用します。挿入ポイントは、挿入ポイントまたは前後のポイントを取得するフォームの式のそれぞれが負である(-1-index)
かどうかをチェックして返されます。n
m
-1-n