【问题标题】:Making an Array out of an ArrayList containing Arraylists从包含 Arraylists 的 ArrayList 中创建一个数组
【发布时间】:2012-12-17 15:58:36
【问题描述】:

我有一个问题。

在 Java 中,我有一个 ArrayList,其中包含一个带有双值的 ArrayList。由此我想创建一个double[][] 数组。

我知道如何通过 'toArray' 方法使用一维数组来制作它,但在这种情况下,我不确定如何去做并且总是在我的代码中收到错误消息。

我的 Aktuell 代码是:

double[][] test = new double[Data.getArrayList().size()][Data.getArrayList().size()];

double[][] array = Data.getArrayList().toArray(test);

Data 是我的 ArrayList 的 ArrayList。

【问题讨论】:

  • 向我们展示Data的声明。如果它是 ArrayList 而不是 Data.getArrayList() 将是编译器错误。
  • 哦。我的错。数据是我自己设计的一个类。使用方法Data.getArrayList,我将数据作为ArrayList<ArrayList<Double>> 取出。但这不应该是问题。

标签: java arrays arraylist toarray


【解决方案1】:

我会使用这样的方法(放在实用程序类中)

public static double[][] to2DArray(List<List<Double>> input) {
    double[][] output = new double[input.size()][];
    for (int i = 0; i < input.size(); i++) {
        output[i] = new double[input.get(i).size()];
        for (int j = 0; j < input.get(i).size(); j++) {
            output[i][j] = input.get(i).get(j);
        }
    }
    return output;
}

【讨论】:

    【解决方案2】:

    你必须

    1. 迭代外部ArrayList
    2. 使用 toArray 将每个条目转换为数组
    3. 将这些逐个添加到数组数组中

    它并不漂亮,但确实没有更好的方法。

    【讨论】:

      【解决方案3】:

      这可能比遍历矩阵中的每个元素要快:

      private Double[][] to2DArray(ArrayList<ArrayList<Double>> data)
      {
          Double[][] result = new Double[data.size()][];
          Double[] temp;
          int mainIdx = 0;
          for (List<Double> arrayOfDouble : data)
          {
              temp = new Double[arrayOfDouble.size()];
              result[mainIdx++] = arrayOfDouble.toArray(temp);
          }
          return result;
      }
      

      【讨论】:

      • @LuisRamos 您正在创建Double[][],OP 要求提供double[][]。不,它并没有更快,因为您还在遍历矩阵中的每个元素。你只是不自己做,你让toArray()为你做。你可以看到它遍历了它的实现中的每个元素。
      • 是的,当我尝试使用代码时,这就是我现在的问题。有没有办法将它与double[][] 一起用作输出?但在原则上,我会说路易斯·拉莫斯是对的。在循环中不使用循环总是更好,我认为toArray-Order 更好,因为我有经验,内置方法总是比自己制作更快。
      • @HansDampf 获得double[][] 的方法是使用我的答案。这个答案还包含一个循环中的循环,因为toArray() 的实现包含一个循环。如果您将toArray() 的来源与我的解决方案进行比较,您会发现toArray() 在您的情况下既不快也不慢。但你是对的,如果没有必要,我们不应该重新发明轮子。
      • @jlordo 谢谢。原则上我现在使用你的方法,因为正如你所说,它给了我正确的类型。什么时候更快:更好! :-) 我认为有两个循环就可以了。但是当你有超过 2 个循环时,还有一个美学论点。因为循环中有很多循环,我发现很难阅读源代码。
      • 如果我的答案是正确的(返回 double[][] 而不是 Double[][]),我会更喜欢我的答案,因为它的代码行数更少,没有重新发明轮子,没有单个字母变量和循环内没有循环。但这是不正确的 :-) 要拆箱双打,我需要别的东西,而不是 toArray。我会使用 @jlordo 的 double[][] 答案和我的 Double[][] 答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多