首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多维ArrayList ->扁平化->激活函数-> Deflat ->多维ArrayList?

多维ArrayList ->扁平化->激活函数-> Deflat ->多维ArrayList?
EN

Stack Overflow用户
提问于 2018-05-23 21:47:23
回答 1查看 76关注 0票数 0

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

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

输入数据结构:

代码语言:javascript
复制
[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]

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

代码语言:javascript
复制
[.,.,.,.,.,.,. ... ]

然后,我想“扁平化”响应,这样它就能反映原始的层次结构。

输出数据结构:

代码语言:javascript
复制
[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]

假设激活函数是按顺序处理的,因此顺序不会被打乱。在Java中,我可以实现相同的最快方法是什么?如果我使用数组,我不想维护展平和收缩的索引。

EN

回答 1

Stack Overflow用户

发布于 2018-05-23 23:23:57

这实现了一个带有getsetList,还实现了一个find,允许您发现某个特定索引处的元素应该出现在数组中的哪个位置。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50490093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档