[英]Convert Clojure's map with vector as key to java HashMap
我们正在将一些业务逻辑从 Clojure 迁移到 Java。 目前我正在研究 2 种方法,但我在第 2 种方法上遇到了问题。
第一个是 - 我相信 - 将映射转换为向量,但只包括我们为其提供键的值(并删除空值)。
(defn- spec-vec [tags-with-classification & tag-types]
(into [] (remove nil? (map tags-with-classification tag-types))))
这就是我将它翻译成 Java 代码的方式:
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 中的键)。 或者我应该使用完全不同的方法/不同的结构? 提前致谢 :)
注意:只能返回 5 个(4 个不同的字符串和 null)可能的值。
第二种Java方法:
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函数:
(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)))
以下是一些帮助我进行迁移的测试用例:
第一个功能的测试:
(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))))
测试第二个功能:
(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}))))
我认为这些标签的顺序并不重要。 在这种情况下,您不能比遗留代码做得更好。 看到这个
https://cs.stackexchange.com/questions/14208/set-combination-data-structure-and-storage-complexity
您可以将关键字替换为常规字符串,并且您可以使用 Set 而不是 List 作为键。 此外,由于这是常量数据,将查找表存储在static
成员中以避免在每次调用时重新创建它。 例如。
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"))));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.