首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中转换为面向列的数组

在Java中转换为面向列的数组
EN

Stack Overflow用户
提问于 2010-04-29 10:57:37
回答 4查看 1.6K关注 0票数 3

虽然我的标题中有Java,但这可能适用于任何OO语言。我想知道一些新的想法,以提高我正在努力做的事情的表现。

我有一个不断接收Object[]数组的方法。我需要将这个数组中的对象拆分为多个数组(List或其他什么),以便为该方法接收的所有数组的每一列都有一个独立的列表。

示例:

代码语言:javascript
复制
List<List<Object>> column-oriented = new ArrayList<ArrayList<Object>>();

public void newObject(Object[] obj) {
    for(int i = 0; i < obj.length; i++) {
        column-oriented.get(i).add(obj[i]);
    }
}

注意:为了简单起见,我省略了对象和东西的初始化。

当然,我上面显示的代码很慢。我已经尝试了一些其他的东西,但想听听一些新的想法。

你怎么做到这一点,因为它是非常敏感的性能?

编辑:

我测试了几件事,发现:

我没有使用ArrayList (或任何其他集合),而是将一个Object[]数组封装在另一个对象中,以存储各个列。如果该数组达到其容量,我将创建另一个具有两倍非大小的数组,并使用System.copyArray将内容从一个复制到另一个。令人惊讶的是(至少对我来说)这比使用ArrayList存储内部列更快..。

EN

回答 4

Stack Overflow用户

发布于 2010-04-29 11:14:14

答案取决于数据和使用情况。在这样的集合中你有多少数据?读写(添加对象数组)的比例是多少?这会影响内部列表的哪些结构更好,以及许多其他可能的优化。

复制数据的最快方法是完全避免复制。如果您知道调用方代码没有进一步修改obj数组(这是重要的条件),那么可能的技巧之一是实现自定义List类作为内部列表使用。在内部,您将存储共享List<Object[]>。每次调用时,我们都会向列表中添加新的数组。自定义内部列表类将知道它代表哪一列(让它是n),当它被要求在m位置给出项时,它将转换mn,并查询内部结构以获得internalArray.get(m)[n]。这个实现是不安全的,因为对调用者的限制很容易忘记,但在某些条件下可能更快(但是,在其他条件下,这可能更慢)。

票数 2
EN

Stack Overflow用户

发布于 2010-04-29 11:04:36

使用LinkedList实现列列表。它与数据线性增长,为O(1)。(如果使用ArrayList,则必须不时调整内部数组的大小)。

收集完值后,可以将该链接列表转换为数组。如果N是从保存每个列表的3*N参考文献(每个LInkedList都有prevRef/nextRef/itemRef)传递到只引用N的行数。

最好有一个数组来保存不同的列列表,但是当然,这并不是一个很大的改进,只有在预先知道列数的情况下,才能这样做。

希望能帮上忙!

编辑检验和理论表明,ArrayList在摊销成本方面表现较好,即总成本除以已处理项目数。所以不要听从我的“建议”:)

票数 0
EN

Stack Overflow用户

发布于 2010-04-29 11:05:44

我会尝试使用LinkedList作为内部列表,因为它应该具有更好的插入性能。也许将对象arra封装到集合中并使用addAll也会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2736698

复制
相关文章

相似问题

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