我正在使用 JFreeChart 在 clojure 中使用,遇到了一个我需要帮助的情况。
JFreeChart 的 DefaultXYDataset 有一个方法 addSeries,用于向图表添加系列。数据应该是一个包含两个数组的数组,这两个数组是特定于类型的(双精度数组(。因此,我编写了以下代码,认为它会起作用,但我得到了一个class [Ljava.lang.Object; cannot be cast to class [[D ([Ljava.lang.Object; and [[D are in module java.base of loader 'bootstrap')
ClassCastException
。
(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"]
。有没有办法将它们组合成一个通用数组而不将它们转换为长整型数组?也许除了to-array
之外的另一种方法.欢迎任何其他建议。谢谢。
编辑:@bfabry答案会起作用,我可以使用make-array
然后使用aset-double
但这会导致我循环访问两个序列并将它们的值分配给主数组。我试图避免这种情况,因为两个数据集可能非常大,甚至每个数据集多达 300k 个项目。
这是二维数组,而不是两个数组对象的数组。您需要使用make-array
和aset-double
来制作所需的数组。
user=> (class (make-array Double/TYPE 2 2))
[[D
https://clojuredocs.org/clojure.core/make-array