java - 用简单的 float[] 模拟 LinkedList

标签 java android arrays linked-list

我必须在 SurfaceView 上绘制一些物体四处移动的轨迹。对象的踪迹被实现为点的 LinkedList(点是 SurfaceView 上的一对浮点坐标)。 LinkedList 是由这样的行为激发的

    public class Trail extends LinkedList<Points> {

        private static int numbOfPoints;

        @Override
        public boolean add(Point point) {
            super.add(point);
            while( this.size() > Trail.numbOfPoints ) {
                super.remove();
            }
            return true;
        }

    }

其中 numbOfPoints 是轨迹点的最大数量。如果添加了一个新点,则将从轨迹中删除最旧的点以保持轨迹大小不变。但是当我绘制点时,为了使用 canvas.drawPoints(float[]),我会有一个 float[] 而不是一个 LinkedList of Points。所以我想出了一个从 LinkedList 到 float[] 的手动转换,它效率低下并且会导致一些麻烦......

那么,有一种方法可以避免使用 LinkedList 并直接将坐标存储到具有上述行为的 float[] 中吗?

最佳答案

我认为最好的实现方式是通过 ring buffer .我真的不明白你是如何使用 float[] 而不是 float[][] 在 Canvas 上绘制东西的,但是你应该能够让这个解决方案使用任何输入你喜欢的:

class Trail {
    private final int maxLength;

    private float[] points;
    private int start = 0;
    private int length = 0;

    private float[] buffer;

    public Trail(int maxLength) {
        this.maxLength = maxLength;
        this.points = new float[maxLength];
        this.buffer = new float[0];
    }

    public void add(float point) {
        points[(start + length) % points.length] = point;
        if (length < maxLength) {
            length++;
        } else {
            start = (start + 1) % points.length;
        }
    }

    public float[] getTail() {
        if (buffer.length != length) { // Reusing the array if possible.
            buffer = new float[length];
        }
        int itemsFromStartToArrayEnd = Math.min(length, points.length - start);
        System.arraycopy(points, start, buffer, 0, itemsFromStartToArrayEnd);
        if (start + length > maxLength) {
            System.arraycopy(points, 0, buffer, itemsFromStartToArrayEnd, length - itemsFromStartToArrayEnd);
        }
        return buffer;
    }
}

关于java - 用简单的 float[] 模拟 LinkedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879645/

相关文章:

android - 如何在服务运行时更改状态栏图标

javascript - 如何在 Vue JS 中使用 v-for 和 orderBy 过滤器反转数组的顺序?

java - 在 Vaadin 6 中检测应用程序停止

java - 从子类实例访问父类实例变量

java - 在 Java 中的 JList 中设置边框

android - 如何调试 BOOT_COMPLETED 广播接收器 "Force Close"崩溃?

java - 运行 Apache Camel 时出错

android - 首选项管理器未从用户首选项中获取值(value)

javascript - 如何使用继承代码将这个复杂的 json 对象/数组改进为映射

arrays - 如何从D中的数组中删除元素