Java 奇怪的数组.asList()行为
我有这个方法:Java 奇怪的数组.asList()行为,java,arrays,sorting,Java,Arrays,Sorting,我有这个方法: //not related to the error, but included for reference ArrayList<ArrayList<Color>> a = new ArrayList<ArrayList<Color>>(); void addColorToList(float[] j) //this array always length 3 { float[] k = Arrays.copyOf(j,
//not related to the error, but included for reference
ArrayList<ArrayList<Color>> a = new ArrayList<ArrayList<Color>>();
void addColorToList(float[] j) //this array always length 3
{
float[] k = Arrays.copyOf(j, 3);
Arrays.sort(k);
//Error in the following line
a.get(Arrays.asList(j).indexOf(k[0])).add(new Color(j[0], j[1], j[2]));
}
我已经确定我的代码总是使用-1调用a.get()
,因为Arrays.asList(j)。indexOf(k[0])
找不到该元素。然而,我不明白为什么这不能像我期望的那样起作用。我尝试打印出数组的结果。asList(j)
,但我不确定如何处理结果:[[F@307af497]
。有人能告诉我问题出在哪里吗?让我们从以下内容开始:
我尝试打印array.asList(j)的结果,但我不确定如何处理结果:[[F@307af497]
您正在(有效地)使用toString()
方法打印列表。因此
- 外部“[”和“]”来自列表格式
- 您有一个由一个元素组成的列表
- 该元素是一个
数组(即float
由[F@307af497
生成,而对象.toString()
是类型[F
的呈现方式…)float[]
这实际上是一条重要线索。Arrays.asList(float[])正在返回一个“float[]列表” 但是为什么呢 好吧,因为这就是它应该做的
Arrays.asList
签名是Arrays.asList(T…
。这意味着它需要一个显式的T[]
…或一个零或多个T
实例序列,然后将其包装为对象[]
。然后将对象[]
包装为列表(粗略地说来)
这里最关键的是,实际类型T必须是引用类型…而不是基元类型
但是您的代码似乎期望像这样的重载方法Arrays.asList(float…
…并期望这将使您的float[]
包装为List
不幸的是,asList
没有这种重载
因此,实际发生的情况是:
- 您的调用正在绑定到数组。asList(float[…)
j
被包装在一个数组中;即相当于newfloat[][]{j}
列表
…的实例那么解决方案是什么呢 总的来说
- 一种解决方案是将浮点数表示为
而不是Float[]
。理想情况下,您可以通过最初创建数组的代码将此更改推回,等等Float[]
- 第二种解决方案是在调用
之前将asList
转换为float[]
。简单的方法是使用一个简单的循环(也可能有一个第三方库来实现)。缺点是:float[]
- 每次调用此方法时都需要进行转换,如果调用次数太多,转换成本可能会很高
- 如果要通过列表包装器更新数组,则原始数组和已包装的数组之间没有连接
Arrays.asList(j).indexOf(k[0])
使用一个简单的循环,在原始的float[]
上迭代,测试与k[0]
匹配的条目
这个故事的寓意是:通过努力用Java实现一个优雅的解决方案,您可以轻松地击中自己的脚
通常,哑代码更好。(速度更快,也更正确。)@OliCharlesworth No.
j
是用addColorToList((新颜色(r.nextInt()).getRGBColorComponents(新浮点[3])生成的;
,r
是一个随机的对象。此外,我已经打印了j
,没有什么不寻常的地方。“该元素是一个浮点数组。”这就是使用该方法时应该发生的情况吗?我以前使用过它,并且感觉它应该返回List
,而不是List
@Azar检查asList方法签名。它接收数量可变的类型T并返回一个列表。您正在传递1个float[]类型的参数,所以它返回一个数组列表。@xp500您所说的似乎是真的。但如果是这样,那么java.util.array.asList(theArray.indexOf(o)如何处理
来自工作?@Azar通过阅读Steven的编辑,我建议您使用类型为Float的数组,而不是原始Float。这应该是正确的。@xp500是的,我也得出了这个结论。
Arrays.asList(j).indexOf(k[0])