Преобразование HashMap в карту Clojure выполняется не так, как исключено из вызова Java - PullRequest
0 голосов
/ 27 января 2011

Я очень новичок в Clojure.Я хочу передать List<HashMap<String,String>> в функцию Clojure, в которой я хочу использовать внутренние HashMaps в качестве обычных карт Clojure, но я не могу получить значения из карты с помощью функции: key (которая отлично работает для обычной карты Clojure). Iиспользуйте функцию into {}, но она не делает то, что я, кроме нее, должен сделать.Что я делаю не так?(Примечание: это код теста демострации, просто чтобы увидеть поведение)

Java-код:

package com.experimental.clojure.java;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.experimental.clojure.test.ConvertTest;

public class Test_Cloj_Convert {
    public static void main(String[] args) {
        List<Map<String, String>> columns = new ArrayList<Map<String, String>>();
        Map<String, String> col1 = new HashMap<String, String>();
        col1.put("name", "ID");
        col1.put("type", "int");
        col1.put("pos", "0");
        Map<String, String> col2 = new HashMap<String, String>();
        col2.put("name", "Name");
        col2.put("type", "string");
        col2.put("pos", "2");
        Map<String, String> col3 = new HashMap<String, String>();
        col3.put("name", "Description");
        col3.put("type", "enum");
        col3.put("pos", "1");
        columns.add(col1);
        columns.add(col2);
        columns.add(col3);

        ConvertTest scripter = new ConvertTest();
        System.out.println(scripter.conv(columns));
    }
}

Код Clojure

(ns com.experimental.clojure.test.ConvertTest
  (:gen-class
   :name com.experimental.clojure.test.ConvertTest
   :methods [
             [conv [java.util.List] String]
  ])
  (:import [java.util List] [java.util HashMap])  
)

(defn conv
    [columns]
    (println columns)
    (println (first columns))
    (println (:type (first columns)))
    (println (into {} (first columns)))
    (println (:type (into {} (first columns))))
)

(defn -conv
  [this columns]
  (conv columns)
)

И (удивительный) вывод

#<ArrayList [{name=ID, type=int, pos=0}, {name=Name, type=string, pos=2}, {name=Description, type=enum, pos=1}]>
#<HashMap {name=ID, type=int, pos=0}>
nil
{name ID, type int, pos 0}
nil
null

То, что я исключил для третьего println, возвращает строку "int".И в четвертой печати очевидно, что HashMap неправильно конвертируется в карту Clojure.Можете ли вы помочь, что сделать для успешного преобразования?(Я знаю, что мог бы использовать функцию get () HashMap, но было бы удобнее использовать ее в качестве карты Clojure)

Ответы [ 2 ]

1 голос
/ 27 января 2011

Я вижу две проблемы:

  • Ваша функция conv возвращает nil, поскольку println является последним оператором и возвращает nil
  • ": type" - это ключевое слово Clojure, котороене равен ключу типа «строка» - следовательно, при поиске не удается найти нужное значение
0 голосов
/ 27 января 2011

Теперь я понимаю больше, и это было глупо. Извините за все, но у меня сложилось впечатление, что в Clojure следующие две структуры идентичны. {"a" 1, "b" 2, "c" 3} и {:a 1, :b 2, :c 3} Это не так, и я попытался использовать неправильный метод для получения данных с карты. Я пытался с использованием (println ((into {} (first columns)) "pos")), и он работает нормально. Прошу прощения, что не понял этого раньше.

Однако, если я могу спросить еще раз. В чем реальная разница между ними? Сейчас у меня есть только смутное представление об этом.

...