首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将以向量为键的Clojure映射转换为java HashMap

将以向量为键的Clojure映射转换为java HashMap
EN

Stack Overflow用户
提问于 2019-08-21 20:13:11
回答 1查看 278关注 0票数 2

我们正在将一些业务逻辑从Clojure迁移到Java。目前我正在研究两个方法,但我对第二个方法有问题。

第一个是--我相信--将map转换成向量,但只包含我们为其提供键的值(并删除null值)。

代码语言:javascript
运行
复制
(defn- spec-vec [tags-with-classification & tag-types]
  (into [] (remove nil? (map tags-with-classification tag-types))))

下面是我将其转换为Java代码的方式:

代码语言:javascript
运行
复制
    private List<String> specVec(Map<String, String> tagsWithClassification, List<String> tagTypes) {
        List<String> list = new ArrayList<>();
        for (String tagType : tagTypes) {
            String value = tagsWithClassification.get(tagType);
            if (value != null) {
                list.add(value);
            }
        }
        return list;
    }

我张贴这一个,因为它在另一个方法中使用,但我可能误解了它的作用。

另一个是以字符串的向量作为键,字符串作为值的映射,但也有一些与过滤键相关的逻辑,但我已经做对了这一部分-我想。

这是我到目前为止得到的java代码,但我被困在如何以一种好的方式将这个映射转换成HashMap (因为ArrayList/LinkedList不是很好的建议用在HashMap中作为键)。或者我应该使用完全不同的approcach/不同的结构?提前感谢:)

注意:只有5种可能的返回值(4个不同的字符串和null)。

第二个Java方法:

代码语言:javascript
运行
复制
    private String bookingModelFor(Map<String, String> tagsWithClassification, List<String> tagTypes) {
        List<String> tagNames = new ArrayList<>(Arrays.asList("event", "product", "client-trade-direction", "r-factor-direction"));
        List<String> filteredTagValues = specVec(tagsWithClassification, tagNames);
        filteredTagValues.addAll(tagTypes);
        /*
        missing part
         */
        return null;
    }

第二个Clojure函数:

代码语言:javascript
运行
复制
(defn booking-model-for [tags-with-classification & tag-types]
  (get {[:trade :goal :increase :vanilla]                              "Astrid"
        [:trade :goal :decrease :vanilla]                              "Maja"
        [:trade :bloc :increase :vanilla]                              "Isabelle"
        [:trade :bloc :decrease :vanilla]                              "Luna"
        [:trade :perles-plus :increase :call]                          "Astrid"
        [:trade :perles-plus :increase :put]                           "Luna"
        [:trade :perles-plus :increase :kickout]                       "Astrid"
        [:trade :perles-plus :decrease :call]                          "Maja"
        [:trade :perles-plus :decrease :put]                           "Isabelle"
        [:trade :perles-plus :decrease :kickout]                       "Maja"
        [:trade :reverse-perles-plus :increase :call]                  "Astrid"
        [:trade :reverse-perles-plus :increase :put]                   "Luna"
        [:trade :reverse-perles-plus :increase :kickout]               "Astrid"
        [:trade :reverse-perles-plus :decrease :call]                  "Maja"
        [:trade :reverse-perles-plus :decrease :put]                   "Isabelle"
        [:trade :reverse-perles-plus :decrease :kickout]               "Maja"
        [:trade :kig :increase :put]                                   "Astrid"
        [:trade :kig :increase :kickout]                               "Maja"
        [:trade :kig :decrease :put]                                   "Maja"
        [:trade :kig :decrease :kickout]                               "Astrid"
        [:expire :goal :decrease :vanilla]                             "Maja"
        [:expire :bloc :decrease :vanilla]                             "Luna"
        [:expire :kig :decrease :put]                                  "Maja"
        [:expire :kig :decrease :kickout]                              "Astrid"
        [:expire :perles-plus :increase :put]                          "Maja"
        [:expire :perles-plus :increase :call]                         "Isabelle"
        [:expire :perles-plus :increase :kickout]                      "Isabelle"
        [:expire :reverse-perles-plus :increase :put]                  "Maja"
        [:expire :reverse-perles-plus :increase :call]                 "Isabelle"
        [:expire :reverse-perles-plus :increase :kickout]              "Isabelle"
        [:barrier-breach :kig :kickout]                                "Astrid"
        [:barrier-breach :perles-plus :kickout]                        "Astrid"
        [:share-adjustment :goal :r-factor>=1 :vanilla]                "Maja"
        [:share-adjustment :goal :r-factor<1 :vanilla]                 "Astrid"
        [:share-adjustment :bloc :r-factor>=1 :vanilla]                "Luna"
        [:share-adjustment :bloc :r-factor<1 :vanilla]                 "Isabelle"
        [:share-adjustment :kig :r-factor>=1 :put]                     "Maja"
        [:share-adjustment :kig :r-factor>=1 :kickout]                 "Astrid"
        [:share-adjustment :kig :r-factor<1 :put]                      "Astrid"
        [:share-adjustment :kig :r-factor<1 :kickout]                  "Maja"
        [:share-adjustment :perles-plus :r-factor>=1 :call]            "Astrid"
        [:share-adjustment :perles-plus :r-factor>=1 :put]             "Luna"
        [:share-adjustment :perles-plus :r-factor>=1 :kickout]         "Astrid"
        [:share-adjustment :perles-plus :r-factor<1 :call]             "Maja"
        [:share-adjustment :perles-plus :r-factor<1 :put]              "Isabelle"
        [:share-adjustment :perles-plus :r-factor<1 :kickout]          "Maja"
        [:share-adjustment :reverse-perles-plus :r-factor>=1 :call]    "Astrid"
        [:share-adjustment :reverse-perles-plus :r-factor>=1 :put]     "Luna"
        [:share-adjustment :reverse-perles-plus :r-factor>=1 :kickout] "Astrid"
        [:share-adjustment :reverse-perles-plus :r-factor<1 :call]     "Maja"
        [:share-adjustment :reverse-perles-plus :r-factor<1 :put]      "Isabelle"
        [:share-adjustment :reverse-perles-plus :r-factor<1 :kickout]  "Maja"}
       (into (spec-vec tags-with-classification :event :product :client-trade-direction :r-factor-direction) tag-types)))

下面是一些对我迁移有帮助的测试案例:

第一个函数的测试:

代码语言:javascript
运行
复制
(deftest spec-vec-test
  (is (= [] (#'ksm.build.transform.neds/spec-vec nil)))
  (is (= [:trade :goal 1] (#'ksm.build.transform.neds/spec-vec {:a :trade :b :goal :c :decrease :d :vanilla :e 1} :a :b :e))))

第二个功能的测试:

代码语言:javascript
运行
复制
       (deftest booking-model-for-test
  (is (nil? (#'ns/booking-model-for {})))
  (is (nil? (#'ns/booking-model-for {:a 1 :b 2 :c 3} :d :e)))
  (is (= "Maja"
         (#'ns/booking-model-for {:event :trade :product :goal :client-trade-direction :decrease :r-factor-direction :vanilla})))
  (is (= "Isabelle"
         (#'ns/booking-model-for {:event :expire :product :reverse-perles-plus :client-trade-direction :increase :r-factor-direction :kickout})))
  (is (= "Luna"
         (#'ns/booking-model-for {:event :share-adjustment :product :reverse-perles-plus :client-trade-direction :r-factor>=1 :r-factor-direction :put}))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-24 06:55:38

我假设这些标签的顺序并不重要。在这种情况下,您不能比遗留代码做得更好。看看这个

https://cs.stackexchange.com/questions/14208/set-combination-data-structure-and-storage-complexity

您可以将关键字替换为常规字符串,并且可以使用Set而不是List作为键。此外,由于这是常量数据,请将查找表存储在static成员中,以避免在每次调用时重新创建它。例如:

代码语言:javascript
运行
复制
class A {
    static Map<Set<String>, String> lut = new HashMap<Set<String>, String>() {{
        put(new HashSet<String>(Arrays.asList("x", "y")), "foo");
        put(new HashSet<String>(Arrays.asList("x", "y", "z")), "bar");
    }};
    public static void main(String[] args) {
        System.out.println(lut.get(new HashSet<String>(Arrays.asList("x", "y"))));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57591378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档