因爲我喜歡在星期天的下午這樣寫的集合,
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
以獲得插入點或前後的點。
您可能只需要一個Treeset - 子集方法可以讓您輕鬆訪問頂部/底部5以及測試包含的較低/較高方法。 + pollFirst/Last刪除正確的項目。但是你仍然需要編碼。 – assylias 2012-07-24 18:47:35
我確實經歷了TreeSet API(子集和尾部集合),但由於大多數操作都是基於元素,而不是索引,所以我無法弄清楚如何實現。 – 2012-07-24 19:06:44
TreeSet是排序的,所以如果大小爲10,您知道子集(0,4)是前5,子集(5,9)是5(或反之亦然,我不確定) – assylias 2012-07-24 19:12:28