【问题标题】:Java toArray() method: primitive result typeJava toArray() 方法:原始结果类型
【发布时间】:2012-03-31 19:58:58
【问题描述】:

我正在尝试执行以下操作:

double[][] ret = new double[res.size()][columnSize];
for(int i = 0; i < res.size(); i++){
     ret[i] = res.get(i).toArray(new double[columnSize]);
}

其中 res 声明为List&lt;List&lt;Double&gt;&gt;。上面的方法不起作用,因为 toArray() 方法需要一个参数化的数组来推断结果类型并且不能是原始的......

现在,我可以将我的方法的返回类型更改为 Double[][],但稍后我有来自不同 API 的其他函数,这些函数需要 double[][] 9primitives)。这意味着会有很多向上转型,不是吗?

任何解决方案,建议?

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

    您不能在集合中保留原始类型,您需要将集合转换为原始类型数组,如下所示:

    double[] toArray(Collection<Double> collection) {
        double[] arr = new double[collection.size()];
        int i = 0;
        for (Double d : collection) {
            arr[i++] = d;
        }
        return arr;
    }
    

    【讨论】:

    • 这是一个非常简单的解决方案......但没有那么好:)
    • 很遗憾,没有更好的解决方案。
    • 哇,Java 仍然 没有数组自动拆箱,真是难以置信。顺便说一句,这个答案是针对单个维度的。问题是二维数组,所以它需要嵌套的 for 循环。为如此简单的事情而疯狂。
    【解决方案2】:

    【讨论】:

    • 哇,这真是有用的伙伴!只是简单地看了一下,乍一看它似乎是一个弥补java错误和缺失实现的库。顺便说一句,您可能知道类似的事情吗?
    • 我在 Guava 上工作。如果您对 Guava 提供的所有东西感到好奇,最好的起点是the wiki
    • 是的,看起来不错。您认为这是目前最复杂的套件吗?
    • 嗯。不知道你的意思,但不使用番石榴就像被绑在背后一样。
    • 我想知道是否有类似的包,也许还针对Java的其他问题,我应该知道
    【解决方案3】:

    对于二维数组。

    private static int[][] convertListArray(ArrayList<Integer[]> al) {
        int[][] ret = new int[al.size()][];
        for (int i=0; i < al.size(); i++) {
            Integer[] row = al.get(i);
            ret[i] = new int[row.length];
            for (int j = 0; j < row.length; j++) {
                ret[i][j] = row[j];
            }
        }
        return ret;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2021-09-28
      相关资源
      最近更新 更多