从Clojure中的类型特定数组创建通用数组

问题描述 投票:2回答:1

我正在Clojure中与JFreeChart一起工作,遇到了我需要帮助的情况。

JFreeChart的DefaultXYDataset具有一个addSeries方法,该方法用于向图表添加序列。数据应该是包含two arrays的数组,它们是特定于类型的(双精度数组)。因此,我编写了以下代码,认为它可以正常工作,但我得到了 ClassCastException,即class [Ljava.lang.Object; cannot be cast to class [[D ([Ljava.lang.Object; and [[D are in module java.base of loader 'bootstrap')

(doto _dataset
  (.addSeries "S1" (to-array (conj
                               []
                               (double-array (range 10))
                               (double-array (range 10))))))

[浏览后,我意识到to-array将两个嵌套数组转换为#object["[Ljava.lang.Object;" 0x491223e7 "[Ljava.lang.Object;@491223e7"],而不是预期的#object["[D" 0x4f5cf37 "[D@4f5cf37"] #object["[D" 0x6d895193 "[D@6d895193"]。有没有一种方法可以将它们组合为通用数组,而无需将其转换为long型数组?也许是to-array以外的另一种方法。欢迎其他任何建议。谢谢。

编辑:@bfabry答案将起作用,我可以使用make-array,然后使用aset-double,但这将导致我循环遍历两个序列并将其值分配给主数组。我试图避免这种情况,因为两个数据集可能很大,甚至每个都高达300k items

arrays clojure jfreechart
1个回答
2
投票

这是二维数组,而不是两个数组对象组成的数组。您需要使用make-arrayaset-double来创建所需的数组。

user=> (class (make-array Double/TYPE 2 2))
[[D

https://clojuredocs.org/clojure.core/make-array

© www.soinside.com 2019 - 2024. All rights reserved.