我输入了数字流
1 3 5 6 5 6 7 43 54 3 2 ....
在给定时间的任何时候如何找到最后五个数字?
答案 0 :(得分:2)
或者您可以使用循环缓冲区:
private class CircularBuffer {
private int[] items;
private int index = 0;
private int size = 0;
public CircularBuffer(int size) {
items = new int[size];
}
public void add(int item) {
items[index] = item;
index = (index + 1) % items.length;
size = Math.min(size + 1, items.length);
}
public int get(int i) {
if (i < 0 || i >= size)
throw new IndexOutOfBoundsException();
return items[(index - size + i + items.length) % items.length];
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("[");
for (int i = 0; i < size; ++i) {
builder.append(get(i));
builder.append(i < size - 1 ? ", " : "]");
}
return builder.toString();
}
}
测试代码:
CircularBuffer b = new CircularBuffer(5);
for (int i = 1; i < 10; ++i) {
b.add(i);
System.out.println(b);
}
输出:
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
[3, 4, 5, 6, 7]
[4, 5, 6, 7, 8]
[5, 6, 7, 8, 9]
答案 1 :(得分:0)
你可以将它们保存在一个堆栈中,这将是最简单,最好的方式。 如果你(无论出于何种原因)不能或不想使用Stack我会建议你为Arrays实现“push”方法:
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int[] numbers = new int[5];
while(true){ // as long as you expect numbers from your stream
push(numbers, sc.nextInt());
}
}
public static void push(int[] arr, int value){
for(int i = 1; i < arr.length; i++){
arr[i - 1] = arr[i];
}
arr[arr.length - 1] = value;
}
假设您的Stream仅向您提供整数,通过STDIN,每行一个 - 数字数组现在为您保留最后5个输入(或者如果到目前为止少于5个值,则为0作为默认值)。 / p>
问候蒂姆