从输入流中查找最后五个数字

时间:2015-01-08 13:29:35

标签: java

我输入了数字流

1 3 5 6 5 6 7 43 54 3 2 ....

在给定时间的任何时候如何找到最后五个数字?

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>

问候蒂姆