-2

I have input stream of numbers coming like

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

At any point of given time how to find the last five number ?

user2656713
  • 31
  • 1
  • 8

2 Answers2

2

Or you could use a circular buffer:

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();
    }
}

Test code:

CircularBuffer b = new CircularBuffer(5);

for (int i = 1; i < 10; ++i) {
    b.add(i);
    System.out.println(b);
}

Output:

[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]
Niels Billen
  • 2,189
  • 11
  • 12
0

You could save them in a Stack which would be the easiest and 'best' way to do it inmho. If you (for whatever reason) can't or don't want to use an Stack I would suggest you to implement the "push" method for Arrays:

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;
}

Assuming your Stream provides with you with Integers only, via STDIN, one per line - the numbers array now holds the last 5 inputs for you (or 0 as a default value in case less than 5 values arrived so far).

Greetings Tim

Tim Hallyburton
  • 2,741
  • 1
  • 21
  • 29