Java 中的循环缓冲区?

Circular Buffer in Java?

我需要一个类似双端队列的数据结构,我认为它被称为循环缓冲区。

这就是我所做的。

public class MyStack {


    byte[][] orders = {  {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}, {3, 0, 1, 2}  };

    byte state      = 0;

    int[] data      = {1, 2, 3, 4};


    void swap(int value){           
        data[state] = value;

        if(state == 3){
            state = 0;

        }else{
            state ++;

        }       
    }

    int[] dump(){

        int[] output = {  
                          data[  orders[state][0]  ],
                          data[  orders[state][1]  ],
                          data[  orders[state][2]  ],
                          data[  orders[state][3]  ],
                       };

        return output;
    }

}

此处的输出正是我需要的功能类型。它基本上是一个长度为 4 的 window,穿过一个无限的、离散的 space,或者沿着一条数轴。

我的问题是:这个解决方案是否有效?是否有为此功能设计的内置库?如果是这样,是否值得改用?

一个circular buffer的典型实现使用两个索引来标记队列的第一个和最后一个元素。不需要显式存储状态,因为 enqueuedequeue 可以通过索引计算来完成。 swap 方法更好的名称是 rotate.

您可以删除 orders 数组并将 dump 实现更改为:

    int[] output = {  
                      data[  (state+0)%4  ],
                      data[  (state+1)%4  ],
                      data[  (state+2)%4  ],
                      data[  (state+3)%4  ],
                   };

对此的一个改进是,删除大小为 n 的二维数组订单。

byte[][] orders = {  {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}, {3, 0, 1, 2}  };

因为如果你知道状态,那么订单数组也可以通过公式动态确定

for(int i =0; i<data.length; i++){
  output[i] = data[(state+i)%data.length];
}

这可以用于return输出。