多维ArrayList - >展平 - >激活功能 - > Deflat - >多维ArrayList?

时间:2018-05-23 13:47:23

标签: java algorithm list serialization data-structures

在java中,如何展平多维数组,将其传递给激活函数,并以最有效的方式从响应数组中检索原始层次结构?

例如,原始数据块的格式为

输入数据结构:

[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]

定义的激活函数可以一次性处理整个块,因此为了最大效率,我想以某种方式将其展平。 中间数据结构:

[.,.,.,.,.,.,. ... ]

然后,我想“解冻”响应,使其反映原始层次结构。

输出数据结构:

[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]

假设激活功能按顺序处理,因此订单不会搞砸。 在Java中我可以实现相同的最快方式是什么?如果我使用数组,我不想保持扁平化和deflattening的索引。

1 个答案:

答案 0 :(得分:0)

如果可以接受List而不是数组,则可以将数组包装在List中。

这实现了List getset,并且还实现了find,以便您可以发现特定索引处的元素应该出现在数组中的哪个位置。

static class Point {
    final int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

static class Flattened<T> extends AbstractList<T> implements List<T> {
    private final T[][] subject;
    private final int flattenedLength;

    public Flattened(T[][] subject) {
        this.subject = subject;
        int flattenedLength = 0;
        for (T[] a : subject) {
            flattenedLength += a.length;
        }
        this.flattenedLength = flattenedLength;
    }

    @Override
    public T get(int index) {
        Point p = find(index);
        return subject[p.x][p.y];
    }

    @Override
    public T set(int index, T it) {
        Point p = find(index);
        T was = subject[p.x][p.y];
        subject[p.x][p.y] = it;
        return was;
    }

    public Point find(int index) {
        int pos = 0;
        // Walk the array to get the right row.
        for(int row = 0; row < subject.length; row++) {
            if(pos + subject[row].length <= index) {
                // Skip this row.
                pos += subject[row].length;
            } else {
                // Found it!!
                return new Point(row,index-pos);
            }
        }
        throw new IndexOutOfBoundsException("No item at position "+index);
    }

    @Override
    public int size() {
        return flattenedLength;
    }
}

public void test() {
    Integer[][] a = {
            {1},
            {2, 3, 4, 5},
            {6, 7, 8, 9, 10}
    };
    List<Integer> flat = new Flattened<>(a);
    System.out.println(flat);
}