【问题标题】:Getting back primitive array after insertion into an ArrayList of primitive arrays in Java在Java中插入原始数组的ArrayList后取回原始数组
【发布时间】:2012-08-22 08:58:29
【问题描述】:
List<double[]> x = new ArrayList<double[]>();
x.add(new double[]={1,2,3,4,54,6});  

元素 1,2,3,4,54,6 被添加到 x

x.get(0) ---> returns 1

但是这样做,数组的地址被添加了?为什么

     List<double[]> x = new ArrayList<double[]>();
    double[] name=new double[5];
    name[0]=1
    name[1]=3;
    name[2]=3;
        .
        . 
        . 
        .
    x.add(name);
    getting x.get(0) ---> returns @as12cd2 (address of the array)

【问题讨论】:

  • 这没什么特别的,数组是列表中唯一的元素。令我惊讶的是,在第一个示例中,显然已经完成了一些拆箱,然后列表包含 double 元素,而不是应该包含的 double[]。这很奇怪,并且可能导致错误,因为 get(...) 预计在编译时返回 double[],但在运行时返回 double。

标签: java


【解决方案1】:

如果您只想让列表存储双精度而不是双精度数组,请更改列表存储的内容

List<Double> doubleList = new ArrayList<Double>();

然后您可以将数组作为列表添加到您的数组列表中,这意味着该列表存储的是值而不是数组。这将为您提供get(0) 将为您提供 1 而不是数组地址的行为

Double[] doubleArray = {1.0, 2.0, 3.0, 4.0, 54.0, 6.0 };
doubleList.addAll(Arrays.asList(doubleArray));
doubleList.get(0); //gives 1.0

【讨论】:

  • 添加数组可以简化:doubleList.addAll(Arrays.asList(1.0, 2.0, 3.0, 4.0, 54.0, 6.0));
  • @sasha_trn 我同意,为了清楚起见,我只是把它隔开。
【解决方案2】:

这是因为List 是由double[] 而不是double 组成的。

因为double[] 是一个数组,所以您还必须从该数组中指定位置。像这样:

x.get(0)[0]

如果您只想使用x.get(),您的List 必须由double 原语组成。然后您可以使用单独的方法(我不知道内置的方法)将doubles 的数组添加到List:

List<Double> addArray(List<Double> o, double[] a) {
  for(Double d : a)
    o.add(d);

  return o;
}

希望这是有道理的。我喜欢使用简短的变量名来使逻辑更清晰。只要你知道变量是什么,你应该没问题。

【讨论】:

  • List 只能存储对象,所以你必须使用 Double 而不是 double
  • 这很合乎逻辑,但没有解释为什么第一个示例有效。按照这个逻辑,它应该与第二个具有相同的结果,因为也使用了double[] 列表。
  • 此外,没有用于将数组添加到现有列表的内置单一方法,但它与doubleList.addAll(Arrays.asList(doubleArray) 单行工作。请参阅下面@n00begon 的答案。
【解决方案3】:

double[] 数组是对象。所以,你得到地址,整个数组被添加到索引 0 处。

您可以使用Arrays.toString(x.get(0)) 来获得可读的数组打印。

数组的toString()是打印[,后跟一个代表数组元素数据类型的字符,然后是@,然后是内存地址。

【讨论】:

  • OP 不想打印数组。他想知道为什么将数组作为单个元素添加,而不是拆箱。如上所述,因为列表存储了double[]。并且还展示了一种将数组元素添加到列表的方法。
【解决方案4】:

任何Object(包括double[])的默认toString()实现是对象地址的返回。这是您的代码打印的内容。

【讨论】:

  • 这不是问题所在。阅读代码之间的行,您会注意到 OP 对数组的打印方式并不感到惊讶,而是将数组作为单个元素放入列表中,而不是被拆箱。目前最热门的 2 个答案(@Jon 和 @n00begon)解释得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2014-10-05
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多