【问题标题】:Mimic a LinkedList with a simple float[]用简单的 float[] 模拟 LinkedList
【发布时间】:2015-06-16 22:56:51
【问题描述】:

我必须在 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。所以我想出了一个从 LinkedList 到 float[] 的手动转换,它效率低下并且会引起一些麻烦......

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

【问题讨论】:

  • 你知道这个数据结构吗:en.wikipedia.org/wiki/Circular_buffer?
  • @user3707125 谢谢,非常有趣,但问题再次是转换为一个普通的浮点数组......我的问题是:有没有一种方法可以只使用浮点数组来获得所需的行为?

标签: java android arrays linked-list


【解决方案1】:

我认为实现这一点的最佳方式是通过ring buffer。我真的不明白你是如何使用float[] 而不是float[][] 在画布上绘制东西的,但你应该能够使这个解决方案使用你喜欢的任何类型:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-18
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多