Javaでの配列を用いた循環バッファーの実装方法


以下に、いくつかの異なる方法で循環バッファーを実装するコード例を示します。

方法1: 単純な循環インデックスの使用

public class CircularBuffer {
    private int[] buffer;
    private int readIndex;
    private int writeIndex;
    public CircularBuffer(int size) {
        buffer = new int[size];
        readIndex = 0;
        writeIndex = 0;
    }
    public void write(int data) {
        buffer[writeIndex] = data;
        writeIndex = (writeIndex + 1) % buffer.length;
    }
    public int read() {
        int data = buffer[readIndex];
        readIndex = (readIndex + 1) % buffer.length;
        return data;
    }
}

方法2: インデックス範囲の制御とオーバーフローの処理

public class CircularBuffer {
    private int[] buffer;
    private int readIndex;
    private int writeIndex;
    private boolean isFull;
    public CircularBuffer(int size) {
        buffer = new int[size];
        readIndex = 0;
        writeIndex = 0;
        isFull = false;
    }
    public void write(int data) {
        if (isFull) {
            readIndex = (readIndex + 1) % buffer.length;
        }
        buffer[writeIndex] = data;
        writeIndex = (writeIndex + 1) % buffer.length;
        isFull = (writeIndex == readIndex);
    }
    public int read() {
        int data = buffer[readIndex];
        isFull = false;
        readIndex = (readIndex + 1) % buffer.length;
        return data;
    }
}

方法3: バッファーがオーバーフローしたときの挙動の制御

public class CircularBuffer {
    private int[] buffer;
    private int readIndex;
    private int writeIndex;
    public CircularBuffer(int size) {
        buffer = new int[size];
        readIndex = 0;
        writeIndex = 0;
    }
    public void write(int data) {
        if ((writeIndex + 1) % buffer.length == readIndex) {
            // バッファーがオーバーフローした場合の処理
            System.out.println("Buffer overflow! Discarding oldest data.");
            readIndex = (readIndex + 1) % buffer.length;
        }
        buffer[writeIndex] = data;
        writeIndex = (writeIndex + 1) % buffer.length;
    }
    public int read() {
        int data = buffer[readIndex];
        readIndex = (readIndex + 1) % buffer.length;
        return data;
    }
}

これらのコード例は、配列を使用して循環バッファーを実装する方法を示しています。循環バッファーは、データが古い順に処理される必要がある場合や、データのオーバーフローを制御する必要がある場合に特に有用です。