【问题标题】:Circular buffer implementation in AndroidAndroid中的循环缓冲区实现
【发布时间】:2015-06-03 06:04:54
【问题描述】:

我们如何在Android中实现循环缓冲区的实现?

如果存在预定义的方法,我们是否可以重用?或者我们是否支持 Android 中的 C 标准库?

【问题讨论】:

标签: java android c


【解决方案1】:

在 Android 开发中,首选是使用 Java 而不是 C 来实现这些东西。当然,您可以在 C 中(使用 JNI)执行此操作,但这需要一定的开销,即您需要实现自己的垃圾收集逻辑以及循环缓冲区的代码,而在 Java 中,这可以自动实现。 .如果它适用于您的情况,请参阅下面的课程..

import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;

public class CustomCircularBuffer<T> {

  private T[] buffer;

  private int tail;

  private int head;


  public CustomCircularBuffer(int n) {
    buffer = (T[]) new Object[n];
    tail = 0;
    head = 0;
  }

  public void add(T toAdd) {
    if (head != (tail - 1)) {
        buffer[head++] = toAdd;
    } else {
        throw new BufferOverflowException();
    }
    head = head % buffer.length;
  }

  public T get() {
    T t = null;
    int adjTail = tail > head ? tail - buffer.length : tail;
    if (adjTail < head) {
        t = (T) buffer[tail++];
        tail = tail % buffer.length;
    } else {
        throw new BufferUnderflowException();
    }
    return t;
  }

  public String toString() {
    return "CustomCircularBuffer(size=" + buffer.length + ", head=" + head + ", tail=" + tail + ")";
  }
}

这里有一些其他有用的链接可以提供必要的解释..

Example

Another Example

In Depth Article

【讨论】:

    【解决方案2】:

    我刚刚意识到ArrayDeque 将是一个很好的实现。

    还有来自 Android 支持的 CircularArray

    CircularArray 是一个通用的循环数组数据结构,它提供 O(1) 随机读取,O(1) 前置和 O(1) 附加。圆形阵列 当添加的项目数量结束时自动增加容量 它的容量。

    我无法判断它的性能,但快速浏览一下 Javadocs,它似乎在设计时就考虑到了效率。现在不太确定了。

    【讨论】:

    • 感谢您的信息。另一方面,你们应该知道,某些 CircularBuffer 实现将数组的容量设置为静态,而其他实现则设置为动态。 Android 的 CircularArray 和 Java 的 ArrayDeque 是动态实现的,对于我们中的一些人来说,这需要自定义实现静态容量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2010-10-24
    • 2012-04-02
    相关资源
    最近更新 更多