Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奇怪的数组.asList()行为_Java_Arrays_Sorting - Fatal编程技术网

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[…)

  • varargs导致
    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])