以下に、いくつかの異なる方法で循環バッファーを実装するコード例を示します。
方法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;
}
}
これらのコード例は、配列を使用して循環バッファーを実装する方法を示しています。循環バッファーは、データが古い順に処理される必要がある場合や、データのオーバーフローを制御する必要がある場合に特に有用です。