2016-07-13 4 views
0

У меня есть 2D вектор, какClojure: определить 2D-примитивы массивы как двойной [] []

(def data [[1 1] [1 1]]) 

Я хотел бы превратить его в два раза [] [].

я рассмотрел clojure.core и я попробовал:

1)

(->> (map double-array data) 
    (to-array-2d)) 

Unfortnately возвращает Object [] [] тип данных, который терпит неудачу в Java Interop.

2)

(->> (map double-array data) 
    (double-array)) 

Конечно, это не работает, потому что двойной массив ожидает набор чисел

3) Я не закодировал его, так как это тяжело, и я, если не знаю, что-то есле существуют, но я мог бы инициализировать двойной [] [] с помощью (make-array Double/Type 2 2) [2 2, полученный alen], а затем заполнить его петлями. Как и на Java.

4) Короткий путь, но немного скрученные

(def double-2d-array-type 
    (type (double-array []))) 

    (->> (map double-array data) 
     (into-array double-2d-array-type))) 

Есть прямой путь? Если бы можно было позвонить напрямую double [], было бы лучше.

Как «(в-массива двойные [] данные)»

+0

is '(in-array (Class/forName" [D ") (карта double-array [[1.0 1.2] [1.3 1.5]]))' => '#object [" [[D "0x16eccb2e" [ [D @ 16eccb2e "]' адрес этого? – noisesmith

+3

также: http://stackoverflow.com/questions/3868192/how-do-create-a-primitive-two-dimensional-2d-array-of-doubles-in-clojure – birdspider

ответ

1

Просто удалить первый аргумент into-array:

(into-array (map double-array data)) 

До тех пор, пока существует, по меньшей мере, один элемент в последовательности ввода, into-array может посмотреть на его тип, чтобы угадать желаемый тип выходного массива. Это не всегда то, чего вы хотите, из-за наследования, но для примитивов это никогда не будет ошибкой.

Смежные вопросы